mpegtsbase: Query whether upstream is live or not

This commit is contained in:
Edward Hervey 2011-11-08 09:44:18 +01:00
parent 4a8b6f0121
commit e48966ecf1
2 changed files with 28 additions and 0 deletions

View file

@ -216,6 +216,9 @@ mpegts_base_reset (MpegTSBase * base)
base->in_gap = 0; base->in_gap = 0;
base->first_buf_ts = GST_CLOCK_TIME_NONE; base->first_buf_ts = GST_CLOCK_TIME_NONE;
base->upstream_live = FALSE;
base->query_latency = FALSE;
if (klass->reset) if (klass->reset)
klass->reset (base); klass->reset (base);
} }
@ -1224,6 +1227,22 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
return res; 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 static inline GstFlowReturn
mpegts_base_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, mpegts_base_push (MpegTSBase * base, MpegTSPacketizerPacket * packet,
MpegTSPacketizerSection * section) MpegTSPacketizerSection * section)
@ -1252,6 +1271,10 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
base = GST_MPEGTS_BASE (parent); base = GST_MPEGTS_BASE (parent);
packetizer = base->packetizer; 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)) && if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) &&
GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf); base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf);

View file

@ -137,6 +137,11 @@ struct _MpegTSBase {
GstClockTime in_gap; GstClockTime in_gap;
GstClockTime first_buf_ts; 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 */ /* Upstream segment */
GstSegment segment; GstSegment segment;
}; };