From: Ziqing Hui zhui@codeweavers.com
--- dlls/mf/tests/transform.c | 203 +++++++++++++++++++++++++++----------- 1 file changed, 144 insertions(+), 59 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 09c0e83a7dc..53c0914c98c 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" @@ -55,6 +55,12 @@ 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);
+typedef enum +{ + INPUT_FUNC, + OUTPUT_FUNC, +} FUNC_TYPE; + static void load_resource(const WCHAR *filename, const BYTE **data, DWORD *length) { HRSRC resource = FindResourceW(NULL, filename, (const WCHAR *)RT_RCDATA); @@ -1071,31 +1077,84 @@ DWORD check_mf_sample_collection_(const char *file, int line, IMFCollection *sam return ctx.diff / count; }
-#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) +static void check_media_object_get_type(IMediaObject *media_object, + FUNC_TYPE type, const DMO_MEDIA_TYPE *expected_type, ULONG count) { - ok_(__FILE__, line)(IsEqualGUID(&media_type->majortype, &expected->majortype), - "Got unexpected majortype %s, expected %s.\n", - debugstr_guid(&media_type->majortype), debugstr_guid(&expected->majortype)); - ok_(__FILE__, line)(IsEqualGUID(&media_type->subtype, &expected->subtype), - "Got unexpected subtype %s, expected %s.\n", - debugstr_guid(&media_type->subtype), debugstr_guid(&expected->subtype)); - ok_(__FILE__, line)(media_type->bFixedSizeSamples == expected->bFixedSizeSamples, - "Got unexpected bFixedSizeSamples %d, expected %d.\n", - media_type->bFixedSizeSamples, expected->bFixedSizeSamples); - ok_(__FILE__, line)(media_type->bTemporalCompression == expected->bTemporalCompression, - "Got unexpected bTemporalCompression %d, expected %d.\n", - media_type->bTemporalCompression, expected->bTemporalCompression); - 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), - "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); + HRESULT (*get_type)(IMediaObject* media_object, DWORD stream_index, DWORD type_index, DMO_MEDIA_TYPE *media_type); + DMO_MEDIA_TYPE media_type; + HRESULT hr; + DWORD i; + + if (type == INPUT_FUNC) + { + winetest_push_context("GetInputType"); + get_type = IMediaObject_GetInputType; + } + else + { + winetest_push_context("GetOutputType"); + get_type = IMediaObject_GetOutputType; + } + + hr = get_type(media_object, 1, 0, NULL); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 1, 0, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 1, count, &media_type); + ok(hr == DMO_E_INVALIDSTREAMINDEX, "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 0, count, &media_type); + ok(hr == DMO_E_NO_MORE_ITEMS, "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 0, count, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS || broken(hr == S_OK && type == OUTPUT_FUNC), + "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 0, 0xdeadbeef, NULL); + ok(hr == DMO_E_NO_MORE_ITEMS || broken(hr == S_OK && type == OUTPUT_FUNC), + "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 0, count - 1, NULL); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = get_type(media_object, 0, count - 1, &media_type); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + if (hr == S_OK) + MoFreeMediaType(&media_type); + + i = -1; + while (SUCCEEDED(hr = get_type(media_object, 0, ++i, &media_type))) + { + const DMO_MEDIA_TYPE *expected = &expected_type[i]; + + winetest_push_context("Type %lu", i); + + ok(IsEqualGUID(&media_type.majortype, &expected->majortype), + "Got unexpected majortype %s, expected %s.\n", + debugstr_guid(&media_type.majortype), debugstr_guid(&expected->majortype)); + ok(IsEqualGUID(&media_type.subtype, &expected->subtype), + "Got unexpected subtype %s, expected %s.\n", + debugstr_guid(&media_type.subtype), debugstr_guid(&expected->subtype)); + ok(media_type.bFixedSizeSamples == expected->bFixedSizeSamples, + "Got unexpected bFixedSizeSamples %d, expected %d.\n", + media_type.bFixedSizeSamples, expected->bFixedSizeSamples); + ok(media_type.bTemporalCompression == expected->bTemporalCompression, + "Got unexpected bTemporalCompression %d, expected %d.\n", + media_type.bTemporalCompression, expected->bTemporalCompression); + ok(media_type.lSampleSize == expected->lSampleSize, + "Got unexpected lSampleSize %lu, expected %lu.\n", + media_type.lSampleSize, expected->lSampleSize); + ok(IsEqualGUID(&media_type.formattype, &expected->formattype), + "Got unexpected formattype %s.\n", + debugstr_guid(&media_type.formattype)); + ok(media_type.pUnk == NULL, "Got unexpected pUnk %p.\n", media_type.pUnk); + ok(media_type.cbFormat == expected->cbFormat, + "Got unexpected cbFormat %lu, expected %lu.\n", + media_type.cbFormat, expected->cbFormat); + + MoFreeMediaType(&media_type); + winetest_pop_context(); + } + + ok(hr == DMO_E_NO_MORE_ITEMS, "Got unexpected hr %#lx.\n", hr); + ok(i == count, "%lu types.\n", i); + + winetest_pop_context(); }
static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) @@ -4531,15 +4590,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 { @@ -4590,7 +4665,7 @@ static void test_wmv_decoder_media_object(void) ULONG ret, i; HRESULT hr;
- winetest_push_context("wmvdec"); + winetest_push_context("WMV decoder");
if (!has_video_processor) { @@ -4622,30 +4697,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_media_object_get_type(media_object, INPUT_FUNC, expected_input_types, ARRAY_SIZE(expected_input_types));
/* Test SetInputType. */ input_type = (DMO_MEDIA_TYPE *)buffer; @@ -4804,6 +4856,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("Input %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_media_object_get_type(media_object, OUTPUT_FUNC, 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();