From: Bernhard Kölbl besentv@gmail.com
Signed-off-by: Bernhard Kölbl besentv@gmail.com --- dlls/mf/tests/mf.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/mf/topology.c | 7 ++++++- 2 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index e8d7252aa3f..34f6ad52182 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -1194,6 +1194,58 @@ static void test_topology(void) ok(ref == 0, "Release returned %ld\n", ref); ref = IMFTopologyNode_Release(node2); ok(ref == 0, "Release returned %ld\n", ref); + + /* Try cloning a topology without connections */ + hr = MFCreateTopology(&topology); + ok(hr == S_OK, "Failed to create topology, hr %#lx.\n", hr); + + hr = MFCreateTopology(&topology2); + ok(hr == S_OK, "Failed to create topology, hr %#lx.\n", hr); + + hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &node); + ok(hr == S_OK, "Failed to create topology node, hr %#lx.\n", hr); + + hr = MFCreateMediaType(&mediatype); + ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + + hr = MFCreateMediaType(&mediatype2); + ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + + hr = IMFTopologyNode_SetInputPrefType(node, 0, mediatype); + ok(hr == S_OK, "Failed to set preferred type, hr %#lx.\n", hr); + + hr = IMFTopologyNode_SetInputPrefType(node, 1, mediatype2); + ok(hr == S_OK, "Failed to set preferred type, hr %#lx.\n", hr); + + IMFMediaType_Release(mediatype2); + IMFMediaType_Release(mediatype); + + hr = IMFTopology_AddNode(topology, node); + ok(hr == S_OK, "Failed to add a node, hr %#lx.\n", hr); + EXPECT_REF(node, 2); + + hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &node2); + ok(hr == S_OK, "Failed to create topology node, hr %#lx.\n", hr); + + hr = IMFTopology_AddNode(topology, node2); + ok(hr == S_OK, "Failed to add a node, hr %#lx.\n", hr); + EXPECT_REF(node, 2); + + hr = IMFTopologyNode_ConnectOutput(node, 1, node2, 0); + ok(hr == S_OK, "Unexpected, hr %#lx.\n", hr); + + hr = IMFTopology_CloneFrom(topology2, topology); + ok(hr == S_OK, "Failed to clone from topology, hr %#lx.\n", hr); + + ref = IMFTopology_Release(topology2); + ok(ref == 0, "Release returned %ld\n", ref); + ref = IMFTopology_Release(topology); + ok(ref == 0, "Release returned %ld\n", ref); + + ref = IMFTopologyNode_Release(node); + ok(ref == 0, "Release returned %ld\n", ref); + ref = IMFTopologyNode_Release(node2); + ok(ref == 0, "Release returned %ld\n", ref); }
static void test_topology_tee_node(void) diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index 25a00708100..b684b17ff72 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -712,7 +712,12 @@ static HRESULT WINAPI topology_CloneFrom(IMFTopology *iface, IMFTopology *src) for (j = 0; j < outputs->count; ++j) { DWORD input_index = outputs->streams[j].connection_stream; - TOPOID id = outputs->streams[j].connection->id; + TOPOID id; + + if (!outputs->streams[j].connection) + continue; + + id = outputs->streams[j].connection->id;
/* Skip node lookup in destination topology, assuming same node order. */ if (SUCCEEDED(hr = topology_get_node_by_id(topology, id, &node)))