Nikolay Sivov : mfmediaengine: Shutdown media source when clearing current presentation.

Alexandre Julliard julliard at winehq.org
Fri Feb 18 15:14:57 CST 2022


Module: wine
Branch: master
Commit: 9a7d166e6bfdbd5b1f5dbee6cbb9b66e44372e31
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9a7d166e6bfdbd5b1f5dbee6cbb9b66e44372e31

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb 18 10:47:39 2022 +0300

mfmediaengine: Shutdown media source when clearing current presentation.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfmediaengine/main.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 31aee0209f6..4a7d85348d7 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -141,6 +141,10 @@ struct media_engine
     IMFSourceResolver *resolver;
     BSTR current_source;
     struct
+    {
+        IMFMediaSource *source;
+    } presentation;
+    struct
     {
         LONGLONG pts;
         SIZE size;
@@ -1071,6 +1075,16 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I
     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)
 {
     IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL;
@@ -1081,6 +1095,7 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
     HRESULT hr;
 
     media_engine_release_video_frame_resources(engine);
+    media_engine_clear_presentation(engine);
 
     if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd)))
         return hr;
@@ -1134,6 +1149,9 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
         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_AUDIO, !!sd_audio);
 
@@ -1340,6 +1358,7 @@ static void free_media_engine(struct media_engine *engine)
     if (engine->resolver)
         IMFSourceResolver_Release(engine->resolver);
     media_engine_release_video_frame_resources(engine);
+    media_engine_clear_presentation(engine);
     if (engine->device_manager)
     {
         IMFDXGIDeviceManager_CloseDeviceHandle(engine->device_manager, engine->device_handle);
@@ -2086,6 +2105,7 @@ static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngineEx *iface)
     else
     {
         media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE);
+        media_engine_clear_presentation(engine);
         IMFMediaSession_Shutdown(engine->session);
     }
     LeaveCriticalSection(&engine->cs);




More information about the wine-cvs mailing list