In this patch set, GetOutputType() currently fails for NV11 and the following RGB types because MFCalculateImageSize() fails for them. I'll fix MFCalculateImageSize() for them recently (but not in this patch set).
-- v2: winegstreamer: Implement GetOutputType for WMV decoder. winegstreamer: Add RGB8, IYUV, NV11 to wg_video_format. mf/tests: Test info headers returned by GetOutputType for WMV decoder. mf/tests: Test GetOutputType for WMV decoder.
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mf/tests/transform.c | 180 +++++++++++++++++++++++++++++--------- 1 file changed, 141 insertions(+), 39 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 09c0e83a7dc..784cb9afd31 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -26,7 +26,7 @@
#include "control.h" #include "d3d9types.h" -#include "dmoreg.h" +#include "dmo.h" #include "mferror.h" #include "mfidl.h" #include "mftransform.h" @@ -1089,13 +1089,89 @@ static void check_dmo_media_type_(int line, DMO_MEDIA_TYPE *media_type, const DM ok_(__FILE__, line)(media_type->lSampleSize == expected->lSampleSize, "Got unexpected lSampleSize %lu, expected %lu.\n", media_type->lSampleSize, expected->lSampleSize); - - ok_(__FILE__, line)(IsEqualGUID(&media_type->formattype, &GUID_NULL), + ok_(__FILE__, line)(IsEqualGUID(&media_type->formattype, &expected->formattype), "Got unexpected formattype %s.\n", debugstr_guid(&media_type->formattype)); ok_(__FILE__, line)(media_type->pUnk == NULL, "Got unexpected pUnk %p.\n", media_type->pUnk); - ok_(__FILE__, line)(media_type->cbFormat == 0, "Got unexpected cbFormat %lu.\n", media_type->cbFormat); - ok_(__FILE__, line)(media_type->pbFormat == NULL, "Got unexpected pbFormat %p.\n", media_type->pbFormat); + ok_(__FILE__, line)(media_type->cbFormat == expected->cbFormat, + "Got unexpected cbFormat %lu, expected %lu.\n", + media_type->cbFormat, expected->cbFormat); +} + +static void check_dmo_get_input_type(IMediaObject *media_object, const DMO_MEDIA_TYPE *expected_type, ULONG count) +{ + DMO_MEDIA_TYPE media_type; + HRESULT hr; + DWORD i; + + hr = IMediaObject_GetInputType(media_object, 1, 0, NULL); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 1, 0, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 1, count, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 0, count, &media_type); + ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 0, count, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 0, 0xdeadbeef, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 0, count - 1, NULL); + ok(hr == S_OK, "GetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetInputType(media_object, 0, count - 1, &media_type); + ok(hr == S_OK, "GetInputType returned unexpected hr %#lx.\n", hr); + if (hr == S_OK) + MoFreeMediaType(&media_type); + + i = -1; + while (SUCCEEDED(hr = IMediaObject_GetInputType(media_object, 0, ++i, &media_type))) + { + winetest_push_context("in %lu", i); + check_dmo_media_type(&media_type, &expected_type[i]); + MoFreeMediaType(&media_type); + winetest_pop_context(); + } + + ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); + ok(i == count, "%lu types.\n", i); +} + +static void check_dmo_get_output_type(IMediaObject *media_object, const DMO_MEDIA_TYPE *expected_type, ULONG count) +{ + DMO_MEDIA_TYPE media_type; + HRESULT hr; + DWORD i; + + hr = IMediaObject_GetOutputType(media_object, 1, 0, NULL); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 1, 0, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 1, count, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, count, &media_type); + ok(hr == DMO_E_NO_MORE_ITEMS, "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, count, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS || broken(hr == S_OK), "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, 0xdeadbeef, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS || broken(hr == S_OK), "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, count - 1, NULL); + ok(hr == S_OK, "GetOutputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, count - 1, &media_type); + ok(hr == S_OK, "GetOutputType returned unexpected hr %#lx.\n", hr); + if (hr == S_OK) + MoFreeMediaType(&media_type); + + i = -1; + while (SUCCEEDED(hr = IMediaObject_GetOutputType(media_object, 0, ++i, &media_type))) + { + winetest_push_context("out %lu", i); + check_dmo_media_type(&media_type, &expected_type[i]); + MoFreeMediaType(&media_type); + winetest_pop_context(); + } + + ok(hr == DMO_E_NO_MORE_ITEMS, "GetOutputType returned unexpected hr %#lx.\n", hr); + ok(i == count, "%lu types.\n", i); }
static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) @@ -4531,15 +4607,31 @@ static void test_wmv_decoder_media_object(void) const GUID *const class_id = &CLSID_CWMVDecMediaObject; const DMO_MEDIA_TYPE expected_input_types[] = { - {MFMediaType_Video, MFVideoFormat_WMV1, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MFVideoFormat_WMV2, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MEDIASUBTYPE_WMVA, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MEDIASUBTYPE_WMVP, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MEDIASUBTYPE_WVP2, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MFVideoFormat_WMV_Unknown, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MFVideoFormat_WVC1, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MFVideoFormat_WMV3, FALSE, TRUE, FALSE}, - {MFMediaType_Video, MFVideoFormat_VC1S, FALSE, TRUE, FALSE}, + {MFMediaType_Video, MEDIASUBTYPE_WMV1, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WMV2, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WMVA, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WMVP, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WVP2, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MFVideoFormat_WMV_Unknown, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WVC1, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MEDIASUBTYPE_WMV3, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + {MFMediaType_Video, MFVideoFormat_VC1S, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, + }; + const DMO_MEDIA_TYPE expected_output_types[] = + { + {MFMediaType_Video, MEDIASUBTYPE_NV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_YV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_IYUV, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_I420, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_YUY2, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_UYVY, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_YVYU, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_NV11, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_RGB32, TRUE, FALSE, 1024, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_RGB24, TRUE, FALSE, 768, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_RGB565, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 100}, + {MFMediaType_Video, MEDIASUBTYPE_RGB555, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, + {MFMediaType_Video, MEDIASUBTYPE_RGB8, TRUE, FALSE, 256, FORMAT_VideoInfo, NULL, 1112}, }; const struct set_type_arg { @@ -4622,30 +4714,7 @@ static void test_wmv_decoder_media_object(void) ok(in_count == 0xdeadbeef, "Got unexpected in_count %lu.\n", in_count);
/* Test GetInputType. */ - i = -1; - while (SUCCEEDED(hr = IMediaObject_GetInputType(media_object, 0, ++i, &media_type))) - { - winetest_push_context("in %lu", i); - check_dmo_media_type(&media_type, &expected_input_types[i]); - winetest_pop_context(); - } - ok(i == ARRAY_SIZE(expected_input_types), "%lu input types.\n", i); - - /* Test GetInputType with invalid arguments. */ - hr = IMediaObject_GetInputType(media_object, 0, ARRAY_SIZE(expected_input_types) - 1, &media_type); - ok(hr == S_OK, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 0, ARRAY_SIZE(expected_input_types), &media_type); - ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 1, 0, &media_type); - ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 0, 0, NULL); - ok(hr == S_OK, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 1, ARRAY_SIZE(expected_input_types), &media_type); - ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 0, ARRAY_SIZE(expected_input_types), NULL); - ok(hr == DMO_E_NO_MORE_ITEMS, "GetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_GetInputType(media_object, 1, 0, NULL); - ok(hr == DMO_E_INVALIDSTREAMINDEX, "GetInputType returned unexpected hr %#lx.\n", hr); + check_dmo_get_input_type(media_object, expected_input_types, ARRAY_SIZE(expected_input_types));
/* Test SetInputType. */ input_type = (DMO_MEDIA_TYPE *)buffer; @@ -4664,7 +4733,7 @@ static void test_wmv_decoder_media_object(void) continue; }
- winetest_push_context("Input %lu", i); + winetest_push_context("in %lu", i);
/* Test setting the type. */ init_dmo_media_type_video(input_type, subtype, 96, 96); @@ -4804,6 +4873,39 @@ static void test_wmv_decoder_media_object(void) winetest_pop_context(); }
+ /* Test GetOutputType without setting input type. */ + hr = IMediaObject_SetInputType(media_object, 0, NULL, DMO_SET_TYPEF_CLEAR); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + hr = IMediaObject_GetOutputType(media_object, 0, 0, &media_type); + todo_wine + ok(hr == DMO_E_TYPE_NOT_SET, "GetOutputType returned unexpected hr %#lx.\n", hr); + + /* Test GetOutputType after setting input type. */ + for (i = 0; i < ARRAY_SIZE(expected_input_types); ++i) + { + const GUID *subtype = &expected_input_types[i].subtype; + if (IsEqualGUID(subtype, &MEDIASUBTYPE_WMV2) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WMVA) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WVP2) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WVC1) + || IsEqualGUID(subtype, &MFVideoFormat_VC1S)) + { + skip("Skipping GetOutputType tests for input subtype %s.\n", debugstr_guid(subtype)); + continue; + } + + winetest_push_context("in %lu", i); + + init_dmo_media_type_video(input_type, &expected_input_types[i].subtype, 16, 16); + hr = IMediaObject_SetInputType(media_object, 0, input_type, 0); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + + todo_wine + check_dmo_get_output_type(media_object, expected_output_types, ARRAY_SIZE(expected_output_types)); + + winetest_pop_context(); + } + ret = IMediaObject_Release(media_object); ok(ret == 0, "Release returned %lu\n", ret); CoUninitialize();
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mf/tests/transform.c | 114 +++++++++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 13 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 784cb9afd31..a2e8d1d6e0b 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -1071,6 +1071,67 @@ DWORD check_mf_sample_collection_(const char *file, int line, IMFCollection *sam return ctx.diff / count; }
+#define check_video_info_header(a, b) check_video_info_header_(__LINE__, a, b) +static void check_video_info_header_(int line, VIDEOINFOHEADER *info, const VIDEOINFOHEADER *expected) +{ + ok_(__FILE__, line)(info->rcSource.left == expected->rcSource.left + && info->rcSource.top == expected->rcSource.top + && info->rcSource.right == expected->rcSource.right + && info->rcSource.bottom == expected->rcSource.bottom, + "Got unexpected rcSource {%ld, %ld, %ld, %ld}, expected {%ld, %ld, %ld, %ld}.\n", + info->rcSource.left, info->rcSource.top, info->rcSource.right, info->rcSource.bottom, + expected->rcSource.left, expected->rcSource.top, expected->rcSource.right, expected->rcSource.bottom); + ok_(__FILE__, line)(info->rcTarget.left == expected->rcTarget.left + && info->rcTarget.top == expected->rcTarget.top + && info->rcTarget.right == expected->rcTarget.right + && info->rcTarget.bottom == expected->rcTarget.bottom, + "Got unexpected rcTarget {%ld, %ld, %ld, %ld}, expected {%ld, %ld, %ld, %ld}.\n", + info->rcTarget.left, info->rcTarget.top, info->rcTarget.right, info->rcTarget.bottom, + expected->rcTarget.left, expected->rcTarget.top, expected->rcTarget.right, expected->rcTarget.bottom); + ok_(__FILE__, line)(info->dwBitRate == expected->dwBitRate, + "Got unexpected dwBitRate %lu, expected %lu.\n", + info->dwBitRate, expected->dwBitRate); + ok_(__FILE__, line)(info->dwBitErrorRate == expected->dwBitErrorRate, + "Got unexpected dwBitErrorRate %lu, expected %lu.\n", + info->dwBitErrorRate, expected->dwBitErrorRate); + ok_(__FILE__, line)(info->AvgTimePerFrame == expected->AvgTimePerFrame, + "Got unexpected AvgTimePerFrame %I64d, expected %I64d.\n", + info->AvgTimePerFrame, expected->AvgTimePerFrame); + ok_(__FILE__, line)(info->bmiHeader.biSize == expected->bmiHeader.biSize, + "Got unexpected bmiHeader.biSize %lu, expected %lu.\n", + info->bmiHeader.biSize, expected->bmiHeader.biSize); + ok_(__FILE__, line)(info->bmiHeader.biWidth == expected->bmiHeader.biWidth, + "Got unexpected bmiHeader.biWidth %ld, expected %ld.\n", + info->bmiHeader.biWidth, expected->bmiHeader.biWidth); + ok_(__FILE__, line)(info->bmiHeader.biHeight == expected->bmiHeader.biHeight, + "Got unexpected bmiHeader.biHeight %ld, expected %ld.\n", + info->bmiHeader.biHeight, expected->bmiHeader.biHeight); + ok_(__FILE__, line)(info->bmiHeader.biPlanes == expected->bmiHeader.biPlanes, + "Got unexpected bmiHeader.biPlanes %u, expected %u.\n", + info->bmiHeader.biPlanes, expected->bmiHeader.biPlanes); + ok_(__FILE__, line)(info->bmiHeader.biBitCount == expected->bmiHeader.biBitCount, + "Got unexpected bmiHeader.biBitCount %u, expected %u.\n", + info->bmiHeader.biBitCount, expected->bmiHeader.biBitCount); + ok_(__FILE__, line)(info->bmiHeader.biCompression == expected->bmiHeader.biCompression, + "Got unexpected bmiHeader.biCompression %#lx, expected %#lx.\n", + info->bmiHeader.biCompression, expected->bmiHeader.biCompression); + ok_(__FILE__, line)(info->bmiHeader.biSizeImage == expected->bmiHeader.biSizeImage, + "Got unexpected bmiHeader.biSizeImage %lu, expected %lu.\n", + info->bmiHeader.biSizeImage, expected->bmiHeader.biSizeImage); + ok_(__FILE__, line)(info->bmiHeader.biXPelsPerMeter == expected->bmiHeader.biXPelsPerMeter, + "Got unexpected bmiHeader.biXPelsPerMeter %ld, expected %ld.\n", + info->bmiHeader.biXPelsPerMeter, expected->bmiHeader.biXPelsPerMeter); + ok_(__FILE__, line)(info->bmiHeader.biYPelsPerMeter == expected->bmiHeader.biYPelsPerMeter, + "Got unexpected bmiHeader.xxxxxx %ld, expected %ld.\n", + info->bmiHeader.biYPelsPerMeter, expected->bmiHeader.biYPelsPerMeter); + ok_(__FILE__, line)(info->bmiHeader.biClrUsed == expected->bmiHeader.biClrUsed, + "Got unexpected bmiHeader.biClrUsed %lu, expected %lu.\n", + info->bmiHeader.biClrUsed, expected->bmiHeader.biClrUsed); + ok_(__FILE__, line)(info->bmiHeader.biClrImportant == expected->bmiHeader.biClrImportant, + "Got unexpected bmiHeader.biClrImportant %lu, expected %lu.\n", + info->bmiHeader.biClrImportant, expected->bmiHeader.biClrImportant); +} + #define check_dmo_media_type(a, b) check_dmo_media_type_(__LINE__, a, b) static void check_dmo_media_type_(int line, DMO_MEDIA_TYPE *media_type, const DMO_MEDIA_TYPE *expected) { @@ -1096,6 +1157,17 @@ static void check_dmo_media_type_(int line, DMO_MEDIA_TYPE *media_type, const DM ok_(__FILE__, line)(media_type->cbFormat == expected->cbFormat, "Got unexpected cbFormat %lu, expected %lu.\n", media_type->cbFormat, expected->cbFormat); + + if (expected->pbFormat) + { + ok_(__FILE__, line)(!!media_type->pbFormat, "Got NULL pbFormat.\n"); + if (!media_type->pbFormat) + return; + + if (IsEqualGUID(&media_type->formattype, &FORMAT_VideoInfo) + && IsEqualGUID(&expected->formattype, &FORMAT_VideoInfo)) + check_video_info_header((VIDEOINFOHEADER *)media_type->pbFormat, (VIDEOINFOHEADER *)expected->pbFormat); + } }
static void check_dmo_get_input_type(IMediaObject *media_object, const DMO_MEDIA_TYPE *expected_type, ULONG count) @@ -4617,21 +4689,37 @@ static void test_wmv_decoder_media_object(void) {MFMediaType_Video, MEDIASUBTYPE_WMV3, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, {MFMediaType_Video, MFVideoFormat_VC1S, FALSE, TRUE, 0, GUID_NULL, NULL, 0}, }; + const VIDEOINFOHEADER expected_output_info[] = + { + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 12, MAKEFOURCC('N', 'V', '1', '2'), 384, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 12, MAKEFOURCC('Y', 'V', '1', '2'), 384, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 12, MAKEFOURCC('I', 'Y', 'U', 'V'), 384, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 12, MAKEFOURCC('I', '4', '2', '0'), 384, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 16, MAKEFOURCC('Y', 'U', 'Y', '2'), 512, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 16, MAKEFOURCC('U', 'Y', 'V', 'Y'), 512, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 16, MAKEFOURCC('Y', 'V', 'Y', 'U'), 512, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 12, MAKEFOURCC('N', 'V', '1', '1'), 384, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 32, BI_RGB, 1024, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 24, BI_RGB, 768, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 16, BI_BITFIELDS, 512, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 16, BI_RGB, 512, 0, 0, 0, 0}}, + {{0, 0, 16, 16}, {0, 0, 16, 16}, 0, 0, 0, {40, 16, 16, 1, 8, BI_RGB, 256, 0, 0, 226, 226}}, + }; const DMO_MEDIA_TYPE expected_output_types[] = { - {MFMediaType_Video, MEDIASUBTYPE_NV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_YV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_IYUV, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_I420, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_YUY2, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_UYVY, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_YVYU, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_NV11, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_RGB32, TRUE, FALSE, 1024, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_RGB24, TRUE, FALSE, 768, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_RGB565, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 100}, - {MFMediaType_Video, MEDIASUBTYPE_RGB555, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88}, - {MFMediaType_Video, MEDIASUBTYPE_RGB8, TRUE, FALSE, 256, FORMAT_VideoInfo, NULL, 1112}, + {MFMediaType_Video, MEDIASUBTYPE_NV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[0]}, + {MFMediaType_Video, MEDIASUBTYPE_YV12, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[1]}, + {MFMediaType_Video, MEDIASUBTYPE_IYUV, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[2]}, + {MFMediaType_Video, MEDIASUBTYPE_I420, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[3]}, + {MFMediaType_Video, MEDIASUBTYPE_YUY2, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[4]}, + {MFMediaType_Video, MEDIASUBTYPE_UYVY, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[5]}, + {MFMediaType_Video, MEDIASUBTYPE_YVYU, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[6]}, + {MFMediaType_Video, MEDIASUBTYPE_NV11, TRUE, FALSE, 384, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[7]}, + {MFMediaType_Video, MEDIASUBTYPE_RGB32, TRUE, FALSE, 1024, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[8]}, + {MFMediaType_Video, MEDIASUBTYPE_RGB24, TRUE, FALSE, 768, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[9]}, + {MFMediaType_Video, MEDIASUBTYPE_RGB565, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 100, (BYTE *)&expected_output_info[10]}, + {MFMediaType_Video, MEDIASUBTYPE_RGB555, TRUE, FALSE, 512, FORMAT_VideoInfo, NULL, 88, (BYTE *)&expected_output_info[11]}, + {MFMediaType_Video, MEDIASUBTYPE_RGB8, TRUE, FALSE, 256, FORMAT_VideoInfo, NULL, 1112, (BYTE *)&expected_output_info[12]}, }; const struct set_type_arg {
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/mfplat.c | 3 +++ dlls/winegstreamer/quartz_parser.c | 20 ++++++++++++++++++++ dlls/winegstreamer/unixlib.h | 3 +++ dlls/winegstreamer/wg_format.c | 5 +++++ dlls/winegstreamer/wg_parser.c | 3 +++ 5 files changed, 34 insertions(+)
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index a09c67b4f11..8f18ea17ce5 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -438,6 +438,7 @@ video_formats[] = {&MFVideoFormat_RGB24, WG_VIDEO_FORMAT_BGR}, {&MFVideoFormat_RGB555, WG_VIDEO_FORMAT_RGB15}, {&MFVideoFormat_RGB565, WG_VIDEO_FORMAT_RGB16}, + {&MFVideoFormat_RGB8, WG_VIDEO_FORMAT_RGB8}, {&MFVideoFormat_AYUV, WG_VIDEO_FORMAT_AYUV}, {&MFVideoFormat_I420, WG_VIDEO_FORMAT_I420}, {&MFVideoFormat_IYUV, WG_VIDEO_FORMAT_I420}, @@ -446,6 +447,8 @@ video_formats[] = {&MFVideoFormat_YUY2, WG_VIDEO_FORMAT_YUY2}, {&MFVideoFormat_YV12, WG_VIDEO_FORMAT_YV12}, {&MFVideoFormat_YVYU, WG_VIDEO_FORMAT_YVYU}, + {&MFVideoFormat_IYUV, WG_VIDEO_FORMAT_IYUV}, + {&MFVideoFormat_NV11, WG_VIDEO_FORMAT_NV11}, };
static const struct diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 6e31f2736fe..9125335e79e 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -293,12 +293,17 @@ unsigned int wg_format_get_max_size(const struct wg_format *format) case WG_VIDEO_FORMAT_YVYU: return ALIGN(width * 2, 4) * height;
+ case WG_VIDEO_FORMAT_RGB8: + return ALIGN(width, 4) * height; + case WG_VIDEO_FORMAT_I420: case WG_VIDEO_FORMAT_YV12: + case WG_VIDEO_FORMAT_IYUV: return ALIGN(width, 4) * ALIGN(height, 2) /* Y plane */ + 2 * ALIGN((width + 1) / 2, 4) * ((height + 1) / 2); /* U and V planes */
case WG_VIDEO_FORMAT_NV12: + case WG_VIDEO_FORMAT_NV11: return ALIGN(width, 4) * ALIGN(height, 2) /* Y plane */ + ALIGN(width, 4) * ((height + 1) / 2); /* U/V plane */
@@ -387,6 +392,7 @@ static const GUID *wg_video_format_get_mediasubtype(enum wg_video_format format) case WG_VIDEO_FORMAT_BGR: return &MEDIASUBTYPE_RGB24; case WG_VIDEO_FORMAT_RGB15: return &MEDIASUBTYPE_RGB555; case WG_VIDEO_FORMAT_RGB16: return &MEDIASUBTYPE_RGB565; + case WG_VIDEO_FORMAT_RGB8: return &MEDIASUBTYPE_RGB8; case WG_VIDEO_FORMAT_AYUV: return &MEDIASUBTYPE_AYUV; case WG_VIDEO_FORMAT_I420: return &MEDIASUBTYPE_I420; case WG_VIDEO_FORMAT_NV12: return &MEDIASUBTYPE_NV12; @@ -394,6 +400,8 @@ static const GUID *wg_video_format_get_mediasubtype(enum wg_video_format format) case WG_VIDEO_FORMAT_YUY2: return &MEDIASUBTYPE_YUY2; case WG_VIDEO_FORMAT_YV12: return &MEDIASUBTYPE_YV12; case WG_VIDEO_FORMAT_YVYU: return &MEDIASUBTYPE_YVYU; + case WG_VIDEO_FORMAT_IYUV: return &MEDIASUBTYPE_IYUV; + case WG_VIDEO_FORMAT_NV11: return &MEDIASUBTYPE_NV11; }
assert(0); @@ -410,6 +418,7 @@ static DWORD wg_video_format_get_compression(enum wg_video_format format) case WG_VIDEO_FORMAT_BGR: return BI_RGB; case WG_VIDEO_FORMAT_RGB15: return BI_RGB; case WG_VIDEO_FORMAT_RGB16: return BI_BITFIELDS; + case WG_VIDEO_FORMAT_RGB8: return BI_RGB; case WG_VIDEO_FORMAT_AYUV: return mmioFOURCC('A','Y','U','V'); case WG_VIDEO_FORMAT_I420: return mmioFOURCC('I','4','2','0'); case WG_VIDEO_FORMAT_NV12: return mmioFOURCC('N','V','1','2'); @@ -417,6 +426,8 @@ static DWORD wg_video_format_get_compression(enum wg_video_format format) case WG_VIDEO_FORMAT_YUY2: return mmioFOURCC('Y','U','Y','2'); case WG_VIDEO_FORMAT_YV12: return mmioFOURCC('Y','V','1','2'); case WG_VIDEO_FORMAT_YVYU: return mmioFOURCC('Y','V','Y','U'); + case WG_VIDEO_FORMAT_IYUV: return mmioFOURCC('I','Y','U','V'); + case WG_VIDEO_FORMAT_NV11: return mmioFOURCC('N','V','1','1'); }
assert(0); @@ -433,6 +444,7 @@ static WORD wg_video_format_get_depth(enum wg_video_format format) case WG_VIDEO_FORMAT_BGR: return 24; case WG_VIDEO_FORMAT_RGB15: return 16; case WG_VIDEO_FORMAT_RGB16: return 16; + case WG_VIDEO_FORMAT_RGB8: return 8; case WG_VIDEO_FORMAT_AYUV: return 32; case WG_VIDEO_FORMAT_I420: return 12; case WG_VIDEO_FORMAT_NV12: return 12; @@ -440,6 +452,8 @@ static WORD wg_video_format_get_depth(enum wg_video_format format) case WG_VIDEO_FORMAT_YUY2: return 16; case WG_VIDEO_FORMAT_YV12: return 12; case WG_VIDEO_FORMAT_YVYU: return 16; + case WG_VIDEO_FORMAT_IYUV: return 12; + case WG_VIDEO_FORMAT_NV11: return 12; }
assert(0); @@ -685,6 +699,7 @@ static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *fo {&MEDIASUBTYPE_RGB24, WG_VIDEO_FORMAT_BGR}, {&MEDIASUBTYPE_RGB555, WG_VIDEO_FORMAT_RGB15}, {&MEDIASUBTYPE_RGB565, WG_VIDEO_FORMAT_RGB16}, + {&MEDIASUBTYPE_RGB8, WG_VIDEO_FORMAT_RGB8}, {&MEDIASUBTYPE_AYUV, WG_VIDEO_FORMAT_AYUV}, {&MEDIASUBTYPE_I420, WG_VIDEO_FORMAT_I420}, {&MEDIASUBTYPE_NV12, WG_VIDEO_FORMAT_NV12}, @@ -692,6 +707,8 @@ static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *fo {&MEDIASUBTYPE_YUY2, WG_VIDEO_FORMAT_YUY2}, {&MEDIASUBTYPE_YV12, WG_VIDEO_FORMAT_YV12}, {&MEDIASUBTYPE_YVYU, WG_VIDEO_FORMAT_YVYU}, + {&MEDIASUBTYPE_IYUV, WG_VIDEO_FORMAT_IYUV}, + {&MEDIASUBTYPE_NV11, WG_VIDEO_FORMAT_NV11}, };
const VIDEOINFOHEADER *video_format = (const VIDEOINFOHEADER *)mt->pbFormat; @@ -1307,11 +1324,14 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, WG_VIDEO_FORMAT_UYVY, WG_VIDEO_FORMAT_YVYU, WG_VIDEO_FORMAT_NV12, + WG_VIDEO_FORMAT_IYUV, + WG_VIDEO_FORMAT_NV11, WG_VIDEO_FORMAT_BGRA, WG_VIDEO_FORMAT_BGRx, WG_VIDEO_FORMAT_BGR, WG_VIDEO_FORMAT_RGB16, WG_VIDEO_FORMAT_RGB15, + WG_VIDEO_FORMAT_RGB8, };
wg_parser_stream_get_preferred_format(pin->wg_stream, &format); diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index 5424633003e..4e21e899e1d 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -100,6 +100,7 @@ struct wg_format WG_VIDEO_FORMAT_BGR, WG_VIDEO_FORMAT_RGB15, WG_VIDEO_FORMAT_RGB16, + WG_VIDEO_FORMAT_RGB8,
WG_VIDEO_FORMAT_AYUV, WG_VIDEO_FORMAT_I420, @@ -108,6 +109,8 @@ struct wg_format WG_VIDEO_FORMAT_YUY2, WG_VIDEO_FORMAT_YV12, WG_VIDEO_FORMAT_YVYU, + WG_VIDEO_FORMAT_IYUV, /* Identical to I420. */ + WG_VIDEO_FORMAT_NV11, } format; int32_t width, height; uint32_t fps_n, fps_d; diff --git a/dlls/winegstreamer/wg_format.c b/dlls/winegstreamer/wg_format.c index a7876977d6c..2ce75f72971 100644 --- a/dlls/winegstreamer/wg_format.c +++ b/dlls/winegstreamer/wg_format.c @@ -148,6 +148,8 @@ static enum wg_video_format wg_video_format_from_gst(GstVideoFormat format) return WG_VIDEO_FORMAT_RGB15; case GST_VIDEO_FORMAT_RGB16: return WG_VIDEO_FORMAT_RGB16; + case GST_VIDEO_FORMAT_RGB8P: + return WG_VIDEO_FORMAT_RGB8; case GST_VIDEO_FORMAT_AYUV: return WG_VIDEO_FORMAT_AYUV; case GST_VIDEO_FORMAT_I420: @@ -400,6 +402,7 @@ static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format) case WG_VIDEO_FORMAT_BGR: return GST_VIDEO_FORMAT_BGR; case WG_VIDEO_FORMAT_RGB15: return GST_VIDEO_FORMAT_RGB15; case WG_VIDEO_FORMAT_RGB16: return GST_VIDEO_FORMAT_RGB16; + case WG_VIDEO_FORMAT_RGB8: return GST_VIDEO_FORMAT_RGB8P; case WG_VIDEO_FORMAT_AYUV: return GST_VIDEO_FORMAT_AYUV; case WG_VIDEO_FORMAT_I420: return GST_VIDEO_FORMAT_I420; case WG_VIDEO_FORMAT_NV12: return GST_VIDEO_FORMAT_NV12; @@ -407,6 +410,8 @@ static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format) case WG_VIDEO_FORMAT_YUY2: return GST_VIDEO_FORMAT_YUY2; case WG_VIDEO_FORMAT_YV12: return GST_VIDEO_FORMAT_YV12; case WG_VIDEO_FORMAT_YVYU: return GST_VIDEO_FORMAT_YVYU; + case WG_VIDEO_FORMAT_IYUV: return GST_VIDEO_FORMAT_I420; + case WG_VIDEO_FORMAT_NV11: return GST_VIDEO_FORMAT_UNKNOWN; default: return GST_VIDEO_FORMAT_UNKNOWN; } } diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index d2db1f039e4..d2ba01e9f1a 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -230,6 +230,7 @@ static NTSTATUS wg_parser_stream_enable(void *args) case WG_VIDEO_FORMAT_BGR: case WG_VIDEO_FORMAT_RGB15: case WG_VIDEO_FORMAT_RGB16: + case WG_VIDEO_FORMAT_RGB8: flip = !flip; break;
@@ -240,6 +241,8 @@ static NTSTATUS wg_parser_stream_enable(void *args) case WG_VIDEO_FORMAT_YUY2: case WG_VIDEO_FORMAT_YV12: case WG_VIDEO_FORMAT_YVYU: + case WG_VIDEO_FORMAT_IYUV: + case WG_VIDEO_FORMAT_NV11: case WG_VIDEO_FORMAT_UNKNOWN: break; }
From: Ziqing Hui zhui@codeweavers.com
--- dlls/mf/tests/transform.c | 5 +- dlls/winegstreamer/wmv_decoder.c | 78 ++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index a2e8d1d6e0b..47045112fbf 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -1229,6 +1229,7 @@ static void check_dmo_get_output_type(IMediaObject *media_object, const DMO_MEDI hr = IMediaObject_GetOutputType(media_object, 0, count - 1, NULL); ok(hr == S_OK, "GetOutputType returned unexpected hr %#lx.\n", hr); hr = IMediaObject_GetOutputType(media_object, 0, count - 1, &media_type); + todo_wine ok(hr == S_OK, "GetOutputType returned unexpected hr %#lx.\n", hr); if (hr == S_OK) MoFreeMediaType(&media_type); @@ -1242,7 +1243,9 @@ static void check_dmo_get_output_type(IMediaObject *media_object, const DMO_MEDI winetest_pop_context(); }
+ todo_wine ok(hr == DMO_E_NO_MORE_ITEMS, "GetOutputType returned unexpected hr %#lx.\n", hr); + todo_wine ok(i == count, "%lu types.\n", i); }
@@ -4965,7 +4968,6 @@ static void test_wmv_decoder_media_object(void) hr = IMediaObject_SetInputType(media_object, 0, NULL, DMO_SET_TYPEF_CLEAR); ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); hr = IMediaObject_GetOutputType(media_object, 0, 0, &media_type); - todo_wine ok(hr == DMO_E_TYPE_NOT_SET, "GetOutputType returned unexpected hr %#lx.\n", hr);
/* Test GetOutputType after setting input type. */ @@ -4988,7 +4990,6 @@ static void test_wmv_decoder_media_object(void) hr = IMediaObject_SetInputType(media_object, 0, input_type, 0); ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr);
- todo_wine check_dmo_get_output_type(media_object, expected_output_types, ARRAY_SIZE(expected_output_types));
winetest_pop_context(); diff --git a/dlls/winegstreamer/wmv_decoder.c b/dlls/winegstreamer/wmv_decoder.c index 1b03d9aa639..7421721d374 100644 --- a/dlls/winegstreamer/wmv_decoder.c +++ b/dlls/winegstreamer/wmv_decoder.c @@ -29,21 +29,38 @@
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
-extern const GUID MFVideoFormat_VC1S; +extern const GUID MEDIASUBTYPE_VC1S;
-DEFINE_GUID(MFVideoFormat_WMV_Unknown, 0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b); +DEFINE_GUID(MEDIASUBTYPE_WMV_Unknown, 0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b);
static const GUID *const wmv_decoder_input_types[] = { - &MFVideoFormat_WMV1, - &MFVideoFormat_WMV2, + &MEDIASUBTYPE_WMV1, + &MEDIASUBTYPE_WMV2, &MEDIASUBTYPE_WMVA, &MEDIASUBTYPE_WMVP, &MEDIASUBTYPE_WVP2, - &MFVideoFormat_WMV_Unknown, - &MFVideoFormat_WVC1, - &MFVideoFormat_WMV3, - &MFVideoFormat_VC1S, + &MEDIASUBTYPE_WMV_Unknown, + &MEDIASUBTYPE_WVC1, + &MEDIASUBTYPE_WMV3, + &MEDIASUBTYPE_VC1S, +}; + +static const enum wg_video_format wmv_decoder_output_formats[] = +{ + WG_VIDEO_FORMAT_NV12, + WG_VIDEO_FORMAT_YV12, + WG_VIDEO_FORMAT_IYUV, + WG_VIDEO_FORMAT_I420, + WG_VIDEO_FORMAT_YUY2, + WG_VIDEO_FORMAT_UYVY, + WG_VIDEO_FORMAT_YVYU, + WG_VIDEO_FORMAT_NV11, + WG_VIDEO_FORMAT_BGRx, + WG_VIDEO_FORMAT_BGR , + WG_VIDEO_FORMAT_RGB16, + WG_VIDEO_FORMAT_RGB15, + WG_VIDEO_FORMAT_RGB8, };
struct wmv_decoder @@ -59,6 +76,11 @@ struct wmv_decoder struct wg_format input_format; };
+static bool wg_format_is_set(struct wg_format *format) +{ + return format->major_type != WG_MAJOR_TYPE_UNKNOWN; +} + static inline struct wmv_decoder *impl_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, struct wmv_decoder, IUnknown_inner); @@ -387,8 +409,44 @@ static HRESULT WINAPI media_object_GetInputType(IMediaObject *iface, DWORD index static HRESULT WINAPI media_object_GetOutputType(IMediaObject *iface, DWORD index, DWORD type_index, DMO_MEDIA_TYPE *type) { - FIXME("iface %p, index %lu, type_index %lu, type %p stub!\n", iface, index, type_index, type); - return E_NOTIMPL; + struct wmv_decoder *decoder = impl_from_IMediaObject(iface); + struct wg_format output_format; + LONG width, height; + UINT32 image_size; + HRESULT hr; + + TRACE("iface %p, index %lu, type_index %lu, type %p.\n", iface, index, type_index, type); + + if (index > 0) + return DMO_E_INVALIDSTREAMINDEX; + if (type_index >= ARRAY_SIZE(wmv_decoder_output_formats)) + return DMO_E_NO_MORE_ITEMS; + if (!type) + return S_OK; + if (!wg_format_is_set(&decoder->input_format)) + return DMO_E_TYPE_NOT_SET; + + width = decoder->input_format.u.video_wmv.width; + height = decoder->input_format.u.video_wmv.height; + memset(&output_format, 0, sizeof(output_format)); + output_format.major_type = WG_MAJOR_TYPE_VIDEO; + output_format.u.video.format = wmv_decoder_output_formats[type_index]; + output_format.u.video.width = width; + output_format.u.video.height = height; + + if (!amt_from_wg_format((AM_MEDIA_TYPE *)type, &output_format, TRUE)) + return E_OUTOFMEMORY; + + if (FAILED(hr = MFCalculateImageSize(&type->subtype, width, height, &image_size))) + { + FIXME("Failed to get image size of subtype %s.\n", debugstr_guid(&type->subtype)); + return hr; + } + + type->lSampleSize = image_size; + ((VIDEOINFOHEADER *)type->pbFormat)->bmiHeader.biSizeImage = image_size; + + return S_OK; }
static HRESULT WINAPI media_object_SetInputType(IMediaObject *iface, DWORD index,
Zebediah Figura (@zfigura) commented about dlls/winegstreamer/unixlib.h:
WG_VIDEO_FORMAT_BGR, WG_VIDEO_FORMAT_RGB15, WG_VIDEO_FORMAT_RGB16,
WG_VIDEO_FORMAT_RGB8,
RGB8 is palettized, so it's not quite that simple. If we don't actually need RGB8 support I'd advise not mapping it to the backend.
Zebediah Figura (@zfigura) commented about dlls/winegstreamer/unixlib.h:
WG_VIDEO_FORMAT_YUY2, WG_VIDEO_FORMAT_YV12, WG_VIDEO_FORMAT_YVYU,
WG_VIDEO_FORMAT_IYUV, /* Identical to I420. */
We should map IYUV to WG_VIDEO_FORMAT_I420 rather than adding a new backend format.
On Thu Dec 8 01:03:19 2022 +0000, Zebediah Figura wrote:
We should map IYUV to WG_VIDEO_FORMAT_I420 rather than adding a new backend format.
OK, I'll remove this patch (PATCH 3). Seems that it's not that simple to add these formats.
On Thu Dec 8 02:09:56 2022 +0000, Ziqing Hui wrote:
OK, I'll remove this patch (PATCH 3). Seems that it's not that simple to add these formats.
Is the NV11 part OK in this patch?
On Tue Dec 6 15:55:18 2022 +0000, Rémi Bernon wrote:
What about using a `struct wg_format` array here and `amt_from_wg_format` to create the DMO_MEDIA_TYPE, could it work and reduce the code duplication of DMO_MEDIA_TYPE creation?
Zebediah says we can't simply add IYUV and RGB8 to wg_video_format. Then I think this method doesn't work because we need a wg_video_format to identify each type and convert it to subtype/bpp/compression.
Also, we can't simply drop IYUV format in GetOutputType(). Because there is high possibility that an application use type index to enumerate each output formats. If one format fails, the enumration will stop, formats behind the failed format will be ignored.
On Thu Dec 8 02:35:33 2022 +0000, Ziqing Hui wrote:
Zebediah says we can't simply add IYUV and RGB8 to wg_video_format. Then I think this method doesn't work because we need a wg_video_format to identify each type and convert it to subtype/bpp/compression. Also, we can't simply drop IYUV format in GetOutputType(). Because there is high possibility that an application use type index to enumerate each output formats. If one format fails, the enumration will stop, formats behind the failed format will be ignored.
I think maybe in the future, we chould add something like subtype_to_dmo_media_type(). I think other DMO will also need it.