From: <th...@ke...> - 2006-06-23 16:46:04
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Fri Jun 23 2006 16:46:02 UTC Log message: * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), (gst_decode_bin_init), (gst_decode_bin_finalize), (add_fakesink), (remove_fakesink), (pad_probe), (gst_decode_bin_change_state): Protect remove_fakesink using a mutex, so that we don't try and remove the fakesink simultaneously from multiple threads. When going from READY to PAUSED, restore the fakesink, so that it is there when decodebin gets reused. Modified files: . : ChangeLog gst/playback : gstdecodebin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2738&r2=1.2739 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c.diff?r1=1.74&r2=1.75 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2738 retrieving revision 1.2739 diff -u -d -r1.2738 -r1.2739 --- ChangeLog 23 Jun 2006 09:53:08 -0000 1.2738 +++ ChangeLog 23 Jun 2006 16:45:50 -0000 1.2739 @@ -1,3 +1,14 @@ +2006-06-23 Jan Schmidt <th...@ma...> + + * gst/playback/gstdecodebin.c: (gst_decode_bin_class_init), + (gst_decode_bin_init), (gst_decode_bin_finalize), (add_fakesink), + (remove_fakesink), (pad_probe), (gst_decode_bin_change_state): + Protect remove_fakesink using a mutex, so that we don't try and + remove the fakesink simultaneously from multiple threads. + When going from READY to PAUSED, restore the fakesink, so that + it is there when decodebin gets reused. 2006-06-23 Tim-Philipp Müller <tim at centricular dot net> * gst-libs/gst/rtp/gstbasertpaudiopayload.c: Index: gstdecodebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- gstdecodebin.c 25 May 2006 16:50:17 -0000 1.74 +++ gstdecodebin.c 23 Jun 2006 16:45:50 -0000 1.75 @@ -73,6 +73,8 @@ gboolean shutting_down; /* stop pluggin if we're shutting down */ GType queue_type; /* store the GType of queues, to aid in recognising them */ + GMutex *cb_mutex; /* Mutex for multi-threaded callbacks, such as removing the fakesink */ }; struct _GstDecodeBinClass @@ -120,10 +122,14 @@ static void gst_decode_bin_class_init (GstDecodeBinClass * klass); static void gst_decode_bin_init (GstDecodeBin * decode_bin); static void gst_decode_bin_dispose (GObject * object); +static void gst_decode_bin_finalize (GObject * object); static GstStateChangeReturn gst_decode_bin_change_state (GstElement * element, GstStateChange transition); +static void add_fakesink (GstDecodeBin * decode_bin); +static void remove_fakesink (GstDecodeBin * decode_bin); static void free_dynamics (GstDecodeBin * decode_bin); static void type_found (GstElement * typefind, guint probability, GstCaps * caps, GstDecodeBin * decode_bin); @@ -208,6 +214,7 @@ GST_TYPE_PAD, GST_TYPE_CAPS); gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_decode_bin_dispose); + gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_decode_bin_finalize); gst_element_class_add_pad_template (gstelement_klass, gst_static_pad_template_get (&decoder_bin_sink_template)); @@ -293,6 +300,8 @@ { GList *factories; + decode_bin->cb_mutex = g_mutex_new (); /* first filter out the interesting element factories */ factories = gst_default_registry_feature_filter ( (GstPluginFeatureFilter) gst_decode_bin_factory_filter, @@ -332,17 +341,7 @@ g_signal_connect (G_OBJECT (decode_bin->typefind), "have_type", G_CALLBACK (type_found), decode_bin); } - decode_bin->fakesink = gst_element_factory_make ("fakesink", "fakesink"); - if (!decode_bin->fakesink) { - g_warning ("can't find fakesink element, decodebin will not work"); - } else { - GST_OBJECT_FLAG_UNSET (decode_bin->fakesink, GST_ELEMENT_IS_SINK); - if (!gst_bin_add (GST_BIN (decode_bin), decode_bin->fakesink)) { - g_warning ("Could not add fakesink element, decodebin will not work"); - gst_object_unref (decode_bin->fakesink); - decode_bin->fakesink = NULL; - } - } + add_fakesink (decode_bin); decode_bin->dynamics = NULL; decode_bin->queues = NULL; @@ -370,6 +369,16 @@ free_dynamics (decode_bin); } +static void +gst_decode_bin_finalize (GObject * object) +{ + GstDecodeBin *decode_bin = GST_DECODE_BIN (object); + g_mutex_free (decode_bin->cb_mutex); + G_OBJECT_CLASS (parent_class)->finalize (object); +} static GstDynamic * dynamic_create (GstElement * element, GstDecodeBin * decode_bin) @@ -492,8 +501,36 @@ static void +add_fakesink (GstDecodeBin * decode_bin) + if (decode_bin->fakesink != NULL) + return; + g_mutex_lock (decode_bin->cb_mutex); + decode_bin->fakesink = gst_element_factory_make ("fakesink", "fakesink"); + if (!decode_bin->fakesink) { + g_warning ("can't find fakesink element, decodebin will not work"); + } else { + GST_OBJECT_FLAG_UNSET (decode_bin->fakesink, GST_ELEMENT_IS_SINK); + if (!gst_bin_add (GST_BIN (decode_bin), decode_bin->fakesink)) { + g_warning ("Could not add fakesink element, decodebin will not work"); + gst_object_unref (decode_bin->fakesink); + decode_bin->fakesink = NULL; + } + } + g_mutex_unlock (decode_bin->cb_mutex); remove_fakesink (GstDecodeBin * decode_bin) + gboolean removed_fakesink = FALSE; + if (decode_bin->fakesink == NULL) if (decode_bin->fakesink) { GST_DEBUG_OBJECT (decode_bin, "Removing fakesink and marking state dirty"); gst_object_ref (decode_bin->fakesink); @@ -506,6 +543,11 @@ gst_object_unref (decode_bin->fakesink); decode_bin->fakesink = NULL; + removed_fakesink = TRUE; + if (removed_fakesink) { free_pad_probes (decode_bin); gst_element_post_message (GST_ELEMENT_CAST (decode_bin), @@ -1462,6 +1504,9 @@ GST_OBJECT_LOCK (decode_bin); decode_bin->shutting_down = FALSE; GST_OBJECT_UNLOCK (decode_bin); + add_fakesink (decode_bin); + break; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: case GST_STATE_CHANGE_PLAYING_TO_PAUSED: |
From: <th...@ke...> - 2006-10-17 11:34:44
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Tue Oct 17 2006 11:34:44 UTC Log message: * gst/playback/gstdecodebin.c: (get_our_ghost_pad), (remove_element_chain): Don't return a pad from get_our_ghost_pad unless it is actually the one we want. Change a cast in remove_element_chain slightly. Modified files: . : ChangeLog gst/playback : gstdecodebin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2967&r2=1.2968 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c.diff?r1=1.84&r2=1.85 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2967 retrieving revision 1.2968 diff -u -d -r1.2967 -r1.2968 --- ChangeLog 13 Oct 2006 15:20:29 -0000 1.2967 +++ ChangeLog 17 Oct 2006 11:34:31 -0000 1.2968 @@ -1,3 +1,11 @@ +2006-10-17 Jan Schmidt <th...@ma...> + + * gst/playback/gstdecodebin.c: (get_our_ghost_pad), + (remove_element_chain): + Don't return a pad from get_our_ghost_pad unless it is actually the + one we want. + Change a cast in remove_element_chain slightly. 2006-10-13 Julien MOUTTE <ju...@mo...> * tests/examples/seek/seek.c: (do_seek), (start_seek), Index: gstdecodebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- gstdecodebin.c 10 Oct 2006 12:49:02 -0000 1.84 +++ gstdecodebin.c 17 Oct 2006 11:34:32 -0000 1.85 @@ -974,6 +974,7 @@ /* our ghostpads are the sourcepads */ pad_it = gst_element_iterate_src_pads (GST_ELEMENT (decode_bin)); while (!done) { + db_pad = NULL; switch (gst_iterator_next (pad_it, (gpointer) & db_pad)) { case GST_ITERATOR_OK: GST_DEBUG_OBJECT (decode_bin, "looking at pad %s:%s", @@ -1072,10 +1073,10 @@ GstObject *parent = gst_pad_get_parent (peer); if (parent) { - GstElement *grandparent = GST_ELEMENT (gst_object_get_parent (parent)); + GstObject *grandparent = gst_object_get_parent (parent); - if (grandparent) { - if (grandparent != GST_ELEMENT (decode_bin)) { + if (grandparent != NULL) { + if (GST_ELEMENT (grandparent) != GST_ELEMENT (decode_bin)) { GST_DEBUG_OBJECT (decode_bin, "dead end pad %s:%s parent %s", GST_DEBUG_PAD_NAME (peer), GST_OBJECT_NAME (grandparent)); } else { |
From: <th...@ke...> - 2006-12-05 12:44:18
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Tue Dec 05 2006 12:44:12 UTC Log message: * gst/playback/gstdecodebin.c: (find_dynamic), (dynamic_add), (close_pad_link), (elem_is_dynamic), (unlinked), (close_link): Handle the case where an element has multiple pads with unfixed caps as well as still possibly producing more dynamic pads by storing each case as a distinct entry in the dynamic list. Fixes #38223 again. Modified files: . : ChangeLog gst/playback : gstdecodebin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3040&r2=1.3041 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c.diff?r1=1.86&r2=1.87 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3040 retrieving revision 1.3041 diff -u -d -r1.3040 -r1.3041 --- ChangeLog 4 Dec 2006 13:02:37 -0000 1.3040 +++ ChangeLog 5 Dec 2006 12:43:59 -0000 1.3041 @@ -1,3 +1,12 @@ +2006-12-05 Jan Schmidt <th...@ma...> + + * gst/playback/gstdecodebin.c: (find_dynamic), (dynamic_add), + (close_pad_link), (elem_is_dynamic), (unlinked), (close_link): + Handle the case where an element has multiple pads with + unfixed caps as well as still possibly producing more dynamic + pads by storing each case as a distinct entry in the dynamic list. + Fixes #38223 again. 2006-12-04 Wim Taymans <wi...@fl...> * gst/playback/gstdecodebin.c: (close_pad_link): Index: gstdecodebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- gstdecodebin.c 4 Dec 2006 13:02:37 -0000 1.86 +++ gstdecodebin.c 5 Dec 2006 12:44:00 -0000 1.87 @@ -384,27 +384,59 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } -static GstDynamic * -dynamic_create (GstElement * element, GstPad * pad, GstDecodeBin * decode_bin) +struct DynFind +{ + GstElement *elem; + GstPad *pad; +}; +static gint +find_dynamic (GstDynamic * dyn, struct DynFind *info) + if (dyn->element == info->elem && dyn->pad == info->pad) + return 0; + return 1; +} +/* Add either an element (for dynamic pads/pad-added watching) or a + * pad (for delayed caps/notify::caps watching) to the dynamic list, + * taking care to ignore repeat entries so we don't end up handling a + * pad twice, for example */ +static void +dynamic_add (GstElement * element, GstPad * pad, GstDecodeBin * decode_bin) { GstDynamic *dyn; + struct DynFind find_info; + GList *found; - GST_DEBUG_OBJECT (element, "dynamic create"); + g_return_if_fail (element != NULL || pad != NULL); - /* take refs */ + /* do a search that this entry doesn't already exist */ + find_info.elem = element; + find_info.pad = pad; + found = g_list_find_custom (decode_bin->dynamics, &find_info, + (GCompareFunc) find_dynamic); + if (found != NULL) + goto exit; + /* take refs */ dyn = g_new0 (GstDynamic, 1); dyn->element = element; dyn->pad = pad; dyn->decode_bin = gst_object_ref (decode_bin); if (element) { + GST_DEBUG_OBJECT (decode_bin, "dynamic create for element %" + GST_PTR_FORMAT, element); gst_object_ref (element); dyn->np_sig_id = g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (new_pad), dyn); dyn->nmp_sig_id = g_signal_connect (G_OBJECT (element), "no-more-pads", G_CALLBACK (no_more_pads), dyn); - } - if (pad) { + } else { + GST_DEBUG_OBJECT (decode_bin, "dynamic create for pad %" GST_PTR_FORMAT, + pad); gst_object_ref (pad); dyn->caps_sig_id = g_signal_connect (G_OBJECT (pad), "notify::caps", G_CALLBACK (new_caps), dyn); @@ -413,7 +445,15 @@ /* and add this element to the dynamic elements */ decode_bin->dynamics = g_list_prepend (decode_bin->dynamics, dyn); - return dyn; + return; +exit: + if (element) { + GST_DEBUG_OBJECT (decode_bin, "Dynamic element already added: %" + GST_DEBUG_OBJECT (decode_bin, "Dynamic pad already added: %" + GST_PTR_FORMAT, pad); + } static void @@ -754,7 +794,7 @@ setup_caps_delay: { GST_LOG_OBJECT (pad, "setting up a delayed link"); - dynamic_create (element, pad, decode_bin); + dynamic_add (NULL, pad, decode_bin); return; } @@ -1296,23 +1336,61 @@ return ret; -static gint -find_dynamic (GstDynamic * dyn, GstElement * elem) +static gboolean +elem_is_dynamic (GstElement * element, GstDecodeBin * decode_bin) - return (dyn->element == elem ? 0 : 1); + GList *pads; + /* loop over all the padtemplates */ + for (pads = GST_ELEMENT_GET_CLASS (element)->padtemplates; pads; + pads = g_list_next (pads)) { + GstPadTemplate *templ = GST_PAD_TEMPLATE (pads->data); + const gchar *templ_name; + /* we are only interested in source pads */ + if (GST_PAD_TEMPLATE_DIRECTION (templ) != GST_PAD_SRC) + continue; + templ_name = GST_PAD_TEMPLATE_NAME_TEMPLATE (templ); + GST_DEBUG_OBJECT (decode_bin, "got a source pad template %s", templ_name); + /* figure out what kind of pad this is */ + switch (GST_PAD_TEMPLATE_PRESENCE (templ)) { + case GST_PAD_SOMETIMES: + { + /* try to get the pad to see if it is already created or + * not */ + GstPad *pad = gst_element_get_pad (element, templ_name); + if (pad) { + GST_DEBUG_OBJECT (decode_bin, "got the pad for sometimes template %s", + templ_name); + gst_object_unref (pad); + } else { + GST_DEBUG_OBJECT (decode_bin, + "did not get the sometimes pad of template %s", templ_name); + /* we have an element that will create dynamic pads */ + return TRUE; + } + break; + } + default: + /* Don't care about ALWAYS or REQUEST pads */ + } + return FALSE; /* This function will be called when a pad is disconnected for some reason */ unlinked (GstPad * pad, GstPad * peerpad, GstDecodeBin * decode_bin) - GstDynamic *dyn; GstElement *element, *peer; /* inactivate pad */ gst_pad_set_active (pad, GST_ACTIVATE_NONE); - element = gst_pad_get_parent_element (pad); peer = gst_pad_get_parent_element (peerpad); if (!is_our_kid (peer, decode_bin)) @@ -1324,15 +1402,16 @@ /* remove all elements linked to the peerpad */ remove_element_chain (decode_bin, peerpad); - /* if an element removes two pads, then we don't want this twice */ - if (g_list_find_custom (decode_bin->dynamics, element, - (GCompareFunc) find_dynamic) != NULL) - goto exit; + /* Re-add as a dynamic element if needed, via close_link */ + element = gst_pad_get_parent_element (pad); + if (elem_is_dynamic (element, decode_bin)) + dynamic_add (element, NULL, decode_bin); - dyn = dynamic_create (element, NULL, decode_bin); + gst_object_unref (element); exit: - gst_object_unref (element); gst_object_unref (peer); @@ -1410,13 +1489,11 @@ } if (dynamic) { - GstDynamic *dyn; - GST_DEBUG_OBJECT (decode_bin, "got a dynamic element here"); /* ok, this element has dynamic pads, set up the signal handlers to be * notified of them */ - dyn = dynamic_create (element, NULL, decode_bin); + dynamic_add (element, NULL, decode_bin); /* Check if this is an element with more than 1 pad. If this element |
From: <th...@ke...> - 2007-01-31 15:59:17
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Wed Jan 31 2007 15:59:05 UTC Log message: * gst/playback/gstplaybin.c: (gen_vis_element): Add audioresample+audioconvert in front of the visualisation element, so that elements like libvisual 0.4 that don't support all samplerates can work. Fixes: #402505 Modified files: . : ChangeLog gst/playback : gstplaybin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3121&r2=1.3122 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c.diff?r1=1.103&r2=1.104 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3121 retrieving revision 1.3122 diff -u -d -r1.3121 -r1.3122 --- ChangeLog 30 Jan 2007 19:19:37 -0000 1.3121 +++ ChangeLog 31 Jan 2007 15:58:52 -0000 1.3122 @@ -1,3 +1,12 @@ +2007-01-31 Jan Schmidt <th...@ma...> + + * gst/playback/gstplaybin.c: (gen_vis_element): + Add audioresample+audioconvert in front of the visualisation + element, so that elements like libvisual 0.4 that don't support all + samplerates can work. + Fixes: #402505 2007-01-30 Tim-Philipp Müller <tim at centricular dot net> * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_property), Index: gstplaybin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- gstplaybin.c 25 Jan 2007 12:24:18 -0000 1.103 +++ gstplaybin.c 31 Jan 2007 15:58:53 -0000 1.104 @@ -1129,21 +1129,21 @@ * normal video bin. The video bin is run in a thread to make sure it does * not block the audio playback pipeline. * - * +--------------------------------------------------------------------+ - * | visbin | - * | +------+ +--------+ +----------------+ | - * | | tee | | aqueue | | abin ... | | - * | +-sink src-sink src-sink | | - * | | | | +--------+ +----------------+ | - * | | | | | - * | | | | +------+ +---------+ +------+ +-----------+ | - * | | | | |vqueue| |audioconv| | vis | | vbin ... | | - * | | | src-sink src-sink src-sink src-sink | | - * | | +------+ | - * sink-+ | - +---------------------------------------------------------------------+ + * +-----------------------------------------------------------------------+ + * | visbin | + * | +------+ +--------+ +----------------+ | + * | | tee | | aqueue | | abin ... | | + * | +-sink src-sink src-sink | | + * | | | | +--------+ +----------------+ | + * | | | | | + * | | | | +------+ +------------+ +------+ +-----------+ | + * | | | | |vqueue| | audioconv | | vis | | vbin ... | | + * | | | src-sink src-sink + samp src-sink src-sink | | + * | | +------+ | + * sink-+ | + +------------------------------------------------------------------------+ */ static GstElement * gen_vis_element (GstPlayBin * play_bin) @@ -1154,6 +1154,8 @@ GstElement *asink; GstElement *vsink; GstElement *conv; + GstElement *resamp; + GstElement *conv2; GstElement *vis; GstElement *vqueue, *aqueue; GstPad *pad, *rpad; @@ -1185,6 +1187,16 @@ goto no_audioconvert; gst_bin_add (GST_BIN_CAST (element), conv); + resamp = gst_element_factory_make ("audioresample", "aresamp"); + if (resamp == NULL) + goto no_audioresample; + gst_bin_add (GST_BIN_CAST (element), resamp); + conv2 = gst_element_factory_make ("audioconvert", "aconv2"); + if (conv2 == NULL) + goto no_audioconvert; + gst_bin_add (GST_BIN_CAST (element), conv2); if (play_bin->visualisation) { gst_object_ref (play_bin->visualisation); vis = play_bin->visualisation; @@ -1196,7 +1208,9 @@ gst_bin_add (GST_BIN_CAST (element), vis); res = gst_element_link_pads (vqueue, "src", conv, "sink"); - res &= gst_element_link_pads (conv, "src", vis, "sink"); + res &= gst_element_link_pads (conv, "src", resamp, "sink"); + res &= gst_element_link_pads (resamp, "src", conv2, "sink"); + res &= gst_element_link_pads (conv2, "src", vis, "sink"); res &= gst_element_link_pads (vis, "src", vsink, "sink"); if (!res) goto link_failed; @@ -1230,6 +1244,15 @@ gst_object_unref (element); return NULL; } +no_audioresample: + { + post_missing_element_message (play_bin, "audioresample"); + GST_ELEMENT_ERROR (play_bin, CORE, MISSING_PLUGIN, + (_("Missing element '%s' - check your GStreamer installation."), + "audioresample"), (NULL)); + gst_object_unref (element); + return NULL; + } no_goom: { post_missing_element_message (play_bin, "goom"); |
From: <th...@ke...> - 2007-03-22 17:44:15
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Thu Mar 22 2007 17:44:04 UTC Log message: * gst/playback/gstplaybin.c: (gst_play_bin_class_init): Remove playbin's override of the set_clock vmethod. It's irrelevant after Wim's commit on the 19th. Modified files: . : ChangeLog gst/playback : gstplaybin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3230&r2=1.3231 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c.diff?r1=1.109&r2=1.110 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3230 retrieving revision 1.3231 diff -u -d -r1.3230 -r1.3231 --- ChangeLog 22 Mar 2007 09:26:01 -0000 1.3230 +++ ChangeLog 22 Mar 2007 17:43:52 -0000 1.3231 @@ -1,3 +1,9 @@ +2007-03-22 Jan Schmidt <th...@ma...> + + * gst/playback/gstplaybin.c: (gst_play_bin_class_init): + Remove playbin's override of the set_clock vmethod. It's irrelevant + after Wim's commit on the 19th. 2007-03-22 Wim Taymans <wi...@fl...> * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_get_size), Index: gstplaybin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c,v retrieving revision 1.109 retrieving revision 1.110 diff -u -d -r1.109 -r1.110 --- gstplaybin.c 21 Mar 2007 11:03:23 -0000 1.109 +++ gstplaybin.c 22 Mar 2007 17:43:52 -0000 1.110 @@ -337,8 +337,6 @@ static gboolean gst_play_bin_send_event (GstElement * element, GstEvent * event); -static gboolean gst_play_bin_set_clock_func (GstElement * element, - GstClock * clock); static GstStateChangeReturn gst_play_bin_change_state (GstElement * element, GstStateChange transition); @@ -441,7 +439,6 @@ gstelement_klass->change_state = GST_DEBUG_FUNCPTR (gst_play_bin_change_state); gstelement_klass->send_event = GST_DEBUG_FUNCPTR (gst_play_bin_send_event); - gstelement_klass->set_clock = GST_DEBUG_FUNCPTR (gst_play_bin_set_clock_func); gstbin_klass->handle_message = GST_DEBUG_FUNCPTR (gst_play_bin_handle_message); @@ -1692,42 +1689,6 @@ return res; } -/* Override the set_clock function, we don't want to set a clock on the sinks - * when we are live pipeline so that they don't synchronize until this is - * fixed in core. */ -static gboolean -gst_play_bin_set_clock_func (GstElement * element, GstClock * clock) -{ - GList *children; - GstBin *bin; - GstPlayBin *play_bin; - gboolean res = TRUE; - GstElement *asink, *vsink; - - bin = GST_BIN (element); - play_bin = GST_PLAY_BIN (element); - asink = g_hash_table_lookup (play_bin->cache, "audio_sink"); - vsink = g_hash_table_lookup (play_bin->cache, "video_sink"); - GST_DEBUG_OBJECT (play_bin, "setting clock, is_live %d", play_bin->is_live); - GST_OBJECT_LOCK (bin); - if (element->clock != clock) { - for (children = bin->children; children; children = g_list_next (children)) { - GstElement *child = GST_ELEMENT (children->data); - if (play_bin->is_live && (child == asink || child == vsink)) - res &= gst_element_set_clock (child, NULL); - else - res &= gst_element_set_clock (child, clock); - } - } - GST_OBJECT_UNLOCK (bin); - return res; -} static void value_list_append_structure_list (GValue * list_val, GstStructure ** first, GList * structure_list) |
From: <th...@ke...> - 2007-06-20 11:09:50
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Wed Jun 20 2007 11:09:17 UTC Log message: * gst/playback/gstdecodebin2.c: (analyze_new_pad): When handling a delayed-caps notification case, mark the group as dynamic so that the nbdynamic count is incremented and decremented correctly. Fixes: #449156 Patch by: Wim Taymans <wi...@fl...> Modified files: . : ChangeLog gst/playback : gstdecodebin2.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3373&r2=1.3374 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin2.c.diff?r1=1.18&r2=1.19 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3373 retrieving revision 1.3374 diff -u -d -r1.3373 -r1.3374 --- ChangeLog 19 Jun 2007 19:13:03 -0000 1.3373 +++ ChangeLog 20 Jun 2007 11:09:03 -0000 1.3374 @@ -1,3 +1,11 @@ +2007-06-20 Jan Schmidt <th...@ma...> + + * gst/playback/gstdecodebin2.c: (analyze_new_pad): + When handling a delayed-caps notification case, mark + the group as dynamic so that the nbdynamic count is + incremented and decremented correctly. Fixes: #449156 + Patch by: Wim Taymans <wi...@fl...> 2007-06-19 Andy Wingo <wi...@po...> * gst-libs/gst/audio/gstbaseaudiosink.c Index: gstdecodebin2.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin2.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstdecodebin2.c 5 Jun 2007 16:05:19 -0000 1.18 +++ gstdecodebin2.c 20 Jun 2007 11:09:03 -0000 1.19 @@ -838,10 +838,14 @@ setup_caps_delay: { /* connect to caps notification */ - if (group) + if (group) { + GROUP_MUTEX_LOCK (group); + group->nbdynamic++; + GST_LOG ("Group %p has now %d dynamic elements", group, group->nbdynamic); + GROUP_MUTEX_UNLOCK (group); g_signal_connect (G_OBJECT (pad), "notify::caps", G_CALLBACK (caps_notify_group_cb), group); - else + } else G_CALLBACK (caps_notify_cb), dbin); return; |
From: <th...@ke...> - 2007-08-09 12:09:38
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Thu Aug 09 2007 12:06:57 UTC Log message: * gst/playback/gstplaybasebin.c: (group_commit), (queue_remove_probe), (queue_threshold_reached): Patch by: Josep Torra Valles <jo...@fl...> Fixes: #465015 Make sure we remove the check_queues buffer probe from the correct queue to avoid racily going back to "buffering 99%" when buffering is actually complete. Also, fix the spelling of Josep's surname in the ChangeLog. Modified files: . : ChangeLog gst/playback : gstplaybasebin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3446&r2=1.3447 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.c.diff?r1=1.149&r2=1.150 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3446 retrieving revision 1.3447 diff -u -d -r1.3446 -r1.3447 --- ChangeLog 9 Aug 2007 11:37:27 -0000 1.3446 +++ ChangeLog 9 Aug 2007 12:06:43 -0000 1.3447 @@ -1,3 +1,16 @@ +2007-08-09 Jan Schmidt <th...@ma...> + + * gst/playback/gstplaybasebin.c: (group_commit), + (queue_remove_probe), (queue_threshold_reached): + Patch by: Josep Torra Valles <jo...@fl...> + Fixes: #465015 + Make sure we remove the check_queues buffer probe from the + correct queue to avoid racily going back to "buffering 99%" when + buffering is actually complete. + Also, fix the spelling of Josep's surname in the ChangeLog. 2007-08-09 Stefan Kost <en...@us...> * ext/ogg/gstoggmux.c: @@ -25,7 +38,7 @@ 2007-08-08 Wim Taymans <wim...@gm...> - Patch by: Josep Torre Valles <jo...@fl...> * docs/plugins/gst-plugins-base-plugins.args: * gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init), @@ -45,7 +58,7 @@ 2007-08-07 Wim Taymans <wim...@gm...> * gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init), (gst_play_base_bin_init), (queue_threshold_reached), @@ -4724,7 +4737,7 @@ 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org> * ext/gnomevfs/gstgnomevfssink.c: * ext/gnomevfs/gstgnomevfssrc.c: Index: gstplaybasebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.c,v retrieving revision 1.149 retrieving revision 1.150 diff -u -d -r1.149 -r1.150 --- gstplaybasebin.c 7 Aug 2007 14:14:54 -0000 1.149 +++ gstplaybasebin.c 9 Aug 2007 12:06:43 -0000 1.150 @@ -82,6 +82,9 @@ * play_base_bin); static void preroll_remove_overrun (GstElement * element, GstPlayBaseBin * play_base_bin); +static void queue_remove_probe (GstElement * queue, GstPlayBaseBin + * play_base_bin); static GstElement *make_decoder (GstPlayBaseBin * play_base_bin); static gboolean has_all_raw_caps (GstPad * pad, gboolean * all_raw); @@ -452,6 +455,8 @@ continue; preroll_remove_overrun (element, play_base_bin); + /* if overrun is removed, probe alse has to be removed */ + queue_remove_probe (element, play_base_bin); } } else { /* this is a special subtitle bin, we don't commit the group but @@ -611,14 +616,39 @@ } } +static void +queue_remove_probe (GstElement * queue, GstPlayBaseBin * play_base_bin) +{ + gpointer data; + GstPad *sinkpad; + data = g_object_get_data (G_OBJECT (queue), "probe"); + sinkpad = gst_element_get_pad (queue, "sink"); + if (data) { + GST_DEBUG_OBJECT (play_base_bin, + "Removing buffer probe from pad %s:%s (%p)", + GST_DEBUG_PAD_NAME (sinkpad), sinkpad); + g_object_set_data (G_OBJECT (queue), "probe", NULL); + gst_pad_remove_buffer_probe (sinkpad, GPOINTER_TO_INT (data)); + } else { + "No buffer probe to remove from %s:%s (%p)", + } + gst_object_unref (sinkpad); +} /* Used for time-based buffering in streaming mode and is called when a queue * emits the running signal. This means that the high watermark threshold is * reached and the buffering is completed. */ static void queue_threshold_reached (GstElement * queue, GstPlayBaseBin * play_base_bin) { + GstPlayBaseGroup *group; gpointer data; - GstPad *sinkpad; + gint n; GST_DEBUG_OBJECT (play_base_bin, "running signal received from queue %s", GST_ELEMENT_NAME (queue)); @@ -641,24 +671,17 @@ play_base_bin->queue_min_threshold, NULL); - sinkpad = gst_element_get_pad (queue, "sink"); - /* we remove the probe now because we don't need it anymore to give progress * about the buffering. */ - data = g_object_get_data (G_OBJECT (queue), "probe"); - if (data) { - GST_DEBUG_OBJECT (play_base_bin, - "Removing buffer probe from pad %s:%s (%p)", - GST_DEBUG_PAD_NAME (sinkpad), sinkpad); + group = get_active_group (play_base_bin); + for (n = 0; n < NUM_TYPES; n++) { + GstElement *element = group->type[n].preroll; - g_object_set_data (G_OBJECT (queue), "probe", NULL); - gst_pad_remove_buffer_probe (sinkpad, GPOINTER_TO_INT (data)); - } else { - "No buffer probe to remove from %s:%s (%p)", + if (!element) + continue; + queue_remove_probe (element, play_base_bin); - gst_object_unref (sinkpad); /* we post a 100% buffering message to notify the app that buffering is * completed and playback can start/continue */ |
From: <th...@ke...> - 2007-08-27 12:00:09
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Mon Aug 27 2007 12:00:11 UTC Log message: * gst/playback/gstdecodebin.c: (close_pad_link): We need to set up delayed-linking whenever the caps are non-fixed, not just when there are multiple types - use gst_pad_is_fixed() to test. Modified files: . : ChangeLog gst/playback : gstdecodebin.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.3472&r2=1.3473 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c.diff?r1=1.98&r2=1.99 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.3472 retrieving revision 1.3473 diff -u -d -r1.3472 -r1.3473 --- ChangeLog 26 Aug 2007 14:14:33 -0000 1.3472 +++ ChangeLog 27 Aug 2007 11:59:55 -0000 1.3473 @@ -1,3 +1,10 @@ +2007-08-27 Jan Schmidt <th...@ma...> + + * gst/playback/gstdecodebin.c: (close_pad_link): + We need to set up delayed-linking whenever the caps are non-fixed, + not just when there are multiple types - use gst_pad_is_fixed() + to test. 2007-08-26 Tim-Philipp Müller <tim at centricular dot net> * gst-libs/gst/pbutils/missing-plugins.c: Index: gstdecodebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstdecodebin.c,v retrieving revision 1.98 retrieving revision 1.99 diff -u -d -r1.98 -r1.99 --- gstdecodebin.c 23 Jun 2007 14:44:07 -0000 1.98 +++ gstdecodebin.c 27 Aug 2007 11:59:56 -0000 1.99 @@ -749,7 +749,7 @@ GList *to_try; /* if the caps has many types, we need to delay */ - if (gst_caps_get_size (caps) != 1) + if (!gst_caps_is_fixed (caps)) goto many_types; /* continue plugging, first find all compatible elements */ |
From: <th...@ke...> - 2008-07-14 08:19:02
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: thaytan Date: Mon Jul 14 2008 08:19:12 UTC Log message: * gst/playback/gstplaybasebin.c: * gst/playback/gstplaybasebin.h: * gst/playback/gstplaybin.c: * gst/playback/gststreamselector.c: First stab at integrating DVD subpicture overlay into playbin. Successfully plugs and plays, but the queues need shrinking - 3 seconds of video is too much buffering. Modified files: . : ChangeLog gst/playback : gstplaybasebin.c gstplaybasebin.h gstplaybin.c gststreamselector.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.4049&r2=1.4050 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.c.diff?r1=1.162&r2=1.163 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.h.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c.diff?r1=1.125&r2=1.126 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst/playback/gststreamselector.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.4049 retrieving revision 1.4050 diff -u -d -r1.4049 -r1.4050 --- ChangeLog 11 Jul 2008 18:06:32 -0000 1.4049 +++ ChangeLog 14 Jul 2008 08:18:56 -0000 1.4050 @@ -1,3 +1,13 @@ +2008-07-14 Jan Schmidt <th...@no...> + + * gst/playback/gstplaybasebin.c: + * gst/playback/gstplaybasebin.h: + * gst/playback/gstplaybin.c: + * gst/playback/gststreamselector.c: + First stab at integrating DVD subpicture overlay into + playbin. Successfully plugs and plays, but the queues need + shrinking - 3 seconds of video is too much buffering. 2008-07-11 Stefan Kost <en...@us...> * gst/audioconvert/gstaudioconvert.c: Index: gstplaybasebin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.c,v retrieving revision 1.162 retrieving revision 1.163 diff -u -d -r1.162 -r1.163 --- gstplaybasebin.c 4 Jun 2008 17:42:38 -0000 1.162 +++ gstplaybasebin.c 14 Jul 2008 08:18:57 -0000 1.163 @@ -791,6 +791,8 @@ prename = "text"; else if (type == GST_STREAM_TYPE_AUDIO) prename = "audio"; + else if (type == GST_STREAM_TYPE_SUBPICTURE) + prename = "subpicture"; else g_return_if_reached (); @@ -1337,6 +1339,9 @@ if (g_str_has_prefix (mimetype, "audio/") && parent != GST_OBJECT_CAST (play_base_bin->subtitle)) { type = GST_STREAM_TYPE_AUDIO; + } else if (g_str_has_prefix (mimetype, "video/x-dvd-subpicture") && + parent != GST_OBJECT_CAST (play_base_bin->subtitle)) { + type = GST_STREAM_TYPE_SUBPICTURE; } else if (g_str_has_prefix (mimetype, "video/") && type = GST_STREAM_TYPE_VIDEO; @@ -1569,7 +1574,7 @@ /* mime types we consider raw media */ static const gchar *raw_mimes[] = { - "audio/x-raw", "video/x-raw", NULL + "audio/x-raw", "video/x-raw", "video/x-dvd-subpicture", NULL }; #define IS_STREAM_URI(uri) (array_has_value (stream_uris, uri)) Index: gstplaybasebin.h RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybasebin.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstplaybasebin.h 5 May 2008 10:03:51 -0000 1.29 +++ gstplaybasebin.h 14 Jul 2008 08:18:57 -0000 1.30 @@ -63,8 +63,8 @@ GstElement *preroll; GstElement *selector; gboolean done; -#define NUM_TYPES 3 - } type[NUM_TYPES]; /* AUDIO, VIDEO, TEXT */ +#define NUM_TYPES 4 + } type[NUM_TYPES]; /* AUDIO, VIDEO, TEXT, SUBPIC */ } GstPlayBaseGroup; struct _GstPlayBaseBin { Index: gstplaybin.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gstplaybin.c,v retrieving revision 1.125 retrieving revision 1.126 diff -u -d -r1.125 -r1.126 --- gstplaybin.c 10 Jul 2008 21:06:05 -0000 1.125 +++ gstplaybin.c 14 Jul 2008 08:18:58 -0000 1.126 @@ -262,6 +262,7 @@ GstElement *pending_visualisation; GstElement *volume_element; GstElement *textoverlay_element; + GstElement *spu_element; gfloat volume; /* these are the currently active sinks */ @@ -431,6 +432,7 @@ play_bin->pending_visualisation = NULL; play_bin->volume_element = NULL; play_bin->textoverlay_element = NULL; + play_bin->spu_element = NULL; play_bin->volume = 1.0; play_bin->sinks = NULL; play_bin->frame = NULL; @@ -476,6 +478,10 @@ gst_object_unref (play_bin->textoverlay_element); play_bin->textoverlay_element = NULL; } + if (play_bin->spu_element != NULL) { + gst_object_unref (play_bin->spu_element); + play_bin->spu_element = NULL; + } g_free (play_bin->font_desc); play_bin->font_desc = NULL; @@ -911,7 +917,7 @@ * | tbin +-------------+ | * | +-----+ | textoverlay | +------+ | * | | csp | +--video_sink | | vbin | | - * video_sink-sink src+ +-text_sink src-sink | | + * video_sink-sink src+ +-text_sink src---sink | | * | +-----+ | +-------------+ +------+ | * text_sink-------------+ | * +--------------------------------------------------+ @@ -920,16 +926,11 @@ * videosink without the text_sink pad. */ static GstElement * -gen_text_element (GstPlayBin * play_bin) +add_text_element (GstPlayBin * play_bin, GstElement * vbin) { - GstElement *element, *csp, *overlay, *vbin; + GstElement *element, *csp, *overlay; GstPad *pad; - /* Create the video rendering bin, error is posted when this fails. */ - vbin = gen_video_element (play_bin); - if (!vbin) - return NULL; - /* Text overlay */ overlay = gst_element_factory_make ("textoverlay", "overlay"); @@ -969,6 +970,13 @@ gst_element_add_pad (element, gst_ghost_pad_new ("sink", pad)); gst_object_unref (pad); + /* If the vbin provides a subpicture sink pad, ghost it too */ + pad = gst_element_get_static_pad (vbin, "subpicture_sink"); + if (pad) { + gst_element_add_pad (element, gst_ghost_pad_new ("subpicture_sink", pad)); + gst_object_unref (pad); /* Set state to READY */ gst_element_set_state (element, GST_STATE_READY); @@ -984,6 +992,74 @@ } +/* make an element for rendering DVD subpictures onto output video + * + * +---------------------------------------------+ + * | tbin +--------+ | + * | +-----+ | | +------+ | + * | | csp | src-videosink | | vbin | | + * video_sink-sink src+ | src-sink | | + * | +-----+ +subpicture | +------+ | + * subpicture_pad--------+ +--------+ | + * +---------- ----------------------------------+ + */ +static GstElement * +add_spu_element (GstPlayBin * play_bin, GstElement * vbin) +{ + GstPad *pad; + /* DVD spu overlay */ + GST_DEBUG_OBJECT (play_bin, "Attempting to insert DVD SPU element"); + overlay = gst_element_factory_make ("dvdspu", "overlay"); + /* If no overlay return the video bin without subpicture support. */ + if (!overlay) + goto no_overlay; + /* Create our bin */ + element = gst_bin_new ("spubin"); + /* Take a ref */ + play_bin->spu_element = GST_ELEMENT_CAST (gst_object_ref (overlay)); + /* we know this will succeed, as the video bin already created one before */ + csp = gst_element_factory_make ("ffmpegcolorspace", "spucsp"); + /* Add our elements */ + gst_bin_add_many (GST_BIN_CAST (element), csp, overlay, vbin, NULL); + /* Link */ + gst_element_link_pads (csp, "src", overlay, "video"); + gst_element_link_pads (overlay, "src", vbin, "sink"); + /* Add ghost pad on the subpicture bin so it looks like vbin */ + pad = gst_element_get_static_pad (csp, "sink"); + gst_element_add_pad (element, gst_ghost_pad_new ("sink", pad)); + gst_object_unref (pad); + pad = gst_element_get_static_pad (overlay, "subpicture"); + gst_element_add_pad (element, gst_ghost_pad_new ("subpicture_sink", pad)); + /* Set state to READY */ + gst_element_set_state (element, GST_STATE_READY); + return element; + /* ERRORS */ +no_overlay: + { + post_missing_element_message (play_bin, "dvdspu"); + GST_WARNING_OBJECT (play_bin, + "No DVD overlay (dvdspu) element. " + "menu highlight/subtitles unavailable"); + return vbin; +} /* make the element (bin) that contains the elements needed to perform * audio playback. * @@ -1479,8 +1555,10 @@ setup_sinks (GstPlayBaseBin * play_base_bin, GstPlayBaseGroup * group) GstPlayBin *play_bin = GST_PLAY_BIN (play_base_bin); + gboolean have_video = FALSE; gboolean need_vis = FALSE; gboolean need_text = FALSE; + gboolean need_spu = FALSE; GstPad *textsrcpad = NULL, *pad = NULL, *origtextsrcpad = NULL; GstElement *sink; gboolean res = TRUE; @@ -1492,10 +1570,12 @@ GST_DEBUG_OBJECT (play_base_bin, "setupsinks"); /* find out what to do */ - if (group->type[GST_STREAM_TYPE_VIDEO - 1].npads > 0 && - group->type[GST_STREAM_TYPE_TEXT - 1].npads > 0) { + have_video = (group->type[GST_STREAM_TYPE_VIDEO - 1].npads > 0); + need_spu = (group->type[GST_STREAM_TYPE_SUBPICTURE - 1].npads != 0); + if (have_video && group->type[GST_STREAM_TYPE_TEXT - 1].npads > 0) { need_text = TRUE; - } else if (group->type[GST_STREAM_TYPE_VIDEO - 1].npads == 0 && + } else if (!have_video && group->type[GST_STREAM_TYPE_AUDIO - 1].npads > 0 && play_bin->visualisation != NULL) { need_vis = TRUE; @@ -1521,12 +1601,23 @@ /* link video */ - if (group->type[GST_STREAM_TYPE_VIDEO - 1].npads > 0) { + if (have_video) { + /* Create the video rendering bin, error is posted when this fails. */ + sink = gen_video_element (play_bin); + if (!sink) + return FALSE; + if (need_spu) { + sink = add_spu_element (play_bin, sink); + } if (need_text) { GstObject *parent = NULL, *grandparent = NULL; GstPad *ghost = NULL; - sink = gen_text_element (play_bin); + /* Add the subtitle overlay element into the video sink */ + sink = add_text_element (play_bin, sink); + /* Link the incoming subtitle stream into the output bin */ textsrcpad = gst_element_get_static_pad (group->type[GST_STREAM_TYPE_TEXT - 1].preroll, "src"); @@ -1589,8 +1680,6 @@ gst_object_unref (parent); gst_object_unref (grandparent); - } else { - sink = gen_video_element (play_bin); } beach: if (!sink) @@ -1606,6 +1695,30 @@ gst_pad_set_blocked_async (origtextsrcpad, FALSE, dummy_blocked_cb, NULL); gst_object_unref (origtextsrcpad); + /* If we have a DVD subpicture stream, link it to the SPU now */ + GstPad *subpic_pad; + GstPad *spu_sink_pad; + subpic_pad = + gst_element_get_static_pad (group->type[GST_STREAM_TYPE_SUBPICTURE + - 1].preroll, "src"); + spu_sink_pad = gst_element_get_static_pad (sink, "subpicture_sink"); + if (subpic_pad && spu_sink_pad) { + GST_LOG_OBJECT (play_bin, "Linking DVD subpicture stream onto SPU"); + gst_pad_set_blocked_async (subpic_pad, TRUE, dummy_blocked_cb, NULL); + if (gst_pad_link (subpic_pad, spu_sink_pad) != GST_PAD_LINK_OK) { + GST_WARNING_OBJECT (play_bin, + "Failed to link DVD subpicture stream onto SPU"); + } + gst_pad_set_blocked_async (subpic_pad, FALSE, dummy_blocked_cb, NULL); + } + if (subpic_pad) + gst_object_unref (subpic_pad); + if (spu_sink_pad) + gst_object_unref (spu_sink_pad); /* remove the sinks now, pipeline get_state will now wait for the Index: gststreamselector.c RCS file: /cvs/gstreamer/gst-plugins-base/gst/playback/gststreamselector.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gststreamselector.c 22 Mar 2008 15:00:49 -0000 1.32 +++ gststreamselector.c 14 Jul 2008 08:18:58 -0000 1.33 @@ -254,12 +254,14 @@ gboolean forward = TRUE; GstStreamSelector *sel; GstSelectorPad *selpad; + GstPad *active_sinkpad; sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); selpad = GST_SELECTOR_PAD_CAST (pad); /* only forward if we are dealing with the active sinkpad */ - forward = gst_stream_selector_is_active_sinkpad (sel, pad); + active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad); + forward = (active_sinkpad == pad); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_STOP: |