From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 50 +++++++++++++++++++++++++++++++-- dlls/mfreadwrite/tests/mfplat.c | 20 ++++++------- 2 files changed, 58 insertions(+), 12 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 9ff34f77151..82fb650601e 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -77,6 +77,7 @@ struct transform_entry IMFTransform *transform; unsigned int min_buffer_size; GUID category; + BOOL hidden; };
struct media_stream @@ -1997,6 +1998,15 @@ static HRESULT source_reader_create_decoder_for_stream(struct source_reader *rea { stream->transform_service = entry->transform; IMFTransform_AddRef(stream->transform_service); + + /* converters are hidden from the stream transforms */ + if (service != entry) + service->hidden = TRUE; + } + else + { + /* converters are hidden from the stream transforms */ + entry->hidden = TRUE; } }
@@ -2431,12 +2441,48 @@ static HRESULT WINAPI src_reader_RemoveAllTransformsForStream(IMFSourceReaderEx return E_NOTIMPL; }
+static struct transform_entry *get_transform_at_index(struct media_stream *stream, UINT index) +{ + struct transform_entry *entry; + + LIST_FOR_EACH_ENTRY(entry, &stream->transforms, struct transform_entry, entry) + if (!entry->hidden && !index--) + return entry; + + return NULL; +} + static HRESULT WINAPI src_reader_GetTransformForStream(IMFSourceReaderEx *iface, DWORD stream_index, DWORD transform_index, GUID *category, IMFTransform **transform) { - FIXME("%p, %#lx, %#lx, %p, %p.\n", iface, stream_index, transform_index, category, transform); + struct source_reader *reader = impl_from_IMFSourceReaderEx(iface); + struct transform_entry *entry; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %#lx, %#lx, %p, %p.\n", iface, stream_index, transform_index, category, transform); + + EnterCriticalSection(&reader->cs); + + if (stream_index == MF_SOURCE_READER_FIRST_VIDEO_STREAM) + stream_index = reader->first_video_stream_index; + else if (stream_index == MF_SOURCE_READER_FIRST_AUDIO_STREAM) + stream_index = reader->first_audio_stream_index; + + if (stream_index >= reader->stream_count) + hr = MF_E_INVALIDSTREAMNUMBER; + else if (!(entry = get_transform_at_index(&reader->streams[stream_index], transform_index))) + hr = MF_E_INVALIDINDEX; + else + { + *category = entry->category; + *transform = entry->transform; + IMFTransform_AddRef(*transform); + hr = S_OK; + } + + LeaveCriticalSection(&reader->cs); + + return hr; }
static const IMFSourceReaderExVtbl srcreader_vtbl = diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 91f9641ccfc..aacd3c101b8 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2011,9 +2011,9 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 0, &category, &transform); if (!enable_advanced) - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); else - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (hr == S_OK) { hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); @@ -2030,7 +2030,7 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad }
hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 1, &category, &transform); - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); IMFSourceReaderEx_Release(reader_ex);
IMFSourceReader_Release(reader); @@ -2123,9 +2123,9 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 0, &category, &transform); if (!enable_processing && !enable_advanced) - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); else - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (hr == S_OK) { hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); @@ -2144,9 +2144,9 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad /* the video processor can be accessed at index 1 with MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING */ hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 1, &category, &transform); if (!enable_advanced) - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); else - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (hr == S_OK) { hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); @@ -2163,7 +2163,7 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad }
hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 2, &category, &transform); - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); IMFSourceReaderEx_Release(reader_ex);
/* H264 -> NV12 conversion */ @@ -2212,7 +2212,7 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad hr = IMFSourceReader_QueryInterface(reader, &IID_IMFSourceReaderEx, (void **)&reader_ex); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 0, &category, &transform); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (hr == S_OK) { hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); @@ -2242,7 +2242,7 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad }
hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 1, &category, &transform); - todo_wine ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDINDEX, "Unexpected hr %#lx.\n", hr); IMFSourceReaderEx_Release(reader_ex);
skip_tests: