Nikolay Sivov : mf/session: Add support for MR_VIDEO_RENDER_SERVICE service.

Alexandre Julliard julliard at winehq.org
Mon Sep 7 16:12:54 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Sep  7 12:43:37 2020 +0300

mf/session: Add support for MR_VIDEO_RENDER_SERVICE service.

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

---

 dlls/mf/session.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index e2a6b868ca..a1b54b7080 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -24,6 +24,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "mfidl.h"
+#include "evr.h"
 
 #include "wine/debug.h"
 #include "wine/heap.h"
@@ -1794,6 +1795,57 @@ static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGU
     {
         return IMFLocalMFTRegistration_QueryInterface(&local_mft_registration, riid, obj);
     }
+    else if (IsEqualGUID(service, &MR_VIDEO_RENDER_SERVICE))
+    {
+        IMFStreamSink *stream_sink;
+        IMFTopologyNode *node;
+        IUnknown *vr, *object;
+        IMFCollection *nodes;
+        IMFMediaSink *sink;
+        unsigned int i = 0;
+        HRESULT hr;
+
+        EnterCriticalSection(&session->cs);
+
+        /* Use first sink to support IMFVideoRenderer. */
+        if (session->presentation.current_topology)
+        {
+            if (SUCCEEDED(IMFTopology_GetOutputNodeCollection(session->presentation.current_topology,
+                    &nodes)))
+            {
+                while (IMFCollection_GetElement(nodes, i++, (IUnknown **)&node) == S_OK)
+                {
+                    if (SUCCEEDED(IMFTopologyNode_GetObject(node, &object)))
+                    {
+                        if (SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&stream_sink)))
+                        {
+                            if (SUCCEEDED(IMFStreamSink_GetMediaSink(stream_sink, &sink)))
+                            {
+                                if (SUCCEEDED(IMFMediaSink_QueryInterface(sink, &IID_IMFVideoRenderer, (void **)&vr)))
+                                {
+                                    if (FAILED(hr = MFGetService(vr, service, riid, obj)))
+                                        WARN("Failed to get service from video renderer %#x.\n", hr);
+                                    IUnknown_Release(vr);
+                                }
+                            }
+                            IMFStreamSink_Release(stream_sink);
+                        }
+
+                        IUnknown_Release(object);
+                    }
+
+                    IMFTopologyNode_Release(node);
+
+                    if (*obj)
+                        break;
+                }
+
+                IMFCollection_Release(nodes);
+            }
+        }
+
+        LeaveCriticalSection(&session->cs);
+    }
     else
         FIXME("Unsupported service %s.\n", debugstr_guid(service));
 




More information about the wine-cvs mailing list