From: Brendan McGrath brendan@redmandi.com
The Microsoft WMV decoder has a bug/feature where orientation of the first output type determines the orientation for all subsequent RGB output types.
If the transform is created new, then the orientation is determined by the value of the MF_MT_DEFAULT_STRIDE. --- dlls/mf/tests/transform.c | 75 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index e828f719ffd..07f967dd801 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -6290,6 +6290,13 @@ static void test_wmv_decoder(void) .todo_time = TRUE, .todo_duration = TRUE, }; const struct sample_desc output_sample_desc_rgb = + { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 333333, + .buffer_count = 1, .buffers = &output_buffer_desc_rgb, + .todo_duration = TRUE, + }; + const struct sample_desc output_sample_desc_rgb_todo_time = { .attributes = output_sample_attributes, .sample_time = 0, .sample_duration = 333333, @@ -6306,6 +6313,7 @@ static void test_wmv_decoder(void) const struct sample_desc *output_sample_desc; const WCHAR *result_bitmap; ULONG delta; + BOOL new_transform; BOOL todo; } transform_tests[] = @@ -6338,7 +6346,7 @@ static void test_wmv_decoder(void) .expect_output_type_desc = expect_output_type_desc_rgb, .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, - .output_sample_desc = &output_sample_desc_rgb, + .output_sample_desc = &output_sample_desc_rgb_todo_time, .result_bitmap = L"rgb32frame-flip.bmp", .delta = 5, }, @@ -6349,7 +6357,7 @@ static void test_wmv_decoder(void) .expect_output_type_desc = expect_output_type_desc_rgb_negative_stride, .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, - .output_sample_desc = &output_sample_desc_rgb, + .output_sample_desc = &output_sample_desc_rgb_todo_time, .result_bitmap = L"rgb32frame-flip.bmp", .delta = 5, }, @@ -6360,11 +6368,60 @@ static void test_wmv_decoder(void) .expect_output_type_desc = expect_output_type_desc_rgb, .expect_input_info = &expect_input_info_rgb, .expect_output_info = &expect_output_info_rgb, + .output_sample_desc = &output_sample_desc_rgb_todo_time, + .result_bitmap = L"rgb32frame-flip.bmp", + .delta = 5, + }, + + { + /* WMV1 -> RGB (w/ new transform) */ + .output_type_desc = output_type_desc_rgb, + .expect_output_type_desc = expect_output_type_desc_rgb, + .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.bmp", + .delta = 5, + .new_transform = TRUE, + .todo = TRUE, + }, + + { + /* WMV1 -> RGB (negative stride, but reusing MFT w/ positive stride) */ + .output_type_desc = output_type_desc_rgb_negative_stride, + .expect_output_type_desc = expect_output_type_desc_rgb_negative_stride, + .expect_input_info = &expect_input_info_rgb, + .expect_output_info = &expect_output_info_rgb, + .output_sample_desc = &output_sample_desc_rgb_todo_time, + .result_bitmap = L"rgb32frame.bmp", + .delta = 5, + .todo = TRUE, + }, + + { + /* WMV1 -> RGB (negative stride w/ new transform) */ + .output_type_desc = output_type_desc_rgb_negative_stride, + .expect_output_type_desc = expect_output_type_desc_rgb_negative_stride, + .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-flip.bmp", .delta = 5, + .new_transform = TRUE, },
+ { + /* WMV1 -> RGB (positive stride w/ new transform) */ + .output_type_desc = output_type_desc_rgb_positive_stride, + .expect_output_type_desc = expect_output_type_desc_rgb, + .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.bmp", + .delta = 5, + .new_transform = TRUE, + .todo = TRUE, + }, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; @@ -6470,10 +6527,23 @@ static void test_wmv_decoder(void) ok(hr == MF_E_NO_MORE_TYPES, "GetOutputAvailableType returned %#lx\n", hr); ok(i == ARRAY_SIZE(expect_available_outputs), "%lu input media types\n", i);
+ check_mft_set_output_type(transform, output_type_desc_rgb, S_OK); + for (j = 0; j < ARRAY_SIZE(transform_tests); j++) { winetest_push_context("transform #%lu", j);
+ if (transform_tests[j].new_transform) + { + ret = IMFTransform_Release(transform); + ok(ret == 0, "Release returned %lu\n", ret); + + if (FAILED(hr = CoCreateInstance(class_id, NULL, CLSCTX_INPROC_SERVER, + &IID_IMFTransform, (void **)&transform))) + goto failed; + check_mft_set_input_type(transform, input_type_desc, S_OK); + } + check_mft_set_output_type_required(transform, transform_tests[j].output_type_desc); check_mft_set_output_type(transform, transform_tests[j].output_type_desc, S_OK); check_mft_get_output_current_type_(__LINE__, transform, transform_tests[j].expect_output_type_desc, FALSE, TRUE); @@ -6535,6 +6605,7 @@ static void test_wmv_decoder(void)
ret = check_mf_sample_collection(output_samples, transform_tests[j].output_sample_desc, transform_tests[j].result_bitmap); + todo_wine_if(transform_tests[j].todo) ok(ret <= transform_tests[j].delta, "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);