From: Santino Mazza smazza@codeweavers.com
--- dlls/mf/mf_private.h | 1 + dlls/mf/tests/mf.c | 8 ++++---- dlls/mf/topology.c | 21 ++++++++++++++------- dlls/mf/topology_loader.c | 4 +++- 4 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/dlls/mf/mf_private.h b/dlls/mf/mf_private.h index bbfadaee5d8..2790de5d64b 100644 --- a/dlls/mf/mf_private.h +++ b/dlls/mf/mf_private.h @@ -118,6 +118,7 @@ extern HRESULT urlmon_scheme_handler_construct(REFIID riid, void **obj);
extern BOOL mf_is_sample_copier_transform(IMFTransform *transform); extern BOOL mf_is_sar_sink(IMFMediaSink *sink); +extern HRESULT create_topology_with_id(TOPOID id, IMFTopology **topology); extern HRESULT topology_node_get_object(IMFTopologyNode *node, REFIID riid, void **obj); extern HRESULT topology_node_get_type_handler(IMFTopologyNode *node, DWORD stream, BOOL output, IMFMediaTypeHandler **handler); extern HRESULT topology_node_init_media_type(IMFTopologyNode *node, DWORD stream, BOOL output, IMFMediaType **type); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 14a66bc9f57..bb5a0b1f0b3 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3566,7 +3566,7 @@ static void test_media_session_topologies(void)
hr = get_media_event(session, callback, MESessionTopologyStatus, 1000, &pv, &event); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine check_topologyid(event, topoid); + check_topologyid(event, topoid); check_topostatus(event, MF_TOPOSTATUS_READY); IMFMediaEvent_Release(event);
@@ -3581,7 +3581,7 @@ static void test_media_session_topologies(void)
hr = get_media_event(session, callback, MESessionTopologyStatus, 1000, &pv, &event); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine check_topologyid(event, topoid); + check_topologyid(event, topoid); check_topostatus(event, MF_TOPOSTATUS_ENDED); IMFMediaEvent_Release(event);
@@ -4326,7 +4326,7 @@ static void test_topology_loader(void) { IMFTopology_GetTopologyID(topology, &oldtopoid); IMFTopology_GetTopologyID(full_topology, &newtopoid); - todo_wine ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); + ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); ok(topology != full_topology, "Expected a different object for the resolved topology.\n");
hr = IMFTopology_GetCount(full_topology, &count); @@ -4478,7 +4478,7 @@ todo_wine { ok(full_topology != topology2, "Unexpected instance.\n"); IMFTopology_GetTopologyID(topology2, &oldtopoid); IMFTopology_GetTopologyID(full_topology, &newtopoid); - todo_wine ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); + ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); hr = IMFTopology_GetUINT32(topology2, &IID_IMFTopology, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index f09a9c87a46..56ce6a8f642 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -866,16 +866,12 @@ static TOPOID topology_generate_id(void) return next_topology_id; }
-/*********************************************************************** - * MFCreateTopology (mf.@) - */ -HRESULT WINAPI MFCreateTopology(IMFTopology **topology) +/* If no topoid is provided a new one will be generated. */ +HRESULT create_topology_with_id(TOPOID id, IMFTopology **topology) { struct topology *object; HRESULT hr;
- TRACE("%p.\n", topology); - if (!topology) return E_POINTER;
@@ -892,13 +888,24 @@ HRESULT WINAPI MFCreateTopology(IMFTopology **topology) return hr; }
- object->id = topology_generate_id(); + if (!id) id = topology_generate_id(); + object->id = id;
*topology = &object->IMFTopology_iface;
return S_OK; }
+/*********************************************************************** + * MFCreateTopology (mf.@) + */ +HRESULT WINAPI MFCreateTopology(IMFTopology **topology) +{ + TRACE("%p.\n", topology); + + return create_topology_with_id(0, topology); +} + static HRESULT WINAPI topology_node_QueryInterface(IMFTopologyNode *iface, REFIID riid, void **out) { struct topology_node *node = impl_from_IMFTopologyNode(iface); diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index 11d0162d94f..3a4cb7caa52 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -721,6 +721,7 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in unsigned short i = 0; IMFStreamSink *sink; IUnknown *object; + TOPOID topoid; HRESULT hr = E_FAIL;
FIXME("iface %p, input_topology %p, ret_topology %p, current_topology %p stub!\n", @@ -763,7 +764,8 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in return hr; }
- if (FAILED(hr = MFCreateTopology(&output_topology))) + IMFTopology_GetTopologyID(input_topology, &topoid); + if (FAILED(hr = create_topology_with_id(topoid, &output_topology))) return hr;
IMFTopology_CopyAllItems(input_topology, (IMFAttributes *)output_topology);