Commit 935e3d12 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

mf: Only enumerate types for decoders / converter if down type is missing.

parent 826a9ce1
...@@ -2349,7 +2349,7 @@ static void test_topology_loader(void) ...@@ -2349,7 +2349,7 @@ static void test_topology_loader(void)
.input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_ALLOW_CONVERTER, .source_method = -1, .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_ALLOW_CONVERTER, .source_method = -1,
.current_input = &audio_pcm_48000, .current_input = &audio_pcm_48000,
.expected_result = S_OK, .expected_result = S_OK,
.flags = LOADER_EXPECTED_CONVERTER | LOADER_SET_ENUMERATE_SOURCE_TYPES | LOADER_TODO, .flags = LOADER_EXPECTED_CONVERTER | LOADER_SET_ENUMERATE_SOURCE_TYPES,
}, },
{ {
/* PCM -> PCM, different enumerated bps, no current type, sink allow decoder */ /* PCM -> PCM, different enumerated bps, no current type, sink allow decoder */
...@@ -2432,7 +2432,7 @@ static void test_topology_loader(void) ...@@ -2432,7 +2432,7 @@ static void test_topology_loader(void)
/* RGB32 -> Any Video, no current output type, refuse input type */ /* RGB32 -> Any Video, no current output type, refuse input type */
.input_type = &video_i420_1280, .output_type = &video_dummy, .sink_method = -1, .source_method = -1, .input_type = &video_i420_1280, .output_type = &video_dummy, .sink_method = -1, .source_method = -1,
.expected_result = S_OK, .expected_result = S_OK,
.flags = LOADER_NO_CURRENT_OUTPUT | LOADER_SET_INVALID_INPUT | LOADER_EXPECTED_CONVERTER | LOADER_TODO, .flags = LOADER_NO_CURRENT_OUTPUT | LOADER_SET_INVALID_INPUT | LOADER_EXPECTED_CONVERTER,
}, },
}; };
......
...@@ -240,7 +240,7 @@ static HRESULT topology_branch_fill_media_type(IMFMediaType *up_type, IMFMediaTy ...@@ -240,7 +240,7 @@ static HRESULT topology_branch_fill_media_type(IMFMediaType *up_type, IMFMediaTy
} }
static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD method_mask, static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD method_mask,
struct topology_branch *branch); struct topology_branch *branch, BOOL enumerate_source_types);
static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_METHOD method_mask, static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_METHOD method_mask,
struct topology_branch *branch, IMFMediaType *up_type); struct topology_branch *branch, IMFMediaType *up_type);
static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNECT_METHOD method_mask, static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNECT_METHOD method_mask,
...@@ -318,7 +318,7 @@ static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNEC ...@@ -318,7 +318,7 @@ static HRESULT topology_branch_connect_indirect(IMFTopology *topology, MF_CONNEC
IMFTransform_Release(transform); IMFTransform_Release(transform);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = topology_branch_connect(topology, method_mask, &down_branch); hr = topology_branch_connect(topology, method_mask, &down_branch, !down_type);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = IMFTopology_AddNode(topology, node); hr = IMFTopology_AddNode(topology, node);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
...@@ -411,9 +411,8 @@ static HRESULT topology_branch_foreach_up_types(IMFTopology *topology, MF_CONNEC ...@@ -411,9 +411,8 @@ static HRESULT topology_branch_foreach_up_types(IMFTopology *topology, MF_CONNEC
} }
static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD method_mask, static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD method_mask,
struct topology_branch *branch) struct topology_branch *branch, BOOL enumerate_source_types)
{ {
UINT32 enumerate_source_types;
MF_CONNECT_METHOD method; MF_CONNECT_METHOD method;
HRESULT hr; HRESULT hr;
...@@ -422,8 +421,7 @@ static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD ...@@ -422,8 +421,7 @@ static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD
if (FAILED(IMFTopologyNode_GetUINT32(branch->up.node, &MF_TOPONODE_CONNECT_METHOD, &method))) if (FAILED(IMFTopologyNode_GetUINT32(branch->up.node, &MF_TOPONODE_CONNECT_METHOD, &method)))
method = MF_CONNECT_DIRECT; method = MF_CONNECT_DIRECT;
if (SUCCEEDED(IMFTopology_GetUINT32(topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES, &enumerate_source_types)) if (enumerate_source_types)
&& enumerate_source_types)
{ {
if (method & MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES) if (method & MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES)
hr = topology_branch_foreach_up_types(topology, method_mask & MF_CONNECT_ALLOW_DECODER, branch); hr = topology_branch_foreach_up_types(topology, method_mask & MF_CONNECT_ALLOW_DECODER, branch);
...@@ -456,7 +454,8 @@ static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD ...@@ -456,7 +454,8 @@ static HRESULT topology_branch_connect(IMFTopology *topology, MF_CONNECT_METHOD
return hr; return hr;
} }
static HRESULT topology_loader_resolve_branches(struct topoloader_context *context, struct list *branches) static HRESULT topology_loader_resolve_branches(struct topoloader_context *context, struct list *branches,
BOOL enumerate_source_types)
{ {
struct list new_branches = LIST_INIT(new_branches); struct list new_branches = LIST_INIT(new_branches);
struct topology_branch *branch, *next; struct topology_branch *branch, *next;
...@@ -474,7 +473,8 @@ static HRESULT topology_loader_resolve_branches(struct topoloader_context *conte ...@@ -474,7 +473,8 @@ static HRESULT topology_loader_resolve_branches(struct topoloader_context *conte
else if (FAILED(hr = topology_branch_clone_nodes(context, branch))) else if (FAILED(hr = topology_branch_clone_nodes(context, branch)))
WARN("Failed to clone nodes for branch %s\n", debugstr_topology_branch(branch)); WARN("Failed to clone nodes for branch %s\n", debugstr_topology_branch(branch));
else else
hr = topology_branch_connect(context->output_topology, MF_CONNECT_ALLOW_DECODER, branch); hr = topology_branch_connect(context->output_topology, MF_CONNECT_ALLOW_DECODER,
branch, enumerate_source_types);
topology_branch_destroy(branch); topology_branch_destroy(branch);
if (FAILED(hr)) if (FAILED(hr))
...@@ -639,6 +639,7 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in ...@@ -639,6 +639,7 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
struct list branches = LIST_INIT(branches); struct list branches = LIST_INIT(branches);
struct topoloader_context context = { 0 }; struct topoloader_context context = { 0 };
struct topology_branch *branch, *next; struct topology_branch *branch, *next;
UINT32 enumerate_source_types;
IMFTopology *output_topology; IMFTopology *output_topology;
MF_TOPOLOGY_TYPE node_type; MF_TOPOLOGY_TYPE node_type;
IMFTopologyNode *node; IMFTopologyNode *node;
...@@ -705,8 +706,12 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in ...@@ -705,8 +706,12 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in
if (SUCCEEDED(hr) && list_empty(&branches)) if (SUCCEEDED(hr) && list_empty(&branches))
hr = MF_E_TOPO_UNSUPPORTED; hr = MF_E_TOPO_UNSUPPORTED;
if (FAILED(IMFTopology_GetUINT32(input_topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES,
&enumerate_source_types)))
enumerate_source_types = 0;
while (SUCCEEDED(hr) && !list_empty(&branches)) while (SUCCEEDED(hr) && !list_empty(&branches))
hr = topology_loader_resolve_branches(&context, &branches); hr = topology_loader_resolve_branches(&context, &branches, enumerate_source_types);
LIST_FOR_EACH_ENTRY_SAFE(branch, next, &branches, struct topology_branch, entry) LIST_FOR_EACH_ENTRY_SAFE(branch, next, &branches, struct topology_branch, entry)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment