[PATCH] mfplat/mediatype: Store extra format data as MF_MT_USER_DATA when initializing from WAVEFORMATEX.
Nikolay Sivov
nsivov at codeweavers.com
Mon Nov 30 06:00:51 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/mediatype.c | 13 ++++++++++---
dlls/mfplat/tests/mfplat.c | 28 +++++++++++++++++++++++++++-
2 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
index f3895ca4d49..62d75e80146 100644
--- a/dlls/mfplat/mediatype.c
+++ b/dlls/mfplat/mediatype.c
@@ -2943,6 +2943,13 @@ static void mediatype_set_guid(IMFMediaType *mediatype, const GUID *attr, const
*hr = IMFMediaType_SetGUID(mediatype, attr, value);
}
+static void mediatype_set_blob(IMFMediaType *mediatype, const GUID *attr, const UINT8 *data,
+ unsigned int size, HRESULT *hr)
+{
+ if (SUCCEEDED(*hr))
+ *hr = IMFMediaType_SetBlob(mediatype, attr, data, size);
+}
+
/***********************************************************************
* MFInitMediaTypeFromWaveFormatEx (mfplat.@)
*/
@@ -2957,9 +2964,6 @@ HRESULT WINAPI MFInitMediaTypeFromWaveFormatEx(IMFMediaType *mediatype, const WA
if (!mediatype || !format)
return E_POINTER;
- if (format->cbSize && format->cbSize < sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX))
- return E_INVALIDARG;
-
if (format->cbSize + sizeof(*format) > size)
return E_INVALIDARG;
@@ -3007,6 +3011,9 @@ HRESULT WINAPI MFInitMediaTypeFromWaveFormatEx(IMFMediaType *mediatype, const WA
mediatype_set_uint32(mediatype, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1, &hr);
}
+ if (format->cbSize)
+ mediatype_set_blob(mediatype, &MF_MT_USER_DATA, (const UINT8 *)(format + 1), format->cbSize, &hr);
+
return hr;
}
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 474d6281f5f..38e8acb966e 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -5600,9 +5600,12 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void)
{ WAVE_FORMAT_WMAUDIO_LOSSLESS },
{ WAVE_FORMAT_WMASPDIF },
};
+
+ UINT8 buff[MPEGLAYER3_WFX_EXTRA_BYTES];
WAVEFORMATEXTENSIBLE waveformatext;
+ MPEGLAYER3WAVEFORMAT mp3format;
IMFMediaType *mediatype;
- unsigned int i;
+ unsigned int i, size;
HRESULT hr;
hr = MFCreateMediaType(&mediatype);
@@ -5628,6 +5631,29 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void)
validate_media_type(mediatype, &waveformatext.Format);
}
+ /* MPEGLAYER3WAVEFORMAT */
+ mp3format.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3;
+ mp3format.wfx.nChannels = 2;
+ mp3format.wfx.nSamplesPerSec = 44100;
+ mp3format.wfx.nAvgBytesPerSec = 16000;
+ mp3format.wfx.nBlockAlign = 1;
+ mp3format.wfx.wBitsPerSample = 0;
+ mp3format.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES;
+ mp3format.wID = MPEGLAYER3_ID_MPEG;
+ mp3format.fdwFlags = 0;
+ mp3format.nBlockSize = 417;
+ mp3format.nFramesPerBlock = 0;
+ mp3format.nCodecDelay = 0;
+
+ hr = MFInitMediaTypeFromWaveFormatEx(mediatype, (WAVEFORMATEX *)&mp3format, sizeof(mp3format));
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ validate_media_type(mediatype, &mp3format.wfx);
+ hr = IMFMediaType_GetBlob(mediatype, &MF_MT_USER_DATA, buff, sizeof(buff), &size);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(size == mp3format.wfx.cbSize, "Unexpected size %u.\n", size);
+ ok(!memcmp(buff, (WAVEFORMATEX *)&mp3format + 1, size), "Unexpected user data.\n");
+
IMFMediaType_Release(mediatype);
}
--
2.29.2
More information about the wine-devel
mailing list