mfmediaengine: Shutdown media source when clearing current presentation.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2022-02-18 10:47:39 +03:00 committed by Alexandre Julliard
parent 5a66eab725
commit 9a7d166e6b
1 changed files with 20 additions and 0 deletions

View File

@ -141,6 +141,10 @@ struct media_engine
IMFSourceResolver *resolver; IMFSourceResolver *resolver;
BSTR current_source; BSTR current_source;
struct struct
{
IMFMediaSource *source;
} presentation;
struct
{ {
LONGLONG pts; LONGLONG pts;
SIZE size; SIZE size;
@ -1071,6 +1075,16 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I
return hr; return hr;
} }
static void media_engine_clear_presentation(struct media_engine *engine)
{
if (engine->presentation.source)
{
IMFMediaSource_Shutdown(engine->presentation.source);
IMFMediaSource_Release(engine->presentation.source);
}
memset(&engine->presentation, 0, sizeof(engine->presentation));
}
static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMediaSource *source) static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMediaSource *source)
{ {
IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL; IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL;
@ -1081,6 +1095,7 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
HRESULT hr; HRESULT hr;
media_engine_release_video_frame_resources(engine); media_engine_release_video_frame_resources(engine);
media_engine_clear_presentation(engine);
if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd))) if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd)))
return hr; return hr;
@ -1134,6 +1149,9 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
return E_UNEXPECTED; return E_UNEXPECTED;
} }
engine->presentation.source = source;
IMFMediaSource_AddRef(engine->presentation.source);
media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video); media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video);
media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio); media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio);
@ -1340,6 +1358,7 @@ static void free_media_engine(struct media_engine *engine)
if (engine->resolver) if (engine->resolver)
IMFSourceResolver_Release(engine->resolver); IMFSourceResolver_Release(engine->resolver);
media_engine_release_video_frame_resources(engine); media_engine_release_video_frame_resources(engine);
media_engine_clear_presentation(engine);
if (engine->device_manager) if (engine->device_manager)
{ {
IMFDXGIDeviceManager_CloseDeviceHandle(engine->device_manager, engine->device_handle); IMFDXGIDeviceManager_CloseDeviceHandle(engine->device_manager, engine->device_handle);
@ -2086,6 +2105,7 @@ static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngineEx *iface)
else else
{ {
media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE); media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE);
media_engine_clear_presentation(engine);
IMFMediaSession_Shutdown(engine->session); IMFMediaSession_Shutdown(engine->session);
} }
LeaveCriticalSection(&engine->cs); LeaveCriticalSection(&engine->cs);