Nikolay Sivov : mf: Handle shutdown state in GetFullTopology().

Alexandre Julliard julliard at winehq.org
Tue Mar 3 16:24:53 CST 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Mar  3 12:24:58 2020 +0300

mf: Handle shutdown state in GetFullTopology().

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

---

 dlls/mf/session.c  | 33 ++++++++++++++++++---------------
 dlls/mf/tests/mf.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index a2a2ba6fe5..c5235e42a8 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -1401,8 +1401,8 @@ static HRESULT WINAPI mfsession_GetFullTopology(IMFMediaSession *iface, DWORD fl
 {
     struct media_session *session = impl_from_IMFMediaSession(iface);
     struct queued_topology *queued;
-    HRESULT hr = S_OK;
     TOPOID topo_id;
+    HRESULT hr;
 
     TRACE("%p, %#x, %s, %p.\n", iface, flags, wine_dbgstr_longlong(id), topology);
 
@@ -1410,27 +1410,30 @@ static HRESULT WINAPI mfsession_GetFullTopology(IMFMediaSession *iface, DWORD fl
 
     EnterCriticalSection(&session->cs);
 
-    if (flags & MFSESSION_GETFULLTOPOLOGY_CURRENT)
+    if (SUCCEEDED(hr = session_is_shut_down(session)))
     {
-        if (session->presentation.topo_status != MF_TOPOSTATUS_INVALID)
-            *topology = session->presentation.current_topology;
+        if (flags & MFSESSION_GETFULLTOPOLOGY_CURRENT)
+        {
+            if (session->presentation.topo_status != MF_TOPOSTATUS_INVALID)
+                *topology = session->presentation.current_topology;
+            else
+                hr = MF_E_INVALIDREQUEST;
+        }
         else
-            hr = MF_E_INVALIDREQUEST;
-    }
-    else
-    {
-        LIST_FOR_EACH_ENTRY(queued, &session->topologies, struct queued_topology, entry)
         {
-            if (SUCCEEDED(IMFTopology_GetTopologyID(queued->topology, &topo_id)) && topo_id == id)
+            LIST_FOR_EACH_ENTRY(queued, &session->topologies, struct queued_topology, entry)
             {
-                *topology = queued->topology;
-                break;
+                if (SUCCEEDED(IMFTopology_GetTopologyID(queued->topology, &topo_id)) && topo_id == id)
+                {
+                    *topology = queued->topology;
+                    break;
+                }
             }
         }
-    }
 
-    if (*topology)
-        IMFTopology_AddRef(*topology);
+        if (*topology)
+            IMFTopology_AddRef(*topology);
+    }
 
     LeaveCriticalSection(&session->cs);
 
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 5f3114da32..5a690880d1 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -1027,11 +1027,14 @@ static void test_media_session(void)
     IMFRateSupport *rate_support;
     IMFAttributes *attributes;
     IMFMediaSession *session;
+    IMFTopology *topology;
+    PROPVARIANT propvar;
     IMFGetService *gs;
     IMFClock *clock;
     IUnknown *unk;
     HRESULT hr;
     float rate;
+    DWORD caps;
     BOOL thin;
 
     hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
@@ -1115,12 +1118,40 @@ todo_wine
     hr = IMFMediaSession_Shutdown(session);
     ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
 
+    hr = IMFMediaSession_ClearTopologies(session);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_Start(session, &GUID_NULL, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    propvar.vt = VT_EMPTY;
+    hr = IMFMediaSession_Start(session, &GUID_NULL, &propvar);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_Pause(session);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_Stop(session);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
     hr = IMFMediaSession_Close(session);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
     hr = IMFMediaSession_GetClock(session, &clock);
     ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFMediaSession_GetSessionCapabilities(session, &caps);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_GetSessionCapabilities(session, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_GetFullTopology(session, MFSESSION_GETFULLTOPOLOGY_CURRENT, 0, &topology);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaSession_Shutdown(session);
+    ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
+
     IMFMediaSession_Release(session);
 
     /* Custom topology loader, GUID is not registered. */




More information about the wine-cvs mailing list