[PATCH 1/3] mf: Implement GetFullTopology().

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 2 04:31:05 CST 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/session.c | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 76310040ee..8edab28935 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -1395,9 +1395,42 @@ static HRESULT WINAPI mfsession_GetSessionCapabilities(IMFMediaSession *iface, D
 
 static HRESULT WINAPI mfsession_GetFullTopology(IMFMediaSession *iface, DWORD flags, TOPOID id, IMFTopology **topology)
 {
-    FIXME("%p, %#x, %s, %p.\n", iface, flags, wine_dbgstr_longlong(id), topology);
+    struct media_session *session = impl_from_IMFMediaSession(iface);
+    struct queued_topology *queued;
+    HRESULT hr = S_OK;
+    TOPOID topo_id;
 
-    return E_NOTIMPL;
+    TRACE("%p, %#x, %s, %p.\n", iface, flags, wine_dbgstr_longlong(id), topology);
+
+    *topology = NULL;
+
+    EnterCriticalSection(&session->cs);
+
+    if (flags & MFSESSION_GETFULLTOPOLOGY_CURRENT)
+    {
+        if (session->presentation.topo_status != MF_TOPOSTATUS_INVALID)
+            *topology = session->presentation.current_topology;
+        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)
+            {
+                *topology = queued->topology;
+                break;
+            }
+        }
+    }
+
+    if (*topology)
+        IMFTopology_AddRef(*topology);
+
+    LeaveCriticalSection(&session->cs);
+
+    return hr;
 }
 
 static const IMFMediaSessionVtbl mfmediasessionvtbl =
-- 
2.25.1




More information about the wine-devel mailing list