[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