[PATCH 0/2] MR1839: mf/tests: Test SetOutputType for WMV decoder.
From: Ziqing Hui <zhui(a)codeweavers.com> --- dlls/mf/tests/transform.c | 349 ++++++++++++++++++-------------------- 1 file changed, 168 insertions(+), 181 deletions(-) diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index a2e8d1d6e0b..0d500109bf1 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -1246,6 +1246,171 @@ static void check_dmo_get_output_type(IMediaObject *media_object, const DMO_MEDI ok(i == count, "%lu types.\n", i); } +static void check_dmo_set_input_type(IMediaObject *media_object, const GUID *subtype) +{ + DMO_MEDIA_TYPE bad_media_type, *good_media_type; + VIDEOINFOHEADER *header; + char buffer[1024]; + DWORD i, flag; + HRESULT hr; + + const DWORD flags[] = {0, 0x4, DMO_SET_TYPEF_CLEAR, DMO_SET_TYPEF_TEST_ONLY, DMO_SET_TYPEF_TEST_ONLY | 0x4}; + + memset(&bad_media_type, 0, sizeof(bad_media_type)); + good_media_type = (DMO_MEDIA_TYPE *)buffer; + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header = (VIDEOINFOHEADER *)(good_media_type + 1); + + /* Test invalid stream index. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + hr = IMediaObject_SetInputType(media_object, 1, NULL, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + hr = IMediaObject_SetInputType(media_object, 1, &bad_media_type, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + hr = IMediaObject_SetInputType(media_object, 1, good_media_type, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + } + + /* Test unaccepted type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + if (!(flag & DMO_SET_TYPEF_CLEAR)) + { + hr = IMediaObject_SetInputType(media_object, 0, NULL, flag); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + } + hr = IMediaObject_SetInputType(media_object, 0, &bad_media_type, flag); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + } + + /* Test clearing the type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = DMO_SET_TYPEF_CLEAR | flags[i]; + hr = IMediaObject_SetInputType(media_object, 0, NULL, flag); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + } + + /* Test accepted type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, flag); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx for flag %#lx.", hr, flag); + } + + /* Test unconsidered header member.*/ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header->dwBitRate = 0xdeadbeef; + header->dwBitErrorRate = 0xdeadbeef; + header->AvgTimePerFrame = 0xdeadbeef; + header->bmiHeader.biPlanes = 0xdead; + header->bmiHeader.biBitCount = 0xdead; + header->bmiHeader.biSizeImage = 0xdeadbeef; + header->bmiHeader.biXPelsPerMeter = 0xdead; + header->bmiHeader.biYPelsPerMeter = 0xdead; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, 0); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test invalid major type. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + good_media_type->majortype = MFMediaType_Default; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test invalid subtype. */ + init_dmo_media_type_video(good_media_type, &MEDIASUBTYPE_None, 16, 16); + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test invalid format type. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + good_media_type->formattype = FORMAT_None; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test invalid format size. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + good_media_type->cbFormat = 1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test NULL format pointer. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + good_media_type->pbFormat = NULL; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test video header struct size. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header->bmiHeader.biSize = 0; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biSize = 1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biSize = 0xdeadbeef; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test width. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header->bmiHeader.biWidth = 0; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biWidth = -1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biWidth = 4096 + 1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biWidth = 4096; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test height. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header->bmiHeader.biHeight = 0; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biHeight = 4096 + 1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biHeight = 4096; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biHeight = -4096; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + + /* Test compression. */ + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + header->bmiHeader.biCompression = 0; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biCompression = 1; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biCompression = 2; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + header->bmiHeader.biCompression = 0xdeadbeef; + hr = IMediaObject_SetInputType(media_object, 0, good_media_type, DMO_SET_TYPEF_TEST_ONLY); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); +} + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -4721,51 +4886,9 @@ static void test_wmv_decoder_media_object(void) {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 - { - DWORD stream_index; - enum - { - MEDIA_TYPE_NULL = 0, - MEDIA_TYPE_GOOD = 1, - MEDIA_TYPE_BAD = 2, - } media_type; - DWORD flags; - HRESULT hr; - } - set_type_arg_tests[] = - { - {1, MEDIA_TYPE_NULL, 0, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_NULL, 0x4, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_NULL, DMO_SET_TYPEF_CLEAR, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_NULL, DMO_SET_TYPEF_TEST_ONLY, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_GOOD, 0, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_GOOD, 0x4, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_GOOD, DMO_SET_TYPEF_CLEAR, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_GOOD, DMO_SET_TYPEF_TEST_ONLY, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_BAD, 0, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_BAD, 0x4, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_BAD, DMO_SET_TYPEF_CLEAR, DMO_E_INVALIDSTREAMINDEX}, - {1, MEDIA_TYPE_BAD, DMO_SET_TYPEF_TEST_ONLY, DMO_E_INVALIDSTREAMINDEX}, - {0, MEDIA_TYPE_BAD, 0, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_BAD, 0x4, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_BAD, DMO_SET_TYPEF_CLEAR, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_BAD, DMO_SET_TYPEF_TEST_ONLY, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_NULL, 0, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_NULL, 0x4, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_NULL, DMO_SET_TYPEF_TEST_ONLY, DMO_E_TYPE_NOT_ACCEPTED}, - {0, MEDIA_TYPE_NULL, DMO_SET_TYPEF_CLEAR, S_OK}, - {0, MEDIA_TYPE_NULL, DMO_SET_TYPEF_CLEAR | 0x4, S_OK}, - {0, MEDIA_TYPE_NULL, DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY, S_OK}, - {0, MEDIA_TYPE_NULL, DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY | 0x4, S_OK}, - {0, MEDIA_TYPE_GOOD, 0x4, S_OK}, - {0, MEDIA_TYPE_GOOD, DMO_SET_TYPEF_CLEAR, S_OK}, - {0, MEDIA_TYPE_GOOD, DMO_SET_TYPEF_CLEAR | DMO_SET_TYPEF_TEST_ONLY, S_OK}, - }; DMO_MEDIA_TYPE media_type, *input_type; IMediaObject *media_object; DWORD in_count, out_count; - VIDEOINFOHEADER *header; char buffer[1024]; ULONG ret, i; HRESULT hr; @@ -4779,6 +4902,8 @@ static void test_wmv_decoder_media_object(void) return; } + input_type = (DMO_MEDIA_TYPE *)buffer; + hr = CoInitialize(NULL); ok(hr == S_OK, "CoInitialize failed, hr %#lx.\n", hr); @@ -4805,12 +4930,9 @@ static void test_wmv_decoder_media_object(void) check_dmo_get_input_type(media_object, expected_input_types, ARRAY_SIZE(expected_input_types)); /* Test SetInputType. */ - input_type = (DMO_MEDIA_TYPE *)buffer; - header = (VIDEOINFOHEADER *)(input_type + 1); 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) @@ -4822,142 +4944,7 @@ static void test_wmv_decoder_media_object(void) } winetest_push_context("in %lu", i); - - /* Test setting the type. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - hr = IMediaObject_SetInputType(media_object, 0, input_type, 0); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - header->dwBitRate = 0xdeadbeef; - header->dwBitErrorRate = 0xdeadbeef; - header->AvgTimePerFrame = 0xdeadbeef; - header->bmiHeader.biPlanes = 0xdead; - header->bmiHeader.biBitCount = 0xdead; - header->bmiHeader.biSizeImage = 0xdeadbeef; - header->bmiHeader.biXPelsPerMeter = 0xdead; - header->bmiHeader.biYPelsPerMeter = 0xdead; - hr = IMediaObject_SetInputType(media_object, 0, input_type, 0); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test invalid major type. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - input_type->majortype = MFMediaType_Default; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test invalid subtype. */ - init_dmo_media_type_video(input_type, &MEDIASUBTYPE_None, 96, 96); - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test invalid format type. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - input_type->formattype = FORMAT_None; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test invalid format size. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - input_type->cbFormat = 1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test NULL format pointer. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - input_type->pbFormat = NULL; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test video header struct size. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - header->bmiHeader.biSize = 0; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biSize = 1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biSize = 0xdeadbeef; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test width. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - header->bmiHeader.biWidth = 0; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biWidth = -1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biWidth = 4096 + 1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biWidth = 4096; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test height. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - header->bmiHeader.biHeight = 0; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biHeight = 4096 + 1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biHeight = 4096; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biHeight = -4096; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - - /* Test compression. */ - init_dmo_media_type_video(input_type, subtype, 96, 96); - header->bmiHeader.biCompression = 0; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - todo_wine - ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biCompression = 1; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biCompression = 2; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - header->bmiHeader.biCompression = 0xdeadbeef; - hr = IMediaObject_SetInputType(media_object, 0, input_type, DMO_SET_TYPEF_TEST_ONLY); - ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); - - winetest_pop_context(); - } - - /* Test SetInputType arguments. */ - memset(&media_type, 0, sizeof(media_type)); - init_dmo_media_type_video(input_type, &expected_input_types[0].subtype, 96, 96); - for (i = 0; i < ARRAY_SIZE(set_type_arg_tests); ++i) - { - const struct set_type_arg *test = &set_type_arg_tests[i]; - DMO_MEDIA_TYPE *type; - - winetest_push_context("Test %lu", i); - - if (test->media_type == MEDIA_TYPE_GOOD) - type = input_type; - else if (test->media_type == MEDIA_TYPE_BAD) - type = &media_type; - else - type = NULL; - - hr = IMediaObject_SetInputType(media_object, test->stream_index, type, test->flags); - ok(hr == test->hr, "SetInputType returned unexpected hr %#lx, expected %#lx.\n", hr, test->hr); - + check_dmo_set_input_type(media_object, subtype); winetest_pop_context(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1839
From: Ziqing Hui <zhui(a)codeweavers.com> --- dlls/mf/tests/transform.c | 143 +++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 3 deletions(-) diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 0d500109bf1..6debc451ff3 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -55,6 +55,58 @@ DEFINE_GUID(MFVideoFormat_WMV_Unknown,0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0x DEFINE_GUID(mft_output_sample_incomplete,0xffffff,0xffff,0xffff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff); +static BOOL is_compressed_subtype(const GUID *subtype) +{ + if (IsEqualGUID(subtype, &MEDIASUBTYPE_WMV1) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WMV2) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WMVA) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WMVP) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WVP2) + || IsEqualGUID(subtype, &MFVideoFormat_WMV_Unknown) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WVC1) + || IsEqualGUID(subtype, &MEDIASUBTYPE_WMV3) + || IsEqualGUID(subtype, &MFVideoFormat_VC1S)) + return TRUE; + return FALSE; +} + +static DWORD subtype_to_compression(const GUID *subtype) +{ + if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB32) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB24) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB555) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB8)) + return BI_RGB; + else if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB565)) + return BI_BITFIELDS; + else + return subtype->Data1; +} + +static DWORD subtype_to_bpp(const GUID *subtype) +{ + if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB8)) + return 8; + else if (IsEqualGUID(subtype, &MEDIASUBTYPE_NV12) + || IsEqualGUID(subtype, &MEDIASUBTYPE_YV12) + || IsEqualGUID(subtype, &MEDIASUBTYPE_IYUV) + || IsEqualGUID(subtype, &MEDIASUBTYPE_I420) + || IsEqualGUID(subtype, &MEDIASUBTYPE_NV11)) + return 12; + else if (IsEqualGUID(subtype, &MEDIASUBTYPE_YUY2) + || IsEqualGUID(subtype, &MEDIASUBTYPE_UYVY) + || IsEqualGUID(subtype, &MEDIASUBTYPE_YVYU) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB565) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB555)) + return 16; + else if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB24)) + return 24; + else if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB32)) + return 32; + else + return 0; +} + static void load_resource(const WCHAR *filename, const BYTE **data, DWORD *length) { HRSRC resource = FindResourceW(NULL, filename, (const WCHAR *)RT_RCDATA); @@ -274,17 +326,19 @@ static void init_dmo_media_type_video(DMO_MEDIA_TYPE *media_type, const GUID *subtype, const LONG width, const LONG height) { VIDEOINFOHEADER *header = (VIDEOINFOHEADER *)(media_type + 1); + BOOL compressed = is_compressed_subtype(subtype); memset(header, 0, sizeof(*header)); header->bmiHeader.biSize = sizeof(header->bmiHeader); header->bmiHeader.biWidth = width; header->bmiHeader.biHeight = height; - header->bmiHeader.biCompression = subtype->Data1; + header->bmiHeader.biBitCount = subtype_to_bpp(subtype); + header->bmiHeader.biCompression = subtype_to_compression(subtype); media_type->majortype = MEDIATYPE_Video; media_type->subtype = *subtype; - media_type->bFixedSizeSamples = FALSE; - media_type->bTemporalCompression = TRUE; + media_type->bFixedSizeSamples = !compressed; + media_type->bTemporalCompression = compressed; media_type->lSampleSize = 0; media_type->formattype = FORMAT_VideoInfo; media_type->pUnk = NULL; @@ -1411,6 +1465,62 @@ static void check_dmo_set_input_type(IMediaObject *media_object, const GUID *sub ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); } +static void check_dmo_set_output_type(IMediaObject *media_object, const GUID *subtype) +{ + DMO_MEDIA_TYPE bad_media_type, *good_media_type; + char buffer[1024]; + DWORD i, flag; + HRESULT hr; + + const DWORD flags[] = {0, 0x4, DMO_SET_TYPEF_CLEAR, DMO_SET_TYPEF_TEST_ONLY, DMO_SET_TYPEF_TEST_ONLY | 0x4}; + + memset(&bad_media_type, 0, sizeof(bad_media_type)); + good_media_type = (DMO_MEDIA_TYPE *)buffer; + init_dmo_media_type_video(good_media_type, subtype, 16, 16); + + /* Test invalid stream index. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + hr = IMediaObject_SetOutputType(media_object, 1, NULL, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + hr = IMediaObject_SetOutputType(media_object, 1, &bad_media_type, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + hr = IMediaObject_SetOutputType(media_object, 1, good_media_type, flag); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + } + + /* Test unaccepted type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + if (!(flag & DMO_SET_TYPEF_CLEAR)) + { + hr = IMediaObject_SetOutputType(media_object, 0, NULL, flag); + ok(hr == E_POINTER, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + } + hr = IMediaObject_SetOutputType(media_object, 0, &bad_media_type, flag); + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + } + + /* Test clearing the type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = DMO_SET_TYPEF_CLEAR | flags[i]; + hr = IMediaObject_SetOutputType(media_object, 0, NULL, flag); + ok(hr == S_OK, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + } + + /* Test accepted type. */ + for (i = 0; i < ARRAY_SIZE(flags); ++i) + { + flag = flags[i]; + hr = IMediaObject_SetOutputType(media_object, 0, good_media_type, flag); + ok(hr == S_OK, "SetOutputType returned unexpected hr %#lx for flag %#lx.\n", hr, flag); + } +} + + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -4981,6 +5091,33 @@ static void test_wmv_decoder_media_object(void) winetest_pop_context(); } + /* Test SetOutputType 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_SetOutputType(media_object, 0, &media_type, 0); + todo_wine + ok(hr == DMO_E_TYPE_NOT_SET, "SetOutputType returned unexpected hr %#lx.\n", hr); + + /* Test SetOutputType after setting input type. */ + init_dmo_media_type_video(input_type, &expected_input_types[0].subtype, 16, 16); + hr = IMediaObject_SetInputType(media_object, 0, input_type, 0); + ok(hr == S_OK, "SetInputType returned unexpected hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(expected_output_types); ++i) + { + const GUID *subtype = &expected_output_types[i].subtype; + if (IsEqualGUID(subtype, &MEDIASUBTYPE_RGB565) + || IsEqualGUID(subtype, &MEDIASUBTYPE_RGB8)) + { + skip("Skipping SetOutputType tests for output subtype %s.\n", debugstr_guid(subtype)); + continue; + } + + winetest_push_context("out %lu", i); + todo_wine + check_dmo_set_output_type(media_object, subtype); + winetest_pop_context(); + } + ret = IMediaObject_Release(media_object); ok(ret == 0, "Release returned %lu\n", ret); CoUninitialize(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/1839
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=127817 Your paranoid android. === debian11 (32 bit report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit ar:MA report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit de report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit fr report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit he:IL report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit hi:IN report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit ja:JP report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11 (32 bit zh:CN report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11b (32 bit WoW report) === Report validation errors: mf:transform prints too much data (50285 bytes) === debian11b (64 bit WoW report) === Report validation errors: mf:transform prints too much data (50285 bytes)
participants (3)
-
Marvin -
Ziqing Hui -
Ziqing Hui (@zhui)