[PATCH 07/10] mf: Introduce topology_loader_connect_source() to handle connections of source nodes in _Load().

Sergio Gómez Del Real sdelreal at codeweavers.com
Sun Jun 14 20:41:55 CDT 2020


Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
---
 dlls/mf/topology.c | 94 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 93 insertions(+), 1 deletion(-)

diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index c51a739aa8..e38035ddd2 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -2016,6 +2016,98 @@ static HRESULT topology_loader_clone_node(struct topoloader_context *context, IM
     return hr;
 }
 
+static HRESULT topology_loader_connect_source(struct topoloader_context *context, IMFTopologyNode *source_node,
+        IMFTopologyNode *downstream_node, unsigned int input_index)
+{
+    IMFStreamDescriptor *strm_desc;
+    IMFMediaType **src_mediatypes;
+    UINT32 method, enum_src_types;
+    IMFMediaTypeHandler *mth_src;
+    struct topology_node *src;
+    IMFAttributes *attrs_src;
+    IMFMediaType *mtype_src;
+    DWORD num_media_types;
+    HRESULT hr;
+    int i;
+
+    src = impl_from_IMFTopologyNode(source_node);
+    attrs_src = src->attributes;
+    if (FAILED(hr = IMFAttributes_GetUnknown(attrs_src, &MF_TOPONODE_STREAM_DESCRIPTOR, &IID_IMFStreamDescriptor, (void **)&strm_desc)))
+        return hr;
+
+    if (FAILED(hr = IMFStreamDescriptor_GetMediaTypeHandler(strm_desc, &mth_src)))
+    {
+        IMFStreamDescriptor_Release(strm_desc);
+        return hr;
+    }
+    IMFStreamDescriptor_Release(strm_desc);
+
+    if (FAILED(IMFTopology_GetUINT32(context->input_topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES, &enum_src_types)))
+        enum_src_types = 0;
+
+    if (!enum_src_types)
+    {
+        num_media_types = 1;
+        if (FAILED(hr = IMFMediaTypeHandler_GetCurrentMediaType(mth_src, &mtype_src)))
+            if (FAILED(hr = IMFMediaTypeHandler_GetMediaTypeByIndex(mth_src, 0, &mtype_src)))
+            {
+                IMFMediaTypeHandler_Release(mth_src);
+                return hr;
+            }
+    }
+    else
+        IMFMediaTypeHandler_GetMediaTypeCount(mth_src, &num_media_types);
+
+    src_mediatypes = heap_alloc(sizeof(IMFMediaType *) * num_media_types);
+    if (!src_mediatypes)
+    {
+        if (!enum_src_types)
+            IMFMediaType_Release(mtype_src);
+        IMFMediaTypeHandler_Release(mth_src);
+        return E_OUTOFMEMORY;
+    }
+
+    if (enum_src_types)
+        for (i = 0; i < num_media_types; i++)
+            IMFMediaTypeHandler_GetMediaTypeByIndex(mth_src, i, &src_mediatypes[i]);
+    else
+        src_mediatypes[0] = mtype_src;
+
+    hr = IMFAttributes_GetUINT32(attrs_src, &MF_TOPONODE_CONNECT_METHOD, &method);
+    if (!enum_src_types || (hr == S_OK && !(method & MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES)))
+    {
+        for (method = MF_CONNECT_DIRECT; method < MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES; method++)
+        {
+            for (i = 0; i < num_media_types; i++)
+            {
+                IMFMediaTypeHandler_SetCurrentMediaType(mth_src, src_mediatypes[i]);
+                hr = S_OK;
+                goto out;
+            }
+        }
+    }
+    else
+    {
+        for (i = 0; i < num_media_types; i++)
+        {
+            for (method = MF_CONNECT_DIRECT; method < MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES; method++)
+            {
+                IMFMediaTypeHandler_SetCurrentMediaType(mth_src, src_mediatypes[i]);
+                hr = S_OK;
+                goto out;
+            }
+        }
+    }
+
+out:
+    while (num_media_types--)
+        IMFMediaType_Release(src_mediatypes[num_media_types]);
+    IMFMediaTypeHandler_Release(mth_src);
+    heap_free(src_mediatypes);
+
+    return hr;
+}
+
 static HRESULT topology_loader_resolve_nodes(struct topoloader_context *context)
 {
     IMFTopologyNode *node, *downstream_node, *orig_node, *orig_downstream_node;
@@ -2042,7 +2134,7 @@ static HRESULT topology_loader_resolve_nodes(struct topoloader_context *context)
             switch (node_type)
             {
                 case MF_TOPOLOGY_SOURCESTREAM_NODE:
-                    hr = S_OK;
+                    hr = topology_loader_connect_source(context, node, downstream_node, input_index);
                     break;
                 case MF_TOPOLOGY_TRANSFORM_NODE:
                     hr = S_OK;
-- 
2.17.1




More information about the wine-devel mailing list