Nikolay Sivov : mf/evr: Create stream sinks for default mixer inputs.

Alexandre Julliard julliard at winehq.org
Tue Sep 8 15:36:16 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Sep  8 11:05:58 2020 +0300

mf/evr: Create stream sinks for default mixer inputs.

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

---

 dlls/mf/evr.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 55 insertions(+), 15 deletions(-)

diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 93ad06b949..161c0d9b73 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -409,11 +409,35 @@ static HRESULT WINAPI video_renderer_sink_GetCharacteristics(IMFMediaSink *iface
     return S_OK;
 }
 
+static HRESULT video_renderer_add_stream(struct video_renderer *renderer, unsigned int id,
+        IMFStreamSink **stream_sink)
+{
+    struct video_stream *stream;
+    HRESULT hr;
+
+    if (!mf_array_reserve((void **)&renderer->streams, &renderer->stream_size, renderer->stream_count + 1,
+            sizeof(*renderer->streams)))
+    {
+        return E_OUTOFMEMORY;
+    }
+
+    if (SUCCEEDED(hr = video_renderer_stream_create(renderer, id, &stream)))
+    {
+        if (stream_sink)
+        {
+            *stream_sink = &stream->IMFStreamSink_iface;
+            IMFStreamSink_AddRef(*stream_sink);
+        }
+        renderer->streams[renderer->stream_count++] = stream;
+    }
+
+    return hr;
+}
+
 static HRESULT WINAPI video_renderer_sink_AddStreamSink(IMFMediaSink *iface, DWORD id,
     IMFMediaType *media_type, IMFStreamSink **stream_sink)
 {
     struct video_renderer *renderer = impl_from_IMFMediaSink(iface);
-    struct video_stream *stream;
     HRESULT hr;
 
     TRACE("%p, %#x, %p, %p.\n", iface, id, media_type, stream_sink);
@@ -425,20 +449,7 @@ static HRESULT WINAPI video_renderer_sink_AddStreamSink(IMFMediaSink *iface, DWO
         hr = MF_E_SHUTDOWN;
     else if (SUCCEEDED(hr = IMFTransform_AddInputStreams(renderer->mixer, 1, &id)))
     {
-        if (mf_array_reserve((void **)&renderer->streams, &renderer->stream_size, renderer->stream_count + 1,
-                sizeof(*renderer->streams)))
-        {
-            if (SUCCEEDED(hr = video_renderer_stream_create(renderer, id, &stream)))
-            {
-                *stream_sink = &stream->IMFStreamSink_iface;
-                IMFStreamSink_AddRef(*stream_sink);
-                renderer->streams[renderer->stream_count++] = stream;
-            }
-        }
-        else
-            hr = E_OUTOFMEMORY;
-
-        if (FAILED(hr))
+        if (FAILED(hr = video_renderer_add_stream(renderer, id, stream_sink)))
             IMFTransform_DeleteInputStream(renderer->mixer, id);
 
     }
@@ -1109,6 +1120,35 @@ static HRESULT video_renderer_create_mixer(struct video_renderer *renderer, IMFA
         IMFTopologyServiceLookupClient_Release(lookup_client);
     }
 
+    if (SUCCEEDED(hr))
+    {
+        unsigned int input_count, output_count;
+        unsigned int *ids, *oids;
+        size_t i;
+
+        /* Create stream sinks for inputs that mixer already has by default. */
+        if (SUCCEEDED(IMFTransform_GetStreamCount(*out, &input_count, &output_count)))
+        {
+            ids = heap_calloc(input_count, sizeof(*ids));
+            oids = heap_calloc(output_count, sizeof(*oids));
+
+            if (ids && oids)
+            {
+                if (SUCCEEDED(IMFTransform_GetStreamIDs(*out, input_count, ids, output_count, oids)))
+                {
+                    for (i = 0; i < input_count; ++i)
+                    {
+                        video_renderer_add_stream(renderer, ids[i], NULL);
+                    }
+                }
+
+            }
+
+            heap_free(ids);
+            heap_free(oids);
+        }
+    }
+
     return hr;
 }
 




More information about the wine-cvs mailing list