| /* GStreamer | |
| * | |
| * unit test for audiotestsrc basetime handling | |
| * | |
| * Copyright (C) 2009 Maemo Multimedia <multimedia at maemo dot org> | |
| * | |
| * 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 | |
| #ifdef HAVE_VALGRIND | |
| #include <valgrind/valgrind.h> | |
| #endif | |
| #include <gst/check/gstcheck.h> | |
| #ifndef GST_DISABLE_PARSE | |
| static GstClockTime old_ts = GST_CLOCK_TIME_NONE; | |
| static gboolean | |
| break_mainloop (gpointer data) | |
| { | |
| GMainLoop *loop; | |
| loop = (GMainLoop *) data; | |
| g_main_loop_quit (loop); | |
| return FALSE; | |
| } | |
| static GstPadProbeReturn | |
| buffer_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) | |
| { | |
| GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info); | |
| GstClockTime new_ts = GST_BUFFER_TIMESTAMP (buffer); | |
| GST_LOG ("ts = %" GST_TIME_FORMAT, GST_TIME_ARGS (new_ts)); | |
| if (old_ts != GST_CLOCK_TIME_NONE) { | |
| fail_unless (new_ts != old_ts, | |
| "Two buffers had same timestamp: %" GST_TIME_FORMAT, | |
| GST_TIME_ARGS (old_ts)); | |
| } | |
| old_ts = new_ts; | |
| return GST_PAD_PROBE_OK; | |
| } | |
| GST_START_TEST (test_basetime_calculation) | |
| { | |
| GstElement *p1, *bin; | |
| GstElement *asrc, *asink; | |
| GstPad *pad; | |
| GMainLoop *loop; | |
| loop = g_main_loop_new (NULL, FALSE); | |
| /* The "main" pipeline */ | |
| p1 = gst_parse_launch ("fakesrc ! identity sleep-time=1 ! fakesink", NULL); | |
| fail_if (p1 == NULL); | |
| /* Create a sub-bin that is activated only in "certain situations" */ | |
| asrc = gst_element_factory_make ("audiotestsrc", NULL); | |
| if (asrc == NULL) { | |
| GST_WARNING ("Cannot run test. 'audiotestsrc' not available"); | |
| gst_element_set_state (p1, GST_STATE_NULL); | |
| gst_object_unref (p1); | |
| return; | |
| } | |
| asink = gst_element_factory_make ("fakesink", NULL); | |
| bin = gst_bin_new ("audiobin"); | |
| gst_bin_add_many (GST_BIN (bin), asrc, asink, NULL); | |
| gst_element_link (asrc, asink); | |
| gst_bin_add (GST_BIN (p1), bin); | |
| gst_element_set_state (p1, GST_STATE_READY); | |
| pad = gst_element_get_static_pad (asink, "sink"); | |
| fail_unless (pad != NULL, "Could not get pad out of sink"); | |
| gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, buffer_probe_cb, NULL, | |
| NULL); | |
| gst_element_set_locked_state (bin, TRUE); | |
| /* Run main pipeline first */ | |
| gst_element_set_state (p1, GST_STATE_PLAYING); | |
| g_timeout_add_seconds (2, break_mainloop, loop); | |
| g_main_loop_run (loop); | |
| /* Now activate the audio pipeline */ | |
| gst_element_set_locked_state (bin, FALSE); | |
| gst_element_set_state (p1, GST_STATE_PAUSED); | |
| /* Normally our custom audiobin would send this message */ | |
| gst_element_post_message (asrc, | |
| gst_message_new_clock_provide (GST_OBJECT (asrc), NULL, TRUE)); | |
| /* At this point a new clock is selected */ | |
| gst_element_set_state (p1, GST_STATE_PLAYING); | |
| g_timeout_add_seconds (2, break_mainloop, loop); | |
| g_main_loop_run (loop); | |
| gst_object_unref (pad); | |
| gst_element_set_state (p1, GST_STATE_NULL); | |
| gst_object_unref (p1); | |
| g_main_loop_unref (loop); | |
| } | |
| GST_END_TEST; | |
| #endif /* #ifndef GST_DISABLE_PARSE */ | |
| static Suite * | |
| baseaudiosrc_suite (void) | |
| { | |
| Suite *s = suite_create ("baseaudiosrc"); | |
| TCase *tc_chain = tcase_create ("general"); | |
| guint timeout; | |
| /* timeout 6 sec */ | |
| timeout = 6; | |
| #ifdef HAVE_VALGRIND | |
| { | |
| if (RUNNING_ON_VALGRIND) | |
| timeout *= 4; | |
| } | |
| #endif | |
| tcase_set_timeout (tc_chain, timeout); | |
| suite_add_tcase (s, tc_chain); | |
| #ifndef GST_DISABLE_PARSE | |
| tcase_add_test (tc_chain, test_basetime_calculation); | |
| #endif | |
| return s; | |
| } | |
| GST_CHECK_MAIN (baseaudiosrc); |