diff options
author | Edward Hervey <edward.hervey@collabora.co.uk> | 2011-11-08 09:44:18 +0100 |
---|---|---|
committer | Edward Hervey <edward.hervey@collabora.co.uk> | 2012-02-23 16:39:48 +0100 |
commit | c492b00b6942bfcf5304296dff9077e5f67bfcfa (patch) | |
tree | d92922d7c985e7587f4935040826851daf860a94 /gst/mpegtsdemux | |
parent | d4b24d9fa56fc24ec9b8d89b105a130fff69a8f9 (diff) | |
download | gstreamer-plugins-bad-c492b00b6942bfcf5304296dff9077e5f67bfcfa.tar.gz |
mpegtsbase: Query whether upstream is live or not
Diffstat (limited to 'gst/mpegtsdemux')
-rw-r--r-- | gst/mpegtsdemux/mpegtsbase.c | 23 | ||||
-rw-r--r-- | gst/mpegtsdemux/mpegtsbase.h | 5 |
2 files changed, 28 insertions, 0 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 12323381d..2b480c02c 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -225,6 +225,9 @@ mpegts_base_reset (MpegTSBase * base) base->in_gap = 0; base->first_buf_ts = GST_CLOCK_TIME_NONE; + base->upstream_live = FALSE; + base->query_latency = FALSE; + if (klass->reset) klass->reset (base); } @@ -1241,6 +1244,22 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) return res; } +static void +query_upstream_latency (MpegTSBase * base) +{ + GstQuery *query; + + query = gst_query_new_latency (); + if (gst_pad_peer_query (base->sinkpad, query)) { + gst_query_parse_latency (query, &base->upstream_live, NULL, NULL); + GST_DEBUG_OBJECT (base, "Upstream is %s", + base->upstream_live ? "LIVE" : "NOT LIVE"); + } else + GST_WARNING_OBJECT (base, "Failed to query upstream latency"); + gst_query_unref (query); + base->query_latency = TRUE; +} + static inline GstFlowReturn mpegts_base_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, MpegTSPacketizerSection * section) @@ -1269,6 +1288,10 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) base = GST_MPEGTS_BASE (gst_object_get_parent (GST_OBJECT (pad))); packetizer = base->packetizer; + if (G_UNLIKELY (base->query_latency == FALSE)) { + query_upstream_latency (base); + } + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf); diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 872e77ee8..499ea6a31 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -137,6 +137,11 @@ struct _MpegTSBase { GstClockTime in_gap; GstClockTime first_buf_ts; + /* Whether upstream is live or not */ + gboolean upstream_live; + /* Whether we queried the upstream latency or not */ + gboolean query_latency; + /* Upstream segment */ GstSegment segment; }; |