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
This commit is contained in:
Vineeth T M 2014-11-10 12:12:42 +05:30 committed by Tim-Philipp Müller
parent f4c1da5f49
commit 7f5aa9af04

View file

@ -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;
}