From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/mf/tests/topology.c | 2 -- dlls/mf/topology_loader.c | 19 ++++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dlls/mf/tests/topology.c b/dlls/mf/tests/topology.c index 0a268054a46..4d96fcb5e87 100644 --- a/dlls/mf/tests/topology.c +++ b/dlls/mf/tests/topology.c @@ -2998,7 +2998,6 @@ static void test_topology_loader(void) /* PCM -> PCM, optional sink */ .input_types = {&audio_pcm_44100}, .output_types = {&audio_pcm_44100}, .sink_method = MF_CONNECT_AS_OPTIONAL, .source_method = -1, .expected_result = MF_E_TOPO_UNSUPPORTED, - .flags = LOADER_TODO, }, { /* PCM -> PCM, optional source is ignored */ @@ -3009,7 +3008,6 @@ static void test_topology_loader(void) /* H264 -> NV12, optional sink */ .input_types = {&video_h264_1280}, .output_types = {&video_nv12_1280}, .sink_method = MF_CONNECT_AS_OPTIONAL | MF_CONNECT_ALLOW_DECODER, .source_method = -1, .expected_result = MF_E_TOPO_UNSUPPORTED, .decoder_class = CLSID_CMSH264DecoderMFT, - .flags = LOADER_TODO, }, { /* #70 H264 -> NV12, optional source is ignored */ diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index 1dd050685a4..187789bad57 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -998,6 +998,7 @@ static HRESULT clone_topology(IMFTopology *input_topology, IMFCollection *source HRESULT hr = S_OK; IUnknown *object; TOPOID topoid; + UINT32 method; IMFTopology_GetTopologyID(input_topology, &topoid); if (FAILED(hr = create_topology(topoid, output_topology))) @@ -1009,13 +1010,17 @@ static HRESULT clone_topology(IMFTopology *input_topology, IMFCollection *source switch (topology_node_get_type(node)) { case MF_TOPOLOGY_OUTPUT_NODE: - if (FAILED(hr = IMFTopologyNode_GetObject(node, &object))) - break; - if (FAILED(IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&sink))) - hr = MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED; - else - IMFStreamSink_Release(sink); - IUnknown_Release(object); + if (SUCCEEDED(IMFTopologyNode_GetUINT32(node, &MF_TOPONODE_CONNECT_METHOD, &method)) + && (method & MF_CONNECT_AS_OPTIONAL)) + hr = MF_E_TOPO_UNSUPPORTED; + else if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, &object))) + { + if (FAILED(IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&sink))) + hr = MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED; + else + IMFStreamSink_Release(sink); + IUnknown_Release(object); + } break; case MF_TOPOLOGY_SOURCESTREAM_NODE: if (SUCCEEDED(hr = IMFTopologyNode_GetItem(node, &MF_TOPONODE_STREAM_DESCRIPTOR, NULL))) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10791