From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 370db8059f3..9f199bd59a6 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3317,9 +3317,9 @@ HRESULT WINAPI MFCreateMFVideoFormatFromMFMediaType(IMFMediaType *media_type, MF sizeof(format->videoInfo.MinimumDisplayAperture), NULL);
/* Video flags. */ - format->videoInfo.VideoFlags |= media_type_get_uint32(media_type, &MF_MT_PAD_CONTROL_FLAGS); - format->videoInfo.VideoFlags |= media_type_get_uint32(media_type, &MF_MT_SOURCE_CONTENT_HINT); - format->videoInfo.VideoFlags |= media_type_get_uint32(media_type, &MF_MT_DRM_FLAGS); + format->videoInfo.VideoFlags |= media_type_get_uint32(media_type, &MF_MT_PAD_CONTROL_FLAGS) & MFVideoFlag_PAD_TO_Mask; + format->videoInfo.VideoFlags |= (media_type_get_uint32(media_type, &MF_MT_SOURCE_CONTENT_HINT) << 2) & MFVideoFlag_SrcContentHintMask; + format->videoInfo.VideoFlags |= (media_type_get_uint32(media_type, &MF_MT_DRM_FLAGS) << 5) & (MFVideoFlag_AnalogProtected | MFVideoFlag_DigitallyProtected); if (media_type_get_uint32(media_type, &MF_MT_PAN_SCAN_ENABLED)) { format->videoInfo.VideoFlags |= MFVideoFlag_PanScanEnabled;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 9f199bd59a6..904a5391bf4 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4208,8 +4208,7 @@ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID f if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value))) am_type->lSampleSize = value;
- if (FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, NULL, 0, &user_size)) - && hr != E_NOT_SUFFICIENT_BUFFER) + if (FAILED(IMFMediaType_GetBlobSize(media_type, &MF_MT_USER_DATA, &user_size))) user_size = 0;
if (IsEqualGUID(&am_type->majortype, &MFMediaType_Audio))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 904a5391bf4..514f6e5b1dc 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4118,6 +4118,20 @@ static void init_video_info_header2(VIDEOINFOHEADER2 *vih, const GUID *subtype, } }
+static void init_video_info_header(VIDEOINFOHEADER *vih, const GUID *subtype, IMFMediaType *media_type) +{ + VIDEOINFOHEADER2 vih2 = {{0}}; + + init_video_info_header2(&vih2, subtype, media_type); + + vih->rcSource = vih2.rcSource; + vih->rcTarget = vih2.rcTarget; + vih->dwBitRate = vih2.dwBitRate; + vih->dwBitErrorRate = vih2.dwBitErrorRate; + vih->AvgTimePerFrame = vih2.AvgTimePerFrame; + vih->bmiHeader = vih2.bmiHeader; +} + static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 user_size, IMFMediaType *media_type) { HRESULT hr; @@ -4132,7 +4146,6 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 us if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo) || IsEqualGUID(&am_type->formattype, &GUID_NULL)) { - VIDEOINFOHEADER2 vih = {{0}}; VIDEOINFOHEADER *format;
am_type->cbFormat = sizeof(*format) + user_size; @@ -4141,13 +4154,7 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 us format = (VIDEOINFOHEADER *)am_type->pbFormat; memset(format, 0, sizeof(*format));
- init_video_info_header2(&vih, &am_type->subtype, media_type); - format->rcSource = vih.rcSource; - format->rcTarget = vih.rcTarget; - format->dwBitRate = vih.dwBitRate; - format->dwBitErrorRate = vih.dwBitErrorRate; - format->AvgTimePerFrame = vih.AvgTimePerFrame; - format->bmiHeader = vih.bmiHeader; + init_video_info_header(format, &am_type->subtype, media_type);
if (user_size && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, (BYTE *)(format + 1), user_size, NULL)))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 110 ++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 67 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 514f6e5b1dc..f9f1a8b3757 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -2972,13 +2972,19 @@ HRESULT WINAPI MFUnwrapMediaType(IMFMediaType *wrapper, IMFMediaType **ret) return S_OK; }
+static UINT32 media_type_get_uint32(IMFMediaType *media_type, REFGUID guid) +{ + UINT32 value; + return SUCCEEDED(IMFMediaType_GetUINT32(media_type, guid, &value)) ? value : 0; +} + /*********************************************************************** * MFCreateWaveFormatExFromMFMediaType (mfplat.@) */ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVEFORMATEX **ret_format, UINT32 *size, UINT32 flags) { - UINT32 value, extra_size = 0, user_size; + UINT32 extra_size = 0, user_size; WAVEFORMATEX *format; GUID major, subtype, basetype = MFAudioFormat_Base; void *user_data; @@ -3002,7 +3008,7 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE user_size = 0; }
- if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS, &value)) && value > 2 + if (media_type_get_uint32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS) > 2 && SUCCEEDED(IMFMediaType_GetItem(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, NULL))) { if (SUCCEEDED(IMFMediaType_GetItem(mediatype, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE, NULL))) @@ -3027,16 +3033,11 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE format->cbSize = user_size + extra_size; user_data = format + 1;
- if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS, &value))) - format->nChannels = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &value))) - format->nSamplesPerSec = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &value))) - format->nAvgBytesPerSec = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &value))) - format->nBlockAlign = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BITS_PER_SAMPLE, &value))) - format->wBitsPerSample = value; + format->nChannels = media_type_get_uint32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS); + format->nSamplesPerSec = media_type_get_uint32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_SECOND); + format->nAvgBytesPerSec = media_type_get_uint32(mediatype, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND); + format->nBlockAlign = media_type_get_uint32(mediatype, &MF_MT_AUDIO_BLOCK_ALIGNMENT); + format->wBitsPerSample = media_type_get_uint32(mediatype, &MF_MT_AUDIO_BITS_PER_SAMPLE);
if (flags == MFWaveFormatExConvertFlag_ForceExtensible) { @@ -3046,13 +3047,11 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE 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.wValidBitsPerSample = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_BLOCK, &value))) - format_ext->Samples.wSamplesPerBlock = value; + format_ext->Samples.wValidBitsPerSample = media_type_get_uint32(mediatype, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE); + format_ext->Samples.wSamplesPerBlock = media_type_get_uint32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_BLOCK);
- if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, &value))) - format_ext->dwChannelMask = value; + if (SUCCEEDED(IMFMediaType_GetItem(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, NULL))) + format_ext->dwChannelMask = media_type_get_uint32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK); else if (format_ext->Format.nChannels < ARRAY_SIZE(default_channel_mask)) format_ext->dwChannelMask = default_channel_mask[format_ext->Format.nChannels]; } @@ -3258,12 +3257,6 @@ HRESULT WINAPI MFCreateAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID return hr; }
-static UINT32 media_type_get_uint32(IMFMediaType *media_type, REFGUID guid) -{ - UINT32 value; - return SUCCEEDED(IMFMediaType_GetUINT32(media_type, guid, &value)) ? value : 0; -} - /*********************************************************************** * MFCreateMFVideoFormatFromMFMediaType (mfplat.@) */ @@ -3996,7 +3989,6 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader(IMFMediaType *media_type, cons
static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, UINT32 user_size, IMFMediaType *media_type) { - UINT32 num_channels; HRESULT hr;
if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo) @@ -4007,10 +3999,7 @@ static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, UINT32 us if (IsEqualGUID(&am_type->formattype, &FORMAT_WaveFormatEx) || IsEqualGUID(&am_type->formattype, &GUID_NULL)) { - UINT32 flags = 0; - - if (FAILED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, &num_channels))) - num_channels = 0; + UINT32 flags = 0, num_channels = media_type_get_uint32(media_type, &MF_MT_AUDIO_NUM_CHANNELS);
if (SUCCEEDED(IMFMediaType_GetItem(media_type, &MF_MT_AUDIO_CHANNEL_MASK, NULL)) || SUCCEEDED(IMFMediaType_GetItem(media_type, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE, NULL)) @@ -4038,7 +4027,7 @@ static void init_video_info_header2(VIDEOINFOHEADER2 *vih, const GUID *subtype, { struct uncompressed_video_format *video_format = mf_get_video_format(subtype); DXVA_ExtendedFormat *format = (DXVA_ExtendedFormat *)&vih->dwControlFlags; - UINT32 image_size, bitrate, sample_size, width, height, value; + UINT32 image_size, width, height, value; UINT64 frame_size, frame_rate;
vih->bmiHeader.biSize = sizeof(vih->bmiHeader); @@ -4050,14 +4039,11 @@ static void init_video_info_header2(VIDEOINFOHEADER2 *vih, const GUID *subtype, else vih->bmiHeader.biCompression = subtype->Data1;
- if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BITRATE, &bitrate))) - vih->dwBitRate = bitrate; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BIT_ERROR_RATE, &bitrate))) - vih->dwBitErrorRate = bitrate; + vih->dwBitRate = media_type_get_uint32(media_type, &MF_MT_AVG_BITRATE); + vih->dwBitErrorRate = media_type_get_uint32(media_type, &MF_MT_AVG_BIT_ERROR_RATE); if (SUCCEEDED(IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_RATE, &frame_rate)) && (frame_rate >> 32)) vih->AvgTimePerFrame = round(10000000. * (UINT32)frame_rate / (frame_rate >> 32)); - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &sample_size))) - vih->bmiHeader.biSizeImage = sample_size; + vih->bmiHeader.biSizeImage = media_type_get_uint32(media_type, &MF_MT_SAMPLE_SIZE);
if (SUCCEEDED(IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &frame_size))) { @@ -4065,7 +4051,7 @@ static void init_video_info_header2(VIDEOINFOHEADER2 *vih, const GUID *subtype, INT32 stride;
width = frame_size >> 32; - if (FAILED(IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, (UINT32 *)&stride))) + if (!(stride = media_type_get_uint32(media_type, &MF_MT_DEFAULT_STRIDE))) stride = width * (bottom_up ? -1 : 1); else if (video_format) stride /= video_format->bpp / 8; @@ -4084,37 +4070,29 @@ static void init_video_info_header2(VIDEOINFOHEADER2 *vih, const GUID *subtype, } }
- if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_CHROMA_SITING, &value))) - format->VideoChromaSubsampling = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_NOMINAL_RANGE, &value))) - format->NominalRange = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_YUV_MATRIX, &value))) - format->VideoTransferMatrix = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_LIGHTING, &value))) - format->VideoLighting = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_PRIMARIES, &value))) - format->VideoPrimaries = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_TRANSFER_FUNCTION, &value))) - format->VideoTransferFunction = value; + format->VideoChromaSubsampling = media_type_get_uint32(media_type, &MF_MT_VIDEO_CHROMA_SITING); + format->NominalRange = media_type_get_uint32(media_type, &MF_MT_VIDEO_NOMINAL_RANGE); + format->VideoTransferMatrix = media_type_get_uint32(media_type, &MF_MT_YUV_MATRIX); + format->VideoLighting = media_type_get_uint32(media_type, &MF_MT_VIDEO_LIGHTING); + format->VideoPrimaries = media_type_get_uint32(media_type, &MF_MT_VIDEO_PRIMARIES); + format->VideoTransferFunction = media_type_get_uint32(media_type, &MF_MT_TRANSFER_FUNCTION);
if (format->VideoChromaSubsampling || format->NominalRange || format->VideoTransferMatrix || format->VideoLighting || format->VideoPrimaries || format->VideoTransferFunction) format->SampleFormat = AMCONTROL_COLORINFO_PRESENT;
- if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &value))) + switch ((value = media_type_get_uint32(media_type, &MF_MT_INTERLACE_MODE))) { - switch (value) - { - case MFVideoInterlace_Progressive: - break; - case MFVideoInterlace_MixedInterlaceOrProgressive: - vih->dwInterlaceFlags = AMINTERLACE_DisplayModeBobOrWeave | AMINTERLACE_IsInterlaced; - break; - default: - FIXME("MF_MT_INTERLACE_MODE %u not implemented!\n", value); - vih->dwInterlaceFlags = AMINTERLACE_IsInterlaced; - break; - } + case MFVideoInterlace_Unknown: + case MFVideoInterlace_Progressive: + break; + case MFVideoInterlace_MixedInterlaceOrProgressive: + vih->dwInterlaceFlags = AMINTERLACE_DisplayModeBobOrWeave | AMINTERLACE_IsInterlaced; + break; + default: + FIXME("MF_MT_INTERLACE_MODE %u not implemented!\n", value); + vih->dwInterlaceFlags = AMINTERLACE_IsInterlaced; + break; } }
@@ -4198,7 +4176,7 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 us */ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID format, AM_MEDIA_TYPE *am_type) { - UINT32 value, user_size; + UINT32 user_size; HRESULT hr;
TRACE("%p, %s, %p.\n", media_type, debugstr_mf_guid(&format), am_type); @@ -4210,10 +4188,8 @@ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID f || FAILED(hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &am_type->subtype))) goto done;
- if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, &value))) - am_type->bFixedSizeSamples = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value))) - am_type->lSampleSize = value; + am_type->bFixedSizeSamples = media_type_get_uint32(media_type, &MF_MT_FIXED_SIZE_SAMPLES); + am_type->lSampleSize = media_type_get_uint32(media_type, &MF_MT_SAMPLE_SIZE);
if (FAILED(IMFMediaType_GetBlobSize(media_type, &MF_MT_USER_DATA, &user_size))) user_size = 0;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 74 +++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 33 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index f9f1a8b3757..8e168139755 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3987,7 +3987,7 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader(IMFMediaType *media_type, cons return MFInitMediaTypeFromVideoInfoHeader2(media_type, &vih2, sizeof(vih2), subtype); }
-static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, UINT32 user_size, IMFMediaType *media_type) +static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, IMFMediaType *media_type) { HRESULT hr;
@@ -4110,7 +4110,28 @@ static void init_video_info_header(VIDEOINFOHEADER *vih, const GUID *subtype, IM vih->bmiHeader = vih2.bmiHeader; }
-static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 user_size, IMFMediaType *media_type) +static UINT32 get_am_media_type_video_format_size(const GUID *format_type, IMFMediaType *media_type) +{ + if (IsEqualGUID(format_type, &FORMAT_VideoInfo)) + { + UINT32 size = sizeof(VIDEOINFOHEADER), user_size; + if (SUCCEEDED(IMFMediaType_GetBlobSize(media_type, &MF_MT_USER_DATA, &user_size))) + size += user_size; + return size; + } + + if (IsEqualGUID(format_type, &FORMAT_VideoInfo2)) + { + UINT32 size = sizeof(VIDEOINFOHEADER2), user_size; + if (SUCCEEDED(IMFMediaType_GetBlobSize(media_type, &MF_MT_USER_DATA, &user_size))) + size += user_size; + return size; + } + + return 0; +} + +static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaType *media_type) { HRESULT hr;
@@ -4121,45 +4142,36 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 us return MFCreateMFVideoFormatFromMFMediaType(media_type, (MFVIDEOFORMAT **)&am_type->pbFormat, (UINT32 *)&am_type->cbFormat);
- if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo) - || IsEqualGUID(&am_type->formattype, &GUID_NULL)) - { - VIDEOINFOHEADER *format; + if (IsEqualGUID(&am_type->formattype, &GUID_NULL)) + am_type->formattype = FORMAT_VideoInfo;
- am_type->cbFormat = sizeof(*format) + user_size; - if (!(am_type->pbFormat = CoTaskMemAlloc(am_type->cbFormat))) - return E_OUTOFMEMORY; - format = (VIDEOINFOHEADER *)am_type->pbFormat; - memset(format, 0, sizeof(*format)); + am_type->cbFormat = get_am_media_type_video_format_size(&am_type->formattype, media_type); + if (!(am_type->pbFormat = CoTaskMemAlloc(am_type->cbFormat))) + return E_OUTOFMEMORY; + memset(am_type->pbFormat, 0, am_type->cbFormat);
+ if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo)) + { + VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)am_type->pbFormat; init_video_info_header(format, &am_type->subtype, media_type);
- if (user_size && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, - (BYTE *)(format + 1), user_size, NULL))) + if (am_type->cbFormat > sizeof(*format) && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, + (BYTE *)(format + 1), am_type->cbFormat - sizeof(*format), NULL))) return hr; - format->bmiHeader.biSize += user_size; + format->bmiHeader.biSize += am_type->cbFormat - sizeof(*format);
- am_type->formattype = FORMAT_VideoInfo; am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); } else if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo2)) { - VIDEOINFOHEADER2 *format; - - am_type->cbFormat = sizeof(*format) + user_size; - if (!(am_type->pbFormat = CoTaskMemAlloc(am_type->cbFormat))) - return E_OUTOFMEMORY; - format = (VIDEOINFOHEADER2 *)am_type->pbFormat; - memset(format, 0, sizeof(*format)); - + VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)am_type->pbFormat; init_video_info_header2(format, &am_type->subtype, media_type);
- if (user_size && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, - (BYTE *)(format + 1), user_size, NULL))) + if (am_type->cbFormat > sizeof(*format) && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_USER_DATA, + (BYTE *)(format + 1), am_type->cbFormat - sizeof(*format), NULL))) return hr; - format->bmiHeader.biSize += user_size; + format->bmiHeader.biSize += am_type->cbFormat - sizeof(*format);
- am_type->formattype = FORMAT_VideoInfo2; am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); } else @@ -4176,7 +4188,6 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, UINT32 us */ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID format, AM_MEDIA_TYPE *am_type) { - UINT32 user_size; HRESULT hr;
TRACE("%p, %s, %p.\n", media_type, debugstr_mf_guid(&format), am_type); @@ -4191,13 +4202,10 @@ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID f am_type->bFixedSizeSamples = media_type_get_uint32(media_type, &MF_MT_FIXED_SIZE_SAMPLES); am_type->lSampleSize = media_type_get_uint32(media_type, &MF_MT_SAMPLE_SIZE);
- if (FAILED(IMFMediaType_GetBlobSize(media_type, &MF_MT_USER_DATA, &user_size))) - user_size = 0; - if (IsEqualGUID(&am_type->majortype, &MFMediaType_Audio)) - hr = init_am_media_type_audio_format(am_type, user_size, media_type); + hr = init_am_media_type_audio_format(am_type, media_type); else if (IsEqualGUID(&am_type->majortype, &MFMediaType_Video)) - hr = init_am_media_type_video_format(am_type, user_size, media_type); + hr = init_am_media_type_video_format(am_type, media_type); else { FIXME("Not implemented!\n");
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 6 ++++++ dlls/mfplat/tests/mfplat.c | 12 ++++++++++++ 2 files changed, 18 insertions(+)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 8e168139755..5fb81286e78 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4133,6 +4133,7 @@ static UINT32 get_am_media_type_video_format_size(const GUID *format_type, IMFMe
static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaType *media_type) { + struct uncompressed_video_format *video_format = mf_get_video_format(&am_type->subtype); HRESULT hr;
if (IsEqualGUID(&am_type->formattype, &FORMAT_WaveFormatEx)) @@ -4161,6 +4162,8 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT format->bmiHeader.biSize += am_type->cbFormat - sizeof(*format);
am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); + am_type->bFixedSizeSamples = !!video_format; + am_type->bTemporalCompression = !video_format; } else if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo2)) { @@ -4173,6 +4176,8 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT format->bmiHeader.biSize += am_type->cbFormat - sizeof(*format);
am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); + am_type->bFixedSizeSamples = !!video_format; + am_type->bTemporalCompression = !video_format; } else { @@ -4199,6 +4204,7 @@ HRESULT WINAPI MFInitAMMediaTypeFromMFMediaType(IMFMediaType *media_type, GUID f || FAILED(hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &am_type->subtype))) goto done;
+ am_type->bTemporalCompression = !media_type_get_uint32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT); am_type->bFixedSizeSamples = media_type_get_uint32(media_type, &MF_MT_FIXED_SIZE_SAMPLES); am_type->lSampleSize = media_type_get_uint32(media_type, &MF_MT_SAMPLE_SIZE);
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 904e8808305..385236881ff 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7382,6 +7382,9 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Audio), "got %s.\n", debugstr_guid(&am_type.majortype)); ok(IsEqualGUID(&am_type.subtype, &MFAudioFormat_PCM), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 0, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 1, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); ok(IsEqualGUID(&am_type.formattype, &FORMAT_WaveFormatEx), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(WAVEFORMATEX), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat); @@ -7418,6 +7421,9 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_RGB32), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 1, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 0, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); ok(IsEqualGUID(&am_type.formattype, &FORMAT_VideoInfo), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(VIDEOINFOHEADER), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat); @@ -7425,6 +7431,9 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_RGB32), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 1, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 0, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); ok(IsEqualGUID(&am_type.formattype, &FORMAT_VideoInfo2), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(VIDEOINFOHEADER2), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat); @@ -7432,6 +7441,9 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); ok(IsEqualGUID(&am_type.subtype, &MFVideoFormat_RGB32), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 0, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 1, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); ok(IsEqualGUID(&am_type.formattype, &FORMAT_MFVideoFormat), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(MFVIDEOFORMAT), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 34 ++++++++++- dlls/mfplat/tests/mfplat.c | 122 +++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 5fb81286e78..3ff42769349 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4128,6 +4128,14 @@ static UINT32 get_am_media_type_video_format_size(const GUID *format_type, IMFMe return size; }
+ if (IsEqualGUID(format_type, &FORMAT_MPEGVideo)) + { + UINT32 size = sizeof(MPEG1VIDEOINFO), sequence_size; + if (SUCCEEDED(IMFMediaType_GetBlobSize(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, &sequence_size))) + size += sequence_size; + return size; + } + return 0; }
@@ -4144,7 +4152,13 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT (UINT32 *)&am_type->cbFormat);
if (IsEqualGUID(&am_type->formattype, &GUID_NULL)) - am_type->formattype = FORMAT_VideoInfo; + { + if (IsEqualGUID(&am_type->subtype, &MEDIASUBTYPE_MPEG1Payload) + || IsEqualGUID(&am_type->subtype, &MEDIASUBTYPE_MPEG1Packet)) + am_type->formattype = FORMAT_MPEGVideo; + else + am_type->formattype = FORMAT_VideoInfo; + }
am_type->cbFormat = get_am_media_type_video_format_size(&am_type->formattype, media_type); if (!(am_type->pbFormat = CoTaskMemAlloc(am_type->cbFormat))) @@ -4179,6 +4193,24 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT am_type->bFixedSizeSamples = !!video_format; am_type->bTemporalCompression = !video_format; } + else if (IsEqualGUID(&am_type->formattype, &FORMAT_MPEGVideo)) + { + MPEG1VIDEOINFO *format = (MPEG1VIDEOINFO *)am_type->pbFormat; + + init_video_info_header(&format->hdr, &am_type->subtype, media_type); + format->hdr.bmiHeader.biSize = 0; + + format->dwStartTimeCode = media_type_get_uint32(media_type, &MF_MT_MPEG_START_TIME_CODE); + + if (am_type->cbFormat > sizeof(*format) && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, + format->bSequenceHeader, am_type->cbFormat - sizeof(*format), NULL))) + return hr; + format->cbSequenceHeader = am_type->cbFormat - sizeof(*format); + + am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); + am_type->bFixedSizeSamples = !!video_format; + am_type->bTemporalCompression = !video_format; + } else { WARN("Unknown format %s\n", debugstr_mf_guid(&am_type->formattype)); diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 385236881ff..78c4ce9d583 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7345,11 +7345,13 @@ static void test_MFCreateMFVideoFormatFromMFMediaType(void) static void test_MFInitAMMediaTypeFromMFMediaType(void) { static const MFVideoArea aperture = {.OffsetX = {.fract = 1, .value = 2}, .OffsetY = {.fract = 3, .value = 4}, .Area={56,78}}; + static const BYTE dummy_mpeg_sequence[] = {0x04,0x05,0x06,0x07,0x08}; static const BYTE dummy_user_data[] = {0x01,0x02,0x03};
WAVEFORMATEXTENSIBLE *wave_format_ext; VIDEOINFOHEADER *video_info; WAVEFORMATEX *wave_format; + MPEG1VIDEOINFO *mpeg1_info; IMFMediaType *media_type, *other_type; AM_MEDIA_TYPE am_type; MFVideoArea *area; @@ -7447,6 +7449,16 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(IsEqualGUID(&am_type.formattype, &FORMAT_MFVideoFormat), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(MFVIDEOFORMAT), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, FORMAT_MPEGVideo, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); + ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_RGB32), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 1, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 0, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); + ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEGVideo), "got %s.\n", debugstr_guid(&am_type.formattype)); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + CoTaskMemFree(am_type.pbFormat);
/* test WAVEFORMATEX mapping */ @@ -7976,6 +7988,116 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) CoTaskMemFree(am_type.pbFormat);
IMFMediaType_Release(other_type); + IMFMediaType_DeleteAllItems(media_type); + + + /* MEDIASUBTYPE_MPEG1Packet and MEDIASUBTYPE_MPEG1Payload use FORMAT_MPEGVideo by default */ + + hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MEDIASUBTYPE_MPEG1Packet); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); + ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_MPEG1Packet), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 0, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 1, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); + ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEGVideo), "got %s.\n", debugstr_guid(&am_type.formattype)); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + CoTaskMemFree(am_type.pbFormat); + + hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MEDIASUBTYPE_MPEG1Payload); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); + ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_MPEG1Payload), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(am_type.bFixedSizeSamples == 0, "got %u\n", am_type.bFixedSizeSamples); + ok(am_type.bTemporalCompression == 1, "got %u\n", am_type.bTemporalCompression); + ok(am_type.lSampleSize == 0, "got %lu\n", am_type.lSampleSize); + ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEGVideo), "got %s.\n", debugstr_guid(&am_type.formattype)); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->cbSequenceHeader == 0, "got %lu\n", mpeg1_info->cbSequenceHeader); + ok(mpeg1_info->dwStartTimeCode == 0, "got %lu\n", mpeg1_info->dwStartTimeCode); + ok(mpeg1_info->hdr.bmiHeader.biPlanes == 1, "got %u\n", mpeg1_info->hdr.bmiHeader.biPlanes); + ok(mpeg1_info->hdr.bmiHeader.biBitCount == 0, "got %u\n", mpeg1_info->hdr.bmiHeader.biBitCount); + todo_wine ok(mpeg1_info->hdr.bmiHeader.biCompression == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biCompression); + CoTaskMemFree(am_type.pbFormat); + + hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)12 << 32 | 34); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->hdr.bmiHeader.biPlanes == 1, "got %u\n", mpeg1_info->hdr.bmiHeader.biPlanes); + ok(mpeg1_info->hdr.bmiHeader.biBitCount == 0, "got %u\n", mpeg1_info->hdr.bmiHeader.biBitCount); + ok(mpeg1_info->hdr.bmiHeader.biWidth == 12, "got %lu\n", mpeg1_info->hdr.bmiHeader.biWidth); + ok(mpeg1_info->hdr.bmiHeader.biHeight == 34, "got %lu\n", mpeg1_info->hdr.bmiHeader.biHeight); + ok(mpeg1_info->hdr.bmiHeader.biSizeImage == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biSizeImage); + ok(mpeg1_info->hdr.bmiHeader.biXPelsPerMeter == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biXPelsPerMeter); + ok(mpeg1_info->hdr.bmiHeader.biYPelsPerMeter == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biYPelsPerMeter); + CoTaskMemFree(am_type.pbFormat); + + hr = IMFMediaType_SetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, (UINT64)12 << 32 | 34); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->hdr.bmiHeader.biXPelsPerMeter == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biXPelsPerMeter); + ok(mpeg1_info->hdr.bmiHeader.biYPelsPerMeter == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biYPelsPerMeter); + CoTaskMemFree(am_type.pbFormat); + + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, 1234); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->dwStartTimeCode == 1234, "got %lu\n", mpeg1_info->dwStartTimeCode); + CoTaskMemFree(am_type.pbFormat); + + /* MF_MT_USER_DATA is ignored */ + + hr = IMFMediaType_SetBlob(media_type, &MF_MT_USER_DATA, (BYTE *)dummy_user_data, sizeof(dummy_user_data)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->hdr.bmiHeader.biSize == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biSize); + ok(mpeg1_info->cbSequenceHeader == 0, "got %lu\n", mpeg1_info->cbSequenceHeader); + CoTaskMemFree(am_type.pbFormat); + + /* MF_MT_MPEG_SEQUENCE_HEADER is used instead in MPEG1VIDEOINFO */ + + hr = IMFMediaType_SetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, (BYTE *)dummy_mpeg_sequence, sizeof(dummy_mpeg_sequence)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO) + sizeof(dummy_mpeg_sequence), "got %lu\n", am_type.cbFormat); + mpeg1_info = (MPEG1VIDEOINFO *)am_type.pbFormat; + ok(mpeg1_info->hdr.bmiHeader.biSize == 0, "got %lu\n", mpeg1_info->hdr.bmiHeader.biSize); + ok(mpeg1_info->cbSequenceHeader == sizeof(dummy_mpeg_sequence), "got %lu\n", mpeg1_info->cbSequenceHeader); + ok(!memcmp(mpeg1_info->bSequenceHeader, dummy_mpeg_sequence, mpeg1_info->cbSequenceHeader), "got wrong data\n"); + CoTaskMemFree(am_type.pbFormat); + + /* MFVIDEOFORMAT loses MF_MT_MPEG_SEQUENCE_HEADER */ + + hr = IMFMediaType_DeleteItem(media_type, &MF_MT_USER_DATA); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, FORMAT_MFVideoFormat, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MFVIDEOFORMAT), "got %lu\n", am_type.cbFormat); + CoTaskMemFree(am_type.pbFormat); + + IMFMediaType_DeleteAllItems(media_type); +
IMFMediaType_Release(media_type); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 30 ++++++++++++++ dlls/mfplat/tests/mfplat.c | 83 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 3ff42769349..7e2e5d45c1c 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4136,6 +4136,14 @@ static UINT32 get_am_media_type_video_format_size(const GUID *format_type, IMFMe return size; }
+ if (IsEqualGUID(format_type, &FORMAT_MPEG2Video)) + { + UINT32 size = sizeof(MPEG2VIDEOINFO), sequence_size; + if (SUCCEEDED(IMFMediaType_GetBlobSize(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, &sequence_size))) + size += sequence_size; + return size; + } + return 0; }
@@ -4156,6 +4164,8 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT if (IsEqualGUID(&am_type->subtype, &MEDIASUBTYPE_MPEG1Payload) || IsEqualGUID(&am_type->subtype, &MEDIASUBTYPE_MPEG1Packet)) am_type->formattype = FORMAT_MPEGVideo; + else if (IsEqualGUID(&am_type->subtype, &MEDIASUBTYPE_MPEG2_VIDEO)) + am_type->formattype = FORMAT_MPEG2Video; else am_type->formattype = FORMAT_VideoInfo; } @@ -4211,6 +4221,26 @@ static HRESULT init_am_media_type_video_format(AM_MEDIA_TYPE *am_type, IMFMediaT am_type->bFixedSizeSamples = !!video_format; am_type->bTemporalCompression = !video_format; } + else if (IsEqualGUID(&am_type->formattype, &FORMAT_MPEG2Video)) + { + MPEG2VIDEOINFO *format = (MPEG2VIDEOINFO *)am_type->pbFormat; + + init_video_info_header2(&format->hdr, &am_type->subtype, media_type); + + format->dwStartTimeCode = media_type_get_uint32(media_type, &MF_MT_MPEG_START_TIME_CODE); + format->dwProfile = media_type_get_uint32(media_type, &MF_MT_MPEG2_PROFILE); + format->dwLevel = media_type_get_uint32(media_type, &MF_MT_MPEG2_LEVEL); + format->dwFlags = media_type_get_uint32(media_type, &MF_MT_MPEG2_FLAGS); + + if (am_type->cbFormat > sizeof(*format) && FAILED(hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, + (BYTE *)format->dwSequenceHeader, am_type->cbFormat - sizeof(*format), NULL))) + return hr; + format->cbSequenceHeader = am_type->cbFormat - sizeof(*format); + + am_type->subtype = get_am_subtype_for_mf_subtype(am_type->subtype); + am_type->bFixedSizeSamples = !!video_format; + am_type->bTemporalCompression = !video_format; + } else { WARN("Unknown format %s\n", debugstr_mf_guid(&am_type->formattype)); diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 78c4ce9d583..98f88c0c73e 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -7352,6 +7352,7 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) VIDEOINFOHEADER *video_info; WAVEFORMATEX *wave_format; MPEG1VIDEOINFO *mpeg1_info; + MPEG2VIDEOINFO *mpeg2_info; IMFMediaType *media_type, *other_type; AM_MEDIA_TYPE am_type; MFVideoArea *area; @@ -7459,6 +7460,13 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEGVideo), "got %s.\n", debugstr_guid(&am_type.formattype)); ok(am_type.cbFormat == sizeof(MPEG1VIDEOINFO), "got %lu\n", am_type.cbFormat); CoTaskMemFree(am_type.pbFormat); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, FORMAT_MPEG2Video, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); + ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_RGB32), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEG2Video), "got %s.\n", debugstr_guid(&am_type.formattype)); + ok(am_type.cbFormat == sizeof(MPEG2VIDEOINFO), "got %lu\n", am_type.cbFormat); + CoTaskMemFree(am_type.pbFormat);
/* test WAVEFORMATEX mapping */ @@ -8099,6 +8107,81 @@ static void test_MFInitAMMediaTypeFromMFMediaType(void) IMFMediaType_DeleteAllItems(media_type);
+ /* MEDIASUBTYPE_MPEG2_VIDEO uses FORMAT_MPEG2Video by default */ + + hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MEDIASUBTYPE_MPEG2_VIDEO); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&am_type.majortype, &MFMediaType_Video), "got %s.\n", debugstr_guid(&am_type.majortype)); + ok(IsEqualGUID(&am_type.subtype, &MEDIASUBTYPE_MPEG2_VIDEO), "got %s.\n", debugstr_guid(&am_type.subtype)); + ok(IsEqualGUID(&am_type.formattype, &FORMAT_MPEG2Video), "got %s.\n", debugstr_guid(&am_type.formattype)); + ok(am_type.cbFormat == sizeof(MPEG2VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg2_info = (MPEG2VIDEOINFO *)am_type.pbFormat; + ok(mpeg2_info->dwStartTimeCode == 0, "got %lu\n", mpeg2_info->dwStartTimeCode); + ok(mpeg2_info->dwProfile == 0, "got %lu\n", mpeg2_info->dwProfile); + ok(mpeg2_info->dwLevel == 0, "got %lu\n", mpeg2_info->dwLevel); + ok(mpeg2_info->dwFlags == 0, "got %lu\n", mpeg2_info->dwFlags); + ok(mpeg2_info->cbSequenceHeader == 0, "got %lu\n", mpeg2_info->cbSequenceHeader); + CoTaskMemFree(am_type.pbFormat); + + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, 1234); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_MPEG2_PROFILE, 6); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_MPEG2_LEVEL, 7); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_MPEG2_FLAGS, 8910); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG2VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg2_info = (MPEG2VIDEOINFO *)am_type.pbFormat; + ok(mpeg2_info->dwStartTimeCode == 1234, "got %lu\n", mpeg2_info->dwStartTimeCode); + ok(mpeg2_info->dwProfile == 6, "got %lu\n", mpeg2_info->dwProfile); + ok(mpeg2_info->dwLevel == 7, "got %lu\n", mpeg2_info->dwLevel); + ok(mpeg2_info->dwFlags == 8910, "got %lu\n", mpeg2_info->dwFlags); + CoTaskMemFree(am_type.pbFormat); + + /* MF_MT_USER_DATA is ignored */ + + hr = IMFMediaType_SetBlob(media_type, &MF_MT_USER_DATA, (BYTE *)dummy_user_data, sizeof(dummy_user_data)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG2VIDEOINFO), "got %lu\n", am_type.cbFormat); + mpeg2_info = (MPEG2VIDEOINFO *)am_type.pbFormat; + ok(mpeg2_info->hdr.bmiHeader.biSize == sizeof(mpeg2_info->hdr.bmiHeader), "got %lu\n", mpeg2_info->hdr.bmiHeader.biSize); + ok(mpeg2_info->cbSequenceHeader == 0, "got %lu\n", mpeg2_info->cbSequenceHeader); + CoTaskMemFree(am_type.pbFormat); + + /* MF_MT_MPEG_SEQUENCE_HEADER is used instead in MPEG2VIDEOINFO */ + + hr = IMFMediaType_SetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, (BYTE *)dummy_mpeg_sequence, sizeof(dummy_mpeg_sequence)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, GUID_NULL, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MPEG2VIDEOINFO) + sizeof(dummy_mpeg_sequence), "got %lu\n", am_type.cbFormat); + mpeg2_info = (MPEG2VIDEOINFO *)am_type.pbFormat; + ok(mpeg2_info->hdr.bmiHeader.biSize == sizeof(mpeg2_info->hdr.bmiHeader), "got %lu\n", mpeg2_info->hdr.bmiHeader.biSize); + ok(mpeg2_info->cbSequenceHeader == sizeof(dummy_mpeg_sequence), "got %lu\n", mpeg2_info->cbSequenceHeader); + ok(!memcmp(mpeg2_info->dwSequenceHeader, dummy_mpeg_sequence, mpeg2_info->cbSequenceHeader), "got wrong data\n"); + CoTaskMemFree(am_type.pbFormat); + + /* MFVIDEOFORMAT loses MF_MT_MPEG_SEQUENCE_HEADER */ + + hr = IMFMediaType_DeleteItem(media_type, &MF_MT_USER_DATA); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = MFInitAMMediaTypeFromMFMediaType(media_type, FORMAT_MFVideoFormat, &am_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(am_type.cbFormat == sizeof(MFVIDEOFORMAT), "got %lu\n", am_type.cbFormat); + CoTaskMemFree(am_type.pbFormat); + + IMFMediaType_DeleteAllItems(media_type); + + IMFMediaType_Release(media_type); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 25 ++++++++ dlls/mfplat/mfplat.spec | 2 +- dlls/mfplat/tests/mfplat.c | 113 +++++++++++++++++++++++++++++++++++++ include/mfapi.h | 3 + 4 files changed, 142 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index 7e2e5d45c1c..dfd695ecfb3 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -31,6 +31,7 @@ #include "ksmedia.h" #include "amvideo.h" #include "wmcodecdsp.h" +#include "wmsdkidl.h"
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
@@ -3987,6 +3988,27 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader(IMFMediaType *media_type, cons return MFInitMediaTypeFromVideoInfoHeader2(media_type, &vih2, sizeof(vih2), subtype); }
+/*********************************************************************** + * MFInitMediaTypeFromMPEG1VideoInfo (mfplat.@) + */ +HRESULT WINAPI MFInitMediaTypeFromMPEG1VideoInfo(IMFMediaType *media_type, const MPEG1VIDEOINFO *vih, UINT32 size, + const GUID *subtype) +{ + HRESULT hr; + + TRACE("%p, %p, %u, %s.\n", media_type, vih, size, debugstr_guid(subtype)); + + if (FAILED(hr = MFInitMediaTypeFromVideoInfoHeader(media_type, &vih->hdr, sizeof(vih->hdr), subtype))) + return hr; + + if (vih->dwStartTimeCode) + mediatype_set_uint32(media_type, &MF_MT_MPEG_START_TIME_CODE, vih->dwStartTimeCode, &hr); + if (vih->cbSequenceHeader) + mediatype_set_blob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, vih->bSequenceHeader, vih->cbSequenceHeader, &hr); + + return hr; +} + static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, IMFMediaType *media_type) { HRESULT hr; @@ -4314,6 +4336,9 @@ HRESULT WINAPI MFInitMediaTypeFromAMMediaType(IMFMediaType *media_type, const AM else if (IsEqualGUID(&am_type->formattype, &FORMAT_VideoInfo2) && am_type->cbFormat >= sizeof(VIDEOINFOHEADER2)) hr = MFInitMediaTypeFromVideoInfoHeader2(media_type, (VIDEOINFOHEADER2 *)am_type->pbFormat, am_type->cbFormat, subtype); + else if (IsEqualGUID(&am_type->formattype, &FORMAT_MPEGVideo) + && am_type->cbFormat >= sizeof(MPEG1VIDEOINFO)) + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, (MPEG1VIDEOINFO *)am_type->pbFormat, am_type->cbFormat, subtype); else { FIXME("Unsupported format type %s / size %ld.\n", debugstr_guid(&am_type->formattype), am_type->cbFormat); diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec index 57db3cdf9f6..6babe6c6498 100644 --- a/dlls/mfplat/mfplat.spec +++ b/dlls/mfplat/mfplat.spec @@ -121,7 +121,7 @@ @ stdcall MFInitAttributesFromBlob(ptr ptr long) @ stdcall MFInitMediaTypeFromAMMediaType(ptr ptr) @ stdcall MFInitMediaTypeFromMFVideoFormat(ptr ptr long) -@ stub MFInitMediaTypeFromMPEG1VideoInfo +@ stdcall MFInitMediaTypeFromMPEG1VideoInfo(ptr ptr long ptr) @ stub MFInitMediaTypeFromMPEG2VideoInfo @ stdcall MFInitMediaTypeFromVideoInfoHeader2(ptr ptr long ptr) @ stdcall MFInitMediaTypeFromVideoInfoHeader(ptr ptr long ptr) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 98f88c0c73e..29ab0adeea4 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -11478,6 +11478,118 @@ static void test_MFInitMediaTypeFromVideoInfoHeader2(void) IMFMediaType_Release(media_type); }
+static void test_MFInitMediaTypeFromMPEG1VideoInfo(void) +{ + IMFMediaType *media_type; + MPEG1VIDEOINFO vih; + BYTE buffer[64]; + UINT32 value32; + UINT64 value64; + HRESULT hr; + GUID guid; + + hr = MFCreateMediaType(&media_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + memset(&vih, 0, sizeof(vih)); + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, 0, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_MAJOR_TYPE, &guid); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected guid %s.\n", debugstr_guid(&guid)); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&guid, &GUID_NULL), "Unexpected guid %s.\n", debugstr_guid(&guid)); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biWidth = 16; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &value32); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biHeight = -32; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)16 << 32 | 32), "Unexpected value %#I64x.\n", value64); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biHeight = 32; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)16 << 32 | 32), "Unexpected value %#I64x.\n", value64); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == MFVideoInterlace_Progressive, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)1 << 32 | 1), "Unexpected value %#I64x.\n", value64); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biXPelsPerMeter = 2; + vih.hdr.bmiHeader.biYPelsPerMeter = 3; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)1 << 32 | 1), "Unexpected value %#I64x.\n", value64); + + value32 = 0xdeadbeef; + vih.hdr.bmiHeader.biSizeImage = 12345; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 12345, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.dwStartTimeCode = 1234; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1234, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetItem(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, NULL); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + memset(buffer, 0xcd, sizeof(buffer)); + vih.cbSequenceHeader = 1; + vih.bSequenceHeader[0] = 0xad; + hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, buffer, sizeof(buffer), &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1, "Unexpected value %#x.\n", value32); + ok(buffer[0] == 0xad, "Unexpected value %#x.\n", buffer[0]); + + IMFMediaType_Release(media_type); +} + static void test_MFInitMediaTypeFromAMMediaType(void) { static const MFVideoArea expect_aperture = {.OffsetX = {.value = 13}, .OffsetY = {.value = 46}, .Area = {.cx = 110, .cy = 410}}; @@ -12098,6 +12210,7 @@ START_TEST(mfplat) test_MFCreateVideoMediaTypeFromVideoInfoHeader(); test_MFInitMediaTypeFromVideoInfoHeader(); test_MFInitMediaTypeFromVideoInfoHeader2(); + test_MFInitMediaTypeFromMPEG1VideoInfo(); test_MFInitMediaTypeFromAMMediaType(); test_MFCreatePathFromURL(); test_2dbuffer_copy(); diff --git a/include/mfapi.h b/include/mfapi.h index 0a9f7c6f415..8bd3fd6e4f9 100644 --- a/include/mfapi.h +++ b/include/mfapi.h @@ -510,6 +510,7 @@ typedef struct tagVIDEOINFOHEADER VIDEOINFOHEADER; struct tagVIDEOINFOHEADER2; typedef struct tagVIDEOINFOHEADER2 VIDEOINFOHEADER2; typedef struct _AMMediaType AM_MEDIA_TYPE; +typedef struct tagMPEG1VIDEOINFO MPEG1VIDEOINFO;
HRESULT WINAPI MFAddPeriodicCallback(MFPERIODICCALLBACK callback, IUnknown *context, DWORD *key); HRESULT WINAPI MFAllocateSerialWorkQueue(DWORD target_queue, DWORD *queue); @@ -600,6 +601,8 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader(IMFMediaType *media_type, cons UINT32 size, const GUID *subtype); HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader2(IMFMediaType *media_type, const VIDEOINFOHEADER2 *vih, UINT32 size, const GUID *subtype); +HRESULT WINAPI MFInitMediaTypeFromMPEG1VideoInfo(IMFMediaType *media_type, const MPEG1VIDEOINFO *vih, + UINT32 size, const GUID *subtype); HRESULT WINAPI MFInitMediaTypeFromWaveFormatEx(IMFMediaType *mediatype, const WAVEFORMATEX *format, UINT32 size); HRESULT WINAPI MFInitVideoFormat_RGB(MFVIDEOFORMAT *format, DWORD width, DWORD height, DWORD d3dformat); HRESULT WINAPI MFInvokeCallback(IMFAsyncResult *result);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfplat/mediatype.c | 31 ++++++++ dlls/mfplat/mfplat.spec | 2 +- dlls/mfplat/tests/mfplat.c | 143 +++++++++++++++++++++++++++++++++++++ include/mfapi.h | 3 + 4 files changed, 178 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index dfd695ecfb3..cebc458a1e3 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -4009,6 +4009,34 @@ HRESULT WINAPI MFInitMediaTypeFromMPEG1VideoInfo(IMFMediaType *media_type, const return hr; }
+/*********************************************************************** + * MFInitMediaTypeFromMPEG2VideoInfo (mfplat.@) + */ +HRESULT WINAPI MFInitMediaTypeFromMPEG2VideoInfo(IMFMediaType *media_type, const MPEG2VIDEOINFO *vih, UINT32 size, + const GUID *subtype) +{ + HRESULT hr; + + TRACE("%p, %p, %u, %s.\n", media_type, vih, size, debugstr_guid(subtype)); + + if (FAILED(hr = MFInitMediaTypeFromVideoInfoHeader2(media_type, &vih->hdr, sizeof(vih->hdr), subtype))) + return hr; + + if (vih->dwStartTimeCode) + mediatype_set_uint32(media_type, &MF_MT_MPEG_START_TIME_CODE, vih->dwStartTimeCode, &hr); + if (vih->cbSequenceHeader) + mediatype_set_blob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, (BYTE *)vih->dwSequenceHeader, vih->cbSequenceHeader, &hr); + + if (vih->dwProfile) + mediatype_set_uint32(media_type, &MF_MT_MPEG2_PROFILE, vih->dwProfile, &hr); + if (vih->dwLevel) + mediatype_set_uint32(media_type, &MF_MT_MPEG2_LEVEL, vih->dwLevel, &hr); + if (vih->dwFlags) + mediatype_set_uint32(media_type, &MF_MT_MPEG2_FLAGS, vih->dwFlags, &hr); + + return hr; +} + static HRESULT init_am_media_type_audio_format(AM_MEDIA_TYPE *am_type, IMFMediaType *media_type) { HRESULT hr; @@ -4339,6 +4367,9 @@ HRESULT WINAPI MFInitMediaTypeFromAMMediaType(IMFMediaType *media_type, const AM else if (IsEqualGUID(&am_type->formattype, &FORMAT_MPEGVideo) && am_type->cbFormat >= sizeof(MPEG1VIDEOINFO)) hr = MFInitMediaTypeFromMPEG1VideoInfo(media_type, (MPEG1VIDEOINFO *)am_type->pbFormat, am_type->cbFormat, subtype); + else if (IsEqualGUID(&am_type->formattype, &FORMAT_MPEG2Video) + && am_type->cbFormat >= sizeof(MPEG2VIDEOINFO)) + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, (MPEG2VIDEOINFO *)am_type->pbFormat, am_type->cbFormat, subtype); else { FIXME("Unsupported format type %s / size %ld.\n", debugstr_guid(&am_type->formattype), am_type->cbFormat); diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec index 6babe6c6498..e311b3cf493 100644 --- a/dlls/mfplat/mfplat.spec +++ b/dlls/mfplat/mfplat.spec @@ -122,7 +122,7 @@ @ stdcall MFInitMediaTypeFromAMMediaType(ptr ptr) @ stdcall MFInitMediaTypeFromMFVideoFormat(ptr ptr long) @ stdcall MFInitMediaTypeFromMPEG1VideoInfo(ptr ptr long ptr) -@ stub MFInitMediaTypeFromMPEG2VideoInfo +@ stdcall MFInitMediaTypeFromMPEG2VideoInfo(ptr ptr long ptr) @ stdcall MFInitMediaTypeFromVideoInfoHeader2(ptr ptr long ptr) @ stdcall MFInitMediaTypeFromVideoInfoHeader(ptr ptr long ptr) @ stdcall MFInitMediaTypeFromWaveFormatEx(ptr ptr long) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 29ab0adeea4..72f9526c079 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -11590,6 +11590,148 @@ static void test_MFInitMediaTypeFromMPEG1VideoInfo(void) IMFMediaType_Release(media_type); }
+static void test_MFInitMediaTypeFromMPEG2VideoInfo(void) +{ + IMFMediaType *media_type; + MPEG2VIDEOINFO vih; + DWORD buffer[64]; + UINT32 value32; + UINT64 value64; + HRESULT hr; + GUID guid; + + hr = MFCreateMediaType(&media_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + memset(&vih, 0, sizeof(vih)); + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, 0, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_MAJOR_TYPE, &guid); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected guid %s.\n", debugstr_guid(&guid)); + hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&guid, &GUID_NULL), "Unexpected guid %s.\n", debugstr_guid(&guid)); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biWidth = 16; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &value32); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biHeight = -32; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)16 << 32 | 32), "Unexpected value %#I64x.\n", value64); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biHeight = 32; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value64 == ((UINT64)16 << 32 | 32), "Unexpected value %#I64x.\n", value64); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_INTERLACE_MODE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == MFVideoInterlace_Progressive, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + vih.hdr.bmiHeader.biXPelsPerMeter = 2; + vih.hdr.bmiHeader.biYPelsPerMeter = 3; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64); + todo_wine + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.hdr.bmiHeader.biSizeImage = 12345; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 12345, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, &value32); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.dwStartTimeCode = 1234; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG_START_TIME_CODE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1234, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetItem(media_type, &MF_MT_MPEG2_PROFILE, NULL); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.dwProfile = 1234; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_PROFILE, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1234, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetItem(media_type, &MF_MT_MPEG2_LEVEL, NULL); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.dwLevel = 1234; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_LEVEL, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1234, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetItem(media_type, &MF_MT_MPEG2_FLAGS, NULL); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + vih.dwFlags = 1234; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetUINT32(media_type, &MF_MT_MPEG2_FLAGS, &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 1234, "Unexpected value %#x.\n", value32); + hr = IMFMediaType_GetItem(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, NULL); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + + value32 = 0xdeadbeef; + memset(buffer, 0xcd, sizeof(buffer)); + vih.cbSequenceHeader = 3; + vih.dwSequenceHeader[0] = 0xabcdef; + hr = MFInitMediaTypeFromMPEG2VideoInfo(media_type, &vih, sizeof(vih), &GUID_NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaType_GetBlob(media_type, &MF_MT_MPEG_SEQUENCE_HEADER, (BYTE *)buffer, sizeof(buffer), &value32); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value32 == 3, "Unexpected value %#x.\n", value32); + ok(buffer[0] == 0xcdabcdef, "Unexpected value %#lx.\n", buffer[0]); + + IMFMediaType_Release(media_type); +} + static void test_MFInitMediaTypeFromAMMediaType(void) { static const MFVideoArea expect_aperture = {.OffsetX = {.value = 13}, .OffsetY = {.value = 46}, .Area = {.cx = 110, .cy = 410}}; @@ -12211,6 +12353,7 @@ START_TEST(mfplat) test_MFInitMediaTypeFromVideoInfoHeader(); test_MFInitMediaTypeFromVideoInfoHeader2(); test_MFInitMediaTypeFromMPEG1VideoInfo(); + test_MFInitMediaTypeFromMPEG2VideoInfo(); test_MFInitMediaTypeFromAMMediaType(); test_MFCreatePathFromURL(); test_2dbuffer_copy(); diff --git a/include/mfapi.h b/include/mfapi.h index 8bd3fd6e4f9..2e1c2345418 100644 --- a/include/mfapi.h +++ b/include/mfapi.h @@ -511,6 +511,7 @@ struct tagVIDEOINFOHEADER2; typedef struct tagVIDEOINFOHEADER2 VIDEOINFOHEADER2; typedef struct _AMMediaType AM_MEDIA_TYPE; typedef struct tagMPEG1VIDEOINFO MPEG1VIDEOINFO; +typedef struct tagMPEG2VIDEOINFO MPEG2VIDEOINFO;
HRESULT WINAPI MFAddPeriodicCallback(MFPERIODICCALLBACK callback, IUnknown *context, DWORD *key); HRESULT WINAPI MFAllocateSerialWorkQueue(DWORD target_queue, DWORD *queue); @@ -603,6 +604,8 @@ HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader2(IMFMediaType *media_type, con UINT32 size, const GUID *subtype); HRESULT WINAPI MFInitMediaTypeFromMPEG1VideoInfo(IMFMediaType *media_type, const MPEG1VIDEOINFO *vih, UINT32 size, const GUID *subtype); +HRESULT WINAPI MFInitMediaTypeFromMPEG2VideoInfo(IMFMediaType *media_type, const MPEG2VIDEOINFO *vih, + UINT32 size, const GUID *subtype); HRESULT WINAPI MFInitMediaTypeFromWaveFormatEx(IMFMediaType *mediatype, const WAVEFORMATEX *format, UINT32 size); HRESULT WINAPI MFInitVideoFormat_RGB(MFVIDEOFORMAT *format, DWORD width, DWORD height, DWORD d3dformat); HRESULT WINAPI MFInvokeCallback(IMFAsyncResult *result);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/evr/evr.spec | 2 +- dlls/mfplat/mediatype.c | 24 ++++++++++++++++++++++++ dlls/mfplat/mfplat.spec | 2 +- include/mfapi.h | 1 + 4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/evr/evr.spec b/dlls/evr/evr.spec index 0a3a3fb6d42..7383589573b 100644 --- a/dlls/evr/evr.spec +++ b/dlls/evr/evr.spec @@ -8,7 +8,7 @@ @ stub MFConvertToFP16Array @ stdcall -import MFCopyImage(ptr long ptr long long long) @ stdcall -import MFCreateDXSurfaceBuffer(ptr ptr long ptr) -@ stub MFCreateVideoMediaType +@ stdcall -import MFCreateVideoMediaType(ptr ptr) @ stub MFCreateVideoMediaTypeFromBitMapInfoHeader @ stdcall -import MFCreateVideoMediaTypeFromSubtype(ptr ptr) @ stub MFCreateVideoMediaTypeFromVideoInfoHeader2 diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index cebc458a1e3..dd0b29fac32 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -3759,6 +3759,30 @@ static const GUID * get_mf_subtype_for_am_subtype(const GUID *subtype) return subtype; }
+HRESULT WINAPI MFCreateVideoMediaType(const MFVIDEOFORMAT *format, IMFVideoMediaType **media_type) +{ + struct media_type *object; + HRESULT hr; + + TRACE("%p, %p.\n", format, media_type); + + if (!media_type) + return E_INVALIDARG; + + if (FAILED(hr = create_media_type(&object))) + return hr; + + if (FAILED(hr = MFInitMediaTypeFromMFVideoFormat(&object->IMFMediaType_iface, format, format->dwSize))) + { + IMFMediaType_Release(&object->IMFMediaType_iface); + return hr; + } + + *media_type = &object->IMFVideoMediaType_iface; + + return hr; +} + /*********************************************************************** * MFCreateVideoMediaTypeFromVideoInfoHeader (mfplat.@) */ diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec index e311b3cf493..d61e18491d3 100644 --- a/dlls/mfplat/mfplat.spec +++ b/dlls/mfplat/mfplat.spec @@ -76,7 +76,7 @@ @ stdcall MFCreateTransformActivate(ptr) @ stub MFCreateURLFromPath @ stub MFCreateUdpSockets -@ stub MFCreateVideoMediaType +@ stdcall MFCreateVideoMediaType(ptr ptr) @ stub MFCreateVideoMediaTypeFromBitMapInfoHeader @ stub MFCreateVideoMediaTypeFromBitMapInfoHeaderEx @ stdcall MFCreateVideoMediaTypeFromSubtype(ptr ptr) diff --git a/include/mfapi.h b/include/mfapi.h index 2e1c2345418..86fdcb2b8e4 100644 --- a/include/mfapi.h +++ b/include/mfapi.h @@ -556,6 +556,7 @@ HRESULT WINAPI MFCreateMediaTypeFromRepresentation(GUID guid_representation, voi HRESULT WINAPI MFCreateSample(IMFSample **sample); HRESULT WINAPI MFCreateTempFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags, IMFByteStream **bytestream); +HRESULT WINAPI MFCreateVideoMediaType(const MFVIDEOFORMAT *format, IMFVideoMediaType **media_type); HRESULT WINAPI MFCreateVideoMediaTypeFromSubtype(const GUID *subtype, IMFVideoMediaType **media_type);
#ifdef _KSMEDIA_
This merge request was approved by Nikolay Sivov.