From 06243b7eeee9ab09515e7367c189ef99bf5b652f Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Mon, 28 Jul 2014 15:45:09 -0300 Subject: [PATCH] tests: templatematch: add test to check that we use the correct rgb format templatematch should use the same RGB format that opencv uses (BGR), make sure we keep it that way with this test. https://bugzilla.gnome.org/show_bug.cgi?id=678485 --- tests/check/Makefile.am | 7 ++ tests/check/elements/templatematch.c | 169 +++++++++++++++++++++++++++++++++++ tests/files/Makefile.am | 1 + 3 files changed, 177 insertions(+) create mode 100644 tests/check/elements/templatematch.c diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 90677f7..ab73bd2 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -136,6 +136,12 @@ else check_zbar = endif +if USE_OPENCV +check_opencv = elements/templatematch +else +check_opencv = +endif + if USE_OPUS check_opus = elements/opus else @@ -214,6 +220,7 @@ check_PROGRAMS = \ $(check_ofa) \ $(check_timidity) \ $(check_kate) \ + $(check_opencv) \ $(check_opus) \ $(check_curl) \ $(check_shm) \ diff --git a/tests/check/elements/templatematch.c b/tests/check/elements/templatematch.c new file mode 100644 index 0000000..cce165f --- /dev/null +++ b/tests/check/elements/templatematch.c @@ -0,0 +1,169 @@ +/* + * GStreamer + * + * unit test for templatematch + * + * Copyright (C) 2014 Samsung Electronics. All rights reserved. + * Author: Thiago Santos + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include + +#define CAPS_TMPL "video/x-raw, format=(string)BGR" + +GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_TMPL) + ); +GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (CAPS_TMPL) + ); + +/* Create a 16x16 buffer split in 4 equal squares + * BG + * Rb + * + * B=Blue, G=Green, R=Red, b=black + */ +static GstBuffer * +create_input_buffer (void) +{ + guint8 *data; + gsize size; + gint i, j, base; + + size = 3 * 16 * 16; /* BGR 16x16 */ + data = g_malloc0 (size); + + /* blue and green */ + for (j = 0; i < 8; j++) { + for (i = 0; i < 8; i++) { + base = j * 16; + data[base + i] = 255; + data[base + i + 1] = 0; + data[base + i + 2] = 0; + + data[base + 8 + i] = 0; + data[base + 8 + i + 1] = 255; + data[base + 8 + i + 2] = 0; + } + } + /* red */ + for (j = 0; i < 8; j++) { + for (i = 0; i < 8; i++) { + base = 8 * 8 + j * 16; + data[base + i] = 0; + data[base + i + 1] = 0; + data[base + i + 2] = 255; + } + } + + return gst_buffer_new_wrapped (data, size); +} + +/* Test to make sure that we are using the same rgb format as opencv expects for + * template matching (BGR). + * Will use a blue 8x8 square as the template and as input a 16x16 frame divided + * evenly in 4 squares: Blue (top-left), Green (top-right), Red (bottom-left) and + * Black (bottom-right) + * + * https://bugzilla.gnome.org/show_bug.cgi?id=678485 + */ +GST_START_TEST (test_match_blue_square) +{ + GstElement *element; + GstPad *sinkpad, *srcpad; + GstCaps *caps = + gst_caps_from_string (CAPS_TMPL ", width=(int)16, height=(int)16"); + GstBus *bus; + GstMessage *msg; + const GstStructure *structure; + gchar *path; + GstBuffer *buf; + guint x, y, width, height; + + element = gst_check_setup_element ("templatematch"); + srcpad = gst_check_setup_src_pad (element, &srctemplate); + sinkpad = gst_check_setup_sink_pad (element, &sinktemplate); + gst_pad_set_active (srcpad, TRUE); + gst_check_setup_events (srcpad, element, caps, GST_FORMAT_TIME); + gst_pad_set_active (sinkpad, TRUE); + + bus = gst_bus_new (); + gst_element_set_bus (element, bus); + + path = g_build_filename (GST_TEST_FILES_PATH, "blue-square.png", NULL); + g_object_set (element, "template", path, NULL); + g_free (path); + + fail_unless (gst_element_set_state (element, + GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, + "could not set to playing"); + + buf = create_input_buffer (); + fail_unless (gst_pad_push (srcpad, buf) == GST_FLOW_OK); + + /* make sure that the template match message was posted, detecting the + * blue area in the top left corner */ + msg = gst_bus_pop_filtered (bus, GST_MESSAGE_ELEMENT); + fail_unless (msg != NULL); + fail_unless (GST_MESSAGE_SRC (msg) == GST_OBJECT_CAST (element)); + structure = gst_message_get_structure (msg); + fail_unless (gst_structure_has_name (structure, "template_match")); + fail_unless (gst_structure_get_uint (structure, "x", &x)); + fail_unless (gst_structure_get_uint (structure, "y", &y)); + fail_unless (gst_structure_get_uint (structure, "width", &width)); + fail_unless (gst_structure_get_uint (structure, "height", &height)); + fail_unless (x == 0); + fail_unless (y == 0); + fail_unless (width == 8); + fail_unless (height == 8); + + gst_message_unref (msg); + + gst_element_set_state (element, GST_STATE_NULL); + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); + gst_caps_unref (caps); + gst_pad_set_active (srcpad, FALSE); + gst_pad_set_active (sinkpad, FALSE); + gst_object_unref (srcpad); + gst_object_unref (sinkpad); + gst_check_teardown_src_pad (element); + gst_check_teardown_sink_pad (element); + gst_check_teardown_element (element); +} + +GST_END_TEST; + +static Suite * +templatematch_suite (void) +{ + Suite *s = suite_create ("templatematch"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_match_blue_square); + + return s; +} + +GST_CHECK_MAIN (templatematch); diff --git a/tests/files/Makefile.am b/tests/files/Makefile.am index 710d286..2807612 100644 --- a/tests/files/Makefile.am +++ b/tests/files/Makefile.am @@ -1,5 +1,6 @@ EXTRA_DIST = \ barcode.png \ + blue-square.png \ cbr_stream.mp3 \ s16be-id3v2.aiff \ stream.mp2 \ -- 2.7.4