Module: wine Branch: master Commit: 26876b4a6edc2694320a4b4e715305bbb6997414 URL: https://gitlab.winehq.org/wine/wine/-/commit/26876b4a6edc2694320a4b4e715305b...
Author: Rémi Bernon rbernon@codeweavers.com Date: Thu Mar 21 11:14:35 2024 +0100
mfplat: Append MFVIDEOFORMAT user data after the structure padding.
Instead of using the last palette entry, which might be misaligned.
---
dlls/mfplat/mediatype.c | 8 ++++++-- dlls/mfplat/tests/mfplat.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index df1334d51ff..370db8059f3 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3864,10 +3864,14 @@ HRESULT WINAPI MFInitMediaTypeFromMFVideoFormat(IMFMediaType *media_type, const if (format->compressedInfo.MaxKeyFrameSpacing) mediatype_set_uint32(media_type, &MF_MT_MAX_KEYFRAME_SPACING, format->compressedInfo.MaxKeyFrameSpacing, &hr);
- if ((palette_size = format->surfaceInfo.PaletteEntries * sizeof(*format->surfaceInfo.Palette))) + if (!(palette_size = format->surfaceInfo.PaletteEntries * sizeof(*format->surfaceInfo.Palette))) + user_data = format + 1; + else + { mediatype_set_blob(media_type, &MF_MT_PALETTE, (BYTE *)format->surfaceInfo.Palette, palette_size, &hr); + user_data = &format->surfaceInfo.Palette[format->surfaceInfo.PaletteEntries + 1]; + }
- user_data = &format->surfaceInfo.Palette[format->surfaceInfo.PaletteEntries + 1]; if ((user_data_size = (BYTE *)format + format->dwSize - (BYTE *)user_data)) mediatype_set_blob(media_type, &MF_MT_USER_DATA, user_data, user_data_size, &hr);
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 2ff78a2b05a..904e8808305 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -8448,6 +8448,20 @@ static void test_MFInitMediaTypeFromMFVideoFormat(void) ok(!memcmp(user_data, expect_user_data, value32), "Unexpected user data.\n"); IMFMediaType_DeleteAllItems(media_type);
+ /* check that user data follows MFVIDEOFORMAT struct, which is padded, when no palette is present */ + format_buf->surfaceInfo.PaletteEntries = 0; + memmove(format_buf + 1, expect_user_data, sizeof(expect_user_data)); + format_buf->dwSize = sizeof(*format_buf) + sizeof(expect_user_data); + hr = MFInitMediaTypeFromMFVideoFormat(media_type, format_buf, format_buf->dwSize); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + value32 = 0xdeadbeef; + memset(&user_data, 0xcd, sizeof(user_data)); + hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, (BYTE *)user_data, sizeof(user_data), &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == sizeof(expect_user_data), "got %u.\n", value32); + ok(!memcmp(user_data, expect_user_data, value32), "Unexpected user data.\n"); + IMFMediaType_DeleteAllItems(media_type); + IMFMediaType_Release(media_type); }