mfplat: Support compressed WAVEFORMATEX in MFCreateWaveFormatExFromMFMediaType.
This commit is contained in:
parent
1939bfff9f
commit
a634c30f00
2 changed files with 39 additions and 51 deletions
|
@ -2963,10 +2963,10 @@ HRESULT WINAPI MFUnwrapMediaType(IMFMediaType *wrapper, IMFMediaType **ret)
|
|||
HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVEFORMATEX **ret_format,
|
||||
UINT32 *size, UINT32 flags)
|
||||
{
|
||||
WAVEFORMATEXTENSIBLE *format_ext = NULL;
|
||||
UINT32 value, extra_size = 0, user_size;
|
||||
WAVEFORMATEX *format;
|
||||
GUID major, subtype;
|
||||
UINT32 value;
|
||||
void *user_data;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("%p, %p, %p, %#x.\n", mediatype, ret_format, size, flags);
|
||||
|
@ -2980,36 +2980,24 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE
|
|||
if (!IsEqualGUID(&major, &MFMediaType_Audio))
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float))
|
||||
if (FAILED(hr = IMFMediaType_GetBlobSize(mediatype, &MF_MT_USER_DATA, &user_size)))
|
||||
{
|
||||
FIXME("Unsupported audio format %s.\n", debugstr_guid(&subtype));
|
||||
return E_NOTIMPL;
|
||||
if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float))
|
||||
return hr;
|
||||
user_size = 0;
|
||||
}
|
||||
|
||||
/* FIXME: probably WAVE_FORMAT_MPEG/WAVE_FORMAT_MPEGLAYER3 should be handled separately. */
|
||||
if (flags == MFWaveFormatExConvertFlag_ForceExtensible)
|
||||
{
|
||||
format_ext = CoTaskMemAlloc(sizeof(*format_ext));
|
||||
*size = sizeof(*format_ext);
|
||||
format = (WAVEFORMATEX *)format_ext;
|
||||
}
|
||||
else
|
||||
{
|
||||
format = CoTaskMemAlloc(sizeof(*format));
|
||||
*size = sizeof(*format);
|
||||
}
|
||||
extra_size = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(*format);
|
||||
|
||||
if (!format)
|
||||
*size = sizeof(*format) + user_size + extra_size;
|
||||
if (!(format = CoTaskMemAlloc(*size)))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
memset(format, 0, *size);
|
||||
|
||||
if (format_ext)
|
||||
format->wFormatTag = WAVE_FORMAT_EXTENSIBLE;
|
||||
else if (IsEqualGUID(&subtype, &MFAudioFormat_Float))
|
||||
format->wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
|
||||
else
|
||||
format->wFormatTag = WAVE_FORMAT_PCM;
|
||||
format->wFormatTag = subtype.Data1;
|
||||
format->cbSize = user_size + extra_size;
|
||||
user_data = format + 1;
|
||||
|
||||
if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS, &value)))
|
||||
format->nChannels = value;
|
||||
|
@ -3021,18 +3009,26 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE
|
|||
format->nBlockAlign = value;
|
||||
if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BITS_PER_SAMPLE, &value)))
|
||||
format->wBitsPerSample = value;
|
||||
if (format_ext)
|
||||
|
||||
if (flags == MFWaveFormatExConvertFlag_ForceExtensible)
|
||||
{
|
||||
format->cbSize = sizeof(*format_ext) - sizeof(*format);
|
||||
WAVEFORMATEXTENSIBLE *format_ext = CONTAINING_RECORD(format, WAVEFORMATEXTENSIBLE, Format);
|
||||
|
||||
format_ext->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
|
||||
format_ext->SubFormat = subtype;
|
||||
user_data = format_ext + 1;
|
||||
|
||||
if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE, &value)))
|
||||
format_ext->Samples.wSamplesPerBlock = value;
|
||||
|
||||
if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, &value)))
|
||||
format_ext->dwChannelMask = value;
|
||||
memcpy(&format_ext->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM, sizeof(format_ext->SubFormat));
|
||||
else if (format_ext->Format.nChannels < ARRAY_SIZE(default_channel_mask))
|
||||
format_ext->dwChannelMask = default_channel_mask[format_ext->Format.nChannels];
|
||||
}
|
||||
|
||||
IMFMediaType_GetBlob(mediatype, &MF_MT_USER_DATA, user_data, user_size, NULL);
|
||||
|
||||
*ret_format = format;
|
||||
|
||||
return S_OK;
|
||||
|
|
|
@ -7082,38 +7082,30 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void)
|
|||
ok(!memcmp(buff, (WAVEFORMATEX *)&aacformat + 1, size), "Unexpected user data.\n");
|
||||
|
||||
hr = MFCreateWaveFormatExFromMFMediaType(mediatype, (WAVEFORMATEX **)&format, &size, MFWaveFormatExConvertFlag_ForceExtensible);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
ok(format->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "got wFormatTag %#x\n", format->Format.wFormatTag);
|
||||
ok(format->Format.cbSize == aacformat.wfInfo.wfx.cbSize + sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX),
|
||||
"got cbSize %u\n", format->Format.cbSize);
|
||||
ok(IsEqualGUID(&format->SubFormat, &MFAudioFormat_AAC), "got SubFormat %s\n", debugstr_guid(&format->SubFormat));
|
||||
ok(format->dwChannelMask == 3, "got dwChannelMask %#lx\n", format->dwChannelMask);
|
||||
ok(format->Samples.wSamplesPerBlock == 0, "got wSamplesPerBlock %u\n", format->Samples.wSamplesPerBlock);
|
||||
ok(!memcmp(format + 1, &aacformat.wfInfo.wfx + 1, aacformat.wfInfo.wfx.cbSize), "Unexpected user data.\n");
|
||||
CoTaskMemFree(format);
|
||||
}
|
||||
ok(format->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "got wFormatTag %#x\n", format->Format.wFormatTag);
|
||||
ok(format->Format.cbSize == aacformat.wfInfo.wfx.cbSize + sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX),
|
||||
"got cbSize %u\n", format->Format.cbSize);
|
||||
ok(IsEqualGUID(&format->SubFormat, &MFAudioFormat_AAC), "got SubFormat %s\n", debugstr_guid(&format->SubFormat));
|
||||
ok(format->dwChannelMask == 3, "got dwChannelMask %#lx\n", format->dwChannelMask);
|
||||
ok(format->Samples.wSamplesPerBlock == 0, "got wSamplesPerBlock %u\n", format->Samples.wSamplesPerBlock);
|
||||
ok(!memcmp(format + 1, &aacformat.wfInfo.wfx + 1, aacformat.wfInfo.wfx.cbSize), "Unexpected user data.\n");
|
||||
CoTaskMemFree(format);
|
||||
|
||||
/* test with invalid format size */
|
||||
aacformat.wfInfo.wfx.cbSize = 1;
|
||||
hr = IMFMediaType_SetBlob(mediatype, &MF_MT_USER_DATA, buff, aacformat.wfInfo.wfx.cbSize);
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
hr = MFCreateWaveFormatExFromMFMediaType(mediatype, (WAVEFORMATEX **)&format, &size, MFWaveFormatExConvertFlag_ForceExtensible);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
ok(format->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "got wFormatTag %#x\n", format->Format.wFormatTag);
|
||||
ok(format->Format.cbSize == aacformat.wfInfo.wfx.cbSize + sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX),
|
||||
"got cbSize %u\n", format->Format.cbSize);
|
||||
ok(IsEqualGUID(&format->SubFormat, &MFAudioFormat_AAC), "got SubFormat %s\n", debugstr_guid(&format->SubFormat));
|
||||
ok(format->dwChannelMask == 3, "got dwChannelMask %#lx\n", format->dwChannelMask);
|
||||
ok(format->Samples.wSamplesPerBlock == 0, "got wSamplesPerBlock %u\n", format->Samples.wSamplesPerBlock);
|
||||
ok(!memcmp(format + 1, &aacformat.wfInfo.wfx + 1, aacformat.wfInfo.wfx.cbSize), "Unexpected user data.\n");
|
||||
CoTaskMemFree(format);
|
||||
}
|
||||
ok(format->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "got wFormatTag %#x\n", format->Format.wFormatTag);
|
||||
ok(format->Format.cbSize == aacformat.wfInfo.wfx.cbSize + sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX),
|
||||
"got cbSize %u\n", format->Format.cbSize);
|
||||
ok(IsEqualGUID(&format->SubFormat, &MFAudioFormat_AAC), "got SubFormat %s\n", debugstr_guid(&format->SubFormat));
|
||||
ok(format->dwChannelMask == 3, "got dwChannelMask %#lx\n", format->dwChannelMask);
|
||||
ok(format->Samples.wSamplesPerBlock == 0, "got wSamplesPerBlock %u\n", format->Samples.wSamplesPerBlock);
|
||||
ok(!memcmp(format + 1, &aacformat.wfInfo.wfx + 1, aacformat.wfInfo.wfx.cbSize), "Unexpected user data.\n");
|
||||
CoTaskMemFree(format);
|
||||
|
||||
IMFMediaType_Release(mediatype);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue