From 0b4e460184da4ed6d2f771d6047ab1e60c6f3bde Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 2 Mar 2020 13:31:05 +0300 Subject: [PATCH] mf: Implement GetFullTopology(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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 76310040ee3..8edab289354 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 =