[PATCH 0/2] MR10535: mfreadwrite: Rescale video frames based on aspect ratio when processing is enabled.
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
From: Yuxuan Shui <yshui@codeweavers.com> --- dlls/mfreadwrite/reader.c | 34 ++++- dlls/mfreadwrite/tests/mfplat.c | 229 ++++++++++++++++++++++++++++ dlls/mfreadwrite/tests/resource.rc | 4 + dlls/mfreadwrite/tests/sar_test.mp4 | Bin 0 -> 32655 bytes dlls/winegstreamer/wg_transform.c | 2 +- 5 files changed, 266 insertions(+), 3 deletions(-) create mode 100644 dlls/mfreadwrite/tests/sar_test.mp4 diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 718c8817198..e58620acbeb 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -714,19 +714,49 @@ static void media_type_try_copy_attr(IMFMediaType *dst, IMFMediaType *src, const PropVariantClear(&value); } +static HRESULT media_type_get_uint32_pair(IMFMediaType *type, const GUID *key, UINT32 *hi, UINT32 *lo) +{ + UINT64 data; + HRESULT hr = IMFMediaType_GetUINT64(type, key, &data); + if (FAILED(hr)) return hr; + + *hi = data >> 32; + *lo = data & 0xffffffff; + return hr; +} /* Update a media type with additional attributes reported by another media type, */ /* also present as update_media_type_from_upstream in mf/topology_loader.c pipeline. */ HRESULT update_media_type(IMFMediaType *dst_type, IMFMediaType *src_type, BOOL advanced) { HRESULT hr = S_OK; + UINT64 dst_frame_size; + UINT32 par_w, par_h, w, h; + + if (advanced && SUCCEEDED(media_type_get_uint32_pair(src_type, &MF_MT_FRAME_SIZE, &w, &h)) && + FAILED(IMFMediaType_GetUINT64(dst_type, &MF_MT_FRAME_SIZE, &dst_frame_size)) && + SUCCEEDED(media_type_get_uint32_pair(src_type, &MF_MT_PIXEL_ASPECT_RATIO, &par_w, &par_h))) + { + /* Video processor should rectify the aspect ratio so the output has aspect ratio of 1:1. + * We are doing this here by explicitly changing the target frame size. + * + * Alternatively it's possible to pass along a aspect ratio of 1:1 and let winegstreamer + * handle it, but unfortunately gstreamer has a way of calcuating desired frame sizes that's + * different from Windows native. */ + + UINT64 new_h = h * par_h / par_w; + IMFMediaType_SetUINT64(dst_type, &MF_MT_FRAME_SIZE, ((UINT64)w << 32) + new_h); + } + else + { + media_type_try_copy_attr(dst_type, src_type, &MF_MT_FRAME_SIZE, &hr); + media_type_try_copy_attr(dst_type, src_type, &MF_MT_PIXEL_ASPECT_RATIO, &hr); + } /* propagate common video attributes */ - media_type_try_copy_attr(dst_type, src_type, &MF_MT_FRAME_SIZE, &hr); media_type_try_copy_attr(dst_type, src_type, &MF_MT_FRAME_RATE, &hr); media_type_try_copy_attr(dst_type, src_type, &MF_MT_VIDEO_ROTATION, &hr); media_type_try_copy_attr(dst_type, src_type, &MF_MT_FIXED_SIZE_SAMPLES, &hr); - media_type_try_copy_attr(dst_type, src_type, &MF_MT_PIXEL_ASPECT_RATIO, &hr); media_type_try_copy_attr(dst_type, src_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, &hr); media_type_try_copy_attr(dst_type, src_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, &hr); diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 604f5e521e7..77a3fcc2562 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1154,6 +1154,234 @@ static void test_source_reader(const char *filename, bool video) winetest_pop_context(); } + +static void test_source_reader_aspect_ratio(void) +{ + IMFSourceResolver *source_resolver; + IMFByteStream *byte_stream = NULL; + IMFAttributes *attributes; + IMFSourceReader *reader; + MF_OBJECT_TYPE obj_type; + IMFMediaType *media_type, *output_media_type; + IMFMediaSource *media_source; + IMFTransform *transform; + HRESULT hr; + LONGLONG timestamp; + IMFSample *sample; + DWORD actualindex, sample_flags; + PROPVARIANT position = { .vt = VT_I8 }; + UINT64 tmp = 0; + + if (!pMFCreateMFByteStreamOnStream) + { + win_skip("MFCreateMFByteStreamOnStream() not found\n"); + return; + } + + winetest_push_context("sar_test.mp4"); + + byte_stream = get_resource_stream("sar_test.mp4"); + + hr = MFCreateMediaType(&output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetGUID(output_media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetGUID(output_media_type, &MF_MT_SUBTYPE, &MFVideoFormat_ARGB32); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetUINT32(output_media_type, &MF_MT_VIDEO_ROTATION, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + MFCreateAttributes(&attributes, 1); + hr = MFCreateSourceResolver(&source_resolver); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceResolver_CreateObjectFromByteStream(source_resolver, byte_stream, L"test.mp4", + MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&media_source); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFAttributes_SetUINT32(attributes, &MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = MFCreateSourceReaderFromMediaSource(media_source, attributes, &reader); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetServiceForStream(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &GUID_NULL, &IID_IMFTransform, (void **)&transform); + ok(hr == E_NOINTERFACE, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetNativeMediaType(reader, 0, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ok(tmp == 0x8000000060, "Unexpected frame size: %I64x\n", tmp); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(tmp == 0x300000004, "Unexpected aspect ratio: %I64x\n", tmp); + IMFMediaType_Release(media_type); + + /* Ask for pixel format conversion. This causes a video processor to be added, which will also + * resize the video according to the source pixel aspect ratio. */ + hr = IMFSourceReader_SetStreamSelection(reader, 0, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 1); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(tmp == 0x8000000080, "Unexpected frame size: %I64x\n", tmp); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + /* Native doesn't return an aspect ratio in current output type, unless it was explicitly set. */ + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx\n", hr); + IMFMediaType_Release(media_type); + + hr = IMFSourceReader_ReadSample(reader, 0, 0, &actualindex, &sample_flags, ×tamp, &sample); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(sample_flags & MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED, + "Unexpected sample flags: %#lx\n", sample_flags); + IMFSample_Release(sample); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(tmp == 0x8000000080, "Unexpected frame size: %I64x\n", tmp); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx\n", hr); + IMFMediaType_Release(media_type); + + /* What if we explicitly set a pixel aspect ratio in the output type? */ + hr = IMFSourceReader_SetCurrentPosition(reader, &GUID_NULL, &position); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetUINT64(output_media_type, &MF_MT_PIXEL_ASPECT_RATIO, 0x300000002); /* 3:2 */ + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_DeleteItem(output_media_type, &MF_MT_PIXEL_ASPECT_RATIO); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 1); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + /* Specified aspect ratio has no effect on the output frame size, but the output media type + * does take on the aspect ratio. */ + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(tmp == 0x8000000080, "Unexpected frame size: %I64x\n", tmp); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ok(tmp == 0x300000002, "Unexpected aspect ratio: %I64x\n", tmp); + IMFMediaType_Release(media_type); + + /* What if we explicitly set a frame size? */ + hr = IMFSourceReader_SetCurrentPosition(reader, &GUID_NULL, &position); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetUINT64(output_media_type, &MF_MT_FRAME_SIZE, 0x4000000040); /* 64x64 */ + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 1); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + /* Frame size has precedence */ + ok(tmp == 0x4000000040, "Unexpected frame size: %I64x\n", tmp); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx\n", hr); + IMFMediaType_Release(media_type); + + /* What if we explicitly set both? */ + hr = IMFSourceReader_SetCurrentPosition(reader, &GUID_NULL, &position); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetUINT64(output_media_type, &MF_MT_PIXEL_ASPECT_RATIO, 0x300000002); /* 3:2 */ + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 1); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ok(tmp == 0x4000000040, "Unexpected frame size: %I64x\n", tmp); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ok(tmp == 0x300000002, "Unexpected aspect ratio: %I64x\n", tmp); + IMFMediaType_Release(media_type); + + IMFSourceReader_Release(reader); + IMFMediaSource_Release(media_source); + + hr = IMFMediaType_DeleteItem(output_media_type, &MF_MT_PIXEL_ASPECT_RATIO); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_DeleteItem(output_media_type, &MF_MT_FRAME_SIZE); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + /* Without advanced video processing. */ + hr = IMFSourceResolver_CreateObjectFromByteStream(source_resolver, byte_stream, L"test.mp4", + MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&media_source); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFAttributes_SetUINT32(attributes, &MF_SOURCE_READER_ENABLE_ADVANCED_VIDEO_PROCESSING, FALSE); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFAttributes_SetUINT32(attributes, &MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = MFCreateSourceReaderFromMediaSource(media_source, attributes, &reader); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_SetStreamSelection(reader, 0, 0); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFMediaType_SetGUID(output_media_type, &MF_MT_SUBTYPE, &MFVideoFormat_NV12); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetCurrentMediaType(reader, 0, NULL, output_media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + hr = IMFSourceReader_SetStreamSelection(reader, 0, 1); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + + hr = IMFSourceReader_GetCurrentMediaType(reader, 0, &media_type); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &tmp); + ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + ok(tmp == 0x8000000060, "Unexpected frame size: %I64x\n", tmp); + tmp = 0xdeadbeef; + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &tmp); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx\n", hr); + todo_wine ok(tmp == 0x300000004, "Unexpected aspect ratio: %I64x\n", tmp); + IMFMediaType_Release(media_type); + + IMFMediaType_Release(output_media_type); + IMFSourceResolver_Release(source_resolver); + IMFAttributes_Release(attributes); + IMFSourceReader_Release(reader); +} + static void test_source_reader_from_media_source(void) { static const DWORD expected_sample_order[10] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 0}; @@ -3922,6 +4150,7 @@ START_TEST(mfplat) test_sink_writer_get_object(); test_sink_writer_add_stream(); test_sink_writer_sample_process(); + test_source_reader_aspect_ratio(); hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); diff --git a/dlls/mfreadwrite/tests/resource.rc b/dlls/mfreadwrite/tests/resource.rc index 5a737b1ad85..f62bfd80b7f 100644 --- a/dlls/mfreadwrite/tests/resource.rc +++ b/dlls/mfreadwrite/tests/resource.rc @@ -25,3 +25,7 @@ test.wav RCDATA test.wav /* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 1.0 -r 25 -f mp4 -vcodec h264 -vf scale=160x120 -acodec aac test.mp4 */ /* @makedep: test.mp4 */ test.mp4 RCDATA test.mp4 + +/* ffmpeg -filter_complex "nullsrc=s=128x96,geq=random(1)*255:128:128[vout]" -map "[vout]" -t 0.25 -r 25 -vcodec h264 -aspect 1 -brand mp42 -an sar_test.mp4 */ +/* @makedep: sar_test.mp4 */ +sar_test.mp4 RCDATA sar_test.mp4 diff --git a/dlls/mfreadwrite/tests/sar_test.mp4 b/dlls/mfreadwrite/tests/sar_test.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9cd8c46871cc2c52c9ca37a4ac25b1cf5dc4a806 GIT binary patch literal 32655 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 literal 0 HcmV?d00001 diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 1537a88d614..6031d85f998 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -655,7 +655,7 @@ static bool transform_create_converter_elements(struct wg_transform *transform, if (g_str_has_prefix(output_mime, "video/")) { - if (!(element = create_element("videoconvert", "base")) + if (!(element = create_element("videoconvertscale", "base")) || !append_element(transform->container, element, first, last)) return false; /* Let GStreamer choose a default number of threads. */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10535
Tests are still `todo_wine` because this only fixes the problem for winedmo. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_134661
Nikolay Sivov (@nsivov) commented about dlls/mfreadwrite/reader.c:
+ { + /* Video processor should rectify the aspect ratio so the output has aspect ratio of 1:1. + * We are doing this here by explicitly changing the target frame size. + * + * Alternatively it's possible to pass along a aspect ratio of 1:1 and let winegstreamer + * handle it, but unfortunately gstreamer has a way of calcuating desired frame sizes that's + * different from Windows native. */ + + UINT64 new_h = h * par_h / par_w; + IMFMediaType_SetUINT64(dst_type, &MF_MT_FRAME_SIZE, ((UINT64)w << 32) + new_h); + } + else + { + media_type_try_copy_attr(dst_type, src_type, &MF_MT_FRAME_SIZE, &hr); + media_type_try_copy_attr(dst_type, src_type, &MF_MT_PIXEL_ASPECT_RATIO, &hr); + } Does this mean we should not be fixing it up here, and processor should do everything instead?
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_137453
We'll need someone to assess winegstreamer component change. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_137454
@rbernon @zfigura Please take a look at winegstreamer part. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_137460
What exactly is that winegstreamer change doing? It needs more explanation. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_137498
On Thu Apr 23 14:21:24 2026 +0000, Nikolay Sivov wrote:
Does this mean we should not be fixing it up here, and processor should do everything instead? Yeah it seems to be something that would need to be tested, and possibly fixed on the VP, in isolation. Whether it should be done through frame size or whether we need to support actual PAR somehow, if that makes a difference. It could also be some decoder output thing.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_137511
On Wed May 20 14:51:49 2026 +0000, Elizabeth Figura wrote:
What exactly is that winegstreamer change doing? It needs more explanation. it's likely not strictly necessary (for the bug i was trying to fix). i will do some testing and if things still work i can drop that bit.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10535#note_140818
participants (5)
-
Elizabeth Figura (@zfigura) -
Nikolay Sivov (@nsivov) -
Rémi Bernon (@rbernon) -
Yuxuan Shui -
Yuxuan Shui (@yshui)