summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2014-08-02 11:29:37 +0100
committerEdward Hervey <bilboed@bilboed.com>2014-10-20 12:32:19 +0200
commit2cd4f5d0c13bb9eaff9ca8303db5b76c9229522d (patch)
tree6fe0bd202349620f7bd382e66993cc4616288587
parentb59a9262c069d8f0c149ce4c9185c9a439ad6ece (diff)
tsdemux: send initial GAP event on sparse streams for faster startup with playbin
Signal sparse streams properly in stream-start event and force sending of pending sticky events which have been stored on the pad already and which otherwise would only be sent on the first buffer or serialized event (which means very late in case of subtitle streams). Playsink in playbin waits for stream-start or another serialized event, and if we don't do this it will wait for the multiqueue to run full before starting playback, which might take a couple of seconds. https://bugzilla.gnome.org/show_bug.cgi?id=734040
-rw-r--r--gst/mpegtsdemux/tsdemux.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index aba2c5a43..3cfa13d64 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -144,6 +144,9 @@ struct _TSDemuxStream
/* Whether the pad was added or not */
gboolean active;
+ /* Whether this is a sparse stream (subtitles or metadata) */
+ gboolean sparse;
+
/* TRUE if we are waiting for a valid timestamp */
gboolean pending_ts;
@@ -1024,6 +1027,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
GstPadTemplate *template = NULL;
const GstMpegtsDescriptor *desc = NULL;
GstPad *pad = NULL;
+ gboolean sparse = FALSE;
gst_ts_demux_create_tags (stream);
@@ -1075,6 +1079,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
template = gst_static_pad_template_get (&subpicture_template);
name = g_strdup_printf ("subpicture_%04x", bstream->pid);
caps = gst_caps_new_empty_simple ("subpicture/x-pgs");
+ sparse = TRUE;
break;
case ST_BD_AUDIO_DTS_HD:
case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO:
@@ -1152,6 +1157,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
template = gst_static_pad_template_get (&private_template);
name = g_strdup_printf ("private_%04x", bstream->pid);
caps = gst_caps_new_empty_simple ("application/x-teletext");
+ sparse = TRUE;
break;
}
desc =
@@ -1162,6 +1168,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
template = gst_static_pad_template_get (&private_template);
name = g_strdup_printf ("private_%04x", bstream->pid);
caps = gst_caps_new_empty_simple ("subpicture/x-dvb");
+ sparse = TRUE;
break;
}
@@ -1324,6 +1331,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
template = gst_static_pad_template_get (&subpicture_template);
name = g_strdup_printf ("subpicture_%04x", bstream->pid);
caps = gst_caps_new_empty_simple ("subpicture/x-dvd");
+ sparse = TRUE;
break;
default:
GST_WARNING ("Non-media stream (stream_type:0x%x). Not creating pad",
@@ -1359,6 +1367,9 @@ done:
event = gst_event_new_stream_start (stream_id);
if (demux->have_group_id)
gst_event_set_group_id (event, demux->group_id);
+ if (sparse)
+ gst_event_set_stream_flags (event, GST_STREAM_FLAG_SPARSE);
+ stream->sparse = sparse;
gst_pad_push_event (pad, event);
g_free (stream_id);
@@ -1476,6 +1487,14 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream)
gst_element_add_pad ((GstElement *) tsdemux, stream->pad);
stream->active = TRUE;
GST_DEBUG_OBJECT (stream->pad, "done adding pad");
+ /* force sending of pending sticky events which have been stored on the
+ * pad already and which otherwise would only be sent on the first buffer
+ * or serialized event (which means very late in case of subtitle streams),
+ * and playsink waits for stream-start or another serialized event */
+ if (stream->sparse) {
+ GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
+ gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
+ }
} else {
GST_WARNING_OBJECT (tsdemux,
"stream %p (pid 0x%04x, type:0x%03x) has no pad", stream,