Nikolay Sivov : mfreadwrite/reader: Implement GetServiceForStream() for stream objects.

Alexandre Julliard julliard at winehq.org
Tue Nov 24 17:01:44 CST 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Nov 24 18:14:24 2020 +0300

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

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

---

 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;
 }
 




More information about the wine-cvs mailing list