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:
parent
5a66eab725
commit
9a7d166e6b
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue