aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-06-28 11:43:14 +0200
committerSebastian Dröge <sebastian@centricular.com>2014-06-28 11:43:14 +0200
commit3985fe5e7372bf83c1cbb3259228700296c88899 (patch)
tree15ffef5bb5d49839e3bd461d4de4040df83a611f /tests
parenta0a5145939d77a557e7c1064795cd6e854de3f82 (diff)
Imported Upstream version 1.3.90
Diffstat (limited to 'tests')
-rw-r--r--tests/check/Makefile.am7
-rw-r--r--tests/check/Makefile.in55
-rw-r--r--tests/check/elements/udpsink.c161
-rw-r--r--tests/check/elements/videobox.c238
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;
+}