diff options
author | Ognyan Tonchev <ognyan@axis.com> | 2009-06-16 15:04:15 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-06-16 15:04:15 +0200 |
commit | 375523be7178aef6b0d998811e4a301d0ba96c3f (patch) | |
tree | ed55c991523880e22388dc89a6e5651b1fc71a39 /tests | |
parent | e2ac5edc4b3f89f3a2ce22b2606873197943828c (diff) |
multiudpsink: add support for buffer lists
Add support for BufferList and add a unit test.
Fixes #585842
Diffstat (limited to 'tests')
-rw-r--r-- | tests/check/Makefile.am | 1 | ||||
-rw-r--r-- | tests/check/elements/udpsink.c | 199 |
2 files changed, 200 insertions, 0 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index be1efd68..2935af4c 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -111,6 +111,7 @@ check_PROGRAMS = \ elements/rgvolume \ elements/rtp-payloading \ elements/spectrum \ + elements/udpsink \ elements/videocrop \ elements/videofilter \ elements/y4menc \ diff --git a/tests/check/elements/udpsink.c b/tests/check/elements/udpsink.c new file mode 100644 index 00000000..a6e42b79 --- /dev/null +++ b/tests/check/elements/udpsink.c @@ -0,0 +1,199 @@ +/* GStreamer RTP payloader unit tests + * Copyright (C) 2009 Axis Communications <dev-gstreamer@axis.com> + * @author Ognyan Tonchev <ognyan@axis.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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include <gst/check/gstcheck.h> +#include <gst/base/gstbasesink.h> +#include <stdlib.h> +#include <unistd.h> + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +#define RTP_HEADER_SIZE 12 +#define RTP_PAYLOAD_SIZE 1024 + +/* + * Number of bytes received in the render function when using buffer lists + */ +static guint render_list_bytes_received; + +/* + * Render function for testing udpsink with buffer lists + */ +static GstFlowReturn +udpsink_render (GstBaseSink * sink, GstBufferList * list) +{ + GstBufferListIterator *it; + + fail_if (!list); + + /* + * 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))) { + render_list_bytes_received += GST_BUFFER_SIZE (buf); + } + } + + gst_buffer_list_iterator_free (it); + + return GST_FLOW_OK; +} + +static void +_set_render_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; +} + +static GstBufferList * +_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); + + /* 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); + + /* 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); + + /*** 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); + + /* 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); + + /* 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); + + /* 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) +{ + GstElement *udpsink; + GstPad *srcpad; + GstBufferList *list; + guint data_size; + + list = _create_buffer_list (&data_size); + + udpsink = gst_check_setup_element ("udpsink"); + if (use_buffer_lists) + _set_render_function (udpsink); + + srcpad = gst_check_setup_src_pad_by_name (udpsink, &srctemplate, "sink"); + + gst_element_set_state (udpsink, GST_STATE_PLAYING); + + gst_pad_push_list (srcpad, list); + + gst_check_teardown_pad_by_name (udpsink, "sink"); + gst_check_teardown_element (udpsink); + + if (use_buffer_lists) + fail_if (data_size != render_list_bytes_received); +} + +GST_START_TEST (test_udpsink) +{ + udpsink_test (FALSE); +} + +GST_END_TEST; +GST_START_TEST (test_udpsink_bufferlist) +{ + udpsink_test (TRUE); +} + +GST_END_TEST; + +/* + * Creates the test suite. + * + * Returns: pointer to the test suite. + */ +static Suite * +udpsink_suite () +{ + 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); + tcase_add_test (tc_chain, test_udpsink); + tcase_add_test (tc_chain, test_udpsink_bufferlist); + return s; +} + +GST_CHECK_MAIN (udpsink) |