From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfplat/mediatype.c | 34 +++++++++++++++++++++++++++++++++- dlls/mfplat/tests/mfplat.c | 6 ------ 2 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index d8f7fbea504..4c44f3669c7 100644 --- a/dlls/mfplat/mediatype.c +++ b/dlls/mfplat/mediatype.c @@ -24,6 +24,7 @@ #include "initguid.h" #include "ks.h" #include "ksmedia.h" +#include "amvideo.h"
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
@@ -2957,6 +2958,12 @@ static void mediatype_set_uint32(IMFMediaType *mediatype, const GUID *attr, unsi *hr = IMFMediaType_SetUINT32(mediatype, attr, value); }
+static void mediatype_set_uint64(IMFMediaType *mediatype, const GUID *attr, unsigned int high, unsigned int low, HRESULT *hr) +{ + if (SUCCEEDED(*hr)) + *hr = IMFMediaType_SetUINT64(mediatype, attr, (UINT64)high << 32 | low); +} + static void mediatype_set_guid(IMFMediaType *mediatype, const GUID *attr, const GUID *value, HRESULT *hr) { if (SUCCEEDED(*hr)) @@ -3577,9 +3584,34 @@ HRESULT WINAPI MFCreateVideoMediaTypeFromVideoInfoHeader(const KS_VIDEOINFOHEADE HRESULT WINAPI MFInitMediaTypeFromVideoInfoHeader(IMFMediaType *media_type, const VIDEOINFOHEADER *vih, UINT32 size, const GUID *subtype) { + HRESULT hr = S_OK; + LONG stride; + FIXME("%p, %p, %u, %s.\n", media_type, vih, size, debugstr_guid(subtype));
- return E_NOTIMPL; + IMFMediaType_DeleteAllItems(media_type); + + if (!subtype) + { + FIXME("Implicit subtype is not supported.\n"); + return E_NOTIMPL; + } + + mediatype_set_guid(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video, &hr); + mediatype_set_guid(media_type, &MF_MT_SUBTYPE, subtype, &hr); + mediatype_set_uint64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, 1, 1, &hr); + mediatype_set_uint32(media_type, &MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive, &hr); + mediatype_set_uint64(media_type, &MF_MT_FRAME_SIZE, vih->bmiHeader.biWidth, vih->bmiHeader.biHeight, &hr); + + if (SUCCEEDED(MFGetStrideForBitmapInfoHeader(subtype->Data1, vih->bmiHeader.biWidth, &stride))) + { + mediatype_set_uint32(media_type, &MF_MT_DEFAULT_STRIDE, stride, &hr); + mediatype_set_uint32(media_type, &MF_MT_SAMPLE_SIZE, abs(stride) * vih->bmiHeader.biHeight, &hr); + mediatype_set_uint32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, 1, &hr); + mediatype_set_uint32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1, &hr); + } + + return hr; }
/*********************************************************************** diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 58f94c12e2d..90ea0616664 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -8250,13 +8250,7 @@ static void test_MFInitMediaTypeFromVideoInfoHeader(void) vih.bmiHeader.biBitCount = 32;
hr = MFInitMediaTypeFromVideoInfoHeader(media_type, &vih, sizeof(vih), &GUID_NULL); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (FAILED(hr)) - { - IMFMediaType_Release(media_type); - return; - }
hr = IMFMediaType_GetGUID(media_type, &MF_MT_MAJOR_TYPE, &guid); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);