From: Yuxuan Shui <yshui@codeweavers.com> src_reader_SetCurrentMediaType indirectly calls update_media_type on `type` which changes its attributes. This is unexpected. --- dlls/mfreadwrite/reader.c | 20 ++++++++++++++------ dlls/mfreadwrite/tests/mfplat.c | 8 ++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 68b90357928..718c8817198 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -2171,25 +2171,33 @@ static HRESULT source_reader_create_transform(struct source_reader *reader, BOOL && SUCCEEDED(hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type))) { BOOL enable_advanced; + IMFMediaType *output_type_copy = NULL; + + hr = MFCreateMediaType(&output_type_copy); + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(output_type, (IMFAttributes *)output_type_copy); source_reader_allow_video_processor(reader, &enable_advanced); - if ((SUCCEEDED(hr = update_media_type(output_type, media_type, enable_advanced))) - && FAILED(hr = IMFTransform_SetOutputType(transform, 0, output_type, 0)) - && FAILED(hr = set_matching_transform_output_type(transform, output_type)) && allow_processor + if (SUCCEEDED(hr) && (SUCCEEDED(hr = update_media_type(output_type_copy, media_type, enable_advanced))) + && FAILED(hr = IMFTransform_SetOutputType(transform, 0, output_type_copy, 0)) + && FAILED(hr = set_matching_transform_output_type(transform, output_type_copy)) && 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(output_type, media_type, enable_advanced)) - && (enable_advanced || SUCCEEDED(hr = set_default_video_attributes(reader, output_type))) - && SUCCEEDED(hr = source_reader_create_transform(reader, FALSE, FALSE, media_type, output_type, &converter))) + && SUCCEEDED(hr = update_media_type(output_type_copy, media_type, enable_advanced)) + && (enable_advanced || SUCCEEDED(hr = set_default_video_attributes(reader, output_type_copy))) + && SUCCEEDED(hr = source_reader_create_transform(reader, FALSE, FALSE, media_type, output_type_copy, &converter))) list_add_tail(&entry->entry, &converter->entry); IMFMediaType_Release(media_type); } + if(output_type_copy) + IMFMediaType_Release(output_type_copy); + if (SUCCEEDED(hr)) { entry->transform = transform; diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 95e940e2449..604f5e521e7 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2172,6 +2172,8 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad IMFTransform *transform; IMFMediaSource *source; GUID category; + UINT32 count; + UINT64 value; HRESULT hr; winetest_push_context("vp %u adv %u", enable_processing, enable_advanced); @@ -2255,6 +2257,12 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad todo_wine_if(enable_processing) /* Wine enables advanced video processing in all cases */ ok(hr == MF_E_TOPO_CODEC_NOT_FOUND, "Unexpected hr %#lx.\n", hr); } + /* SetCurrentMediaType shouldn't modify media_type */ + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetCount(media_type, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 2, "Unexpected attribute count: %u\n", count); IMFMediaType_Release(media_type); hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10535