summaryrefslogtreecommitdiff
path: root/gst/mpegtsdemux/mpegtsbase.c
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2011-11-08 09:44:18 +0100
committerEdward Hervey <edward.hervey@collabora.co.uk>2012-02-23 16:39:48 +0100
commitc492b00b6942bfcf5304296dff9077e5f67bfcfa (patch)
treed92922d7c985e7587f4935040826851daf860a94 /gst/mpegtsdemux/mpegtsbase.c
parentd4b24d9fa56fc24ec9b8d89b105a130fff69a8f9 (diff)
downloadgstreamer-plugins-bad-c492b00b6942bfcf5304296dff9077e5f67bfcfa.tar.gz
mpegtsbase: Query whether upstream is live or not
Diffstat (limited to 'gst/mpegtsdemux/mpegtsbase.c')
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c23
1 files changed, 23 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);