Module: wine Branch: master Commit: 2be95875c0f773f6b393783b061ec0ca8caa6ce8 URL: https://gitlab.winehq.org/wine/wine/-/commit/2be95875c0f773f6b393783b061ec0c...
Author: Rémi Bernon rbernon@codeweavers.com Date: Wed Aug 17 20:46:33 2022 +0200
mf: Support uninitialized downstream media types in topology loader.
---
dlls/mf/tests/mf.c | 2 -- dlls/mf/topology_loader.c | 26 +++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index eb320af92fe..af611fac814 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2746,7 +2746,6 @@ todo_wine {
hr = IMFMediaType_Compare(output_type, (IMFAttributes *)media_type, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &ret); ok(hr == S_OK, "Failed to compare media types, hr %#lx.\n", hr); - todo_wine_if(test->flags & LOADER_SET_MEDIA_TYPES) ok(ret, "Output type of last transform doesn't match sink node type.\n");
IMFTopologyNode_Release(mft_node); @@ -2776,7 +2775,6 @@ todo_wine { ok(!count, "Unexpected count %u.\n", count);
if (test->flags & LOADER_SET_MEDIA_TYPES) - todo_wine ok(handler.enum_count, "got %lu GetMediaTypeByIndex\n", handler.enum_count); else ok(!handler.enum_count, "got %lu GetMediaTypeByIndex\n", handler.enum_count); diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index eb652f526dd..ab694379237 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -335,6 +335,30 @@ static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNEC return hr; }
+static HRESULT topology_branch_get_current_type(IMFMediaTypeHandler *handler, IMFMediaType **type) +{ + IMFMediaType *media_type; + HRESULT hr; + DWORD i; + + hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, type); + if (hr != MF_E_NOT_INITIALIZED) + return hr; + + for (i = 0; SUCCEEDED(hr = IMFMediaTypeHandler_GetMediaTypeByIndex(handler, i, &media_type)); i++) + { + if (SUCCEEDED(hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, media_type, NULL))) + { + *type = media_type; + return hr; + } + + IMFMediaType_Release(media_type); + } + + return hr; +} + static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_METHOD method_mask, struct topology_branch *branch, IMFMediaType *up_type) { @@ -353,7 +377,7 @@ static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_ME if (FAILED(hr = topology_node_get_type_handler(branch->down.node, branch->down.stream, FALSE, &down_handler))) return hr;
- if (SUCCEEDED(hr = IMFMediaTypeHandler_GetCurrentMediaType(down_handler, &down_type)) + if (SUCCEEDED(hr = topology_branch_get_current_type(down_handler, &down_type)) && IMFMediaType_IsEqual(up_type, down_type, &flags) == S_OK) { TRACE("Connecting branch %s with current type %p.\n", debugstr_topology_branch(branch), up_type);