[v2 04/10] mf: Clone source nodes into output topology in _Load().

Sergio Gómez Del Real sdelreal at codeweavers.com
Sun Jul 5 09:16:09 CDT 2020


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

diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index 70b9f4962c..83e3b0a7c5 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -1943,6 +1943,37 @@ struct topoloader_context
     unsigned int marker;
 };
 
+static HRESULT topology_loader_clone_node(struct topoloader_context *context, IMFTopologyNode *node, IMFTopologyNode **ret,
+        unsigned int marker)
+{
+    IMFTopologyNode *cloned_node;
+    MF_TOPOLOGY_TYPE node_type;
+    HRESULT hr;
+
+    if (ret) *ret = NULL;
+
+    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);
+
+    if (SUCCEEDED(hr) && ret)
+    {
+        *ret = cloned_node;
+        IMFTopologyNode_AddRef(*ret);
+    }
+
+    IMFTopologyNode_Release(cloned_node);
+
+    return hr;
+}
+
 static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *input_topology,
         IMFTopology **output_topology, IMFTopology *current_topology)
 {
@@ -1976,7 +2007,16 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
     {
         IMFTopologyNode_GetNodeType(node, &node_type);
 
-        if (node_type == MF_TOPOLOGY_OUTPUT_NODE)
+        /* Clone and mark source nodes. */
+        if (node_type == MF_TOPOLOGY_SOURCESTREAM_NODE)
+        {
+            if (FAILED(hr = topology_loader_clone_node(&context, node, NULL, 0)))
+            {
+                WARN("Failed to clone source node, hr %#x.\n", hr);
+                continue;
+            }
+        }
+        else if (node_type == MF_TOPOLOGY_OUTPUT_NODE)
         {
             if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, &object)))
             {
-- 
2.17.1




More information about the wine-devel mailing list