In preparation for fixes to the topology loader graph resolution.
From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 193 +++++++++++++-------------------------------- 1 file changed, 56 insertions(+), 137 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 00be50c8494..a473a44db6c 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -2064,10 +2064,40 @@ enum loader_test_flags
static void test_topology_loader(void) { - static const struct loader_test + static const media_type_desc audio_pcm_44100 = { - media_type_desc input_type; - media_type_desc output_type; + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), + ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), + ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), + ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), + ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), + ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), + }; + static const media_type_desc audio_pcm_48000 = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), + ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), + ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), + ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000), + ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 48000), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), + ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), + }; + static const media_type_desc audio_mp3_44100 = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), + ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_MP3), + ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), + ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), + ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16000), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), + }; + + const struct loader_test + { + const media_type_desc *input_type; + const media_type_desc *output_type; MF_CONNECT_METHOD method; HRESULT expected_result; unsigned int flags; @@ -2076,152 +2106,37 @@ static void test_topology_loader(void) { { /* PCM -> PCM, same type */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_DIRECT, - S_OK, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .expected_result = S_OK, }, - { /* PCM -> PCM, different bps. */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 48000), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_DIRECT, - MF_E_INVALIDMEDIATYPE, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .expected_result = MF_E_INVALIDMEDIATYPE, }, - { /* PCM -> PCM, different bps. */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 48000), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_ALLOW_CONVERTER, - S_OK, - LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_ALLOW_CONVERTER, + .expected_result = S_OK, + .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, },
{ /* MP3 -> PCM */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_MP3), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16000), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_DIRECT, - MF_E_INVALIDMEDIATYPE, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .expected_result = MF_E_INVALIDMEDIATYPE, }, - { /* MP3 -> PCM */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_MP3), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16000), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_ALLOW_CONVERTER, - MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION, - LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_TODO, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_CONVERTER, + .expected_result = MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION, + .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_TODO, }, - { /* MP3 -> PCM */ - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_MP3), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16000), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - }, - { - ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), - ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), - ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), - }, - - MF_CONNECT_ALLOW_DECODER, - S_OK, - LOADER_EXPECTED_DECODER | LOADER_TODO, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_DECODER, + .expected_result = S_OK, + .flags = LOADER_EXPECTED_DECODER | LOADER_TODO, }, };
@@ -2346,8 +2261,10 @@ static void test_topology_loader(void) { const struct loader_test *test = &loader_tests[i];
- init_media_type(input_type, test->input_type, -1); - init_media_type(output_type, test->output_type, -1); + winetest_push_context("%u", i); + + init_media_type(input_type, *test->input_type, -1); + init_media_type(output_type, *test->output_type, -1);
hr = MFCreateSampleGrabberSinkActivate(output_type, &test_grabber_callback, &sink_activate); ok(hr == S_OK, "Failed to create grabber sink, hr %#lx.\n", hr); @@ -2361,11 +2278,11 @@ static void test_topology_loader(void)
hr = IMFTopoLoader_Load(loader, topology, &full_topology, NULL); if (test->flags & LOADER_NEEDS_VIDEO_PROCESSOR && !has_video_processor) - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx on test %u.\n", hr, i); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx\n", hr); else { todo_wine_if(test->flags & LOADER_TODO) - ok(hr == test->expected_result, "Unexpected hr %#lx on test %u.\n", hr, i); + ok(hr == test->expected_result, "Unexpected hr %#lx\n", hr); ok(full_topology != topology, "Unexpected instance.\n"); }
@@ -2505,6 +2422,8 @@ todo_wine { ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ref = IMFActivate_Release(sink_activate); ok(ref == 0, "Release returned %ld\n", ref); + + winetest_pop_context(); }
ref = IMFTopology_Release(topology);
From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 150 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 121 insertions(+), 29 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index a473a44db6c..93d0502c91d 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -1987,27 +1987,19 @@ static void init_media_type(IMFMediaType *mediatype, const struct attribute_desc } }
-static void init_source_node(IMFMediaType *mediatype, IMFMediaSource *source, IMFTopologyNode *node) +static void init_source_node(IMFMediaSource *source, IMFTopologyNode *node, + UINT enum_types_count, IMFMediaType **enum_types, const media_type_desc *current_desc) { IMFPresentationDescriptor *pd; - IMFMediaTypeHandler *handler; IMFStreamDescriptor *sd; HRESULT hr;
hr = IMFTopologyNode_DeleteAllItems(node); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- hr = MFCreateStreamDescriptor(0, 1, &mediatype, &sd); + hr = MFCreateStreamDescriptor(0, enum_types_count, enum_types, &sd); ok(hr == S_OK, "Failed to create stream descriptor, hr %#lx.\n", hr);
- hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler); - ok(hr == S_OK, "Failed to get media type handler, hr %#lx.\n", hr); - - hr = IMFMediaTypeHandler_SetCurrentMediaType(handler, mediatype); - ok(hr == S_OK, "Failed to set current media type, hr %#lx.\n", hr); - - IMFMediaTypeHandler_Release(handler); - hr = MFCreatePresentationDescriptor(1, &sd, &pd); ok(hr == S_OK, "Failed to create presentation descriptor, hr %#lx.\n", hr);
@@ -2025,10 +2017,28 @@ static void init_source_node(IMFMediaType *mediatype, IMFMediaSource *source, IM ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); }
+ if (current_desc) + { + IMFMediaTypeHandler *handler; + IMFMediaType *type; + + hr = MFCreateMediaType(&type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(type, *current_desc, -1); + + hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaTypeHandler_SetCurrentMediaType(handler, type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IMFMediaTypeHandler_Release(handler); + IMFMediaType_Release(type); + } + IMFStreamDescriptor_Release(sd); }
-static void init_sink_node(IMFActivate *sink_activate, unsigned int method, IMFTopologyNode *node) +static void init_sink_node(IMFActivate *sink_activate, MF_CONNECT_METHOD method, IMFTopologyNode *node) { IMFStreamSink *stream_sink; IMFMediaSink *sink; @@ -2060,6 +2070,7 @@ enum loader_test_flags LOADER_EXPECTED_CONVERTER = 0x2, LOADER_TODO = 0x4, LOADER_NEEDS_VIDEO_PROCESSOR = 0x8, + LOADER_SET_ENUMERATE_SOURCE_TYPES = 0x10, };
static void test_topology_loader(void) @@ -2093,11 +2104,21 @@ static void test_topology_loader(void) ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16000), ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), }; + static const media_type_desc audio_pcm_44100_incomplete = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), + ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), + ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 1), + ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 1), + ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 8), + };
const struct loader_test { const media_type_desc *input_type; const media_type_desc *output_type; + const media_type_desc *current_input; MF_CONNECT_METHOD method; HRESULT expected_result; unsigned int flags; @@ -2105,36 +2126,102 @@ static void test_topology_loader(void) loader_tests[] = { { - /* PCM -> PCM, same type */ + /* PCM -> PCM, same enumerated type, no current type */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .expected_result = S_OK, + .flags = LOADER_TODO, + }, + { + /* PCM -> PCM, same enumerated type, incomplete current type */ .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_44100_incomplete, + .expected_result = MF_E_INVALIDMEDIATYPE, + .flags = LOADER_TODO, + }, + { + /* PCM -> PCM, same enumerated bps, different current bps */ + .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_44100, + .expected_result = MF_E_INVALIDMEDIATYPE, + }, + { + /* PCM -> PCM, same enumerated bps, different current bps, force enumerate */ + .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_44100, .expected_result = S_OK, + .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, }, + { - /* PCM -> PCM, different bps. */ + /* PCM -> PCM, incomplete enumerated type, same current type */ + .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_44100, + .expected_result = S_OK, + }, + { + /* PCM -> PCM, incomplete enumerated type, same current type, force enumerate */ + .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_44100, + .expected_result = MF_E_NO_MORE_TYPES, + .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES | LOADER_TODO, + }, + + { + /* PCM -> PCM, different enumerated bps, no current type */ .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, .expected_result = MF_E_INVALIDMEDIATYPE, + .flags = LOADER_TODO, + }, + { + /* PCM -> PCM, different enumerated bps, same current bps */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_48000, + .expected_result = S_OK, }, { - /* PCM -> PCM, different bps. */ + /* PCM -> PCM, different enumerated bps, same current bps, force enumerate */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .current_input = &audio_pcm_48000, + .expected_result = MF_E_NO_MORE_TYPES, + .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, + }, + { + /* PCM -> PCM, different enumerated bps, no current type, allow converter */ .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_ALLOW_CONVERTER, .expected_result = S_OK, .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, }, + { + /* PCM -> PCM, different enumerated bps, no current type, allow decoder */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_ALLOW_DECODER, + .expected_result = S_OK, + .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, + },
{ /* MP3 -> PCM */ .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .current_input = &audio_mp3_44100, .expected_result = MF_E_INVALIDMEDIATYPE, }, + { + /* MP3 -> PCM, force enumerate */ + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .current_input = &audio_mp3_44100, + .expected_result = MF_E_NO_MORE_TYPES, + .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, + }, { /* MP3 -> PCM */ .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_CONVERTER, + .current_input = &audio_mp3_44100, .expected_result = MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION, .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_TODO, }, { /* MP3 -> PCM */ .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_DECODER, + .current_input = &audio_mp3_44100, .expected_result = S_OK, .flags = LOADER_EXPECTED_DECODER | LOADER_TODO, }, @@ -2269,16 +2356,21 @@ static void test_topology_loader(void) hr = MFCreateSampleGrabberSinkActivate(output_type, &test_grabber_callback, &sink_activate); ok(hr == S_OK, "Failed to create grabber sink, hr %#lx.\n", hr);
- init_source_node(input_type, source, src_node); + init_source_node(source, src_node, 1, &input_type, test->current_input); init_sink_node(sink_activate, test->method, sink_node);
hr = IMFTopology_GetCount(topology, &count); ok(hr == S_OK, "Failed to get attribute count, hr %#lx.\n", hr); ok(!count, "Unexpected count %u.\n", count);
+ if (test->flags & LOADER_SET_ENUMERATE_SOURCE_TYPES) + IMFTopology_SetUINT32(topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES, 1); hr = IMFTopoLoader_Load(loader, topology, &full_topology, NULL); + IMFTopology_DeleteItem(topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES); + if (test->flags & LOADER_NEEDS_VIDEO_PROCESSOR && !has_video_processor) - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE || hr == MF_E_TOPO_CODEC_NOT_FOUND, + "Unexpected hr %#lx\n", hr); else { todo_wine_if(test->flags & LOADER_TODO) @@ -2297,7 +2389,8 @@ static void test_topology_loader(void) hr = IMFTopology_GetCount(full_topology, &count); ok(hr == S_OK, "Failed to get attribute count, hr %#lx.\n", hr); todo_wine - ok(count == 1, "Unexpected count %u.\n", count); + ok(count == (test->flags & LOADER_SET_ENUMERATE_SOURCE_TYPES ? 2 : 1), + "Unexpected count %u.\n", count);
value = 0xdeadbeef; hr = IMFTopology_GetUINT32(full_topology, &MF_TOPOLOGY_RESOLUTION_STATUS, &value); @@ -2456,6 +2549,14 @@ todo_wine {
static void test_topology_loader_evr(void) { + static const media_type_desc media_type_desc = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), + ATTR_RATIO(MF_MT_FRAME_SIZE, 640, 480), + ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE), + {0}, + }; IMFTopologyNode *node, *source_node, *evr_node; IMFTopology *topology, *full_topology; IMFMediaTypeHandler *handler; @@ -2483,17 +2584,8 @@ static void test_topology_loader_evr(void)
hr = MFCreateMediaType(&media_type); ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); - - hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFVideoFormat_RGB32); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)640 << 32 | 480); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - init_source_node(media_type, NULL, source_node); + init_media_type(media_type, media_type_desc, -1); + init_source_node(NULL, source_node, 1, &media_type, &media_type_desc);
/* EVR sink node. */ window = create_window();
From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 70 ++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 24 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 93d0502c91d..87a834a0f7b 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -1987,7 +1987,7 @@ static void init_media_type(IMFMediaType *mediatype, const struct attribute_desc } }
-static void init_source_node(IMFMediaSource *source, IMFTopologyNode *node, +static void init_source_node(IMFMediaSource *source, MF_CONNECT_METHOD method, IMFTopologyNode *node, UINT enum_types_count, IMFMediaType **enum_types, const media_type_desc *current_desc) { IMFPresentationDescriptor *pd; @@ -2011,6 +2011,12 @@ static void init_source_node(IMFMediaSource *source, IMFTopologyNode *node, hr = IMFTopologyNode_SetUnknown(node, &MF_TOPONODE_STREAM_DESCRIPTOR, (IUnknown *)sd); ok(hr == S_OK, "Failed to set node sd, hr %#lx.\n", hr);
+ if (method != -1) + { + hr = IMFTopologyNode_SetUINT32(node, &MF_TOPONODE_CONNECT_METHOD, method); + ok(hr == S_OK, "Failed to set connect method, hr %#lx.\n", hr); + } + if (source) { hr = IMFTopologyNode_SetUnknown(node, &MF_TOPONODE_SOURCE, (IUnknown *)source); @@ -2060,8 +2066,11 @@ static void init_sink_node(IMFActivate *sink_activate, MF_CONNECT_METHOD method,
IMFStreamSink_Release(stream_sink);
- hr = IMFTopologyNode_SetUINT32(node, &MF_TOPONODE_CONNECT_METHOD, method); - ok(hr == S_OK, "Failed to set connect method, hr %#lx.\n", hr); + if (method != -1) + { + hr = IMFTopologyNode_SetUINT32(node, &MF_TOPONODE_CONNECT_METHOD, method); + ok(hr == S_OK, "Failed to set connect method, hr %#lx.\n", hr); + } }
enum loader_test_flags @@ -2119,7 +2128,8 @@ static void test_topology_loader(void) const media_type_desc *input_type; const media_type_desc *output_type; const media_type_desc *current_input; - MF_CONNECT_METHOD method; + MF_CONNECT_METHOD source_method; + MF_CONNECT_METHOD sink_method; HRESULT expected_result; unsigned int flags; } @@ -2127,26 +2137,26 @@ static void test_topology_loader(void) { { /* PCM -> PCM, same enumerated type, no current type */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .expected_result = S_OK, .flags = LOADER_TODO, }, { /* PCM -> PCM, same enumerated type, incomplete current type */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_44100_incomplete, .expected_result = MF_E_INVALIDMEDIATYPE, .flags = LOADER_TODO, }, { /* PCM -> PCM, same enumerated bps, different current bps */ - .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_44100, .expected_result = MF_E_INVALIDMEDIATYPE, }, { /* PCM -> PCM, same enumerated bps, different current bps, force enumerate */ - .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_48000, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_44100, .expected_result = S_OK, .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, @@ -2154,13 +2164,13 @@ static void test_topology_loader(void)
{ /* PCM -> PCM, incomplete enumerated type, same current type */ - .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_44100, .expected_result = S_OK, }, { /* PCM -> PCM, incomplete enumerated type, same current type, force enumerate */ - .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100_incomplete, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_44100, .expected_result = MF_E_NO_MORE_TYPES, .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES | LOADER_TODO, @@ -2168,59 +2178,71 @@ static void test_topology_loader(void)
{ /* PCM -> PCM, different enumerated bps, no current type */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .expected_result = MF_E_INVALIDMEDIATYPE, .flags = LOADER_TODO, }, { /* PCM -> PCM, different enumerated bps, same current bps */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_48000, .expected_result = S_OK, }, { /* PCM -> PCM, different enumerated bps, same current bps, force enumerate */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_DIRECT, + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_pcm_48000, .expected_result = MF_E_NO_MORE_TYPES, .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, }, { - /* PCM -> PCM, different enumerated bps, no current type, allow converter */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_ALLOW_CONVERTER, + /* PCM -> PCM, different enumerated bps, no current type, sink allow converter */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_ALLOW_CONVERTER, .source_method = MF_CONNECT_DIRECT, .expected_result = S_OK, .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, }, { - /* PCM -> PCM, different enumerated bps, no current type, allow decoder */ - .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .method = MF_CONNECT_ALLOW_DECODER, + /* PCM -> PCM, different enumerated bps, no current type, sink allow decoder */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_ALLOW_DECODER, .source_method = MF_CONNECT_DIRECT, .expected_result = S_OK, .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, }, + { + /* PCM -> PCM, different enumerated bps, no current type, default methods */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = -1, .source_method = -1, + .expected_result = S_OK, + .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_EXPECTED_CONVERTER | LOADER_TODO, + }, + { + /* PCM -> PCM, different enumerated bps, no current type, source allow converter */ + .input_type = &audio_pcm_44100, .output_type = &audio_pcm_48000, .sink_method = MF_CONNECT_DIRECT, .source_method = MF_CONNECT_ALLOW_CONVERTER, + .expected_result = MF_E_INVALIDMEDIATYPE, + .flags = LOADER_TODO, + },
{ /* MP3 -> PCM */ - .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_mp3_44100, .expected_result = MF_E_INVALIDMEDIATYPE, }, { /* MP3 -> PCM, force enumerate */ - .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_DIRECT, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_DIRECT, .source_method = -1, .current_input = &audio_mp3_44100, .expected_result = MF_E_NO_MORE_TYPES, .flags = LOADER_SET_ENUMERATE_SOURCE_TYPES, }, { /* MP3 -> PCM */ - .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_CONVERTER, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_ALLOW_CONVERTER, .source_method = -1, .current_input = &audio_mp3_44100, .expected_result = MF_E_TRANSFORM_NOT_POSSIBLE_FOR_CURRENT_MEDIATYPE_COMBINATION, .flags = LOADER_NEEDS_VIDEO_PROCESSOR | LOADER_TODO, }, { /* MP3 -> PCM */ - .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .method = MF_CONNECT_ALLOW_DECODER, + .input_type = &audio_mp3_44100, .output_type = &audio_pcm_44100, .sink_method = MF_CONNECT_ALLOW_DECODER, .source_method = -1, .current_input = &audio_mp3_44100, .expected_result = S_OK, .flags = LOADER_EXPECTED_DECODER | LOADER_TODO, @@ -2356,8 +2378,8 @@ static void test_topology_loader(void) hr = MFCreateSampleGrabberSinkActivate(output_type, &test_grabber_callback, &sink_activate); ok(hr == S_OK, "Failed to create grabber sink, hr %#lx.\n", hr);
- init_source_node(source, src_node, 1, &input_type, test->current_input); - init_sink_node(sink_activate, test->method, sink_node); + init_source_node(source, test->source_method, src_node, 1, &input_type, test->current_input); + init_sink_node(sink_activate, test->sink_method, sink_node);
hr = IMFTopology_GetCount(topology, &count); ok(hr == S_OK, "Failed to get attribute count, hr %#lx.\n", hr); @@ -2585,7 +2607,7 @@ static void test_topology_loader_evr(void) hr = MFCreateMediaType(&media_type); ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); init_media_type(media_type, media_type_desc, -1); - init_source_node(NULL, source_node, 1, &media_type, &media_type_desc); + init_source_node(NULL, -1, source_node, 1, &media_type, &media_type_desc);
/* EVR sink node. */ window = create_window();
From: Rémi Bernon rbernon@codeweavers.com
To topology_node_get_type_handler.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/topology.c | 74 +++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-)
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index 34c20dbc735..29f34445bc5 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -1820,6 +1820,41 @@ HRESULT WINAPI MFCreateTopologyNode(MF_TOPOLOGY_TYPE node_type, IMFTopologyNode return hr; }
+static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, IMFMediaTypeHandler **handler) +{ + MF_TOPOLOGY_TYPE node_type; + IMFStreamSink *stream_sink; + IMFStreamDescriptor *sd; + HRESULT hr; + + if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type))) + return hr; + + switch (node_type) + { + case MF_TOPOLOGY_OUTPUT_NODE: + if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink))) + { + hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, handler); + IMFStreamSink_Release(stream_sink); + } + break; + case MF_TOPOLOGY_SOURCESTREAM_NODE: + if (SUCCEEDED(hr = IMFTopologyNode_GetUnknown(node, &MF_TOPONODE_STREAM_DESCRIPTOR, + &IID_IMFStreamDescriptor, (void **)&sd))) + { + hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, handler); + IMFStreamDescriptor_Release(sd); + } + break; + default: + WARN("Unexpected node type %u.\n", node_type); + return MF_E_UNEXPECTED; + } + + return hr; +} + /*********************************************************************** * MFGetTopoNodeCurrentType (mf.@) */ @@ -2168,41 +2203,6 @@ static HRESULT connect_to_converter(struct transform_output_type *output_type, s typedef HRESULT (*p_topology_loader_connect_func)(struct topoloader_context *context, IMFTopologyNode *upstream_node, unsigned int output_index, IMFTopologyNode *downstream_node, unsigned int input_index);
-static HRESULT topology_loader_get_node_type_handler(IMFTopologyNode *node, IMFMediaTypeHandler **handler) -{ - MF_TOPOLOGY_TYPE node_type; - IMFStreamSink *stream_sink; - IMFStreamDescriptor *sd; - HRESULT hr; - - if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type))) - return hr; - - switch (node_type) - { - case MF_TOPOLOGY_OUTPUT_NODE: - if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink))) - { - hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, handler); - IMFStreamSink_Release(stream_sink); - } - break; - case MF_TOPOLOGY_SOURCESTREAM_NODE: - if (SUCCEEDED(hr = IMFTopologyNode_GetUnknown(node, &MF_TOPONODE_STREAM_DESCRIPTOR, - &IID_IMFStreamDescriptor, (void **)&sd))) - { - hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, handler); - IMFStreamDescriptor_Release(sd); - } - break; - default: - WARN("Unexpected node type %u.\n", node_type); - return MF_E_UNEXPECTED; - } - - return hr; -} - static HRESULT topology_loader_get_mft_categories(IMFMediaTypeHandler *handler, GUID *decode_cat, GUID *convert_cat) { GUID major; @@ -2291,10 +2291,10 @@ static HRESULT topology_loader_connect_source_to_sink(struct topoloader_context
TRACE("attempting to connect %p:%u to %p:%u\n", source, output_index, sink, input_index);
- if (FAILED(hr = topology_loader_get_node_type_handler(source, &source_handler))) + if (FAILED(hr = topology_node_get_type_handler(source, &source_handler))) goto done;
- if (FAILED(hr = topology_loader_get_node_type_handler(sink, &sink_handler))) + if (FAILED(hr = topology_node_get_type_handler(sink, &sink_handler))) goto done;
if (FAILED(IMFTopologyNode_GetUINT32(source, &MF_TOPONODE_CONNECT_METHOD, &source_method)))
From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/topology.c | 59 ++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 41 deletions(-)
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index 29f34445bc5..e158ba1fc82 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -1820,7 +1820,8 @@ HRESULT WINAPI MFCreateTopologyNode(MF_TOPOLOGY_TYPE node_type, IMFTopologyNode return hr; }
-static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, IMFMediaTypeHandler **handler) +static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, DWORD stream, + BOOL output, IMFMediaTypeHandler **handler) { MF_TOPOLOGY_TYPE node_type; IMFStreamSink *stream_sink; @@ -1833,6 +1834,9 @@ static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, IMFMediaTyp switch (node_type) { case MF_TOPOLOGY_OUTPUT_NODE: + if (output || stream) + return MF_E_INVALIDSTREAMNUMBER; + if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink))) { hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, handler); @@ -1840,6 +1844,9 @@ static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, IMFMediaTyp } break; case MF_TOPOLOGY_SOURCESTREAM_NODE: + if (!output || stream) + return MF_E_INVALIDSTREAMNUMBER; + if (SUCCEEDED(hr = IMFTopologyNode_GetUnknown(node, &MF_TOPONODE_STREAM_DESCRIPTOR, &IID_IMFStreamDescriptor, (void **)&sd))) { @@ -1860,10 +1867,8 @@ static HRESULT topology_node_get_type_handler(IMFTopologyNode *node, IMFMediaTyp */ HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD stream, BOOL output, IMFMediaType **type) { - IMFMediaTypeHandler *type_handler; + IMFMediaTypeHandler *handler; MF_TOPOLOGY_TYPE node_type; - IMFStreamSink *stream_sink; - IMFStreamDescriptor *sd; IMFTransform *transform; UINT32 primary_output; HRESULT hr; @@ -1873,42 +1878,15 @@ HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD stream, BOO if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type))) return hr;
- switch (node_type) + if (SUCCEEDED(hr = topology_node_get_type_handler(node, stream, output, &handler))) { - case MF_TOPOLOGY_OUTPUT_NODE: - if (output || stream) - return MF_E_INVALIDSTREAMNUMBER; - - if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink))) - { - hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, &type_handler); - IMFStreamSink_Release(stream_sink); - - if (SUCCEEDED(hr)) - { - hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, type); - IMFMediaTypeHandler_Release(type_handler); - } - } - break; - case MF_TOPOLOGY_SOURCESTREAM_NODE: - if (!output || stream) - return MF_E_INVALIDSTREAMNUMBER; - - if (FAILED(hr = IMFTopologyNode_GetUnknown(node, &MF_TOPONODE_STREAM_DESCRIPTOR, &IID_IMFStreamDescriptor, - (void **)&sd))) - { - return hr; - } + hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, type); + IMFMediaTypeHandler_Release(handler); + return hr; + }
- hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &type_handler); - IMFStreamDescriptor_Release(sd); - if (SUCCEEDED(hr)) - { - hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, type); - IMFMediaTypeHandler_Release(type_handler); - } - break; + switch (node_type) + { case MF_TOPOLOGY_TRANSFORM_NODE: if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFTransform, (void **)&transform))) { @@ -2291,10 +2269,9 @@ static HRESULT topology_loader_connect_source_to_sink(struct topoloader_context
TRACE("attempting to connect %p:%u to %p:%u\n", source, output_index, sink, input_index);
- if (FAILED(hr = topology_node_get_type_handler(source, &source_handler))) + if (FAILED(hr = topology_node_get_type_handler(source, output_index, TRUE, &source_handler))) goto done; - - if (FAILED(hr = topology_node_get_type_handler(sink, &sink_handler))) + if (FAILED(hr = topology_node_get_type_handler(sink, input_index, FALSE, &sink_handler))) goto done;
if (FAILED(IMFTopologyNode_GetUINT32(source, &MF_TOPONODE_CONNECT_METHOD, &source_method)))
This merge request was approved by Nikolay Sivov.