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