Nikolay Sivov : mf/topoloader: Clone source nodes as a first layer of resulting topology.

Alexandre Julliard julliard at winehq.org
Wed Jul 15 16:44:46 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jul 15 15:55:46 2020 +0300

mf/topoloader: Clone source nodes as a first layer of resulting topology.

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

---

 dlls/mf/topology.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 57 insertions(+), 4 deletions(-)

diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index 8522f56969..840f1bd25f 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -1933,9 +1933,40 @@ static ULONG WINAPI topology_loader_Release(IMFTopoLoader *iface)
     return refcount;
 }
 
+struct topoloader_context
+{
+    IMFTopology *output_topology;
+    GUID key;
+};
+
+static HRESULT topology_loader_clone_node(struct topoloader_context *context, IMFTopologyNode *node,
+        unsigned int marker)
+{
+    IMFTopologyNode *cloned_node;
+    MF_TOPOLOGY_TYPE node_type;
+    HRESULT hr;
+
+    IMFTopologyNode_GetNodeType(node, &node_type);
+
+    if (FAILED(hr = MFCreateTopologyNode(node_type, &cloned_node)))
+        return hr;
+
+    if (SUCCEEDED(hr = IMFTopologyNode_CloneFrom(cloned_node, node)))
+        hr = IMFTopologyNode_SetUINT32(cloned_node, &context->key, marker);
+
+    if (SUCCEEDED(hr))
+        hr = IMFTopology_AddNode(context->output_topology, cloned_node);
+
+    IMFTopologyNode_Release(cloned_node);
+
+    return hr;
+}
+
 static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *input_topology,
-        IMFTopology **output_topology, IMFTopology *current_topology)
+        IMFTopology **ret_topology, IMFTopology *current_topology)
 {
+    struct topoloader_context context = { 0 };
+    IMFTopology *output_topology;
     MF_TOPOLOGY_TYPE node_type;
     IMFTopologyNode *node;
     unsigned short i = 0;
@@ -1943,7 +1974,7 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
     IUnknown *object;
     HRESULT hr = E_FAIL;
 
-    FIXME("%p, %p, %p, %p.\n", iface, input_topology, output_topology, current_topology);
+    FIXME("%p, %p, %p, %p.\n", iface, input_topology, ret_topology, current_topology);
 
     if (current_topology)
         FIXME("Current topology instance is ignored.\n");
@@ -1982,10 +2013,32 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
             return hr;
     }
 
-    if (FAILED(hr = MFCreateTopology(output_topology)))
+    if (FAILED(hr = MFCreateTopology(&output_topology)))
         return hr;
 
-    return IMFTopology_CloneFrom(*output_topology, input_topology);
+    context.output_topology = output_topology;
+    memset(&context.key, 0xff, sizeof(context.key));
+
+    /* Clone source nodes, use initial marker value. */
+    i = 0;
+    while (SUCCEEDED(IMFTopology_GetNode(input_topology, i++, &node)))
+    {
+        IMFTopologyNode_GetNodeType(node, &node_type);
+
+        if (node_type == MF_TOPOLOGY_SOURCESTREAM_NODE)
+        {
+            if (FAILED(hr = topology_loader_clone_node(&context, node, 0)))
+                WARN("Failed to clone source node, hr %#x.\n", hr);
+        }
+
+        IMFTopologyNode_Release(node);
+    }
+
+    /* For now return original topology. */
+
+    *ret_topology = output_topology;
+
+    return IMFTopology_CloneFrom(output_topology, input_topology);
 }
 
 static const IMFTopoLoaderVtbl topologyloadervtbl =




More information about the wine-cvs mailing list