diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-10-23 12:02:28 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-10-23 12:02:28 +0300 |
commit | 53f135cec7ac63b8951797568b9e8e153bd6ad2e (patch) | |
tree | 6a1afa93acb9071ff7ae0c4e7d729e583810ede5 /gst | |
parent | 04eeaef7a4f14ff2d882541f1b1ac1d4860a3537 (diff) |
playbin: Send upstream events directly to playsink
Send event directly to playsink instead of letting GstBin iterate
over all sink elements. The latter might send the event multiple times
in case the SEEK causes a reconfiguration of the pipeline, as can easily
happen with adaptive streaming demuxers.
What would then happen is that the iterator would be reset, we send the
event again, and on the second time it will fail in the majority of cases
because the pipeline is still being reconfigured
Diffstat (limited to 'gst')
-rw-r--r-- | gst/playback/gstplaybin2.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c index 050cd898a..4a056a0e1 100644 --- a/gst/playback/gstplaybin2.c +++ b/gst/playback/gstplaybin2.c @@ -625,6 +625,8 @@ static void gst_play_bin_handle_message (GstBin * bin, GstMessage * message); static gboolean gst_play_bin_query (GstElement * element, GstQuery * query); static void gst_play_bin_set_context (GstElement * element, GstContext * context); +static gboolean gst_play_bin_send_event (GstElement * element, + GstEvent * event); static GstTagList *gst_play_bin_get_video_tags (GstPlayBin * playbin, gint stream); @@ -1315,6 +1317,7 @@ gst_play_bin_class_init (GstPlayBinClass * klass) GST_DEBUG_FUNCPTR (gst_play_bin_change_state); gstelement_klass->query = GST_DEBUG_FUNCPTR (gst_play_bin_query); gstelement_klass->set_context = GST_DEBUG_FUNCPTR (gst_play_bin_set_context); + gstelement_klass->send_event = GST_DEBUG_FUNCPTR (gst_play_bin_send_event); gstbin_klass->handle_message = GST_DEBUG_FUNCPTR (gst_play_bin_handle_message); @@ -4242,6 +4245,27 @@ autoplug_factories_cb (GstElement * decodebin, GstPad * pad, return result; } +static gboolean +gst_play_bin_send_event (GstElement * element, GstEvent * event) +{ + GstPlayBin *playbin = GST_PLAY_BIN (element); + + /* Send event directly to playsink instead of letting GstBin iterate + * over all sink elements. The latter might send the event multiple times + * in case the SEEK causes a reconfiguration of the pipeline, as can easily + * happen with adaptive streaming demuxers. + * + * What would then happen is that the iterator would be reset, we send the + * event again, and on the second time it will fail in the majority of cases + * because the pipeline is still being reconfigured + */ + if (GST_EVENT_IS_UPSTREAM (event)) { + return gst_element_send_event (GST_ELEMENT_CAST (playbin->playsink), event); + } + + return GST_ELEMENT_CLASS (parent_class)->send_event (element, event); +} + static void gst_play_bin_set_context (GstElement * element, GstContext * context) { |