From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 104 ++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 48 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index a9d25848e7b..de47d07df0d 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -1997,6 +1997,58 @@ 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) +{ + IMFAttributes *attributes; + IMFMediaType *media_type; + HRESULT hr; + + if (!reader->device_manager || FAILED(IMFTransform_GetAttributes(transform, &attributes))) + entry->attributes_initialized = TRUE; + else + { + UINT32 d3d_aware = FALSE; + + if (reader->flags & SOURCE_READER_DXGI_DEVICE_MANAGER) + { + if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D11_AWARE, &d3d_aware)) && d3d_aware) + IMFTransform_ProcessMessage(transform, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)reader->device_manager); + } + else if (reader->flags & SOURCE_READER_D3D9_DEVICE_MANAGER) + { + if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &d3d_aware)) && d3d_aware) + IMFTransform_ProcessMessage(transform, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)reader->device_manager); + } + + entry->attributes_initialized = !d3d_aware; + IMFAttributes_Release(attributes); + } + + 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); + } + } + + 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) { @@ -2047,58 +2099,14 @@ static HRESULT source_reader_create_transform(struct source_reader *reader, BOOL
for (i = 0; i < count; i++) { - IMFAttributes *attributes; - IMFMediaType *media_type; - if (FAILED(hr = IMFActivate_ActivateObject(activates[i], &IID_IMFTransform, (void **)&transform))) continue; - - if (!reader->device_manager || FAILED(IMFTransform_GetAttributes(transform, &attributes))) - entry->attributes_initialized = TRUE; - else - { - UINT32 d3d_aware = FALSE; - - if (reader->flags & SOURCE_READER_DXGI_DEVICE_MANAGER) - { - if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D11_AWARE, &d3d_aware)) && d3d_aware) - IMFTransform_ProcessMessage(transform, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)reader->device_manager); - } - else if (reader->flags & SOURCE_READER_D3D9_DEVICE_MANAGER) - { - if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &d3d_aware)) && d3d_aware) - IMFTransform_ProcessMessage(transform, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)reader->device_manager); - } - - entry->attributes_initialized = !d3d_aware; - IMFAttributes_Release(attributes); - } - - 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; - break; - } + entry->transform = transform; + *out = entry; + break; } - IMFTransform_Release(transform); }