diff options
| -rw-r--r-- | tests/check/Makefile.am | 2 | ||||
| -rw-r--r-- | tests/check/elements/.gitignore | 1 | ||||
| -rw-r--r-- | tests/check/elements/flvmux.c | 158 | 
3 files changed, 161 insertions, 0 deletions
| diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index faff1f09..f765386f 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -126,6 +126,7 @@ check_PROGRAMS = \  	$(check_wavpack)  VALGRIND_TO_FIX = \ +	elements/flvmux \  	elements/rtp-payloading  TESTS = $(check_PROGRAMS) @@ -133,6 +134,7 @@ TESTS = $(check_PROGRAMS)  # these tests don't even pass  # autodetect: temporarily disabled because of broken videosinks in -bad  noinst_PROGRAMS = \ +	elements/flvmux \  	elements/autodetect  AM_CFLAGS = $(GST_OBJ_CFLAGS) $(GST_CHECK_CFLAGS) $(CHECK_CFLAGS) \ diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index e6dde233..88218ae7 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -22,6 +22,7 @@ deinterleave  equalizer  gdkpixbufsink  flvdemux +flvmux  icydemux  id3demux  id3v2mux diff --git a/tests/check/elements/flvmux.c b/tests/check/elements/flvmux.c new file mode 100644 index 00000000..58810717 --- /dev/null +++ b/tests/check/elements/flvmux.c @@ -0,0 +1,158 @@ +/* GStreamer unit tests for flvmux + * + * Copyright (C) 2009 Tim-Philipp Müller  <tim centricular net> + * + * 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/gst.h> + +static GstBusSyncReply +error_cb (GstBus * bus, GstMessage * msg, gpointer user_data) +{ +  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { +    GError *err = NULL; +    gchar *dbg = NULL; + +    gst_message_parse_error (msg, &err, &dbg); +    g_error ("ERROR: %s\n%s\n", err->message, dbg); +  } + +  return GST_BUS_PASS; +} + +static void +handoff_cb (GstElement * element, GstBuffer * buf, GstPad * pad, +    gint * p_counter) +{ +  *p_counter += 1; +  GST_LOG ("counter = %d", *p_counter); + +  fail_unless (GST_BUFFER_CAPS (buf) != NULL); +} + +static void +mux_pcm_audio (guint num_buffers, guint repeat) +{ +  GstElement *src, *sink, *flvmux, *pipeline; +  GstPad *sinkpad, *srcpad; +  gint counter; + +  GST_LOG ("num_buffers = %u", num_buffers); + +  pipeline = gst_pipeline_new ("pipeline"); +  fail_unless (pipeline != NULL, "Failed to create pipeline!"); + +  /* kids, don't use a sync handler for this at home, really; we do because +   * we just want to abort and nothing else */ +  gst_bus_set_sync_handler (GST_ELEMENT_BUS (pipeline), error_cb, NULL); + +  src = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); +  fail_unless (src != NULL, "Failed to create 'audiotestsrc' element!"); + +  g_object_set (src, "num-buffers", num_buffers, NULL); + +  flvmux = gst_element_factory_make ("flvmux", "flvmux"); +  fail_unless (flvmux != NULL, "Failed to create 'flvmux' element!"); + +  sink = gst_element_factory_make ("fakesink", "fakesink"); +  fail_unless (sink != NULL, "Failed to create 'fakesink' element!"); + +  g_object_set (sink, "signal-handoffs", TRUE, NULL); +  g_signal_connect (sink, "handoff", G_CALLBACK (handoff_cb), &counter); + +  gst_bin_add_many (GST_BIN (pipeline), src, flvmux, sink, NULL); + +  /* now link the elements */ +  sinkpad = gst_element_get_request_pad (flvmux, "audio"); +  fail_unless (sinkpad != NULL, "Could not get audio request pad"); + +  srcpad = gst_element_get_static_pad (src, "src"); +  fail_unless (srcpad != NULL, "Could not get audiotestsrc's source pad"); + +  fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK); +  fail_unless (gst_element_link (flvmux, sink)); + +  do { +    GstStateChangeReturn state_ret; +    GstMessage *msg; + +    GST_LOG ("repeat=%d", repeat); + +    counter = 0; + +    state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); +    fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + +    if (state_ret == GST_STATE_CHANGE_ASYNC) { +      GST_LOG ("waiting for pipeline to reach PAUSED state"); +      state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); +      fail_unless_equals_int (state_ret, GST_STATE_CHANGE_SUCCESS); +    } + +    GST_LOG ("PAUSED, let's do the rest of it"); + +    state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); +    fail_unless (state_ret != GST_STATE_CHANGE_FAILURE); + +    msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1); +    fail_unless (msg != NULL, "Expected EOS message on bus!"); + +    GST_LOG ("EOS"); +    gst_message_unref (msg); + +    /* should have some output */ +    fail_unless (counter > 2); + +    fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL), +        GST_STATE_CHANGE_SUCCESS); + +    /* repeat = test re-usability */ +    --repeat; +  } while (repeat > 0); + +  gst_object_unref (pipeline); +} + +GST_START_TEST (test_index_writing) +{ +  guint bufs; + +  /* note: there's a magic 128 value in flvmux when doing index writing */ +  for (bufs = 1; bufs < 500; bufs += 33) { +    mux_pcm_audio (bufs, 2); +  } + +  gst_task_cleanup_all (); +} + +GST_END_TEST; + +static Suite * +flvmux_suite (void) +{ +  Suite *s = suite_create ("flvmux"); +  TCase *tc_chain = tcase_create ("general"); + +  suite_add_tcase (s, tc_chain); +  tcase_add_test (tc_chain, test_index_writing); + +  return s; +} + +GST_CHECK_MAIN (flvmux) | 
