From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 66 ++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 25 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index b77b5f9c538..6fabc482f0a 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -1921,6 +1921,43 @@ static BOOL source_reader_allow_video_processor(struct source_reader *reader, BO return *advanced; }
+static HRESULT source_reader_create_transform(struct source_reader *reader, BOOL decoder, BOOL allow_processor, + IMFMediaType *input_type, IMFMediaType *output_type, struct transform_entry **out); + +static HRESULT source_reader_connect_transform(struct source_reader *reader, BOOL allow_processor, + IMFMediaType *input_type, IMFMediaType *output_type, IMFTransform *transform, + struct transform_entry *entry) +{ + IMFMediaType *media_type; + HRESULT hr; + + if (SUCCEEDED(hr = IMFTransform_SetInputType(transform, 0, input_type, 0)) + && SUCCEEDED(hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type))) + { + if (SUCCEEDED(hr = update_media_type_from_upstream(output_type, media_type)) + && FAILED(hr = IMFTransform_SetOutputType(transform, 0, output_type, 0)) && allow_processor + && SUCCEEDED(hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type))) + { + struct transform_entry *converter; + + if (SUCCEEDED(hr = IMFTransform_SetOutputType(transform, 0, media_type, 0)) + && SUCCEEDED(hr = update_media_type_from_upstream(output_type, media_type)) + && SUCCEEDED(hr = source_reader_create_transform(reader, FALSE, FALSE, media_type, output_type, &converter))) + list_add_tail(&entry->entry, &converter->entry); + + IMFMediaType_Release(media_type); + } + + if (SUCCEEDED(hr)) + { + entry->transform = transform; + return S_OK; + } + } + + return hr; +} + static HRESULT source_reader_create_transform(struct source_reader *reader, BOOL decoder, BOOL allow_processor, IMFMediaType *input_type, IMFMediaType *output_type, struct transform_entry **out) { @@ -1970,35 +2007,14 @@ static HRESULT source_reader_create_transform(struct source_reader *reader, BOOL
for (i = 0; i < count; i++) { - IMFMediaType *media_type; - if (FAILED(hr = CoCreateInstance(&classes[i], NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)&transform))) break; - if (SUCCEEDED(hr = IMFTransform_SetInputType(transform, 0, input_type, 0)) - && SUCCEEDED(hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type))) + if (SUCCEEDED(hr = source_reader_connect_transform(reader, allow_processor, input_type, output_type, transform, entry))) { - if (SUCCEEDED(hr = update_media_type_from_upstream(output_type, media_type)) - && FAILED(hr = IMFTransform_SetOutputType(transform, 0, output_type, 0)) && allow_processor - && SUCCEEDED(hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type))) - { - struct transform_entry *converter; - - if (SUCCEEDED(hr = IMFTransform_SetOutputType(transform, 0, media_type, 0)) - && SUCCEEDED(hr = update_media_type_from_upstream(output_type, media_type)) - && SUCCEEDED(hr = source_reader_create_transform(reader, FALSE, FALSE, media_type, output_type, &converter))) - list_add_tail(&entry->entry, &converter->entry); - - IMFMediaType_Release(media_type); - } - - if (SUCCEEDED(hr)) - { - entry->transform = transform; - *out = entry; - return S_OK; - } + *out = entry; + entry = NULL; + break; } - IMFTransform_Release(transform); }