summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-10-27 15:44:06 +0200
committerSebastian Dröge <sebastian@centricular.com>2015-10-27 17:14:33 +0200
commit2358915754a3606dc2c5ac92f7ae0c0caa2952e9 (patch)
tree54cfd2bdf6ff3fc589a68513cbeeca5005adf0af
parentd9ebc67f0dd0a70681f8636494d138ce54e6dbdd (diff)
downloadgstreamer-plugins-base-2358915754a3606dc2c5ac92f7ae0c0caa2952e9.tar.gz
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
-rw-r--r--gst/playback/gstdecodebin2.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
index d5bd5eec2..3afad0d1d 100644
--- a/gst/playback/gstdecodebin2.c
+++ b/gst/playback/gstdecodebin2.c
@@ -2936,11 +2936,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;
}
@@ -4931,6 +4933,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);
@@ -4987,6 +5022,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;