From: Rémi Bernon rbernon@codeweavers.com
And fix W11 results. --- dlls/mf/tests/transform.c | 150 +++++++++++++++----------------------- 1 file changed, 60 insertions(+), 90 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index def0170e106..c3338560383 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -6059,63 +6059,44 @@ static void test_video_processor(void) {.subtype = &MFVideoFormat_YVYU}, }, }; - const GUID expect_available_inputs_w8[] = + const struct input_type_desc { - MFVideoFormat_IYUV, - MFVideoFormat_YV12, - MFVideoFormat_NV12, - MFVideoFormat_420O, - MFVideoFormat_UYVY, - MFVideoFormat_YUY2, - MFVideoFormat_P208, - MFVideoFormat_NV11, - MFVideoFormat_AYUV, - MFVideoFormat_ARGB32, - MFVideoFormat_RGB32, - MFVideoFormat_RGB24, - MFVideoFormat_I420, - MFVideoFormat_YVYU, - MFVideoFormat_RGB555, - MFVideoFormat_RGB565, - MFVideoFormat_RGB8, - MFVideoFormat_Y216, - MFVideoFormat_v410, - MFVideoFormat_Y41P, - MFVideoFormat_Y41T, - MFVideoFormat_Y42T, - }; - const GUID expect_available_inputs_w10[] = - { - MFVideoFormat_L8, - MFVideoFormat_L16, - MFAudioFormat_MPEG, - MFVideoFormat_IYUV, - MFVideoFormat_YV12, - MFVideoFormat_NV12, - MFVideoFormat_420O, - MFVideoFormat_P010, - MFVideoFormat_P016, - MFVideoFormat_UYVY, - MFVideoFormat_YUY2, - MFVideoFormat_P208, - MFVideoFormat_NV11, - MFVideoFormat_AYUV, - MFVideoFormat_ARGB32, - MFVideoFormat_ABGR32, - MFVideoFormat_RGB32, - MFVideoFormat_A2R10G10B10, - MFVideoFormat_A16B16G16R16F, - MFVideoFormat_RGB24, - MFVideoFormat_I420, - MFVideoFormat_YVYU, - MFVideoFormat_RGB555, - MFVideoFormat_RGB565, - MFVideoFormat_RGB8, - MFVideoFormat_Y216, - MFVideoFormat_v410, - MFVideoFormat_Y41P, - MFVideoFormat_Y41T, - MFVideoFormat_Y42T, + GUID guid; + BOOL optional; + } + expect_available_inputs[] = + { + {MFVideoFormat_L8, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_L16, .optional = TRUE /* >= W10 */}, + {MFAudioFormat_MPEG, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_IYUV}, + {MFVideoFormat_YV12}, + {MFVideoFormat_NV12}, + {MFVideoFormat_NV21, .optional = TRUE /* >= W11 */}, + {MFVideoFormat_420O}, + {MFVideoFormat_P010, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_P016, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_UYVY}, + {MFVideoFormat_YUY2}, + {MFVideoFormat_P208}, + {MFVideoFormat_NV11}, + {MFVideoFormat_AYUV}, + {MFVideoFormat_ARGB32}, + {MFVideoFormat_ABGR32, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_RGB32}, + {MFVideoFormat_A2R10G10B10, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_A16B16G16R16F, .optional = TRUE /* >= W10 */}, + {MFVideoFormat_RGB24}, + {MFVideoFormat_I420}, + {MFVideoFormat_YVYU}, + {MFVideoFormat_RGB555}, + {MFVideoFormat_RGB565}, + {MFVideoFormat_RGB8}, + {MFVideoFormat_Y216}, + {MFVideoFormat_v410}, + {MFVideoFormat_Y41P}, + {MFVideoFormat_Y41T}, + {MFVideoFormat_Y42T}, }; const GUID expect_available_outputs[] = { @@ -6138,6 +6119,7 @@ static void test_video_processor(void) MFVideoFormat_AYUV, /* some inputs enumerate MFVideoFormat_AYUV after RGB565 */ MFVideoFormat_NV12, /* P010 enumerates NV12 after (A)RGB32 formats */ MFVideoFormat_A16B16G16R16F, /* enumerated with MFVideoFormat_P010 input */ + MFVideoFormat_NV21, /* enumerated with some input formats */ }; static const media_type_desc expect_available_common = { @@ -6246,10 +6228,10 @@ static void test_video_processor(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; + const struct input_type_desc *expect_input = expect_available_inputs; DWORD i, j, k, flags, length, output_status; IMFSample *input_sample, *output_sample; IMFMediaType *media_type, *media_type2; - const GUID *expect_available_inputs; IMFCollection *output_samples; const BYTE *nv12frame_data; ULONG nv12frame_data_len; @@ -6361,7 +6343,9 @@ static void test_video_processor(void) ok(flags == MFT_INPUT_STATUS_ACCEPT_DATA, "Unexpected input status %#lx.\n", flags);
input_info.cbSize = 0; - if (!IsEqualGUID(&guid, &MFVideoFormat_P208) && !IsEqualGUID(&guid, &MEDIASUBTYPE_Y41T) + if (IsEqualGUID(&guid, &MFVideoFormat_NV21)) + input_info.cbSize = 0x180; + else if (!IsEqualGUID(&guid, &MFVideoFormat_P208) && !IsEqualGUID(&guid, &MEDIASUBTYPE_Y41T) && !IsEqualGUID(&guid, &MEDIASUBTYPE_Y42T)) { hr = MFCalculateImageSize(&guid, 16, 16, (UINT32 *)&input_info.cbSize); @@ -6481,51 +6465,38 @@ static void test_video_processor(void) hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type); ok(hr == MF_E_NO_MORE_TYPES, "GetOutputAvailableType returned %#lx\n", hr);
- hr = IMFTransform_GetInputAvailableType(transform, 0, 23, &media_type); - ok(hr == S_OK || hr == MF_E_NO_MORE_TYPES /* w8 */, "GetOutputAvailableType returned %#lx\n", hr); - if (hr == MF_E_NO_MORE_TYPES) - expect_available_inputs = expect_available_inputs_w8; - else - { - hr = IMFTransform_GetInputAvailableType(transform, 0, 27, &media_type); - ok(hr == S_OK || broken(hr == MF_E_NO_MORE_TYPES) /* w1064v1507 */, "GetOutputAvailableType returned %#lx\n", hr); - if (hr == MF_E_NO_MORE_TYPES) - expect_available_inputs = expect_available_inputs_w10 + 3; - else - expect_available_inputs = expect_available_inputs_w10; - } - i = -1; while (SUCCEEDED(hr = IMFTransform_GetInputAvailableType(transform, 0, ++i, &media_type))) { - /* FIXME: Skip exotic input types which aren't directly accepted */ - if (IsEqualGUID(&expect_available_inputs[i], &MFVideoFormat_L8) - || IsEqualGUID(&expect_available_inputs[i], &MFVideoFormat_L16) - || IsEqualGUID(&expect_available_inputs[i], &MFAudioFormat_MPEG) - || IsEqualGUID(&expect_available_inputs[i], &MFVideoFormat_420O) - || IsEqualGUID(&expect_available_inputs[i], &MFVideoFormat_A16B16G16R16F) /* w1064v1507 */) - { - IMFMediaType_Release(media_type); - continue; - } - winetest_push_context("in %lu", i); + ok(hr == S_OK, "GetInputAvailableType returned %#lx\n", hr); check_media_type(media_type, expect_available_common, -1);
hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid); ok(hr == S_OK, "GetGUID returned %#lx\n", hr);
- /* w1064v1507 doesn't expose MFVideoFormat_ABGR32 input */ - if (broken(IsEqualGUID(&expect_available_inputs[i], &MFVideoFormat_ABGR32) - && IsEqualGUID(&guid, &MFVideoFormat_RGB32))) - expect_available_inputs++; + while (!IsEqualGUID(&expect_input->guid, &guid)) + { + if (!expect_input->optional) + break; + expect_input++; + } + ok(IsEqualGUID(&expect_input->guid, &guid), "got subtype %s\n", debugstr_guid(&guid)); + expect_input++;
- ok(IsEqualGUID(&expect_available_inputs[i], &guid), "got subtype %s\n", debugstr_guid(&guid)); + /* FIXME: Skip exotic input types which aren't directly accepted */ + if (IsEqualGUID(&guid, &MFVideoFormat_L8) || IsEqualGUID(&guid, &MFVideoFormat_L16) + || IsEqualGUID(&guid, &MFAudioFormat_MPEG) || IsEqualGUID(&guid, &MFVideoFormat_420O) + || IsEqualGUID(&guid, &MFVideoFormat_A16B16G16R16F) /* w1064v1507 */) + { + IMFMediaType_Release(media_type); + winetest_pop_context(); + continue; + }
hr = IMFTransform_SetInputType(transform, 0, media_type, 0); ok(hr == MF_E_ATTRIBUTENOTFOUND, "SetInputType returned %#lx.\n", hr); - hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)actual_width << 32 | actual_height); ok(hr == S_OK, "SetUINT64 returned %#lx.\n", hr); hr = IMFTransform_SetInputType(transform, 0, media_type, 0); @@ -6564,7 +6535,6 @@ static void test_video_processor(void) winetest_pop_context(); } ok(hr == MF_E_NO_MORE_TYPES, "GetInputAvailableType returned %#lx\n", hr); - ok(i == 22 || i == 30 || broken(i == 26) /* w1064v1507 */, "%lu input media types\n", i);
for (i = 0; i < ARRAY_SIZE(video_processor_tests); i++) {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/resource.rc | 4 +- ...{rgb32frame-vp.bmp => rgb32frame-flip.bmp} | Bin dlls/mf/tests/transform.c | 74 ++++++++---------- 3 files changed, 35 insertions(+), 43 deletions(-) rename dlls/mf/tests/{rgb32frame-vp.bmp => rgb32frame-flip.bmp} (100%)
diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index 10a969ff037..1651d1d4d1e 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -80,8 +80,8 @@ i420frame.bmp RCDATA i420frame.bmp rgb32frame.bmp RCDATA rgb32frame.bmp
/* Generated from running the tests on Windows */ -/* @makedep: rgb32frame-vp.bmp */ -rgb32frame-vp.bmp RCDATA rgb32frame-vp.bmp +/* @makedep: rgb32frame-flip.bmp */ +rgb32frame-flip.bmp RCDATA rgb32frame-flip.bmp
/* Generated from running the tests on Windows */ /* @makedep: rgb32frame-grabber.bmp */ diff --git a/dlls/mf/tests/rgb32frame-vp.bmp b/dlls/mf/tests/rgb32frame-flip.bmp similarity index 100% rename from dlls/mf/tests/rgb32frame-vp.bmp rename to dlls/mf/tests/rgb32frame-flip.bmp diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index c3338560383..ee1cd3d69c0 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -5146,7 +5146,7 @@ static void test_wmv_decoder(void) .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, .output_sample_desc = &output_sample_desc_rgb, - .result_bitmap = L"rgb32frame-vp.bmp", + .result_bitmap = L"rgb32frame-flip.bmp", .delta = 5, },
@@ -5157,7 +5157,7 @@ static void test_wmv_decoder(void) .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, .output_sample_desc = &output_sample_desc_rgb, - .result_bitmap = L"rgb32frame-vp.bmp", + .result_bitmap = L"rgb32frame-flip.bmp", .delta = 5, },
@@ -5168,7 +5168,7 @@ static void test_wmv_decoder(void) .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, .output_sample_desc = &output_sample_desc_rgb, - .result_bitmap = L"rgb32frame-vp.bmp", + .result_bitmap = L"rgb32frame-flip.bmp", .delta = 5, },
@@ -5849,7 +5849,7 @@ static void test_color_convert(void) /* YUV -> RGB (negative stride) */ .output_type_desc = output_type_desc_negative_stride, .expect_output_type_desc = expect_output_type_desc_negative_stride, - .result_bitmap = L"rgb32frame-vp.bmp", + .result_bitmap = L"rgb32frame-flip.bmp", .delta = 6, },
@@ -6134,7 +6134,7 @@ static void test_video_processor(void)
static const MFVideoArea actual_aperture = {.Area={82,84}}; static const DWORD actual_width = 96, actual_height = 96; - const struct attribute_desc input_type_desc[] = + const struct attribute_desc nv12_default_stride[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12, .required = TRUE), @@ -6142,7 +6142,7 @@ static void test_video_processor(void) ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), {0}, }; - const struct attribute_desc output_type_desc[] = + const struct attribute_desc rgb32_default_stride[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), @@ -6150,7 +6150,7 @@ static void test_video_processor(void) ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), {0}, }; - const struct attribute_desc output_type_desc_negative_stride[] = + const struct attribute_desc rgb32_negative_stride[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), @@ -6159,7 +6159,7 @@ static void test_video_processor(void) ATTR_UINT32(MF_MT_DEFAULT_STRIDE, -actual_width * 4), {0}, }; - const struct attribute_desc output_type_desc_positive_stride[] = + const struct attribute_desc rgb32_positive_stride[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), @@ -6173,57 +6173,48 @@ static void test_video_processor(void) MFT_OUTPUT_STREAM_INFO output_info = {0}; MFT_INPUT_STREAM_INFO input_info = {0};
- const struct buffer_desc output_buffer_desc = - { - .length = actual_width * actual_height * 4, - .compare = compare_rgb32, .dump = dump_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, - }; const struct attribute_desc output_sample_attributes[] = { ATTR_UINT32(MFSampleExtension_CleanPoint, 1, .todo = TRUE), {0}, }; - const struct sample_desc output_sample_desc = + const struct buffer_desc rgb32_buffer_desc = + { + .length = actual_width * actual_height * 4, + .compare = compare_rgb32, .dump = dump_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, + }; + const struct sample_desc rgb32_sample_desc = { .attributes = output_sample_attributes, .sample_time = 0, .sample_duration = 10000000, - .buffer_count = 1, .buffers = &output_buffer_desc, + .buffer_count = 1, .buffers = &rgb32_buffer_desc, };
const struct transform_desc { + const struct attribute_desc *input_type_desc; const struct attribute_desc *output_type_desc; - const struct attribute_desc *expect_output_type_desc; + const struct sample_desc *output_sample_desc; const WCHAR *result_bitmap; ULONG delta; } video_processor_tests[] = { - { - /* YUV -> RGB */ - .output_type_desc = output_type_desc, - .expect_output_type_desc = output_type_desc, - .result_bitmap = L"rgb32frame-vp.bmp", + .input_type_desc = nv12_default_stride, .output_type_desc = rgb32_default_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame-flip.bmp", .delta = 2, /* Windows returns 0, Wine needs 2 */ }, - { - /* YUV -> RGB (negative stride) */ - .output_type_desc = output_type_desc_negative_stride, - .expect_output_type_desc = output_type_desc_negative_stride, - .result_bitmap = L"rgb32frame-vp.bmp", + .input_type_desc = nv12_default_stride, .output_type_desc = rgb32_negative_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame-flip.bmp", .delta = 2, /* Windows returns 0, Wine needs 2 */ }, - { - /* YUV -> RGB (positive stride) */ - .output_type_desc = output_type_desc_positive_stride, - .expect_output_type_desc = output_type_desc_positive_stride, - .result_bitmap = L"rgb32frame.bmp", + .input_type_desc = nv12_default_stride, .output_type_desc = rgb32_positive_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", .delta = 6, }, - };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; @@ -6538,15 +6529,17 @@ static void test_video_processor(void)
for (i = 0; i < ARRAY_SIZE(video_processor_tests); i++) { + const struct transform_desc *test = video_processor_tests + i; + winetest_push_context("transform #%lu", i);
- check_mft_set_input_type_required(transform, input_type_desc); - check_mft_set_input_type(transform, input_type_desc); - check_mft_get_input_current_type(transform, input_type_desc); + check_mft_set_input_type_required(transform, test->input_type_desc); + check_mft_set_input_type(transform, test->input_type_desc); + check_mft_get_input_current_type(transform, test->input_type_desc);
- check_mft_set_output_type_required(transform, video_processor_tests[i].output_type_desc); - check_mft_set_output_type(transform, video_processor_tests[i].output_type_desc, S_OK); - check_mft_get_output_current_type(transform, video_processor_tests[i].output_type_desc); + check_mft_set_output_type_required(transform, test->output_type_desc); + check_mft_set_output_type(transform, test->output_type_desc, S_OK); + check_mft_get_output_current_type(transform, test->output_type_desc);
input_info.cbSize = actual_width * actual_height * 3 / 2; output_info.cbSize = actual_width * actual_height * 4; @@ -6594,9 +6587,8 @@ static void test_video_processor(void) ref = IMFSample_Release(output_sample); ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample_collection(output_samples, &output_sample_desc, - video_processor_tests[i].result_bitmap); - ok(ret <= video_processor_tests[i].delta + ret = check_mf_sample_collection(output_samples, test->output_sample_desc, test->result_bitmap); + ok(ret <= test->delta /* w1064v1507 / w1064v1809 incorrectly rescale */ || broken(ret == 25) || broken(ret == 32), "got %lu%% diff\n", ret);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 61 +++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 19 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index ee1cd3d69c0..1bc618f63f7 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -6134,12 +6134,19 @@ static void test_video_processor(void)
static const MFVideoArea actual_aperture = {.Area={82,84}}; static const DWORD actual_width = 96, actual_height = 96; + const struct attribute_desc rgb32_with_aperture[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), + ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), + ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), + {0}, + }; const struct attribute_desc nv12_default_stride[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_NV12, .required = TRUE), ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), - ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), {0}, }; const struct attribute_desc rgb32_default_stride[] = @@ -6147,7 +6154,6 @@ static void test_video_processor(void) ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), - ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), {0}, }; const struct attribute_desc rgb32_negative_stride[] = @@ -6155,7 +6161,6 @@ static void test_video_processor(void) ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), - ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), ATTR_UINT32(MF_MT_DEFAULT_STRIDE, -actual_width * 4), {0}, }; @@ -6164,7 +6169,6 @@ static void test_video_processor(void) ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32, .required = TRUE), ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), - ATTR_BLOB(MF_MT_MINIMUM_DISPLAY_APERTURE, &actual_aperture, 16), ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width * 4), {0}, }; @@ -6197,6 +6201,7 @@ static void test_video_processor(void) const struct sample_desc *output_sample_desc; const WCHAR *result_bitmap; ULONG delta; + BOOL broken; } video_processor_tests[] = { @@ -6215,6 +6220,11 @@ static void test_video_processor(void) .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", .delta = 6, }, + { + .input_type_desc = rgb32_with_aperture, .output_type_desc = rgb32_with_aperture, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", + .broken = TRUE /* old Windows version incorrectly rescale */ + }, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; @@ -6224,10 +6234,10 @@ static void test_video_processor(void) IMFSample *input_sample, *output_sample; IMFMediaType *media_type, *media_type2; IMFCollection *output_samples; - const BYTE *nv12frame_data; - ULONG nv12frame_data_len; IMFTransform *transform; IMFMediaBuffer *buffer; + const BYTE *input_data; + ULONG input_data_len; UINT32 count; HRESULT hr; ULONG ret; @@ -6541,19 +6551,35 @@ static void test_video_processor(void) check_mft_set_output_type(transform, test->output_type_desc, S_OK); check_mft_get_output_current_type(transform, test->output_type_desc);
- input_info.cbSize = actual_width * actual_height * 3 / 2; output_info.cbSize = actual_width * actual_height * 4; - check_mft_get_input_stream_info(transform, S_OK, &input_info); check_mft_get_output_stream_info(transform, S_OK, &output_info);
- load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len); - /* skip BMP header and RGB data from the dump */ - length = *(DWORD *)(nv12frame_data + 2); - nv12frame_data_len = nv12frame_data_len - length; - nv12frame_data = nv12frame_data + length; - ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len); + if (test->input_type_desc == nv12_default_stride) + { + input_info.cbSize = actual_width * actual_height * 3 / 2; + check_mft_get_input_stream_info(transform, S_OK, &input_info);
- input_sample = create_sample(nv12frame_data, nv12frame_data_len); + load_resource(L"nv12frame.bmp", &input_data, &input_data_len); + /* skip BMP header and RGB data from the dump */ + length = *(DWORD *)(input_data + 2); + input_data_len = input_data_len - length; + ok(input_data_len == 13824, "got length %lu\n", input_data_len); + input_data = input_data + length; + } + else + { + input_info.cbSize = actual_width * actual_height * 4; + check_mft_get_input_stream_info(transform, S_OK, &input_info); + + load_resource(L"rgb32frame.bmp", &input_data, &input_data_len); + /* skip BMP header and RGB data from the dump */ + length = *(DWORD *)(input_data + 2 + 2 * sizeof(DWORD)); + input_data_len -= length; + ok(input_data_len == 36864, "got length %lu\n", input_data_len); + input_data += length; + } + + input_sample = create_sample(input_data, input_data_len); hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); hr = IMFSample_SetSampleDuration(input_sample, 10000000); @@ -6588,10 +6614,7 @@ static void test_video_processor(void) ok(ref == 1, "Release returned %ld\n", ref);
ret = check_mf_sample_collection(output_samples, test->output_sample_desc, test->result_bitmap); - ok(ret <= test->delta - /* w1064v1507 / w1064v1809 incorrectly rescale */ - || broken(ret == 25) || broken(ret == 32), - "got %lu%% diff\n", ret); + ok(ret <= test->delta || broken(test->broken), "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, output_info.cbSize);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/mf_test.h | 2 + dlls/mf/tests/nv12frame-flip.bmp | Bin 0 -> 50742 bytes dlls/mf/tests/resource.rc | 12 +++ dlls/mf/tests/rgb555frame-flip.bmp | Bin 0 -> 18486 bytes dlls/mf/tests/rgb555frame.bmp | Bin 0 -> 18486 bytes dlls/mf/tests/transform.c | 165 +++++++++++++++++++++++++++-- 6 files changed, 168 insertions(+), 11 deletions(-) create mode 100644 dlls/mf/tests/nv12frame-flip.bmp create mode 100644 dlls/mf/tests/rgb555frame-flip.bmp create mode 100644 dlls/mf/tests/rgb555frame.bmp
diff --git a/dlls/mf/tests/mf_test.h b/dlls/mf/tests/mf_test.h index 77af51abd55..75a09b1dd15 100644 --- a/dlls/mf/tests/mf_test.h +++ b/dlls/mf/tests/mf_test.h @@ -65,10 +65,12 @@ typedef DWORD (*compare_cb)(const BYTE *data, DWORD *length, const RECT *rect, c extern DWORD compare_nv12(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_i420(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); +extern DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_pcm16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect);
typedef void (*dump_cb)(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); +extern void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_nv12(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_i420(const BYTE *data, DWORD length, const RECT *rect, HANDLE output);
diff --git a/dlls/mf/tests/nv12frame-flip.bmp b/dlls/mf/tests/nv12frame-flip.bmp new file mode 100644 index 0000000000000000000000000000000000000000..72310512d44ec8b88e4186e2e7bd3ee61dc66fda GIT binary patch literal 50742 zcmeI4y-H(I6h@sl(9UwS8X<xR25hIFA_x{%(}@-~f~~1VLB$8KFiNzDosS?XBw#Oy zm0cd;%<-piTO4qIo6!^3-h3h9az5@|S)>ww|7q@zJx?>g{>u6Lnjd37^SeB+*Iz!o zyk2yAiRcV&Zf=q%u-Dl?G4!y1Is<?BkAegEALFst1^C0?>&_^g!+-oA1&_VYfd6&+ ze|6kVL}%dj|1$F@Is-5N*@t!_Is-5Nh0LGm47~hjh8v0K4B)RbR6K+~{1ty{Ka2nP zU%SJ~{o_CWEB@4e*6aWL^-dx>126wZ=1+76UjD7^K_WT>`0ET658eD%hN(ql2Jrt} zkKhmg@BBN4|M-vpAO9Ql@60Un+4=pc^Y>?Y^Dz;ff!F_~%%A8Cy!_XC_lf8Xy!=-) zf1)$+@?Y=YC89Hczs^wc5dQF2{Hgsc{^Nh`4lDPM|M;)?Q~O!`$N$<LR_@>H|9*2i z5uE}2b%u(E@Q1(RPwi*%AOCB2Sh;`v$A872+Rx%Y{@3oXa{pfck6KfS=nTC44>NzF zGw||1+nr2AXW-?3lKB&zftP>xbUYEA0sM7_iihxrzv55rXYn8ZYj;?=fBeUP#h=>G zdi_6d&n2QWfWOXA@zBeEu(*|o&cMsRpZOD=ftUa7#6coD1NiF<6%XMLf5o5L&*DG+ z*Y2=#|M-vpia)iVb^G7gOSeR30RPYR$jhH|AOD|uFoPKm-~bNb01n^)4&VR|-~bNb z01n_lO%7ayPk#D06JCGuraZr;|2+ZtyeDEmj~1V+@UeU@!^if|hL7!E2p`)&6F&5p zk;3OI@tF@F`~5b;$M(0vhyF5B_`s)3pnTQ(vm8FQe<^%y|62Ii{?+iY{p;aFe;Fx! z;8P}0zH0s14<Gu=NZ|vYGJ*0{>(5d6*#5)tvHfS^WBX6S$M$!_hyF5B_<SWk=iy_& z-|+f#+dl{&+usi#+kYEA^p}ys2R>y2<*U{oK0yEi5cn(tonG|XCy8$F^yn`$wS11d z(QEr3+R<zKha1sLf0?M|bG;M2wtssNy|#a47`^nDiCR9JkI`%Ud-u_6`}=p%OMjW@ z|K-!1j$V8J(e2G?`pZl$pVn0L+Wy_i=(YW)<IzihnW*K{o{L`Fzql2>wtwOvdg(6{ QwR{?T(QEtp1ObJ>KcaD^#sB~S
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index 1651d1d4d1e..b20363acc60 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -71,6 +71,10 @@ nv12frame.bmp RCDATA nv12frame.bmp /* @makedep: nv12frame-grabber.bmp */ nv12frame-grabber.bmp RCDATA nv12frame-grabber.bmp
+/* Generated from running the tests on Windows */ +/* @makedep: nv12frame-flip.bmp */ +nv12frame-flip.bmp RCDATA nv12frame-flip.bmp + /* Generated from running the tests on Windows */ /* @makedep: i420frame.bmp */ i420frame.bmp RCDATA i420frame.bmp @@ -87,6 +91,14 @@ rgb32frame-flip.bmp RCDATA rgb32frame-flip.bmp /* @makedep: rgb32frame-grabber.bmp */ rgb32frame-grabber.bmp RCDATA rgb32frame-grabber.bmp
+/* Generated from running the tests on Windows */ +/* @makedep: rgb555frame.bmp */ +rgb555frame.bmp RCDATA rgb555frame.bmp + +/* Generated from running the tests on Windows */ +/* @makedep: rgb555frame-flip.bmp */ +rgb555frame-flip.bmp RCDATA rgb555frame-flip.bmp + /* Generated with: * gst-launch-1.0 videotestsrc num-buffers=60 pattern=smpte100 ! \ * video/x-raw,format=I420,width=64,height=64,framerate=30000/1001 ! \ diff --git a/dlls/mf/tests/rgb555frame-flip.bmp b/dlls/mf/tests/rgb555frame-flip.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e3a641a9a04d3e09b8ad12c3f437cece1dab2f30 GIT binary patch literal 18486 zcmeH_u}Z^G7)B#kP()B?i&+GH0lNxLF5LuIA3<;t4CyoZ8il??q0Vkj3L0$ZZ}|xK z6VE*)w1hu7oO^F()7$2EO^5sCa6N3Vo#uG>HLUIP&7aM^?ekfRm2cnnLVt<>_yy=c zeq;3o`l~wQKcoNnjnx-a|9PK}^1tr$QT}K9`6&O%A6Ux2ZSujt?jF&f{!RhTk5kW| zRsB!S^HKh%hxsV~-N$^C|LiUw<==Gq;9qx-=udyA0O!Z4=g+GC2haH^|I+27{3l&L z%Kxg%NBOs1KKR$&Bl^?dDZu%0>iM(u_ZvEIQ2kdWAN=d?5&h}!6yW?g_54}-`wg8p zsQ!zRkMduae3buJ$w&Er?B%2Uze_&&*WDxf)88q;`Ely`v#S5=MLx>^^C%zX|MrxR z@_)b2NBOVj`QTr7kLXW-rvT^2sprqC{)?A<l>d63kMidk1t>rP3Q&Lo6!>oiegF~` BPFnx~
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/rgb555frame.bmp b/dlls/mf/tests/rgb555frame.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7feb1e4254cc61b1a82f4563b4db942c363e13a5 GIT binary patch literal 18486 zcmeH_F-ikb6h%kApon0s4Neo#4VX4yWs^>@bqRuv;4rf$w-Im;fmqvFDd=EQ-{uzo zisv6PB!o8{&imKP`AzeC=Hv5n{M_$8d(CA0HlE%8+aKHKD~AFUpa2CZKmiK;vjUqT zAGMOzb3V#{J>-Lb-5t@N{!Rhzk5kW|RsG-Z@=^Y8kNGJ7&y#$V|I0-_%Ky9MgMZx} z(VzZK0q&1e&!1KOKMwLy{$C{@<-aNUDF0Q-NBOTyKKR$&5&h}!6yW|i_54}-`wg8p zsQzu25B_y`M1T4_1-L&>J%5(|enaOCs{d7&kMf^(`6&O=<)i$Mp7K%tO_vY;b$3L6 z`a1=<KTbV=R`p-r=A-=gAM#QDXUF*{|I=AM%D-*$!N2Z~=udyA0QbkK=g+GC(?4*O r|M_7)%74-4qx^?HALZZn`QTr7NA#z^Q-J&9)bnTQ?>BVbp!)v+To6uM
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 1bc618f63f7..1acc7d1e826 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -858,31 +858,41 @@ DWORD compare_i420(const BYTE *data, DWORD *length, const RECT *rect, const BYTE return diff * 100 / 256 / size; }
-DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) +static DWORD compare_rgb(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect, UINT bits) { - DWORD x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + DWORD x, y, step = bits / 8, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf;
/* skip BMP header from the dump */ size = *(DWORD *)(expect + 2 + 2 * sizeof(DWORD)); *length = *length + size; expect = expect + size;
- for (y = 0; y < height; y++, data += width * 4, expect += width * 4) + for (y = 0; y < height; y++, data += width * step, expect += width * step) { if (y < rect->top || y >= rect->bottom) continue; for (x = 0; x < width; x++) { if (x < rect->left || x >= rect->right) continue; - diff += abs((int)expect[4 * x + 0] - (int)data[4 * x + 0]); - diff += abs((int)expect[4 * x + 1] - (int)data[4 * x + 1]); - diff += abs((int)expect[4 * x + 2] - (int)data[4 * x + 2]); + diff += abs((int)expect[step * x + 0] - (int)data[step * x + 0]); + diff += abs((int)expect[step * x + 1] - (int)data[step * x + 1]); + if (step >= 3) diff += abs((int)expect[step * x + 2] - (int)data[step * x + 2]); } }
- size = (rect->right - rect->left) * (rect->bottom - rect->top) * 3; + size = (rect->right - rect->left) * (rect->bottom - rect->top) * min(step, 3); return diff * 100 / 256 / size; }
+DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) +{ + return compare_rgb(data, length, rect, expect, 32); +} + +DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) +{ + return compare_rgb(data, length, rect, expect, 16); +} + DWORD compare_pcm16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { const INT16 *data_pcm = (INT16 *)data, *expect_pcm = (INT16 *)expect; @@ -904,7 +914,7 @@ static DWORD compare_bytes(const BYTE *data, DWORD *length, const RECT *rect, co return diff * 100 / 256 / size; }
-void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +static void dump_rgb(const BYTE *data, DWORD length, const RECT *rect, HANDLE output, UINT bits) { DWORD width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; static const char magic[2] = "BM"; @@ -920,7 +930,7 @@ void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) .biHeader = { .biSize = sizeof(BITMAPINFOHEADER), .biWidth = width, .biHeight = height, .biPlanes = 1, - .biBitCount = 32, .biCompression = BI_RGB, .biSizeImage = width * height * 4, + .biBitCount = bits, .biCompression = BI_RGB, .biSizeImage = width * height * (bits / 8), }, }; DWORD written; @@ -937,6 +947,16 @@ void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) ok(written == length, "written %lu bytes\n", written); }
+void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + return dump_rgb(data, length, rect, output, 32); +} + +void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + return dump_rgb(data, length, rect, output, 16); +} + void dump_nv12(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) { DWORD written, x, y, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; @@ -6172,6 +6192,29 @@ static void test_video_processor(void) ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width * 4), {0}, }; + const struct attribute_desc rgb555_default_stride[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB555, .required = TRUE), + ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), + {0}, + }; + const struct attribute_desc rgb555_negative_stride[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB555, .required = TRUE), + ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), + ATTR_UINT32(MF_MT_DEFAULT_STRIDE, -actual_width * 2), + {0}, + }; + const struct attribute_desc rgb555_positive_stride[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video, .required = TRUE), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB555, .required = TRUE), + ATTR_RATIO(MF_MT_FRAME_SIZE, actual_width, actual_height, .required = TRUE), + ATTR_UINT32(MF_MT_DEFAULT_STRIDE, actual_width * 2), + {0}, + }; const MFT_OUTPUT_STREAM_INFO initial_output_info = {0}; const MFT_INPUT_STREAM_INFO initial_input_info = {0}; MFT_OUTPUT_STREAM_INFO output_info = {0}; @@ -6194,6 +6237,30 @@ static void test_video_processor(void) .buffer_count = 1, .buffers = &rgb32_buffer_desc, };
+ const struct buffer_desc rgb555_buffer_desc = + { + .length = actual_width * actual_height * 2, + .compare = compare_rgb16, .dump = dump_rgb16, .rect = {.top = 12, .right = 82, .bottom = 96}, + }; + const struct sample_desc rgb555_sample_desc = + { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 10000000, + .buffer_count = 1, .buffers = &rgb555_buffer_desc, + }; + + const struct buffer_desc nv12_buffer_desc = + { + .length = actual_width * actual_height * 3 / 2, + .compare = compare_nv12, .dump = dump_nv12, .rect = {.top = 12, .right = 82, .bottom = 96}, + }; + const struct sample_desc nv12_sample_desc = + { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 10000000, + .buffer_count = 1, .buffers = &nv12_buffer_desc, + }; + const struct transform_desc { const struct attribute_desc *input_type_desc; @@ -6220,11 +6287,62 @@ static void test_video_processor(void) .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", .delta = 6, }, + { + .input_type_desc = rgb32_default_stride, .output_type_desc = nv12_default_stride, + .output_sample_desc = &nv12_sample_desc, .result_bitmap = L"nv12frame-flip.bmp", + .delta = 2, /* Windows returns 0, Wine needs 2 */ + }, + { + .input_type_desc = rgb32_negative_stride, .output_type_desc = nv12_default_stride, + .output_sample_desc = &nv12_sample_desc, .result_bitmap = L"nv12frame-flip.bmp", + .delta = 2, /* Windows returns 0, Wine needs 2 */ + }, + { + .input_type_desc = rgb32_positive_stride, .output_type_desc = nv12_default_stride, + .output_sample_desc = &nv12_sample_desc, .result_bitmap = L"nv12frame.bmp", + .delta = 2, /* Windows returns 1, Wine needs 2 */ + }, + { + .input_type_desc = rgb32_negative_stride, .output_type_desc = rgb32_negative_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", + }, + { + .input_type_desc = rgb32_negative_stride, .output_type_desc = rgb32_positive_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame-flip.bmp", + .delta = 3, /* Windows returns 3 */ + }, + { + .input_type_desc = rgb32_positive_stride, .output_type_desc = rgb32_negative_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame-flip.bmp", + .delta = 3, /* Windows returns 3 */ + }, + { + .input_type_desc = rgb32_positive_stride, .output_type_desc = rgb32_positive_stride, + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", + }, { .input_type_desc = rgb32_with_aperture, .output_type_desc = rgb32_with_aperture, .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", .broken = TRUE /* old Windows version incorrectly rescale */ }, + { + .input_type_desc = rgb32_default_stride, .output_type_desc = rgb555_default_stride, + .output_sample_desc = &rgb555_sample_desc, .result_bitmap = L"rgb555frame.bmp", + }, + { + .input_type_desc = rgb32_default_stride, .output_type_desc = rgb555_negative_stride, + .output_sample_desc = &rgb555_sample_desc, .result_bitmap = L"rgb555frame.bmp", + }, + { + .input_type_desc = rgb32_default_stride, .output_type_desc = rgb555_positive_stride, + .output_sample_desc = &rgb555_sample_desc, .result_bitmap = L"rgb555frame-flip.bmp", + .delta = 3, /* Windows returns 0, Wine needs 3 */ + }, + { + .input_type_desc = rgb555_default_stride, .output_type_desc = rgb555_positive_stride, + .output_sample_desc = &rgb555_sample_desc, .result_bitmap = L"rgb555frame-flip.bmp", + .delta = 4, /* Windows returns 0, Wine needs 4 */ + }, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; @@ -6551,8 +6669,21 @@ static void test_video_processor(void) check_mft_set_output_type(transform, test->output_type_desc, S_OK); check_mft_get_output_current_type(transform, test->output_type_desc);
- output_info.cbSize = actual_width * actual_height * 4; - check_mft_get_output_stream_info(transform, S_OK, &output_info); + if (test->output_sample_desc == &nv12_sample_desc) + { + output_info.cbSize = actual_width * actual_height * 3 / 2; + check_mft_get_output_stream_info(transform, S_OK, &output_info); + } + else if (test->output_sample_desc == &rgb555_sample_desc) + { + output_info.cbSize = actual_width * actual_height * 2; + check_mft_get_output_stream_info(transform, S_OK, &output_info); + } + else + { + output_info.cbSize = actual_width * actual_height * 4; + check_mft_get_output_stream_info(transform, S_OK, &output_info); + }
if (test->input_type_desc == nv12_default_stride) { @@ -6566,6 +6697,18 @@ static void test_video_processor(void) ok(input_data_len == 13824, "got length %lu\n", input_data_len); input_data = input_data + length; } + else if (test->input_type_desc == rgb555_default_stride) + { + input_info.cbSize = actual_width * actual_height * 2; + check_mft_get_input_stream_info(transform, S_OK, &input_info); + + load_resource(L"rgb555frame.bmp", &input_data, &input_data_len); + /* skip BMP header and RGB data from the dump */ + length = *(DWORD *)(input_data + 2 + 2 * sizeof(DWORD)); + input_data_len -= length; + ok(input_data_len == 18432, "got length %lu\n", input_data_len); + input_data += length; + } else { input_info.cbSize = actual_width * actual_height * 4;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/Makefile.in | 2 +- dlls/mf/tests/iv50frame.bin | Bin 0 -> 744 bytes dlls/mf/tests/mf_test.h | 2 + dlls/mf/tests/resource.rc | 8 ++ dlls/mf/tests/rgb24frame.bmp | Bin 0 -> 27702 bytes dlls/mf/tests/transform.c | 207 +++++++++++++++++++++++++++++++++++ 6 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 dlls/mf/tests/iv50frame.bin create mode 100644 dlls/mf/tests/rgb24frame.bmp
diff --git a/dlls/mf/tests/Makefile.in b/dlls/mf/tests/Makefile.in index c684d033207..d6219219f67 100644 --- a/dlls/mf/tests/Makefile.in +++ b/dlls/mf/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = mf.dll -IMPORTS = mf mfplat dmoguids mfuuid strmiids uuid wmcodecdspuuid ole32 user32 propsys msdmo d3d11 +IMPORTS = mf mfplat dmoguids mfuuid strmiids uuid wmcodecdspuuid ole32 user32 propsys msdmo d3d11 msvfw32
C_SRCS = \ mf.c \ diff --git a/dlls/mf/tests/iv50frame.bin b/dlls/mf/tests/iv50frame.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7054eaf5bfe9ac9d4f9afd1846546dcd9495adb GIT binary patch literal 744 zcmb1VXyjq2FkoP7V&*p!xcY*LK`?;fLIxuPE3*=(HkUQu8nOTXJR>8o9{t7r&z+Tl zAu4<A-XJf{_j8KRWv|`(%}aCXp5k+s%;HnMiY#XEJX^4&t@&gEU)9PWPd@g^2W6&Q zDKL;c<ES61b@E|?(TwIvQhaL7mM@lisaneTuoVXc9X^<1z`i$RrAj+UpH~*x5Z6}U z+wtz9q6ua4(l65r9!`0BYu)?TOZ;9S&@;ZjUJr6_n|dDo!?w?tb!}dh;p#<Mm%AcG zLuZGbS+(NUmZUJ(tII?;YiYSiaA~Y|P*^@sZRJ&<Xy{a+=&DsFYiERpF3mi;W|fw& zcAD<%RFOcNa{>OGcQ0kmMMAZEHe~*O9ddPv;Qg0-`(~}_UYer8s2b{SG^IiBMUtkZ zmxJfki9D(cxOYW(wFw0Tm8v*%zG%{$HfbTtln~jI0Zh9VAZuAMf%iO5{`=NTe<x~j zO`6WYz|8uRU7N#p`@~JF)5OHZm{!36@9{^!``b-?4_A0xHt9hy_81)az071yQu0Et zU?g-{<{f|D!Gc*PYfkZWG+O|Xhx5r_zAC)zKX|$pTL6*Q;RUfj?9{!S3(&P1>GS9D zDlI>`RZSHLR4$!iU|{8##C4GQF}oh8oQFUY_cMgMoVHiA_;z0sG}HBRzp+I_Hu3VJ z5}?4LQ`}9QE+W^2o|jB{hCm{HCK7vmJWRQ^{NVU4wAB5^bPd}>`&?cMepB`8-=H7( z!(kSSotMJ#z#Wr*aO?&tm<m*|4yd3Eq(D2c;;h^U4VgrdR@S4IvP+RrtM1_ks{C1h mJU?<R*Yygw$PL_eD6{*Ls9*Gybp^K`^|v25pxmd-00jWkFGAh`
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/mf_test.h b/dlls/mf/tests/mf_test.h index 75a09b1dd15..0f23e2aeb02 100644 --- a/dlls/mf/tests/mf_test.h +++ b/dlls/mf/tests/mf_test.h @@ -65,11 +65,13 @@ typedef DWORD (*compare_cb)(const BYTE *data, DWORD *length, const RECT *rect, c extern DWORD compare_nv12(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_i420(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); +extern DWORD compare_rgb24(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_pcm16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect);
typedef void (*dump_cb)(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); +extern void dump_rgb24(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_nv12(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_i420(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index b20363acc60..e3df92e375f 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -99,6 +99,14 @@ rgb555frame.bmp RCDATA rgb555frame.bmp /* @makedep: rgb555frame-flip.bmp */ rgb555frame-flip.bmp RCDATA rgb555frame-flip.bmp
+/* Generated from running the tests on Windows */ +/* @makedep: iv50frame.bin */ +iv50frame.bin RCDATA iv50frame.bin + +/* Generated from running the tests on Windows */ +/* @makedep: rgb24frame.bmp */ +rgb24frame.bmp RCDATA rgb24frame.bmp + /* Generated with: * gst-launch-1.0 videotestsrc num-buffers=60 pattern=smpte100 ! \ * video/x-raw,format=I420,width=64,height=64,framerate=30000/1001 ! \ diff --git a/dlls/mf/tests/rgb24frame.bmp b/dlls/mf/tests/rgb24frame.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c2676ee6a83e2cfc0d279fb6734400eebe3bc6ce GIT binary patch literal 27702 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 MhPya$_#H(07jZUNtpET3
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 1acc7d1e826..a18aec15b07 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -35,6 +35,7 @@ #include "wmcodecdsp.h" #include "mediaerr.h" #include "amvideo.h" +#include "vfw.h"
#include "mf_test.h"
@@ -54,6 +55,7 @@ DEFINE_GUID(MFVideoFormat_ABGR32,0x00000020,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x DEFINE_GUID(MFVideoFormat_P208,0x38303250,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_VC1S,0x53314356,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_WMV_Unknown,0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b); +DEFINE_MEDIATYPE_GUID(MEDIASUBTYPE_IV50,MAKEFOURCC('I','V','5','0'));
DEFINE_GUID(mft_output_sample_incomplete,0xffffff,0xffff,0xffff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
@@ -888,6 +890,11 @@ DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYT return compare_rgb(data, length, rect, expect, 32); }
+DWORD compare_rgb24(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) +{ + return compare_rgb(data, length, rect, expect, 24); +} + DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { return compare_rgb(data, length, rect, expect, 16); @@ -952,6 +959,11 @@ void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) return dump_rgb(data, length, rect, output, 32); }
+void dump_rgb24(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + return dump_rgb(data, length, rect, output, 24); +} + void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) { return dump_rgb(data, length, rect, output, 16); @@ -7418,6 +7430,198 @@ failed: CoUninitialize(); }
+static void test_iv50_encoder(void) +{ + static const BITMAPINFOHEADER expect_iv50 = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 0x18, + .biCompression = mmioFOURCC('I','V','5','0'), + .biSizeImage = 0x5100, + }; + const struct buffer_desc iv50_buffer_desc = + { + .length = 0x2e8, + }; + const struct sample_desc iv50_sample_desc = + { + .buffer_count = 1, .buffers = &iv50_buffer_desc, + }; + const BYTE *res_data; + BYTE rgb_data[0x6c00], iv50_data[0x5100]; + BITMAPINFO rgb_info, iv50_info; + IMFCollection *collection; + DWORD flags, res_len, ret; + IMFSample *sample; + LRESULT res; + HRESULT hr; + HIC hic; + + load_resource(L"rgb555frame.bmp", (const BYTE **)&res_data, &res_len); + res_data += 2 + 3 * sizeof(DWORD); + res_len -= 2 + 3 * sizeof(DWORD); + rgb_info.bmiHeader = *(BITMAPINFOHEADER *)res_data; + memcpy(rgb_data, res_data + sizeof(BITMAPINFOHEADER), res_len - sizeof(BITMAPINFOHEADER)); + + hic = ICOpen(ICTYPE_VIDEO, expect_iv50.biCompression, ICMODE_COMPRESS); + if (!hic) + { + todo_wine + win_skip("ICOpen failed to created IV50 compressor.\n"); + return; + } + + res = ICCompressQuery(hic, &rgb_info, NULL); + todo_wine + ok(!res, "got res %#Ix\n", res); + if (res) + goto done; + + res = ICCompressGetSize(hic, &rgb_info, NULL); + ok(res == expect_iv50.biSizeImage, "got res %#Ix\n", res); + + res = ICCompressGetFormatSize(hic, &rgb_info); + ok(res == sizeof(BITMAPINFOHEADER), "got res %#Ix\n", res); + res = ICCompressGetFormat(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biSize); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biWidth); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biHeight); + check_member(iv50_info.bmiHeader, expect_iv50, "%#x", biPlanes); + check_member(iv50_info.bmiHeader, expect_iv50, "%#x", biBitCount); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biCompression); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biSizeImage); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biXPelsPerMeter); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biYPelsPerMeter); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biClrUsed); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biClrImportant); + res = ICCompressQuery(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + + res = ICCompressBegin(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + memset(iv50_data, 0xcd, sizeof(iv50_data)); + res = ICCompress(hic, ICCOMPRESS_KEYFRAME, &iv50_info.bmiHeader, iv50_data, &rgb_info.bmiHeader, rgb_data, + NULL, &flags, 1, 0, 0, NULL, NULL); + ok(!res, "got res %#Ix\n", res); + ok(flags == 0x10, "got flags %#lx\n", flags); + ok(iv50_info.bmiHeader.biSizeImage == 0x2e8, "got res %#Ix\n", res); + res = ICCompressEnd(hic); + ok(!res, "got res %#Ix\n", res); + + hr = MFCreateCollection(&collection); + ok(hr == S_OK, "got hr %#lx\n", hr); + sample = create_sample(iv50_data, iv50_info.bmiHeader.biSizeImage); + ok(!!sample, "got sample %p\n", sample); + hr = IMFSample_SetSampleTime(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFSample_SetSampleDuration(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFCollection_AddElement(collection, (IUnknown *)sample); + ok(hr == S_OK, "got hr %#lx\n", hr); + ret = check_mf_sample_collection(collection, &iv50_sample_desc, L"iv50frame.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(collection); + +done: + res = ICClose(hic); + ok(!res, "got res %#Ix\n", res); +} + +static void test_iv50_decoder(void) +{ + static const BITMAPINFOHEADER expect_iv50 = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 24, + .biCompression = mmioFOURCC('I','V','5','0'), + .biSizeImage = 0x2e8, + }; + static const BITMAPINFOHEADER expect_rgb = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 24, + .biCompression = BI_RGB, + .biSizeImage = 96 * 96 * 3, + }; + const struct buffer_desc rgb_buffer_desc = + { + .length = 96 * 96 * 3, .compare = compare_rgb24, .dump = dump_rgb24, + .rect = {.right = 82, .bottom = 84}, + }; + const struct sample_desc rgb_sample_desc = + { + .buffer_count = 1, .buffers = &rgb_buffer_desc, + }; + const BYTE *res_data; + BYTE rgb_data[0x6c00], iv50_data[0x5100]; + BITMAPINFO rgb_info, iv50_info; + IMFCollection *collection; + DWORD res_len, ret; + IMFSample *sample; + LRESULT res; + HRESULT hr; + HIC hic; + + load_resource(L"iv50frame.bin", (const BYTE **)&res_data, &res_len); + memcpy(iv50_data, res_data, res_len); + + iv50_info.bmiHeader = expect_iv50; + hic = ICOpen(ICTYPE_VIDEO, expect_iv50.biCompression, ICMODE_DECOMPRESS); + if (!hic) + { + todo_wine + win_skip("ICOpen failed to created IV50 decompressor.\n"); + return; + } + + res = ICDecompressGetFormat(hic, &iv50_info, &rgb_info); + ok(!res, "got res %#Ix\n", res); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biSize); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biWidth); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biHeight); + check_member(rgb_info.bmiHeader, expect_rgb, "%#x", biPlanes); + todo_wine + check_member(rgb_info.bmiHeader, expect_rgb, "%#x", biBitCount); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biCompression); + todo_wine + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biSizeImage); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biXPelsPerMeter); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biYPelsPerMeter); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biClrUsed); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biClrImportant); + rgb_info.bmiHeader = expect_rgb; + + res = ICDecompressBegin(hic, &iv50_info, &rgb_info); + ok(!res, "got res %#Ix\n", res); + res = ICDecompress(hic, 0, &iv50_info.bmiHeader, iv50_data, &rgb_info.bmiHeader, rgb_data); + ok(!res, "got res %#Ix\n", res); + res = ICDecompressEnd(hic); + todo_wine + ok(!res, "got res %#Ix\n", res); + + res = ICClose(hic); + ok(!res, "got res %#Ix\n", res); + + + hr = MFCreateCollection(&collection); + ok(hr == S_OK, "got hr %#lx\n", hr); + sample = create_sample(rgb_data, rgb_info.bmiHeader.biSizeImage); + ok(!!sample, "got sample %p\n", sample); + hr = IMFSample_SetSampleTime(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFSample_SetSampleDuration(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFCollection_AddElement(collection, (IUnknown *)sample); + ok(hr == S_OK, "got hr %#lx\n", hr); + ret = check_mf_sample_collection(collection, &rgb_sample_desc, L"rgb24frame.bmp"); + ok(ret <= 4, "got %lu%% diff\n", ret); + IMFCollection_Release(collection); +} + START_TEST(transform) { init_functions(); @@ -7436,5 +7640,8 @@ START_TEST(transform) test_color_convert(); test_video_processor(); test_mp3_decoder(); + test_iv50_encoder(); + test_iv50_decoder(); + test_h264_with_dxgi_manager(); }