diff options
author | Edward Hervey <edward@centricular.com> | 2018-06-06 07:51:19 +0200 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2018-06-06 07:51:19 +0200 |
commit | e1133bbbfe969cf0016a23e0d0fc284ffd375b62 (patch) | |
tree | 24bbf3de6a274357b1f182cbd0ccd1c759a79b44 /gst | |
parent | 30644c40635a9bba8444130c8c8691a3bfdccbcf (diff) |
mpegtsdemux: Fix SEGMENT seqnum propagation
* If the seek was handled upstream, use that SEGMENT seqnum
* Use the proper invalid default value
Diffstat (limited to 'gst')
-rw-r--r-- | gst/mpegtsdemux/mpegtsbase.c | 9 | ||||
-rw-r--r-- | gst/mpegtsdemux/mpegtsbase.h | 2 | ||||
-rw-r--r-- | gst/mpegtsdemux/tsdemux.c | 2 |
3 files changed, 10 insertions, 3 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index ee2460c28..5180c2ee5 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -201,7 +201,7 @@ mpegts_base_reset (MpegTSBase * base) } gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); - base->last_seek_seqnum = (guint32) - 1; + base->last_seek_seqnum = GST_SEQNUM_INVALID; base->mode = BASE_MODE_STREAMING; base->seen_pat = FALSE; @@ -1321,10 +1321,13 @@ mpegts_base_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) if (base->segment.format == GST_FORMAT_TIME) { base->packetizer->calculate_offset = FALSE; base->packetizer->calculate_skew = TRUE; + /* Seek was handled upstream */ + base->last_seek_seqnum = gst_event_get_seqnum (event); } else { base->packetizer->calculate_offset = TRUE; base->packetizer->calculate_skew = FALSE; } + res = GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, event); break; case GST_EVENT_STREAM_START: @@ -1583,6 +1586,10 @@ mpegts_base_loop (MpegTSBase * base) GST_DEBUG ("Pulling data from %" G_GUINT64_FORMAT, base->seek_offset); + if (G_UNLIKELY (base->last_seek_seqnum == GST_SEQNUM_INVALID)) { + /* No configured seek, set a valid seqnum */ + base->last_seek_seqnum = gst_util_seqnum_next (); + } ret = gst_pad_pull_range (base->sinkpad, base->seek_offset, 100 * base->packetsize, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 0dd78599c..80a454f68 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -148,7 +148,7 @@ struct _MpegTSBase { /* Upstream segment */ GstSegment segment; - /* Last received seek event seqnum (default -1) */ + /* Last received seek event seqnum (default GST_SEQNUM_INVALID) */ guint last_seek_seqnum; /* Whether to parse private section or not */ diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 40f06e367..1e1c0eab5 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -2471,7 +2471,7 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream, if (!demux->segment_event) { demux->segment_event = gst_event_new_segment (&demux->segment); - GST_EVENT_SEQNUM (demux->segment_event) = base->last_seek_seqnum; + gst_event_set_seqnum (demux->segment_event, base->last_seek_seqnum); } push_new_segment: |