From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mf/topology_loader.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index 05f999fcaec..9eceb66bb5f 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -265,6 +265,36 @@ static HRESULT update_media_type_from_upstream(IMFMediaType *media_type, IMFMedi return hr; } +static HRESULT topology_branch_is_input_type_supported(struct topology_branch *branch, IMFMediaType *down_type) +{ + HRESULT hr; + + if (topology_node_get_type(branch->down.node) == MF_TOPOLOGY_TRANSFORM_NODE) + { + IMFTransform *transform; + + if (SUCCEEDED(hr = topology_node_get_object(branch->down.node, &IID_IMFTransform, (void **)&transform))) + { + /* Native sets the transform type without using MFT_SET_TYPE_TEST_ONLY. This is required for resolving + * some transform outputs because parameters from the input type appear in the available output types.*/ + hr = IMFTransform_SetInputType(transform, branch->down.stream, down_type, 0); + IMFTransform_Release(transform); + } + } + else + { + IMFMediaTypeHandler *handler; + + if (SUCCEEDED(hr = topology_node_get_type_handler(branch->down.node, branch->down.stream, FALSE, &handler))) + { + hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, down_type, NULL); + IMFMediaTypeHandler_Release(handler); + } + } + + return hr; +} + static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD method_mask, struct topology_branch *branch, BOOL enumerate_source_types); static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_METHOD method_mask, @@ -437,14 +467,10 @@ static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_ME goto done; } - if (SUCCEEDED(hr = IMFMediaTypeHandler_IsMediaTypeSupported(down_handler, up_type, NULL))) + if (SUCCEEDED(hr = topology_branch_is_input_type_supported(branch, up_type))) { TRACE("Connected branch %s with upstream type %s.\n", debugstr_topology_branch(branch), debugstr_media_type(up_type)); - if (topology_node_get_type(branch->down.node) == MF_TOPOLOGY_TRANSFORM_NODE - && FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(down_handler, up_type))) - WARN("Failed to set transform node media type, hr %#lx\n", hr); - hr = IMFTopologyNode_ConnectOutput(branch->up.node, branch->up.stream, branch->down.node, branch->down.stream); goto done; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10009