diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-06-28 11:43:14 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-06-28 11:43:14 +0200 |
commit | 3985fe5e7372bf83c1cbb3259228700296c88899 (patch) | |
tree | 15ffef5bb5d49839e3bd461d4de4040df83a611f /tests | |
parent | a0a5145939d77a557e7c1064795cd6e854de3f82 (diff) |
Imported Upstream version 1.3.90
Diffstat (limited to 'tests')
-rw-r--r-- | tests/check/Makefile.am | 7 | ||||
-rw-r--r-- | tests/check/Makefile.in | 55 | ||||
-rw-r--r-- | tests/check/elements/udpsink.c | 161 | ||||
-rw-r--r-- | tests/check/elements/videobox.c | 238 |
4 files changed, 370 insertions, 91 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index ce400431..e15e2950 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -272,6 +272,12 @@ else check_udp = endif +if USE_PLUGIN_VIDEOBOX +check_videobox = elements/videobox +else +check_videobox = +endif + if USE_PLUGIN_VIDEOCROP check_videocrop = \ elements/aspectratiocrop \ @@ -368,6 +374,7 @@ check_PROGRAMS = \ $(check_sunaudio) \ $(check_taglib) \ $(check_udp) \ + $(check_videobox) \ $(check_videocrop) \ $(check_videofilter) \ $(check_videomixer) \ diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in index 268076e4..42eb6831 100644 --- a/tests/check/Makefile.in +++ b/tests/check/Makefile.in @@ -98,7 +98,7 @@ check_PROGRAMS = generic/states$(EXEEXT) \ $(am__EXEEXT_32) $(am__EXEEXT_33) $(am__EXEEXT_34) \ $(am__EXEEXT_35) $(am__EXEEXT_36) $(am__EXEEXT_37) \ $(am__EXEEXT_38) $(am__EXEEXT_39) $(am__EXEEXT_40) \ - $(am__EXEEXT_41) + $(am__EXEEXT_41) $(am__EXEEXT_42) subdir = tests/check ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ @@ -228,22 +228,23 @@ libparser_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ @USE_TAGLIB_TRUE@ elements/apev2mux$(EXEEXT) @USE_PLUGIN_UDP_TRUE@am__EXEEXT_32 = elements/udpsink$(EXEEXT) \ @USE_PLUGIN_UDP_TRUE@ elements/udpsrc$(EXEEXT) -@USE_PLUGIN_VIDEOCROP_TRUE@am__EXEEXT_33 = \ +@USE_PLUGIN_VIDEOBOX_TRUE@am__EXEEXT_33 = elements/videobox$(EXEEXT) +@USE_PLUGIN_VIDEOCROP_TRUE@am__EXEEXT_34 = \ @USE_PLUGIN_VIDEOCROP_TRUE@ elements/aspectratiocrop$(EXEEXT) \ @USE_PLUGIN_VIDEOCROP_TRUE@ elements/videocrop$(EXEEXT) -@USE_PLUGIN_VIDEOFILTER_TRUE@am__EXEEXT_34 = \ +@USE_PLUGIN_VIDEOFILTER_TRUE@am__EXEEXT_35 = \ @USE_PLUGIN_VIDEOFILTER_TRUE@ elements/videofilter$(EXEEXT) -@USE_PLUGIN_VIDEOMIXER_TRUE@am__EXEEXT_35 = \ +@USE_PLUGIN_VIDEOMIXER_TRUE@am__EXEEXT_36 = \ @USE_PLUGIN_VIDEOMIXER_TRUE@ elements/videomixer$(EXEEXT) -@USE_VPX_TRUE@am__EXEEXT_36 = elements/vp8enc$(EXEEXT) \ +@USE_VPX_TRUE@am__EXEEXT_37 = elements/vp8enc$(EXEEXT) \ @USE_VPX_TRUE@ elements/vp8dec$(EXEEXT) -@USE_PLUGIN_WAVENC_TRUE@am__EXEEXT_37 = pipelines/wavenc$(EXEEXT) -@USE_WAVPACK_TRUE@am__EXEEXT_38 = elements/wavpackdec$(EXEEXT) \ +@USE_PLUGIN_WAVENC_TRUE@am__EXEEXT_38 = pipelines/wavenc$(EXEEXT) +@USE_WAVPACK_TRUE@am__EXEEXT_39 = elements/wavpackdec$(EXEEXT) \ @USE_WAVPACK_TRUE@ elements/wavpackenc$(EXEEXT) \ @USE_WAVPACK_TRUE@ pipelines/wavpack$(EXEEXT) -@USE_PLUGIN_WAVPARSE_TRUE@am__EXEEXT_39 = elements/wavparse$(EXEEXT) -@USE_PLUGIN_Y4M_TRUE@am__EXEEXT_40 = elements/y4menc$(EXEEXT) -@HAVE_ORC_TRUE@am__EXEEXT_41 = orc/deinterlace$(EXEEXT) \ +@USE_PLUGIN_WAVPARSE_TRUE@am__EXEEXT_40 = elements/wavparse$(EXEEXT) +@USE_PLUGIN_Y4M_TRUE@am__EXEEXT_41 = elements/y4menc$(EXEEXT) +@HAVE_ORC_TRUE@am__EXEEXT_42 = orc/deinterlace$(EXEEXT) \ @HAVE_ORC_TRUE@ orc/videomixer$(EXEEXT) orc/videobox$(EXEEXT) elements_aacparse_SOURCES = elements/aacparse.c elements_aacparse_OBJECTS = elements/aacparse.$(OBJEXT) @@ -678,6 +679,10 @@ elements_udpsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(elements_udpsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ +elements_videobox_SOURCES = elements/videobox.c +elements_videobox_OBJECTS = elements/videobox.$(OBJEXT) +elements_videobox_LDADD = $(LDADD) +elements_videobox_DEPENDENCIES = $(am__DEPENDENCIES_1) elements_videocrop_SOURCES = elements/videocrop.c elements_videocrop_OBJECTS = \ elements/elements_videocrop-videocrop.$(OBJEXT) @@ -859,9 +864,10 @@ SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ elements/rtpjitterbuffer.c elements/rtpmux.c elements/rtprtx.c \ elements/rtpsession.c elements/shapewipe.c \ elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ - elements/udpsink.c elements/udpsrc.c elements/videocrop.c \ - elements/videofilter.c elements/videomixer.c elements/vp8dec.c \ - elements/vp8enc.c elements/wavpackdec.c elements/wavpackenc.c \ + elements/udpsink.c elements/udpsrc.c elements/videobox.c \ + elements/videocrop.c elements/videofilter.c \ + elements/videomixer.c elements/vp8dec.c elements/vp8enc.c \ + elements/wavpackdec.c elements/wavpackenc.c \ elements/wavpackparse.c elements/wavparse.c elements/y4menc.c \ generic/states.c $(nodist_orc_deinterlace_SOURCES) \ $(nodist_orc_videobox_SOURCES) \ @@ -894,9 +900,10 @@ DIST_SOURCES = $(libparser_la_SOURCES) elements/aacparse.c \ elements/rtpjitterbuffer.c elements/rtpmux.c elements/rtprtx.c \ elements/rtpsession.c elements/shapewipe.c \ elements/souphttpsrc.c elements/spectrum.c elements/sunaudio.c \ - elements/udpsink.c elements/udpsrc.c elements/videocrop.c \ - elements/videofilter.c elements/videomixer.c elements/vp8dec.c \ - elements/vp8enc.c elements/wavpackdec.c elements/wavpackenc.c \ + elements/udpsink.c elements/udpsrc.c elements/videobox.c \ + elements/videocrop.c elements/videofilter.c \ + elements/videomixer.c elements/vp8dec.c elements/vp8enc.c \ + elements/wavpackdec.c elements/wavpackenc.c \ elements/wavpackparse.c elements/wavparse.c elements/y4menc.c \ generic/states.c pipelines/effectv.c pipelines/flacdec.c \ pipelines/simple-launch-lines.c pipelines/tagschecking.c \ @@ -1611,6 +1618,8 @@ CLEANFILES = core.* test-registry.* @USE_PLUGIN_UDP_TRUE@ elements/udpsink \ @USE_PLUGIN_UDP_TRUE@ elements/udpsrc +@USE_PLUGIN_VIDEOBOX_FALSE@check_videobox = +@USE_PLUGIN_VIDEOBOX_TRUE@check_videobox = elements/videobox @USE_PLUGIN_VIDEOCROP_FALSE@check_videocrop = @USE_PLUGIN_VIDEOCROP_TRUE@check_videocrop = \ @USE_PLUGIN_VIDEOCROP_TRUE@ elements/aspectratiocrop \ @@ -2233,6 +2242,12 @@ elements/elements_udpsrc-udpsrc.$(OBJEXT): elements/$(am__dirstamp) \ elements/udpsrc$(EXEEXT): $(elements_udpsrc_OBJECTS) $(elements_udpsrc_DEPENDENCIES) $(EXTRA_elements_udpsrc_DEPENDENCIES) elements/$(am__dirstamp) @rm -f elements/udpsrc$(EXEEXT) $(AM_V_CCLD)$(elements_udpsrc_LINK) $(elements_udpsrc_OBJECTS) $(elements_udpsrc_LDADD) $(LIBS) +elements/videobox.$(OBJEXT): elements/$(am__dirstamp) \ + elements/$(DEPDIR)/$(am__dirstamp) + +elements/videobox$(EXEEXT): $(elements_videobox_OBJECTS) $(elements_videobox_DEPENDENCIES) $(EXTRA_elements_videobox_DEPENDENCIES) elements/$(am__dirstamp) + @rm -f elements/videobox$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(elements_videobox_OBJECTS) $(elements_videobox_LDADD) $(LIBS) elements/elements_videocrop-videocrop.$(OBJEXT): \ elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp) @@ -2449,6 +2464,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/rtpbin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/shapewipe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/udpsink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/videobox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/vp8dec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/vp8enc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/wavpackdec.Po@am__quote@ @@ -3828,6 +3844,13 @@ elements/udpsrc.log: elements/udpsrc$(EXEEXT) --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +elements/videobox.log: elements/videobox$(EXEEXT) + @p='elements/videobox$(EXEEXT)'; \ + b='elements/videobox'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) elements/aspectratiocrop.log: elements/aspectratiocrop$(EXEEXT) @p='elements/aspectratiocrop$(EXEEXT)'; \ b='elements/aspectratiocrop'; \ diff --git a/tests/check/elements/udpsink.c b/tests/check/elements/udpsink.c index d3f03f11..0e938eef 100644 --- a/tests/check/elements/udpsink.c +++ b/tests/check/elements/udpsink.c @@ -20,9 +20,7 @@ #include <gst/check/gstcheck.h> #include <gst/base/gstbasesink.h> #include <stdlib.h> -#include <unistd.h> -#if 0 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, @@ -40,129 +38,100 @@ static guint render_list_bytes_received; * Render function for testing udpsink with buffer lists */ static GstFlowReturn -udpsink_render (GstBaseSink * sink, GstBufferList * list) +udpsink_render_list (GstBaseSink * sink, GstBufferList * list) { - GstBufferListIterator *it; + guint i, num; - fail_if (!list); + num = gst_buffer_list_length (list); + for (i = 0; i < num; ++i) { + GstBuffer *buf = gst_buffer_list_get (list, i); + gsize size = gst_buffer_get_size (buf); - /* - * Count the size of the rtp header and the payload in the buffer list. - */ - - it = gst_buffer_list_iterate (list); - - /* Loop through all groups */ - while (gst_buffer_list_iterator_next_group (it)) { - GstBuffer *buf; - /* Loop through all buffers in the current group */ - while ((buf = gst_buffer_list_iterator_next (it))) { - guint size; - - size = GST_BUFFER_SIZE (buf); - GST_DEBUG ("rendered %u bytes", size); - - render_list_bytes_received += size; - } + GST_DEBUG ("rendered %" G_GSIZE_FORMAT " bytes", size); + render_list_bytes_received += size; } - gst_buffer_list_iterator_free (it); - return GST_FLOW_OK; } static void -_set_render_function (GstElement * bsink) +set_render_list_function (GstElement * bsink) { GstBaseSinkClass *bsclass; + bsclass = GST_BASE_SINK_GET_CLASS ((GstBaseSink *) bsink); + /* Add callback function for the buffer list tests */ - bsclass->render_list = udpsink_render; + bsclass->render_list = udpsink_render_list; } static GstBufferList * -_create_buffer_list (guint * data_size) +create_buffer_list (guint * data_size) { GstBufferList *list; - GstBufferListIterator *it; GstBuffer *rtp_buffer; GstBuffer *data_buffer; list = gst_buffer_list_new (); - it = gst_buffer_list_iterate (list); /*** First group, i.e. first packet. **/ /* Create the RTP header buffer */ - rtp_buffer = gst_buffer_new (); - GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); - GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); - GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; - memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); + rtp_buffer = gst_buffer_new_allocate (NULL, RTP_HEADER_SIZE, NULL); + gst_buffer_memset (rtp_buffer, 0, 0, RTP_HEADER_SIZE); /* Create the buffer that holds the payload */ - data_buffer = gst_buffer_new (); - GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); - GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); - GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; - memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); + data_buffer = gst_buffer_new_allocate (NULL, RTP_PAYLOAD_SIZE, NULL); + gst_buffer_memset (data_buffer, 0, 0, RTP_PAYLOAD_SIZE); /* Create a new group to hold the rtp header and the payload */ - gst_buffer_list_iterator_add_group (it); - gst_buffer_list_iterator_add (it, rtp_buffer); - gst_buffer_list_iterator_add (it, data_buffer); + gst_buffer_list_add (list, gst_buffer_append (rtp_buffer, data_buffer)); /*** Second group, i.e. second packet. ***/ /* Create the RTP header buffer */ - rtp_buffer = gst_buffer_new (); - GST_BUFFER_MALLOCDATA (rtp_buffer) = g_malloc (RTP_HEADER_SIZE); - GST_BUFFER_DATA (rtp_buffer) = GST_BUFFER_MALLOCDATA (rtp_buffer); - GST_BUFFER_SIZE (rtp_buffer) = RTP_HEADER_SIZE; - memset (GST_BUFFER_DATA (rtp_buffer), 0, RTP_HEADER_SIZE); + rtp_buffer = gst_buffer_new_allocate (NULL, RTP_HEADER_SIZE, NULL); + gst_buffer_memset (rtp_buffer, 0, 0, RTP_HEADER_SIZE); /* Create the buffer that holds the payload */ - data_buffer = gst_buffer_new (); - GST_BUFFER_MALLOCDATA (data_buffer) = g_malloc (RTP_PAYLOAD_SIZE); - GST_BUFFER_DATA (data_buffer) = GST_BUFFER_MALLOCDATA (data_buffer); - GST_BUFFER_SIZE (data_buffer) = RTP_PAYLOAD_SIZE; - memset (GST_BUFFER_DATA (data_buffer), 0, RTP_PAYLOAD_SIZE); + data_buffer = gst_buffer_new_allocate (NULL, RTP_PAYLOAD_SIZE, NULL); + gst_buffer_memset (data_buffer, 0, 0, RTP_PAYLOAD_SIZE); /* Create a new group to hold the rtp header and the payload */ - gst_buffer_list_iterator_add_group (it); - gst_buffer_list_iterator_add (it, rtp_buffer); - gst_buffer_list_iterator_add (it, data_buffer); + gst_buffer_list_add (list, gst_buffer_append (rtp_buffer, data_buffer)); /* Calculate the size of the data */ *data_size = 2 * RTP_HEADER_SIZE + 2 * RTP_PAYLOAD_SIZE; - gst_buffer_list_iterator_free (it); - return list; } static void udpsink_test (gboolean use_buffer_lists) { + GstSegment segment; GstElement *udpsink; GstPad *srcpad; GstBufferList *list; guint data_size; - list = _create_buffer_list (&data_size); + list = create_buffer_list (&data_size); udpsink = gst_check_setup_element ("udpsink"); if (use_buffer_lists) - _set_render_function (udpsink); + set_render_list_function (udpsink); srcpad = gst_check_setup_src_pad_by_name (udpsink, &srctemplate, "sink"); gst_element_set_state (udpsink, GST_STATE_PLAYING); + gst_pad_set_active (srcpad, TRUE); + + gst_pad_push_event (srcpad, gst_event_new_stream_start ("hey there!")); - gst_pad_push_event (srcpad, gst_event_new_new_segment_full (FALSE, 1.0, 1.0, - GST_FORMAT_TIME, 0, -1, 0)); + gst_segment_init (&segment, GST_FORMAT_TIME); + gst_pad_push_event (srcpad, gst_event_new_segment (&segment)); - gst_pad_push_list (srcpad, list); + fail_unless_equals_int (gst_pad_push_list (srcpad, list), GST_FLOW_OK); gst_check_teardown_pad_by_name (udpsink, "sink"); gst_check_teardown_element (udpsink); @@ -177,34 +146,76 @@ GST_START_TEST (test_udpsink) } GST_END_TEST; + + GST_START_TEST (test_udpsink_bufferlist) { udpsink_test (TRUE); } GST_END_TEST; -#endif -/* - * Creates the test suite. - * - * Returns: pointer to the test suite. - */ +GST_START_TEST (test_udpsink_client_add_remove) +{ + GstElement *udpsink; + + /* Note: keep in mind that these are in addition to the client added by + * the host/port properties (by default 'localhost:5004' */ + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "remove", "localhost", 5004, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "remove", "127.0.0.1", 5554, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "remove", "127.0.0.1", 5555, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5555, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "add", "10.2.0.1", 5554, NULL); + gst_object_unref (udpsink); + + udpsink = gst_check_setup_element ("udpsink"); + g_signal_emit_by_name (udpsink, "add", "127.0.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "add", "10.2.0.1", 5554, NULL); + g_signal_emit_by_name (udpsink, "remove", "127.0.0.1", 5554, NULL); + gst_object_unref (udpsink); +} + +GST_END_TEST; + static Suite * udpsink_suite (void) { Suite *s = suite_create ("udpsink_test"); - TCase *tc_chain = tcase_create ("linear"); - /* Set timeout to 60 seconds. */ - tcase_set_timeout (tc_chain, 60); - suite_add_tcase (s, tc_chain); -#if 0 + tcase_add_test (tc_chain, test_udpsink); tcase_add_test (tc_chain, test_udpsink_bufferlist); -#endif + tcase_add_test (tc_chain, test_udpsink_client_add_remove); + return s; } diff --git a/tests/check/elements/videobox.c b/tests/check/elements/videobox.c new file mode 100644 index 00000000..89534495 --- /dev/null +++ b/tests/check/elements/videobox.c @@ -0,0 +1,238 @@ +/* GStreamer + * unit test for the videobox element + * + * Copyright (C) 2006 Ravi Kiran K N <ravi.kiran@samsung.com> + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <unistd.h> + +#include <gst/check/gstcheck.h> + +typedef struct _GstVideoBoxTestContext +{ + GstElement *pipeline; + GstElement *src; + GstElement *filter; + GstElement *box; + GstElement *filter2; + GstElement *sink; +} GstVideoBoxTestContext; + +typedef struct _FormatConversion +{ + const gchar *in_caps; + const gchar *out_caps; + gboolean expected_result; +} FormatConversion; + + +/* + * Update this table as and when the conversion is supported(or unsupported) in videobox + */ +static const FormatConversion conversion_table[] = { + {"video/x-raw,format={RGBA}", "video/x-raw,format={AYUV}", TRUE}, + {"video/x-raw,format={AYUV}", "video/x-raw,format={RGBA}", TRUE}, + {"video/x-raw,format={I420}", "video/x-raw,format={AYUV}", TRUE}, + {"video/x-raw,format={AYUV}", "video/x-raw,format={I420}", TRUE}, + {"video/x-raw,format={I420}", "video/x-raw,format={YV12}", TRUE}, + {"video/x-raw,format={YV12}", "video/x-raw,format={AYUV}", TRUE}, + {"video/x-raw,format={YV12}", "video/x-raw,format={I420}", TRUE}, + {"video/x-raw,format={AYUV}", "video/x-raw,format={YV12}", TRUE}, + {"video/x-raw,format={AYUV}", "video/x-raw,format={xRGB}", TRUE}, + {"video/x-raw,format={xRGB}", "video/x-raw,format={xRGB}", TRUE}, + {"video/x-raw,format={xRGB}", "video/x-raw,format={AYUV}", TRUE}, + {"video/x-raw,format={GRAY8}", "video/x-raw,format={GRAY16_LE}", FALSE}, + {"video/x-raw,format={GRAY8}", "video/x-raw,format={GRAY16_BE}", FALSE}, + {"video/x-raw,format={Y444}", "video/x-raw,format={Y42B}", FALSE}, + {"video/x-raw,format={Y444}", "video/x-raw,format={Y41B}", FALSE}, + {"video/x-raw,format={Y42B}", "video/x-raw,format={Y41B}", FALSE} +}; + + +static gboolean +bus_handler (GstBus * bus, GstMessage * message, gpointer data) +{ + GMainLoop *loop = (GMainLoop *) data; + + switch (message->type) { + case GST_MESSAGE_EOS:{ + GST_LOG ("EOS event received"); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + gst_message_parse_error (message, &gerror, &debug); + g_error ("Error from %s: %s (%s)\n", + GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)), gerror->message, + GST_STR_NULL (debug)); + g_error_free (gerror); + g_free (debug); + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_WARNING:{ + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +static void +videobox_test_init_context (GstVideoBoxTestContext * ctx) +{ + fail_unless (ctx != NULL); + + ctx->pipeline = gst_pipeline_new ("pipeline"); + fail_unless (ctx->pipeline != NULL); + ctx->src = gst_element_factory_make ("videotestsrc", "src"); + fail_unless (ctx->src != NULL, "Failed to create videotestsrc element"); + ctx->filter = gst_element_factory_make ("capsfilter", "filter"); + fail_unless (ctx->filter != NULL, "Failed to create capsfilter element"); + ctx->box = gst_element_factory_make ("videobox", "box"); + fail_unless (ctx->box != NULL, "Failed to create videobox element"); + ctx->filter2 = gst_element_factory_make ("capsfilter", "filter2"); + fail_unless (ctx->filter2 != NULL, + "Failed to create second capsfilter element"); + ctx->sink = gst_element_factory_make ("fakesink", "sink"); + fail_unless (ctx->sink != NULL, "Failed to create fakesink element"); + + gst_bin_add_many (GST_BIN (ctx->pipeline), ctx->src, ctx->filter, + ctx->box, ctx->filter2, ctx->sink, NULL); + fail_unless (gst_element_link_many (ctx->src, ctx->filter, ctx->box, + ctx->filter2, ctx->sink, NULL) == TRUE, "Can not link elements"); + + fail_unless (gst_element_set_state (ctx->pipeline, + GST_STATE_READY) != GST_STATE_CHANGE_FAILURE, + "couldn't set pipeline to READY state"); + + GST_LOG ("videobox context inited"); +} + +static void +videobox_test_deinit_context (GstVideoBoxTestContext * ctx) +{ + GST_LOG ("deiniting videobox context"); + + gst_element_set_state (ctx->pipeline, GST_STATE_NULL); + gst_object_unref (ctx->pipeline); + memset (ctx, 0x00, sizeof (GstVideoBoxTestContext)); +} + +GST_START_TEST (test_caps_transform) +{ + GstStateChangeReturn state_ret; + GstVideoBoxTestContext ctx; + guint conversions_test_size; + guint itr; + gboolean link_res; + GMainLoop *loop; + GstBus *bus; + + videobox_test_init_context (&ctx); + gst_util_set_object_arg (G_OBJECT (ctx.src), "num-buffers", "1"); + + loop = g_main_loop_new (NULL, TRUE); + fail_unless (loop != NULL); + + bus = gst_element_get_bus (ctx.pipeline); + fail_unless (bus != NULL); + + gst_bus_add_watch (bus, bus_handler, loop); + gst_object_unref (bus); + + conversions_test_size = G_N_ELEMENTS (conversion_table); + for (itr = 0; itr < conversions_test_size; itr++) { + gst_element_unlink_many (ctx.src, ctx.filter, ctx.box, ctx.filter2, + ctx.sink, NULL); + gst_util_set_object_arg (G_OBJECT (ctx.filter), "caps", + conversion_table[itr].in_caps); + gst_util_set_object_arg (G_OBJECT (ctx.filter2), "caps", + conversion_table[itr].out_caps); + + /* Link with new input and output format from conversion table */ + link_res = + gst_element_link_many (ctx.src, ctx.filter, ctx.box, ctx.filter2, + ctx.sink, NULL); + + /* Check if the specified format conversion is supported or not by videobox */ + fail_unless (link_res == conversion_table[itr].expected_result, + "videobox can not convert from '%s'' to '%s'", + conversion_table[itr].in_caps, conversion_table[itr].out_caps); + + if (link_res == FALSE) { + GST_LOG ("elements linking failed"); + continue; + } + + state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_PLAYING); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE, + "couldn't set pipeline to PLAYING state"); + + g_main_loop_run (loop); + + state_ret = gst_element_set_state (ctx.pipeline, GST_STATE_READY); + fail_unless (state_ret != GST_STATE_CHANGE_FAILURE, + "couldn't set pipeline to READY state"); + } + + g_main_loop_unref (loop); + + videobox_test_deinit_context (&ctx); +} + +GST_END_TEST; + + +static Suite * +videobox_suite (void) +{ + Suite *s = suite_create ("videobox"); + TCase *tc_chain = tcase_create ("general"); + + suite_add_tcase (s, tc_chain); + tcase_add_test (tc_chain, test_caps_transform); + + return s; +} + +int +main (int argc, char **argv) +{ + int nf; + + Suite *s = videobox_suite (); + SRunner *sr = srunner_create (s); + + gst_check_init (&argc, &argv); + + srunner_run_all (sr, CK_NORMAL); + nf = srunner_ntests_failed (sr); + srunner_free (sr); + + return nf; +} |