mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
gst/playback/gstplaybin2.c: Fix nasty race where multiple decodebins could start pushing data before we manage to con...
Original commit message from CVS: * gst/playback/gstplaybin2.c: (selector_blocked), (pad_added_cb), (no_more_pads_cb): Fix nasty race where multiple decodebins could start pushing data before we manage to configure the sinks, resulting in not-linked errors in typical RTSP streaming cases.
This commit is contained in:
parent
da76d5e7cb
commit
ed11048c05
2 changed files with 31 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2008-08-27 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/playback/gstplaybin2.c: (selector_blocked), (pad_added_cb),
|
||||||
|
(no_more_pads_cb):
|
||||||
|
Fix nasty race where multiple decodebins could start pushing data before
|
||||||
|
we manage to configure the sinks, resulting in not-linked errors in
|
||||||
|
typical RTSP streaming cases.
|
||||||
|
|
||||||
2008-08-26 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-08-26 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_stop):
|
* gst-libs/gst/audio/gstaudiosink.c: (gst_audioringbuffer_stop):
|
||||||
|
|
|
@ -1529,6 +1529,13 @@ gst_play_bin_handle_message (GstBin * bin, GstMessage * msg)
|
||||||
GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
|
GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
selector_blocked (GstPad * pad, gboolean blocked, gpointer user_data)
|
||||||
|
{
|
||||||
|
/* no nothing */
|
||||||
|
GST_DEBUG_OBJECT (pad, "blocked callback, blocked: %d", blocked);
|
||||||
|
}
|
||||||
|
|
||||||
/* this function is called when a new pad is added to decodebin. We check the
|
/* this function is called when a new pad is added to decodebin. We check the
|
||||||
* type of the pad and add it to the selecter element of the group.
|
* type of the pad and add it to the selecter element of the group.
|
||||||
*/
|
*/
|
||||||
|
@ -1580,6 +1587,11 @@ pad_added_cb (GstElement * decodebin, GstPad * pad, GstSourceGroup * group)
|
||||||
|
|
||||||
/* save source pad */
|
/* save source pad */
|
||||||
select->srcpad = gst_element_get_static_pad (select->selector, "src");
|
select->srcpad = gst_element_get_static_pad (select->selector, "src");
|
||||||
|
/* block the selector srcpad. It's possible that multiple decodebins start
|
||||||
|
* pushing data into the selectors before we have a chance to collect all
|
||||||
|
* streams and connect the sinks, resulting in not-linked errors. After we
|
||||||
|
* configured the sinks we will unblock them all. */
|
||||||
|
gst_pad_set_blocked_async (select->srcpad, TRUE, selector_blocked, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get sinkpad for the new stream */
|
/* get sinkpad for the new stream */
|
||||||
|
@ -1755,6 +1767,17 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
|
||||||
|
|
||||||
/* signal the other decodebins that they can continue now. */
|
/* signal the other decodebins that they can continue now. */
|
||||||
GST_SOURCE_GROUP_LOCK (group);
|
GST_SOURCE_GROUP_LOCK (group);
|
||||||
|
/* unblock all selectors */
|
||||||
|
for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
|
||||||
|
GstSourceSelect *select = &group->selector[i];
|
||||||
|
|
||||||
|
if (select->selector) {
|
||||||
|
GST_DEBUG_OBJECT (playbin, "unblocking %" GST_PTR_FORMAT,
|
||||||
|
select->srcpad);
|
||||||
|
gst_pad_set_blocked_async (select->srcpad, FALSE, selector_blocked,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
GST_DEBUG_OBJECT (playbin, "signal other decodebins");
|
GST_DEBUG_OBJECT (playbin, "signal other decodebins");
|
||||||
GST_SOURCE_GROUP_BROADCAST (group);
|
GST_SOURCE_GROUP_BROADCAST (group);
|
||||||
GST_SOURCE_GROUP_UNLOCK (group);
|
GST_SOURCE_GROUP_UNLOCK (group);
|
||||||
|
|
Loading…
Reference in a new issue