From: Vineeth T M Date: Mon, 10 Nov 2014 06:42:42 +0000 (+0530) Subject: tests: video: add video blend test X-Git-Tag: 1.6.0~826 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7f5aa9af04044373bf54536793c88aab3f7c8516;p=platform%2Fupstream%2Fgst-plugins-base.git tests: video: add video blend test Add test to check rendering of overlays of different sizes that are completely or partially outside the video surface. Once the overlay is blended to the video, verify if the position of the blended overlay is as expected, by comparing the pixels of the blended video with the expected values. https://bugzilla.gnome.org/show_bug.cgi?id=739281 --- diff --git a/tests/check/libs/video.c b/tests/check/libs/video.c index 6a8fb19..1fc178a 100644 --- a/tests/check/libs/video.c +++ b/tests/check/libs/video.c @@ -2277,6 +2277,168 @@ GST_START_TEST (test_video_transfer) GST_END_TEST; +void test_overlay_blend_rect (gint x, gint y, gint width, gint height, + GstVideoFrame * video_frame); +void test_overlay_blend_rect_verify (gint x, gint y, gint width, + gint height, GstVideoFrame * video_frame); +#define VIDEO_WIDTH 320 +#define VIDEO_HEIGHT 240 + +void +test_overlay_blend_rect_verify (gint x, gint y, gint width, gint height, + GstVideoFrame * video_frame) +{ + guint8 *data; + gint i = 0, prev_i = 0; + gint size = 0; + gint temp_width = 0, temp_height = 0; + + data = GST_VIDEO_FRAME_PLANE_DATA (video_frame, 0); + size = GST_VIDEO_FRAME_SIZE (video_frame); + + if (x + width < 0 || y + height < 0 || x >= VIDEO_WIDTH || y >= VIDEO_HEIGHT) + return; + if (x <= 0) + temp_width = width + x; + else if (x > 0 && (x + width) <= VIDEO_WIDTH) + temp_width = width; + else + temp_width = VIDEO_WIDTH - x; + if (y <= 0) + temp_height = height + y; + else if (y > 0 && (y + height) <= VIDEO_HEIGHT) + temp_height = height; + else + temp_height = VIDEO_HEIGHT - y; + + if (x <= 0 && y <= 0) + i = 0; + else + i = (((x <= 0) ? 0 : x) + (((y <= 0) ? 0 : y) * VIDEO_WIDTH)) * 4; + prev_i = i; + + for (; i < size - 4; i += 4) { +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + /* B - G - R - A */ + fail_unless_equals_int (data[i], 0x40); + fail_unless_equals_int (data[i + 1], 0x40); + fail_unless_equals_int (data[i + 2], 0x40); + fail_unless_equals_int (data[i + 3], 0x00); +#else + /* A - R - G - B */ + fail_unless_equals_int (data[i], 0x00); + fail_unless_equals_int (data[i + 1], 0x40); + fail_unless_equals_int (data[i + 2], 0x40); + fail_unless_equals_int (data[i + 3], 0x40); +#endif + if ((i + 4) == (4 * (((((y > 0) ? (y + temp_height) : temp_height) - + 1) * VIDEO_WIDTH) + ((x > + 0) ? (x + temp_width) : temp_width)))) + break; + if ((i + 4 - prev_i) == ((temp_width) * 4)) { + i += ((VIDEO_WIDTH - (temp_width)) * 4); + prev_i = i + 4; + } + + } +} + +void +test_overlay_blend_rect (gint x, gint y, gint width, gint height, + GstVideoFrame * video_frame) +{ + GstVideoOverlayComposition *comp1; + GstVideoOverlayRectangle *rect1; + GstBuffer *pix, *pix1; + GstVideoInfo vinfo; + + memset (video_frame, 0, sizeof (GstVideoFrame)); + pix = + gst_buffer_new_and_alloc (VIDEO_WIDTH * VIDEO_HEIGHT * sizeof (guint32)); + gst_buffer_memset (pix, 0, 0, gst_buffer_get_size (pix)); + gst_video_info_init (&vinfo); + gst_video_info_set_format (&vinfo, GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, + VIDEO_WIDTH, VIDEO_HEIGHT); + gst_video_frame_map (video_frame, &vinfo, pix, GST_MAP_READWRITE); + gst_buffer_unref (pix); + pix = NULL; + + pix1 = gst_buffer_new_and_alloc (width * height * sizeof (guint32)); + gst_buffer_memset (pix1, 0, 0x80, gst_buffer_get_size (pix1)); + gst_buffer_add_video_meta (pix1, GST_VIDEO_FRAME_FLAG_NONE, + GST_VIDEO_OVERLAY_COMPOSITION_FORMAT_RGB, width, height); + rect1 = gst_video_overlay_rectangle_new_raw (pix1, + x, y, width, height, GST_VIDEO_OVERLAY_FORMAT_FLAG_NONE); + gst_buffer_unref (pix1); + pix1 = NULL; + + comp1 = gst_video_overlay_composition_new (rect1); + fail_unless (gst_video_overlay_composition_blend (comp1, video_frame)); + gst_video_overlay_composition_unref (comp1); + + test_overlay_blend_rect_verify (x, y, width, height, video_frame); + gst_video_frame_unmap (video_frame); +} + +GST_START_TEST (test_overlay_blend) +{ + GstVideoFrame video_frame; + + /* Overlay width & height smaller than video width & height */ + /* Overlay rendered completely left of video surface + * x + overlay_width <= 0 */ + test_overlay_blend_rect (-60, 50, 50, 50, &video_frame); + /* Overlay rendered completely right of video surface + * x >= video_width */ + test_overlay_blend_rect (330, 50, 50, 50, &video_frame); + /* Overlay rendered completely top of video surface + * y + overlay_height <= 0 */ + test_overlay_blend_rect (50, -60, 50, 50, &video_frame); + /* Overlay rendered completely bottom of video surface + * y >= video_height */ + test_overlay_blend_rect (50, 250, 50, 50, &video_frame); + /* Overlay rendered partially left of video surface + * x < 0 && -x < overlay_width */ + test_overlay_blend_rect (-40, 50, 50, 50, &video_frame); + /* Overlay rendered partially right of video surface + * x < video_width && (overlay_width + x) > video_width */ + test_overlay_blend_rect (300, 50, 50, 50, &video_frame); + /* Overlay rendered partially top of video surface + * y < 0 && -y < overlay_height */ + test_overlay_blend_rect (50, -40, 50, 50, &video_frame); + /* Overlay rendered partially bottom of video surface + * y < video_height && (overlay_height + y) > video_height */ + test_overlay_blend_rect (50, 220, 50, 50, &video_frame); + + /* Overlay width & height bigger than video width & height */ + /* Overlay rendered completely left of video surface + * x + overlay_width <= 0 */ + test_overlay_blend_rect (-360, 50, 350, 250, &video_frame); + /* Overlay rendered completely right of video surface + * x >= video_width */ + test_overlay_blend_rect (330, 50, 350, 250, &video_frame); + /* Overlay rendered completely top of video surface + * y + overlay_height <= 0 */ + test_overlay_blend_rect (50, -260, 350, 250, &video_frame); + /* Overlay rendered completely bottom of video surface + * y >= video_height */ + test_overlay_blend_rect (50, 250, 350, 250, &video_frame); + /* Overlay rendered partially left of video surface + * x < 0 && -x < overlay_width */ + test_overlay_blend_rect (-40, 50, 350, 250, &video_frame); + /* Overlay rendered partially right of video surface + * x < video_width && (overlay_width + x) > video_width */ + test_overlay_blend_rect (300, 50, 350, 250, &video_frame); + /* Overlay rendered partially top of video surface + * y < 0 && -y < overlay_height */ + test_overlay_blend_rect (50, -40, 350, 250, &video_frame); + /* Overlay rendered partially bottom of video surface + * y < video_height && (overlay_height + y) > video_height */ + test_overlay_blend_rect (50, 220, 350, 250, &video_frame); +} + +GST_END_TEST; + static Suite * video_suite (void) { @@ -2306,6 +2468,7 @@ video_suite (void) tcase_add_test (tc_chain, test_video_color_convert); tcase_add_test (tc_chain, test_video_size_convert); tcase_add_test (tc_chain, test_video_transfer); + tcase_add_test (tc_chain, test_overlay_blend); return s; }