This is required to fix video playback in Crashlands 2 on Proton 10.
From: Brendan McGrath bmcgrath@codeweavers.com
--- dlls/mfreadwrite/reader.c | 16 ++++++++++++++++ dlls/mfreadwrite/tests/mfplat.c | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 139b8991da2..c16641a4911 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -2269,6 +2269,22 @@ static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReaderEx *iface, D if (SUCCEEDED(hr)) hr = source_reader_setup_sample_allocator(reader, index);
+ if (SUCCEEDED(hr)) + { + GUID major_type, subtype; + UINT64 frame_size; + LONG stride; + + type = reader->streams[index].current; + + if (SUCCEEDED(IMFMediaType_GetMajorType(type, &major_type)) + && IsEqualGUID(&major_type, &MFMediaType_Video) + && SUCCEEDED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype)) + && SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size)) + && SUCCEEDED(MFGetStrideForBitmapInfoHeader(subtype.Data1, frame_size >> 32, &stride))) + IMFMediaType_SetUINT32(type, &MF_MT_DEFAULT_STRIDE, abs(stride)); + } + LeaveCriticalSection(&reader->cs);
return hr; diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 7ed757073ff..34f7f90ac09 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -998,7 +998,7 @@ static void test_source_reader(const char *filename, bool video)
hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_DEFAULT_STRIDE, &stride); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(stride == 160 * 4, "Got stride %u.\n", stride); + ok(stride == 160 * 4, "Got stride %u.\n", stride);
IMFMediaType_Release(mediatype); } @@ -2101,7 +2101,7 @@ static void test_source_reader_transforms(BOOL enable_processing, BOOL enable_ad ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1, .todo = TRUE), - ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 384, .todo = TRUE), + ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 384), ATTR_UINT32(MF_MT_INTERLACE_MODE, 2, .todo = TRUE), ATTR_UINT32(MF_MT_SAMPLE_SIZE, 36864, .todo = TRUE), {0}, @@ -3106,7 +3106,7 @@ static void test_source_reader_transform_stream_change(void) ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1, .todo = TRUE), ATTR_UINT32(MF_MT_FIXED_SIZE_SAMPLES, 1, .todo = TRUE), - ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 96 * 2, .todo = TRUE), + ATTR_UINT32(MF_MT_DEFAULT_STRIDE, 96 * 2), ATTR_UINT32(MF_MT_SAMPLE_SIZE, 96 * 96 * 2, .todo = TRUE), {0}, };
Nikolay Sivov (@nsivov) commented about dlls/mfreadwrite/reader.c:
- if (SUCCEEDED(hr))
- {
GUID major_type, subtype;
UINT64 frame_size;
LONG stride;
type = reader->streams[index].current;
if (SUCCEEDED(IMFMediaType_GetMajorType(type, &major_type))
&& IsEqualGUID(&major_type, &MFMediaType_Video)
&& SUCCEEDED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))
&& SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size))
&& SUCCEEDED(MFGetStrideForBitmapInfoHeader(subtype.Data1, frame_size >> 32, &stride)))
IMFMediaType_SetUINT32(type, &MF_MT_DEFAULT_STRIDE, abs(stride));
- }
If we really need this it should go to helpers where type is set from the source or from a transform. Right now it looks like a workaround to me. How can we be sure that it's a reader responsibility to modify type like this, and not something missing in source/transform?