From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mf/topology_loader.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index 05f999fcaec..8f7b108d693 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -265,6 +265,39 @@ static HRESULT update_media_type_from_upstream(IMFMediaType *media_type, IMFMedi return hr; } +static HRESULT clone_media_type(IMFMediaType *in_type, IMFMediaType **out_type) +{ + IMFMediaType *media_type; + HRESULT hr; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (SUCCEEDED(hr = IMFMediaType_CopyAllItems(in_type, (IMFAttributes *)media_type))) + *out_type = media_type; + else + IMFMediaType_Release(media_type); + + return hr; +} + +static HRESULT clone_media_type_and_update_from_upstream(IMFMediaType *in_type, IMFMediaType *up_type, + IMFMediaType **out_type) +{ + IMFMediaType *media_type; + HRESULT hr; + + if (FAILED(hr = clone_media_type(in_type, &media_type))) + return hr; + + if (SUCCEEDED(hr = update_media_type_from_upstream(media_type, up_type))) + *out_type = media_type; + else + IMFMediaType_Release(media_type); + + 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, @@ -336,11 +369,9 @@ static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNEC IMFTopologyNode_SetGUID(node, &MF_TOPONODE_TRANSFORM_OBJECTID, &guid); hr = topology_branch_connect_down(topology, MF_CONNECT_DIRECT, &up_branch, up_type); - if (down_type && SUCCEEDED(MFCreateMediaType(&media_type))) + if (down_type && SUCCEEDED(clone_media_type_and_update_from_upstream(down_type, up_type, &media_type))) { - if (SUCCEEDED(IMFMediaType_CopyAllItems(down_type, (IMFAttributes *)media_type)) - && SUCCEEDED(update_media_type_from_upstream(media_type, up_type)) - && SUCCEEDED(IMFTransform_SetOutputType(transform, 0, media_type, 0))) + if (SUCCEEDED(IMFTransform_SetOutputType(transform, 0, media_type, 0))) method = MF_CONNECT_DIRECT; IMFMediaType_Release(media_type); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10009