Rémi Bernon : mf: Check whether node is already in the topology before cloning.

Alexandre Julliard julliard at winehq.org
Wed Jul 27 16:15:58 CDT 2022


Module: wine
Branch: master
Commit: 1dc4c94ed07336b0e7f4233cd22342a5898767eb
URL:    https://gitlab.winehq.org/wine/wine/-/commit/1dc4c94ed07336b0e7f4233cd22342a5898767eb

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Jul  5 16:03:43 2022 +0200

mf: Check whether node is already in the topology before cloning.

---

 dlls/mf/topology_loader.c | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c
index 2ab92393c3e..997afd5ae0a 100644
--- a/dlls/mf/topology_loader.c
+++ b/dlls/mf/topology_loader.c
@@ -109,33 +109,32 @@ static IMFTopologyNode *topology_loader_get_node_for_marker(struct topoloader_co
 }
 
 static HRESULT topology_loader_clone_node(struct topoloader_context *context, IMFTopologyNode *node,
-        IMFTopologyNode **ret, unsigned int marker)
+        IMFTopologyNode **clone, unsigned int marker)
 {
-    IMFTopologyNode *cloned_node;
     MF_TOPOLOGY_TYPE node_type;
     HRESULT hr;
+    TOPOID id;
 
-    if (ret) *ret = NULL;
+    if (FAILED(hr = IMFTopologyNode_GetTopoNodeID(node, &id)))
+        return hr;
+    if (SUCCEEDED(hr = IMFTopology_GetNodeByID(context->output_topology, id, clone)))
+        return hr;
 
     IMFTopologyNode_GetNodeType(node, &node_type);
-
-    if (FAILED(hr = MFCreateTopologyNode(node_type, &cloned_node)))
+    if (FAILED(hr = MFCreateTopologyNode(node_type, clone)))
         return hr;
 
-    if (SUCCEEDED(hr = IMFTopologyNode_CloneFrom(cloned_node, node)))
-        hr = IMFTopologyNode_SetUINT32(cloned_node, &context->key, marker);
+    if (SUCCEEDED(hr = IMFTopologyNode_CloneFrom(*clone, node)))
+        hr = IMFTopologyNode_SetUINT32(*clone, &context->key, marker);
 
     if (SUCCEEDED(hr))
-        hr = IMFTopology_AddNode(context->output_topology, cloned_node);
+        hr = IMFTopology_AddNode(context->output_topology, *clone);
 
-    if (SUCCEEDED(hr) && ret)
+    if (FAILED(hr))
     {
-        *ret = cloned_node;
-        IMFTopologyNode_AddRef(*ret);
+        IMFTopologyNode_Release(*clone);
+        *clone = NULL;
     }
-
-    IMFTopologyNode_Release(cloned_node);
-
     return hr;
 }
 
@@ -470,12 +469,9 @@ static HRESULT topology_loader_resolve_branch(struct topoloader_context *context
     MF_TOPOLOGY_TYPE u_type, d_type;
     IMFTopologyNode *node;
     HRESULT hr;
-    TOPOID id;
 
-    /* Downstream node might have already been cloned. */
-    IMFTopologyNode_GetTopoNodeID(downstream_node, &id);
-    if (FAILED(IMFTopology_GetNodeByID(context->output_topology, id, &node)))
-        topology_loader_clone_node(context, downstream_node, &node, context->marker + 1);
+    if (FAILED(hr = topology_loader_clone_node(context, downstream_node, &node, context->marker + 1)))
+        return hr;
 
     IMFTopologyNode_GetNodeType(upstream_node, &u_type);
     IMFTopologyNode_GetNodeType(downstream_node, &d_type);
@@ -763,8 +759,12 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
 
         if (node_type == MF_TOPOLOGY_SOURCESTREAM_NODE)
         {
-            if (FAILED(hr = topology_loader_clone_node(&context, node, NULL, 0)))
+            IMFTopologyNode *clone;
+
+            if (FAILED(hr = topology_loader_clone_node(&context, node, &clone, 0)))
                 WARN("Failed to clone source node, hr %#lx.\n", hr);
+            else
+                IMFTopologyNode_Release(clone);
         }
 
         IMFTopologyNode_Release(node);




More information about the wine-cvs mailing list