[PATCH] mfreadwrite/reader: Implement GetServiceForStream() for stream objects.

Nikolay Sivov nsivov at codeweavers.com
Tue Nov 24 09:14:24 CST 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfreadwrite/reader.c | 52 ++++++++++++++++++++++++++++-----------
 1 file changed, 38 insertions(+), 14 deletions(-)

diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c
index 7aa8f65df7a..85aec9aaedc 100644
--- a/dlls/mfreadwrite/reader.c
+++ b/dlls/mfreadwrite/reader.c
@@ -1906,36 +1906,60 @@ static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWO
 {
     struct source_reader *reader = impl_from_IMFSourceReader(iface);
     IUnknown *obj = NULL;
-    HRESULT hr;
+    HRESULT hr = S_OK;
 
     TRACE("%p, %#x, %s, %s, %p\n", iface, index, debugstr_guid(service), debugstr_guid(riid), object);
 
+    EnterCriticalSection(&reader->cs);
+
     switch (index)
     {
         case MF_SOURCE_READER_MEDIASOURCE:
             obj = (IUnknown *)reader->source;
             break;
         default:
-            FIXME("Unsupported index %#x.\n", index);
-            return E_NOTIMPL;
-    }
+            if (index == MF_SOURCE_READER_FIRST_VIDEO_STREAM)
+                index = reader->first_video_stream_index;
+            else if (index == MF_SOURCE_READER_FIRST_AUDIO_STREAM)
+                index = reader->first_audio_stream_index;
 
-    if (IsEqualGUID(service, &GUID_NULL))
-    {
-        hr = IUnknown_QueryInterface(obj, riid, object);
+            if (index >= reader->stream_count)
+                hr = MF_E_INVALIDSTREAMNUMBER;
+            else
+            {
+                obj = (IUnknown *)reader->streams[index].decoder;
+                if (!obj) hr = E_NOINTERFACE;
+            }
+            break;
     }
-    else
-    {
-        IMFGetService *gs;
 
-        hr = IUnknown_QueryInterface(obj, &IID_IMFGetService, (void **)&gs);
-        if (SUCCEEDED(hr))
+    if (obj)
+        IUnknown_AddRef(obj);
+
+    LeaveCriticalSection(&reader->cs);
+
+    if (obj)
+    {
+        if (IsEqualGUID(service, &GUID_NULL))
         {
-            hr = IMFGetService_GetService(gs, service, riid, object);
-            IMFGetService_Release(gs);
+            hr = IUnknown_QueryInterface(obj, riid, object);
+        }
+        else
+        {
+            IMFGetService *gs;
+
+            hr = IUnknown_QueryInterface(obj, &IID_IMFGetService, (void **)&gs);
+            if (SUCCEEDED(hr))
+            {
+                hr = IMFGetService_GetService(gs, service, riid, object);
+                IMFGetService_Release(gs);
+            }
         }
     }
 
+    if (obj)
+        IUnknown_Release(obj);
+
     return hr;
 }
 
-- 
2.29.2




More information about the wine-devel mailing list