From c63c290d6840b211594aa76e879bd1a401574298 Mon Sep 17 00:00:00 2001 From: maroy Date: Wed, 22 Jun 2005 14:37:21 +0000 Subject: [PATCH] added autoplugging capability --- .../modules/gstreamerElements/etc/Makefile.in | 60 +- .../gstreamerElements/src/AutoplugTest.cxx | 169 +++++ .../gstreamerElements/src/AutoplugTest.h | 129 ++++ .../modules/gstreamerElements/src/autoplug.c | 634 ++++++++++++++++++ .../modules/gstreamerElements/src/autoplug.h | 80 +++ .../gstreamerElements/var/5seccounter.ogg | Bin 0 -> 62665 bytes 6 files changed, 1047 insertions(+), 25 deletions(-) create mode 100644 livesupport/modules/gstreamerElements/src/AutoplugTest.cxx create mode 100644 livesupport/modules/gstreamerElements/src/AutoplugTest.h create mode 100644 livesupport/modules/gstreamerElements/src/autoplug.c create mode 100644 livesupport/modules/gstreamerElements/src/autoplug.h create mode 100644 livesupport/modules/gstreamerElements/var/5seccounter.ogg diff --git a/livesupport/modules/gstreamerElements/etc/Makefile.in b/livesupport/modules/gstreamerElements/etc/Makefile.in index 13ddf4953..35f626164 100644 --- a/livesupport/modules/gstreamerElements/etc/Makefile.in +++ b/livesupport/modules/gstreamerElements/etc/Makefile.in @@ -21,7 +21,7 @@ # # # Author : $Author: maroy $ -# Version : $Revision: 1.4 $ +# Version : $Revision: 1.5 $ # Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/gstreamerElements/etc/Makefile.in,v $ # # @configure_input@ @@ -76,6 +76,9 @@ TEST_RESULTS = ${DOC_DIR}/testResults.xml # the text result XSLT has to be relative to the test result file, e.g. TMP_DIR TEST_XSLT = ../etc/testResultToHtml.xsl +GSTREAMER_ELEMENTS_LIB = livesupport_gstreamerelements +GSTREAMER_ELEMENTS_LIB_FILE = ${LIB_DIR}/lib${GSTREAMER_ELEMENTS_LIB}.a + ONESHOT_READER_LIB = livesupport_oneshotreader ONESHOT_READER_LIB_FILE = ${LIB_DIR}/lib${ONESHOT_READER_LIB}.so MINIMAL_AUDIO_SMIL_LIB = livesupport_minimalaudiosmil @@ -122,26 +125,22 @@ LDFLAGS = @LDFLAGS@ ${GSTREAMER_LIBS} \ #------------------------------------------------------------------------------- # Dependencies #------------------------------------------------------------------------------- +GSTREAMER_ELEMENTS_LIB_OBJS = ${TMP_DIR}/seek.o \ + ${TMP_DIR}/util.o \ + ${TMP_DIR}/seek-pack.o \ + ${TMP_DIR}/autoplug.o \ + ${TMP_DIR}/smil-util.o + ONESHOT_READER_LIB_OBJS = ${TMP_DIR}/oneshot-reader.o -MINIMAL_AUDIO_SMIL_LIB_OBJS = ${TMP_DIR}/seek.o \ - ${TMP_DIR}/util.o \ - ${TMP_DIR}/seek-pack.o \ - ${TMP_DIR}/minimal-audio-smil.o +MINIMAL_AUDIO_SMIL_LIB_OBJS = ${TMP_DIR}/minimal-audio-smil.o -PARTIAL_PLAY_LIB_OBJS = ${TMP_DIR}/seek.o \ - ${TMP_DIR}/util.o \ - ${TMP_DIR}/seek-pack.o \ - ${TMP_DIR}/smil-util.o \ - ${TMP_DIR}/partial-play.o +PARTIAL_PLAY_LIB_OBJS = ${TMP_DIR}/partial-play.o -SWITCHER_LIB_OBJS = ${TMP_DIR}/smil-util.o \ - ${TMP_DIR}/switcher.o +SWITCHER_LIB_OBJS = ${TMP_DIR}/switcher.o TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ - ${TMP_DIR}/seek.o \ - ${TMP_DIR}/util.o \ - ${TMP_DIR}/seek-pack.o \ + ${TMP_DIR}/AutoplugTest.o \ ${TMP_DIR}/SeekTest.o \ ${TMP_DIR}/SwitcherTest.o \ ${TMP_DIR}/SeekPackTest.o \ @@ -149,7 +148,8 @@ TEST_RUNNER_OBJS = ${TMP_DIR}/TestRunner.o \ ${TMP_DIR}/OneshotReaderTest.o \ ${TMP_DIR}/MinimalAudioSmilTest.o -TEST_RUNNER_LIBS = -l${CORE_LIB} -lcppunit -ldl -lxmlrpc++ +TEST_RUNNER_LIBS = -l${GSTREAMER_ELEMENTS_LIB} -l${CORE_LIB} \ + -lcppunit -ldl -lxmlrpc++ #------------------------------------------------------------------------------- @@ -157,7 +157,8 @@ TEST_RUNNER_LIBS = -l${CORE_LIB} -lcppunit -ldl -lxmlrpc++ #------------------------------------------------------------------------------- .PHONY: all dir_setup doc clean docclean depclean distclean -all: dir_setup ${ONESHOT_READER_LIB_FILE} \ +all: dir_setup ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${ONESHOT_READER_LIB_FILE} \ ${MINIMAL_AUDIO_SMIL_LIB_FILE} \ ${PARTIAL_PLAY_LIB_FILE} \ ${SWITCHER_LIB_FILE} \ @@ -172,6 +173,7 @@ doc: ${DOXYGEN} ${DOXYGEN_CONFIG} clean: + ${RM} ${GSTREAMER_ELEMENTS_LIB_OBJS} ${GSTREAMER_ELEMENTS_LIB_FILE} ${RM} ${ONESHOT_READER_LIB_OBJS} ${ONESHOT_READER_LIB_FILE} ${RM} ${MINIMAL_AUDIO_SMIL_LIB_OBJS} ${MINIMAL_AUDIO_SMIL_LIB_FILE} ${RM} ${PARTIAL_PLAY_LIB_OBJS} ${PARTIAL_PLAY_LIB_FILE} @@ -196,17 +198,24 @@ check: all ${TEST_RUNNER} #------------------------------------------------------------------------------- # Specific targets #------------------------------------------------------------------------------- -${ONESHOT_READER_LIB_FILE}: ${ONESHOT_READER_LIB_OBJS} +${GSTREAMER_ELEMENTS_LIB_FILE}: ${GSTREAMER_ELEMENTS_LIB_OBJS} + ${AR} crus $@ $^ + +${ONESHOT_READER_LIB_FILE}: ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${ONESHOT_READER_LIB_OBJS} ${CC} -shared -o $@ $^ ${GST_LDFLAGS} -${MINIMAL_AUDIO_SMIL_LIB_FILE}: ${MINIMAL_AUDIO_SMIL_LIB_OBJS} - ${CC} -shared ${GST_LDFLAGS} -o $@ $^ +${MINIMAL_AUDIO_SMIL_LIB_FILE}: ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${MINIMAL_AUDIO_SMIL_LIB_OBJS} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} -${PARTIAL_PLAY_LIB_FILE}: ${PARTIAL_PLAY_LIB_OBJS} - ${CC} -shared ${GST_LDFLAGS} -o $@ $^ +${PARTIAL_PLAY_LIB_FILE}: ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${PARTIAL_PLAY_LIB_OBJS} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} -${SWITCHER_LIB_FILE}: ${SWITCHER_LIB_OBJS} - ${CC} -shared ${GST_LDFLAGS} -o $@ $^ +${SWITCHER_LIB_FILE}: ${SWITCHER_LIB_OBJS} \ + ${GSTREAMER_ELEMENTS_LIB_FILE} + ${CC} -shared -o $@ $^ ${GST_LDFLAGS} ${TMP_DIR}: ${MKDIR} ${TMP_DIR} @@ -214,7 +223,8 @@ ${TMP_DIR}: ${DOXYGEN_DIR}: ${MKDIR} ${DOXYGEN_DIR} -${TEST_RUNNER}: ${CORE_LIB_FILE} ${TEST_RUNNER_OBJS} +${TEST_RUNNER}: ${CORE_LIB_FILE} ${GSTREAMER_ELEMENTS_LIB_FILE} \ + ${TEST_RUNNER_OBJS} ${CXX} ${LDFLAGS} -o $@ ${TEST_RUNNER_OBJS} ${TEST_RUNNER_LIBS} ${CORE_LIB_FILE}: diff --git a/livesupport/modules/gstreamerElements/src/AutoplugTest.cxx b/livesupport/modules/gstreamerElements/src/AutoplugTest.cxx new file mode 100644 index 000000000..64993f7db --- /dev/null +++ b/livesupport/modules/gstreamerElements/src/AutoplugTest.cxx @@ -0,0 +1,169 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the LiveSupport project. + http://livesupport.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + LiveSupport is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + LiveSupport 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LiveSupport; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: maroy $ + Version : $Revision: 1.1 $ + Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/gstreamerElements/src/AutoplugTest.cxx,v $ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include +#include + +#include + +#include "autoplug.h" +#include "AutoplugTest.h" + + +using namespace LiveSupport::GstreamerElements; + +/* =================================================== local data structures */ + + +/* ================================================ local constants & macros */ + +CPPUNIT_TEST_SUITE_REGISTRATION(AutoplugTest); + +/** + * An mp3 test file. + */ +static const char * mp3TestFile = "var/5seccounter.mp3"; + +/** + * An ogg vorbis test file. + */ +static const char * oggTestFile = "var/5seccounter.ogg"; + + +/* =============================================== local function prototypes */ + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Set up the test environment + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: setUp(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Clean up the test environment + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: tearDown(void) throw () +{ +} + + +/*------------------------------------------------------------------------------ + * Play an audio file + *----------------------------------------------------------------------------*/ +gint64 +AutoplugTest :: playFile(const char * audioFile) + throw (CPPUNIT_NS::Exception) +{ + GstElement * pipeline; + GstElement * source; + GstElement * decoder; + GstElement * sink; + GstFormat format; + gint64 timePlayed; + + /* initialize GStreamer */ + gst_init(0, 0); + + /* create elements */ + pipeline = gst_pipeline_new("audio-player"); + source = gst_element_factory_make("filesrc", "source"); + sink = gst_element_factory_make("alsasink", "alsa-output"); + + g_object_set(G_OBJECT(source), "location", audioFile, NULL); + + decoder = autoplug_plug_source(source); + + gst_element_link(decoder, sink); + gst_bin_add_many(GST_BIN(pipeline), source, decoder, sink, NULL); + + gst_element_set_state(source, GST_STATE_PAUSED); + gst_element_set_state(decoder, GST_STATE_PAUSED); + gst_element_set_state(sink, GST_STATE_PAUSED); + gst_element_set_state(pipeline, GST_STATE_PLAYING); + gst_bin_sync_children_state(GST_BIN(pipeline)); + + // iterate until playTo is reached + while (gst_bin_iterate(GST_BIN(pipeline))); + + format = GST_FORMAT_TIME; + gst_element_query(sink, GST_QUERY_POSITION, &format, &timePlayed); + + /* clean up nicely */ + gst_element_set_state(pipeline, GST_STATE_NULL); + gst_object_unref(GST_OBJECT (pipeline)); + + return timePlayed; +} + + +/*------------------------------------------------------------------------------ + * A simple smoke test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: firstTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(mp3TestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + + +/*------------------------------------------------------------------------------ + * An ogg vorbis test. + *----------------------------------------------------------------------------*/ +void +AutoplugTest :: oggVorbisTest(void) + throw (CPPUNIT_NS::Exception) +{ + gint64 timePlayed; + char str[256]; + + timePlayed = playFile(oggTestFile); + g_snprintf(str, 256, "time played: %" G_GINT64_FORMAT, timePlayed); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed > 4.9 * GST_SECOND); + CPPUNIT_ASSERT_MESSAGE(str, timePlayed < 5.1 * GST_SECOND); +} + diff --git a/livesupport/modules/gstreamerElements/src/AutoplugTest.h b/livesupport/modules/gstreamerElements/src/AutoplugTest.h new file mode 100644 index 000000000..e65a8450e --- /dev/null +++ b/livesupport/modules/gstreamerElements/src/AutoplugTest.h @@ -0,0 +1,129 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the LiveSupport project. + http://livesupport.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + LiveSupport is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + LiveSupport 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LiveSupport; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: maroy $ + Version : $Revision: 1.1 $ + Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/gstreamerElements/src/AutoplugTest.h,v $ + +------------------------------------------------------------------------------*/ +#ifndef AutoplugTest_h +#define AutoplugTest_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + + +namespace LiveSupport { +namespace GstreamerElements { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * Unit test for the partialplay gstreamer element. + * + * @author $Author: maroy $ + * @version $Revision: 1.1 $ + */ +class AutoplugTest : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE(AutoplugTest); + CPPUNIT_TEST(firstTest); + CPPUNIT_TEST(oggVorbisTest); + CPPUNIT_TEST_SUITE_END(); + + private: + + /** + * Play a specific file, from and until a specific timepoint. + * + * @param audioFile the audio file to play. + * @return the number of milliseconds played. + * @exception CPPUNIT_NS::Exception on test failures. + */ + gint64 + playFile(const char * audioFile) + throw (CPPUNIT_NS::Exception); + + + protected: + + /** + * A simple smoke test. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + firstTest(void) throw (CPPUNIT_NS::Exception); + + /** + * Test an Ogg Vorbis file. + * + * @exception CPPUNIT_NS::Exception on test failures. + */ + void + oggVorbisTest(void) throw (CPPUNIT_NS::Exception); + + + public: + + /** + * Set up the environment for the test case. + */ + void + setUp(void) throw (); + + /** + * Clean up the environment after the test case. + */ + void + tearDown(void) throw (); +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace GstreamerElements +} // namespace LiveSupport + +#endif // AutoplugTest_h + diff --git a/livesupport/modules/gstreamerElements/src/autoplug.c b/livesupport/modules/gstreamerElements/src/autoplug.c new file mode 100644 index 000000000..496585289 --- /dev/null +++ b/livesupport/modules/gstreamerElements/src/autoplug.c @@ -0,0 +1,634 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the LiveSupport project. + http://livesupport.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + LiveSupport is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + LiveSupport 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LiveSupport; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + This code is based on the examples/manual/dynamic.c sample file + provided in the gstreamer-0.8.10 source tarball, which is published + under the GNU LGPL license. + + + Author : $Author: maroy $ + Version : $Revision: 1.1 $ + Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/gstreamerElements/src/autoplug.c,v $ + +------------------------------------------------------------------------------*/ + +/* ============================================================ include files */ + +#include + +#include "autoplug.h" + + +/* =================================================== local data structures */ + +typedef struct _Typefind Typefind; + +/** + * Data structure to hold information related to typefindinf. + */ +struct _Typefind { + GList * factories; + + GstElement * pipeline; + GstElement * bin; + GstElement * source; + GstElement * typefind; + GstElement * audiosink; + GstElement * sink; + + gulong typefindSignal; + + gboolean done; +}; + + +/* ================================================ local constants & macros */ + + +/* =============================================== local function prototypes */ + +/** + * Handle typefinding error. + * + * @param pipeline the pipeline generating the error. + * @param source the source element with the error + * @param error the error itself. + * @param message the error message. + * @param userData user-specific data. + */ +static void +autoplug_error_handler(GstElement * pipeline, + GstElement * source, + GError * error, + gchar * message, + gpointer userData); + +/** + * Handle event of the typefinder finding a type. + * + * @param typefind the typefind element that found the type. + * @param probability the probability of the find. + * @param caps the found capabilities. + * @param userData user-specific data, a pointer to a related Typefind + * structure. + */ +static void +autoplug_typefound_handler(GstElement * typefind, + gint probability, + GstCaps * caps, + gpointer userData); + +/** + * Initialize a typefind object. + * + * @param typefind the Typefind structure to init. + */ +static void +autoplug_init(Typefind * typefind); + +/** + * A filter specifying the kind of factories we're interested in. + * + * @param feature the feature to test + * @param userData user-specific data + * @return TRUE if we're interested in the supplied feature, FALSE otherwise + */ +static gboolean +autoplug_feature_filter(GstPluginFeature * feature, + gpointer userData); + +/** + * A comparison function based on the ranks of two features. + * + * @param feature1 one of the features to compare. + * @param feature2 the other feature to compare. + * @return 0 if the two features match in terms of their ranks, + * <0 if feature1 is higher, >0 if feature2 is higher in + * their ranks. + */ +static gint +autoplug_compare_ranks(GstPluginFeature * feature1, + GstPluginFeature * feature2); + +/** + * Type to plug an appropriate element to a pad, according to the specified + * capabilities. + * + * @param typefind the Typefind structure to do the plugging for + * @param pad the pad to plug. + * @param caps the capabilities to plug with. + */ +static void +autoplug_try_to_plug(Typefind * typefind, + GstPad * pad, + const GstCaps * caps); + +/** + * Close a found link. + * + * @param typefind the Typefind structure to do close the link for. + * @param srcpad the source pad to close linking for. + * @param sinkelement the sink element to link the src pad to. + * @param padname the name of sink pad in sinkelement to link srcpad to. + * @param templlist a pad template list (TODO: what's this for?) + */ +static void +autoplug_close_link(Typefind * typefind, + GstPad * srcpad, + GstElement * sinkelement, + const gchar * padname, + const GList * templlist); + +/** + * Handle the event of new pads created on elements with dynamic pads. + * + * @param element the element that the new pad was created on. + * @param pad the new pad. + * @param userData user-specific data. + */ +static void +autoplug_newpad(GstElement * element, + GstPad * pad, + gpointer data); + + +/** + * Remove all typefind elements inside the bin, traversing to lower binds + * if necessary. The pads linked through the removed typefind elements are + * linked directly instead. + * + * @param bin the bin to remove the typefind elements from. + */ +static void +autoplug_remove_typefind_elements(GstBin * bin); + + +/* ============================================================= module code */ + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +static gboolean +autoplug_feature_filter(GstPluginFeature * feature, + gpointer userData) +{ + const gchar * klass; + guint rank; + + /* we only care about element factories */ + if (!GST_IS_ELEMENT_FACTORY(feature)) { + return FALSE; + } + + /* only parsers, demuxers and decoders */ + klass = gst_element_factory_get_klass(GST_ELEMENT_FACTORY(feature)); + if (g_strrstr(klass, "Demux") == NULL && + g_strrstr(klass, "Decoder") == NULL && + g_strrstr(klass, "Parse") == NULL) { + + return FALSE; + } + + /* only select elements with autoplugging rank */ + rank = gst_plugin_feature_get_rank(feature); + if (rank < GST_RANK_MARGINAL) { + return FALSE; + } + + return TRUE; +} + + +/*------------------------------------------------------------------------------ + * Compare the ranks of two features. + *----------------------------------------------------------------------------*/ +static gint +autoplug_compare_ranks(GstPluginFeature * feature1, + GstPluginFeature * feature2) +{ + return gst_plugin_feature_get_rank(feature2) + - gst_plugin_feature_get_rank(feature1); +} + + +/*------------------------------------------------------------------------------ + * Initialize a Typefind object, like the factories that we care about. + *----------------------------------------------------------------------------*/ +static void +autoplug_init(Typefind * typefind) +{ + /* first filter out the interesting element factories */ + typefind->factories = gst_registry_pool_feature_filter( + (GstPluginFeatureFilter) autoplug_feature_filter, + FALSE, NULL); + + /* sort them according to their ranks */ + typefind->factories = g_list_sort(typefind->factories, + (GCompareFunc) autoplug_compare_ranks); + + typefind->pipeline = gst_pipeline_new("pipeline"); + typefind->bin = gst_bin_new("bin"); + typefind->typefind = gst_element_factory_make("typefind", "tf"); + typefind->audiosink = gst_element_factory_make("audioconvert", "audiosink"); + typefind->sink = gst_element_factory_make("fakesink", "fakesink"); + + gst_element_add_ghost_pad(typefind->bin, + gst_element_get_pad(typefind->typefind, "sink"), + "sink"); + gst_bin_add_many(GST_BIN(typefind->bin), + typefind->typefind, + NULL); + + g_signal_connect(typefind->bin, + "error", + G_CALLBACK(autoplug_error_handler), + NULL); + typefind->typefindSignal = g_signal_connect(typefind->typefind, + "have-type", + G_CALLBACK(autoplug_typefound_handler), + typefind); + + gst_element_link(typefind->source, typefind->bin); + gst_bin_add_many(GST_BIN(typefind->pipeline), + typefind->source, + typefind->bin, + NULL); + + typefind->done = FALSE; +} + + +/*------------------------------------------------------------------------------ + * Handle the event of a new pad being created on an element with + * request pads. + *----------------------------------------------------------------------------*/ +static void +autoplug_newpad(GstElement * element, + GstPad * pad, + gpointer userData) +{ + GstCaps * caps; + Typefind * typefind = (Typefind*) userData; + + g_return_if_fail(typefind != NULL); + + GST_DEBUG("created new pad %s for element %s", + gst_pad_get_name(pad), gst_element_get_name(element)); + caps = gst_pad_get_caps(pad); + autoplug_try_to_plug(typefind, pad, caps); + gst_caps_free(caps); +} + + + +/*------------------------------------------------------------------------------ + * Close the link. + *----------------------------------------------------------------------------*/ +static void +autoplug_close_link(Typefind * typefind, + GstPad * srcpad, + GstElement * sinkelement, + const gchar * padname, + const GList * templlist) +{ + GstPad * pad; + gboolean has_dynamic_pads = FALSE; + + GST_DEBUG("Plugging pad %s:%s to newly created %s:%s", + gst_object_get_name (GST_OBJECT (gst_pad_get_parent (srcpad))), + gst_pad_get_name (srcpad), + gst_object_get_name (GST_OBJECT (sinkelement)), padname); + + /* add the element to the pipeline and set correct state */ + gst_element_set_state(sinkelement, GST_STATE_PAUSED); + gst_bin_add(GST_BIN(typefind->bin), sinkelement); + pad = gst_element_get_pad(sinkelement, padname); + gst_pad_link(srcpad, pad); + gst_bin_sync_children_state(GST_BIN(typefind->bin)); + + /* if we have static source pads, link those. If we have dynamic + * source pads, listen for new-pad signals on the element */ + for ( ; templlist != NULL; templlist = templlist->next) { + GstPadTemplate *templ = GST_PAD_TEMPLATE (templlist->data); + + /* only sourcepads, no request pads */ + if (templ->direction != GST_PAD_SRC || + templ->presence == GST_PAD_REQUEST) { + continue; + } + + switch (templ->presence) { + case GST_PAD_ALWAYS: { + GstPad * pad = gst_element_get_pad(sinkelement, + templ->name_template); + GstCaps * caps = gst_pad_get_caps(pad); + + /* link */ + autoplug_try_to_plug(typefind, pad, caps); + gst_caps_free(caps); + } break; + + case GST_PAD_SOMETIMES: + has_dynamic_pads = TRUE; + break; + + default: + break; + } + } + + /* listen for newly created pads if this element supports that */ + if (has_dynamic_pads) { + g_signal_connect(sinkelement, + "new-pad", + G_CALLBACK(autoplug_newpad), + typefind); + } +} + + +/*------------------------------------------------------------------------------ + * Try to plug a pad with the specified capabilities. + *----------------------------------------------------------------------------*/ +static void +autoplug_try_to_plug(Typefind * typefind, + GstPad * pad, + const GstCaps * caps) +{ + GstObject * parent = GST_OBJECT(gst_pad_get_parent(pad)); + const gchar * mime; + const GList * item; + GstCaps * res; + GstCaps * audiocaps; + + g_return_if_fail(typefind != NULL); + + /* don't plug if we're already plugged */ + if (GST_PAD_IS_LINKED(gst_element_get_pad(typefind->audiosink, "sink"))) { + GST_DEBUG("Omitting link for pad %s:%s because we're already linked", + gst_object_get_name (parent), gst_pad_get_name (pad)); + return; + } + + /* as said above, we only try to plug audio... Omit video */ + mime = gst_structure_get_name(gst_caps_get_structure(caps, 0)); + if (g_strrstr(mime, "video")) { + GST_DEBUG("Omitting link for pad %s:%s because " + "mimetype %s is non-audio\n", + gst_object_get_name (parent), gst_pad_get_name (pad), mime); + return; + } + + /* can it link to the audiopad? */ + audiocaps = gst_pad_get_caps(gst_element_get_pad(typefind->audiosink, + "sink")); + res = gst_caps_intersect(caps, audiocaps); + if (res && !gst_caps_is_empty(res)) { + GST_DEBUG("Found pad to link to audiosink - plugging is now done"); + typefind->done = TRUE; + + autoplug_close_link(typefind, pad, typefind->audiosink, "sink", NULL); + + gst_element_add_ghost_pad(typefind->bin, + gst_element_get_pad(typefind->audiosink, "src"), + "src"); + gst_element_link(typefind->bin, typefind->sink); + gst_bin_add(GST_BIN(typefind->pipeline), typefind->sink); + gst_bin_sync_children_state(GST_BIN(typefind->bin)); + gst_bin_sync_children_state(GST_BIN(typefind->pipeline)); + + gst_caps_free (audiocaps); + gst_caps_free (res); + return; + } + gst_caps_free (audiocaps); + gst_caps_free (res); + + /* try to plug from our list */ + for (item = typefind->factories; item != NULL; item = item->next) { + GstElementFactory * factory = GST_ELEMENT_FACTORY(item->data); + const GList * pads; + + for (pads = gst_element_factory_get_pad_templates(factory); + pads != NULL; + pads = pads->next) { + GstPadTemplate * templ = GST_PAD_TEMPLATE(pads->data); + + if (!GST_IS_PAD_TEMPLATE(templ)) { + continue; + } + /* find the sink template - need an always pad*/ + if (templ->direction != GST_PAD_SINK || + templ->presence != GST_PAD_ALWAYS) { + continue; + } + + /* can it link? */ + res = gst_caps_intersect(caps, templ->caps); + if (res && !gst_caps_is_empty(res)) { + GstElement * element; + const GList * padTemplates; + + /* close link and return */ + gst_caps_free(res); + element = gst_element_factory_create(factory, NULL); + padTemplates = gst_element_factory_get_pad_templates(factory); + autoplug_close_link(typefind, + pad, + element, + templ->name_template, + padTemplates); + return; + } + gst_caps_free (res); + + /* we only check one sink template per factory, so move on to the + * next factory now */ + break; + } + } + + /* if we get here, no item was found */ + GST_DEBUG("No compatible pad found to decode %s on %s:%s", + mime, gst_object_get_name(parent), gst_pad_get_name(pad)); +} + + +/*------------------------------------------------------------------------------ + * Handle the event when a new type was found. + *----------------------------------------------------------------------------*/ +static void +autoplug_typefound_handler(GstElement * typefind, + gint probability, + GstCaps * caps, + gpointer userData) +{ + gchar * str; + Typefind * tf = (Typefind*) userData; + + g_return_if_fail(tf != NULL); + + str = gst_caps_to_string(caps); + GST_DEBUG("Detected media type %s", str); + g_free(str); + + /* actually plug now */ + autoplug_try_to_plug(tf, gst_element_get_pad(typefind, "src"), caps); +} + + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +static void +autoplug_error_handler(GstElement * pipeline, + GstElement * source, + GError * error, + gchar * message, + gpointer userData) +{ + /* TODO: handle error somehow */ + GST_DEBUG("error: %s", message); +} + + +/*------------------------------------------------------------------------------ + * Remove all typefind elements inside the bin, traversing to lower binds + * if necessary. The pads linked to the removed typefind elements are + * linked directly instead. + *----------------------------------------------------------------------------*/ +static void +autoplug_remove_typefind_elements(GstBin * bin) +{ + GstElement * element; + const GList * elements; + + elements = gst_bin_get_list(GST_BIN(bin)); + while (elements) { + GstElementFactory * factory; + GType type; + + element = (GstElement*) elements->data; + factory = gst_element_get_factory(element); + type = gst_element_factory_get_element_type(factory); + + GST_DEBUG("found factory: %s of type %s, is bin: %d", + gst_element_factory_get_longname(factory), + g_type_name(type), + g_type_is_a(type, GST_TYPE_BIN)); + + if (GST_IS_BIN(element)) { + autoplug_remove_typefind_elements(GST_BIN(element)); + } else if (g_strrstr(gst_element_factory_get_longname(factory), + "TypeFind")) { + GstPad * tfSinkPad; + GstPad * tfSrcPad; + GstPad * sinkPad; + GstElement * sinkElement; + GstPad * srcPad; + GstElement * srcElement; + GstElement * parent; + GstPad * parentSrcPad; + GstPad * parentSinkPad; + + tfSinkPad = gst_element_get_pad(element, "sink"); + tfSrcPad = gst_element_get_pad(element, "src"); + sinkPad = gst_pad_get_peer(tfSrcPad); + sinkElement = gst_pad_get_parent(sinkPad); + srcPad = gst_pad_get_peer(tfSinkPad); + srcElement = gst_pad_get_parent(srcPad); + parent = (GstElement*) gst_element_get_parent(element); + parentSrcPad = gst_element_get_pad(parent, "src"); + parentSinkPad = gst_element_get_pad(parent, "sink"); + + gst_element_unlink(srcElement, element); + gst_element_unlink(element, sinkElement); + + if (GST_PAD_REALIZE(parentSrcPad) == (GstRealPad*) tfSrcPad) { + /* if the pad we want to relink is ghosted by the container */ + gst_element_remove_pad(parent, parentSrcPad); + gst_element_add_ghost_pad(parent, srcPad, "src"); + gst_element_link(parent, sinkElement); + } else if (GST_PAD_REALIZE(parentSinkPad) == + (GstRealPad*) tfSinkPad) { + /* if the pad we want to relink is ghosted by the container */ + gst_element_remove_pad(parent, parentSinkPad); + gst_element_add_ghost_pad(parent, sinkPad, "sink"); + gst_element_link(srcElement, parent); + } else { + gst_element_link(srcElement, sinkElement); + } + + gst_bin_remove(bin, element); + + /* start iteration from the beginning, as probably the element + * list is invalidated with us removing the typefind element */ + elements = gst_bin_get_list(GST_BIN(bin)); + continue; + } + + elements = elements->next; + } +} + + +/*------------------------------------------------------------------------------ + * Filter the features that we're interested in. + *----------------------------------------------------------------------------*/ +GstElement * +autoplug_plug_source(GstElement * source) +{ + Typefind typefind; + + typefind.source = source; + autoplug_init(&typefind); + + gst_element_set_state(typefind.audiosink, GST_STATE_PAUSED); + gst_element_set_state(typefind.sink, GST_STATE_PAUSED); + gst_element_set_state(typefind.bin, GST_STATE_PLAYING); + gst_element_set_state(typefind.pipeline, GST_STATE_PLAYING); + + /* run */ + while (!typefind.done && gst_bin_iterate(GST_BIN(typefind.pipeline))); + + /* remove the sink element */ + gst_element_unlink(typefind.bin, typefind.sink); + gst_bin_remove(GST_BIN(typefind.pipeline), typefind.sink); + + /* remove the typefind elements, and re-link with the source */ + g_signal_handler_disconnect(typefind.typefind, typefind.typefindSignal); + autoplug_remove_typefind_elements(GST_BIN(typefind.bin)); + gst_element_link(typefind.source, typefind.bin); + + /* destory the pipeline, but keep source and bin */ + g_object_ref(typefind.source); + g_object_ref(typefind.bin); + gst_bin_remove(GST_BIN(typefind.pipeline), typefind.bin); + gst_object_unref(GST_OBJECT(typefind.pipeline)); + + gst_element_set_state(typefind.bin, GST_STATE_PAUSED); + gst_bin_sync_children_state(GST_BIN(typefind.bin)); + + return typefind.bin; +} + diff --git a/livesupport/modules/gstreamerElements/src/autoplug.h b/livesupport/modules/gstreamerElements/src/autoplug.h new file mode 100644 index 000000000..e5ff2c434 --- /dev/null +++ b/livesupport/modules/gstreamerElements/src/autoplug.h @@ -0,0 +1,80 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the LiveSupport project. + http://livesupport.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + LiveSupport is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + LiveSupport 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LiveSupport; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: maroy $ + Version : $Revision: 1.1 $ + Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/gstreamerElements/src/Attic/autoplug.h,v $ + +------------------------------------------------------------------------------*/ +#ifndef Audioplug_h +#define Audioplug_h + +/** + * @file + * Functions for autoplugging gstreamer elements based on their MIME types. + * + * @author $Author: maroy $ + * @version $Revision: 1.1 $ + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ============================================================ include files */ + +#include + + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + + +/* ====================================================== function prototypes */ + +/** + * Autoplug a source element, that contains some form of audio. + * The result will be a gstreamer element, that is linked with + * source, and produces raw audio on its src pad as it output. + * + * @param source the source to autoplug. + * @return a gstreamer element already linked to source, that produces + * the audio provided by source in audio/x-raw-int or + * audio/x-raw-float format, as needed. + */ +GstElement * +autoplug_plug_source(GstElement * source); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* Audioplug_h */ + diff --git a/livesupport/modules/gstreamerElements/var/5seccounter.ogg b/livesupport/modules/gstreamerElements/var/5seccounter.ogg new file mode 100644 index 0000000000000000000000000000000000000000..30e5ddb370e9f531678a3a4702346fe7fcd8ac42 GIT binary patch literal 62665 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 JX{8a-{2xsfgAf1! literal 0 HcmV?d00001