From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 20 ++----------------- dlls/winegstreamer/wg_transform.c | 32 +++++++++++++++++++------------ 2 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index a7c659c7cbf..db47710bc61 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -7394,32 +7394,17 @@ static void test_video_processor(void) .sample_time = 0, .sample_duration = 10000000, .buffer_count = 1, .buffers = &rgb32_buffer_desc, }; - const struct buffer_desc rgb32_buffer_desc_todo = - { - .length = actual_width * actual_height * 4, - .compare = compare_rgb32, .dump = dump_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, - .todo_length = TRUE, - }; - const struct sample_desc rgb32_sample_desc_todo = - { - .attributes = output_sample_attributes, - .sample_time = 0, .sample_duration = 10000000, - .buffer_count = 1, .buffers = &rgb32_buffer_desc_todo, - .todo_length = TRUE, - };
const struct buffer_desc rgb32_cropped_buffer_desc = { .length = 82 * 84 * 4, .compare = compare_rgb32, .dump = dump_rgb32, - .todo_length = TRUE }; const struct sample_desc rgb32_cropped_sample_desc = { .attributes = output_sample_attributes, .sample_time = 0, .sample_duration = 10000000, .buffer_count = 1, .buffers = &rgb32_cropped_buffer_desc, - .todo_length = TRUE };
const struct buffer_desc rgb555_buffer_desc = @@ -7507,7 +7492,7 @@ static void test_video_processor(void) }, { .input_type_desc = rgb32_with_aperture, .output_type_desc = rgb32_with_aperture, - .output_sample_desc = &rgb32_sample_desc_todo, .result_bitmap = L"rgb32frame.bmp", + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame.bmp", .broken = TRUE /* old Windows version incorrectly rescale */ }, { @@ -7530,7 +7515,7 @@ static void test_video_processor(void) }, { .input_type_desc = rgb32_no_aperture, .output_type_desc = rgb32_with_aperture, - .output_sample_desc = &rgb32_sample_desc_todo, .result_bitmap = L"rgb32frame-bogus.bmp", + .output_sample_desc = &rgb32_sample_desc, .result_bitmap = L"rgb32frame-bogus.bmp", }, { .input_type_desc = rgb32_with_aperture, .output_type_desc = rgb32_no_aperture, @@ -7967,7 +7952,6 @@ 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); - todo_wine_if(i == 10 || i == 15) ok(ret <= test->delta || broken(test->broken), "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 65b95229096..47ddd0ff81f 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -75,6 +75,18 @@ static void align_video_info_planes(struct wg_format *format, gsize plane_align,
align->padding_right = ((plane_align + 1) - (info->width & plane_align)) & plane_align; align->padding_bottom = ((plane_align + 1) - (info->height & plane_align)) & plane_align; + align->padding_right = max(align->padding_right, format->u.video.padding.right); + align->padding_bottom = max(align->padding_bottom, format->u.video.padding.bottom); + align->padding_top = format->u.video.padding.top; + align->padding_left = format->u.video.padding.left; + + if (format->u.video.height < 0) + { + gsize top = align->padding_top; + align->padding_top = align->padding_bottom; + align->padding_bottom = top; + } + align->stride_align[0] = plane_align; align->stride_align[1] = plane_align; align->stride_align[2] = plane_align; @@ -106,18 +118,6 @@ static void update_format_height_padding(struct wg_format *max, struct wg_format
static void update_format_padding(struct wg_format *input_format, struct wg_format *output_format) { - if (input_format->major_type == WG_MAJOR_TYPE_VIDEO) - { - input_format->u.video.width += input_format->u.video.padding.left + input_format->u.video.padding.right; - input_format->u.video.height += input_format->u.video.padding.top + input_format->u.video.padding.bottom; - } - - if (output_format->major_type == WG_MAJOR_TYPE_VIDEO) - { - output_format->u.video.width += output_format->u.video.padding.left + output_format->u.video.padding.right; - output_format->u.video.height += output_format->u.video.padding.top + output_format->u.video.padding.bottom; - } - if (input_format->major_type != output_format->major_type) return; if (input_format->major_type != WG_MAJOR_TYPE_VIDEO) @@ -476,6 +476,7 @@ NTSTATUS wg_transform_create(void *args) goto out; transform->attrs = *params->attrs;
+ /* GStreamer cannot include the buffer padding in the frame sizes but MF does, make sure the formats have the same */ update_format_padding(&input_format, &output_format); transform->input_format = input_format; transform->output_format = output_format; @@ -656,6 +657,13 @@ NTSTATUS wg_transform_set_output_format(void *args) GstSample *sample; GstCaps *caps;
+ if (output_format.major_type == WG_MAJOR_TYPE_VIDEO) + { + /* GStreamer cannot include the buffer padding in the frame sizes but MF does, make sure the formats have the same */ + update_format_width_padding(&output_format, &transform->output_format); + update_format_height_padding(&output_format, &transform->output_format); + } + if (!(caps = transform_format_to_caps(transform, &output_format))) { GST_ERROR("Failed to convert format to caps.");