diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-10-27 15:44:06 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-10-27 15:50:45 +0200 |
commit | 36b80edb7263118467dfcaee3923f7c964ae6bc8 (patch) | |
tree | 171313b1a1cf1b5f896f0a6392529b89cde56488 /gst | |
parent | 7d6b6b0313028074aa8adf1b3d7af77bb100fc66 (diff) |
decodebin: Send SEEK events directly to adaptive streaming demuxers
This makes sure that they will always get SEEK events, even if we're currently
in the middle of a group switch (i.e. switching to another
representation/bitrate/etc).
https://bugzilla.gnome.org/show_bug.cgi?id=606382
Diffstat (limited to 'gst')
-rw-r--r-- | gst/playback/gstdecodebin2.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index 5f2bbbc7b..ae6e7e0a0 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -2925,11 +2925,13 @@ sink_pad_event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) } gst_object_unref (otherpeer); } - } else + } else { GST_DEBUG_OBJECT (pad, "No request pads, can't forward event"); + } } - } else + } else { gst_object_unref (peer); + } return proberet; } @@ -4920,6 +4922,39 @@ gst_decode_pad_unblock (GstDecodePad * dpad) } static gboolean +gst_decode_pad_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + GstDecodeBin *dbin = GST_DECODE_BIN (parent); + + if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK && dbin && dbin->decode_chain) { + GstElement *demuxer = NULL; + + /* For adaptive demuxers we send the seek event directly to the demuxer. + * See https://bugzilla.gnome.org/show_bug.cgi?id=606382 + */ + CHAIN_MUTEX_LOCK (dbin->decode_chain); + if (dbin->decode_chain->adaptive_demuxer) { + GstDecodeElement *delem = dbin->decode_chain->elements->data; + demuxer = gst_object_ref (delem->element); + } + CHAIN_MUTEX_UNLOCK (dbin->decode_chain); + + if (demuxer) { + gboolean ret; + + GST_DEBUG_OBJECT (dbin, + "Sending SEEK event directly to adaptive streaming demuxer %s", + GST_OBJECT_NAME (demuxer)); + ret = gst_element_send_event (demuxer, event); + gst_object_unref (demuxer); + return ret; + } + } + + return gst_pad_event_default (pad, parent, event); +} + +static gboolean gst_decode_pad_query (GstPad * pad, GstObject * parent, GstQuery * query) { GstDecodePad *dpad = GST_DECODE_PAD (parent); @@ -4976,6 +5011,7 @@ gst_decode_pad_new (GstDecodeBin * dbin, GstDecodeChain * chain) ppad = gst_proxy_pad_get_internal (GST_PROXY_PAD (dpad)); gst_pad_set_query_function (GST_PAD_CAST (ppad), gst_decode_pad_query); + gst_pad_set_event_function (GST_PAD_CAST (dpad), gst_decode_pad_event); gst_object_unref (ppad); return dpad; |