From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/colorcnv/tests/Makefile.in | 2 +- dlls/colorcnv/tests/colorcnv.c | 232 ++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+), 1 deletion(-) diff --git a/dlls/colorcnv/tests/Makefile.in b/dlls/colorcnv/tests/Makefile.in index a4ee918ef95..2ec3b1231f4 100644 --- a/dlls/colorcnv/tests/Makefile.in +++ b/dlls/colorcnv/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = colorcnv.dll -IMPORTS = +IMPORTS = ole32 msdmo dmoguids wmcodecdspuuid strmiids uuid SOURCES = \ colorcnv.c diff --git a/dlls/colorcnv/tests/colorcnv.c b/dlls/colorcnv/tests/colorcnv.c index 991f047bdef..c42fd6766ff 100644 --- a/dlls/colorcnv/tests/colorcnv.c +++ b/dlls/colorcnv/tests/colorcnv.c @@ -18,6 +18,238 @@ #include "wine/test.h" +#define COBJMACROS +#include <mediaerr.h> +#include <mediaobj.h> +#include <uuids.h> +#include <wmcodecdsp.h> + +#include <amvideo.h> +#include <dmort.h> + +static void test_media_object_media_types(void) +{ + static const GUID *input_types[] = + { + &MEDIASUBTYPE_YV12, + &MEDIASUBTYPE_YUY2, + &MEDIASUBTYPE_UYVY, + &MEDIASUBTYPE_AYUV, + &MEDIASUBTYPE_NV12, + &MEDIASUBTYPE_RGB32, + &MEDIASUBTYPE_RGB565, + &MEDIASUBTYPE_I420, + &MEDIASUBTYPE_IYUV, + &MEDIASUBTYPE_YVYU, + &MEDIASUBTYPE_RGB24, + &MEDIASUBTYPE_RGB555, + &MEDIASUBTYPE_RGB8, + &MEDIASUBTYPE_V216, + &MEDIASUBTYPE_V410, + &MEDIASUBTYPE_NV11, + &MEDIASUBTYPE_Y41P, + &MEDIASUBTYPE_Y41T, + &MEDIASUBTYPE_Y42T, + &MEDIASUBTYPE_YVU9, + }; + + static const struct + { + const GUID *guid; + ULONG cbFormat; + ULONG lSampleSize; + } + output_types[] = + { + {&MEDIASUBTYPE_YV12, sizeof(VIDEOINFOHEADER), 13824}, + {&MEDIASUBTYPE_YUY2, sizeof(VIDEOINFOHEADER), 18432}, + {&MEDIASUBTYPE_UYVY, sizeof(VIDEOINFOHEADER), 18432}, + {&MEDIASUBTYPE_AYUV, sizeof(VIDEOINFOHEADER), 36864}, + {&MEDIASUBTYPE_NV12, sizeof(VIDEOINFOHEADER), 13824}, + {&MEDIASUBTYPE_RGB32, sizeof(VIDEOINFOHEADER), 36864}, + {&MEDIASUBTYPE_RGB565, 100, 18432}, + {&MEDIASUBTYPE_I420, sizeof(VIDEOINFOHEADER), 13824}, + {&MEDIASUBTYPE_IYUV, sizeof(VIDEOINFOHEADER), 13824}, + {&MEDIASUBTYPE_YVYU, sizeof(VIDEOINFOHEADER), 18432}, + {&MEDIASUBTYPE_RGB24, sizeof(VIDEOINFOHEADER), 27648}, + {&MEDIASUBTYPE_RGB555, 100, 18432}, + {&MEDIASUBTYPE_RGB8, 1112, 9216}, + {&MEDIASUBTYPE_V216, sizeof(VIDEOINFOHEADER), 36864}, + {&MEDIASUBTYPE_V410, sizeof(VIDEOINFOHEADER), 36864}, + {&MEDIASUBTYPE_NV11, sizeof(VIDEOINFOHEADER), 13824}, + }; + + DWORD num_in_streams, num_out_streams; + VIDEOINFOHEADER video_info = {0}; + IMediaObject *media_object; + DMO_MEDIA_TYPE mt = {0}; + ULONG refcount; + HRESULT hr; + int i; + + hr = CoInitialize(NULL); + ok(hr == S_OK, "CoInitialize failed, hr %#lx.\n", hr); + + hr = CoCreateInstance(&CLSID_CColorConvertDMO, NULL, CLSCTX_INPROC_SERVER, &IID_IMediaObject, + (void **)&media_object); + ok(hr == S_OK, "Failed to create media object, hr %#lx.\n", hr); + + hr = IMediaObject_GetStreamCount(media_object, &num_in_streams, &num_out_streams); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine + ok(num_in_streams == 1, "Got num_in_streams %lu.\n", num_in_streams); + todo_wine + ok(num_out_streams == 1, "Got num_out_streams %lu.\n", num_in_streams); + + hr = IMediaObject_GetInputCurrentType(media_object, 0, &mt); + todo_wine + ok(hr == DMO_E_TYPE_NOT_SET, "Got hr %#lx.\n", hr); + + for (i = 0; i < ARRAY_SIZE(input_types); i++) + { + winetest_push_context("%d", i); + hr = IMediaObject_GetInputType(media_object, 0, i, &mt); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video), "Unexpected major type %s.\n", + wine_dbgstr_guid(&mt.majortype)); + todo_wine + ok(IsEqualGUID(&mt.subtype, input_types[i]), "Unexpected subtype %s.\n", wine_dbgstr_guid(&mt.subtype)); + todo_wine + ok(mt.bFixedSizeSamples, "bFixedSizeSamples should be true.\n"); + ok(!mt.bTemporalCompression, "bTemporalCompression should be false.\n"); + ok(mt.lSampleSize == 0, "Unexpected lSampleSize %lu.\n", mt.lSampleSize); + ok(IsEqualGUID(&mt.formattype, &GUID_NULL), "Unexpected format type %s.\n", wine_dbgstr_guid(&mt.formattype)); + ok(mt.pUnk == NULL, "Unexpected pUnk value %p.\n", mt.pUnk); + ok(mt.cbFormat == 0, "Unexpected cbFormat value %lu.\n", mt.cbFormat); + ok(mt.pbFormat == NULL, "Unexpected pbFormat vlaue %p.\n", mt.pbFormat); + winetest_pop_context(); + } + + hr = IMediaObject_GetInputType(media_object, 0, i, &mt); + todo_wine + ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#lx.\n", hr); + + for (i = 0; i < ARRAY_SIZE(output_types); i++) + { + winetest_push_context("%d", i); + hr = IMediaObject_GetOutputType(media_object, 0, i, &mt); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video), "Unexpected major type %s.\n", + wine_dbgstr_guid(&mt.majortype)); + todo_wine + ok(IsEqualGUID(&mt.subtype, output_types[i].guid), "Unexpected sub type %s.\n", wine_dbgstr_guid(&mt.subtype)); + todo_wine + ok(mt.bFixedSizeSamples, "bFixedSizeSamples should be true.\n"); + ok(!mt.bTemporalCompression, "bTemporalCompression should be false.\n"); + ok(mt.lSampleSize == 0, "Unexpected lSampleSize %lu.\n", mt.lSampleSize); + ok(IsEqualGUID(&mt.formattype, &GUID_NULL), "Unexpected format type %s.\n", wine_dbgstr_guid(&mt.formattype)); + ok(mt.pUnk == NULL, "Unexpected pUnk value %p.\n", mt.pUnk); + ok(mt.cbFormat == 0, "Unexpected cbFormat value %lu.\n", mt.cbFormat); + ok(mt.pbFormat == NULL, "Unexpected pbFormat value %p.\n", mt.pbFormat); + winetest_pop_context(); + } + + hr = IMediaObject_GetOutputType(media_object, 0, i, &mt); + todo_wine + ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#lx.\n", hr); + + mt.majortype = MEDIATYPE_Video; + mt.subtype = MEDIASUBTYPE_RGB24; + mt.bFixedSizeSamples = TRUE; + mt.lSampleSize = 96 * 96 * 3; + hr = IMediaObject_SetInputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + + /* MS documentation for BITMAPINFOHEADER states biSizeImage can be zero + * for uncompressed RGB bitmaps; but this DMO rejects it with E_INVALIDARG + */ + mt.formattype = FORMAT_VideoInfo; + mt.cbFormat = sizeof(video_info); + mt.pbFormat = (BYTE *)&video_info; + video_info.bmiHeader.biSize = sizeof(video_info.bmiHeader); + video_info.bmiHeader.biWidth = 96; + video_info.bmiHeader.biHeight = 96; + video_info.bmiHeader.biPlanes = 1; + video_info.bmiHeader.biBitCount = 24; + video_info.bmiHeader.biCompression = BI_RGB; + hr = IMediaObject_SetInputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + video_info.bmiHeader.biSizeImage = 96 * 96 * 3; + hr = IMediaObject_SetInputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + memset(&mt, 0, sizeof(mt)); + for (i = 0; i < ARRAY_SIZE(output_types); i++) + { + winetest_push_context("%d", i); + hr = IMediaObject_GetOutputType(media_object, 0, i, &mt); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video), "Unexpected major type %s.\n", + wine_dbgstr_guid(&mt.majortype)); + todo_wine + ok(IsEqualGUID(&mt.subtype, output_types[i].guid), "Unexpected sub type %s.\n", wine_dbgstr_guid(&mt.subtype)); + todo_wine + ok(mt.bFixedSizeSamples, "bFixedSizeSamples should be true.\n"); + ok(!mt.bTemporalCompression, "bTemporalCompression should be false.\n"); + todo_wine + ok(mt.lSampleSize == output_types[i].lSampleSize, "Unexpected lSampleSize %lu.\n", mt.lSampleSize); + todo_wine + ok(IsEqualGUID(&mt.formattype, &FORMAT_VideoInfo), "Unexpected format type %s.\n", + wine_dbgstr_guid(&mt.formattype)); + ok(mt.pUnk == NULL, "Unexpected pUnk value %p.\n", mt.pUnk); + todo_wine + ok(mt.cbFormat == output_types[i].cbFormat, "Unexpected cbFormat value %lu.\n", mt.cbFormat); + todo_wine + ok(mt.pbFormat != NULL, "pbFormat should not be NULL.\n"); + MoFreeMediaType(&mt); + winetest_pop_context(); + } + + mt.majortype = MEDIATYPE_Video; + mt.subtype = MEDIASUBTYPE_RGB32; + mt.bFixedSizeSamples = TRUE; + mt.lSampleSize = 96 * 96 * 4; + hr = IMediaObject_SetOutputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == DMO_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + + memset(&video_info, 0, sizeof(video_info)); + mt.formattype = FORMAT_VideoInfo; + mt.cbFormat = sizeof(video_info); + mt.pbFormat = (BYTE *)&video_info; + video_info.bmiHeader.biSize = sizeof(video_info.bmiHeader); + video_info.bmiHeader.biWidth = 96; + video_info.bmiHeader.biHeight = 96; + video_info.bmiHeader.biPlanes = 1; + video_info.bmiHeader.biBitCount = 32; + video_info.bmiHeader.biCompression = BI_RGB; + hr = IMediaObject_SetOutputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + + video_info.bmiHeader.biSizeImage = 96 * 96 * 4; + hr = IMediaObject_SetInputType(media_object, 0, &mt, 0); + todo_wine + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + refcount = IMediaObject_Release(media_object); + ok(refcount == 0, "Unexpected refcount %lu.\n", refcount); + + CoUninitialize(); +} + START_TEST(colorcnv) { + test_media_object_media_types(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10709