From 32d650491c0a3e53b266a1507b51d0019c5d1617 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Fri, 31 Aug 2018 22:43:46 +1000 Subject: mpegts: Re-work segment tracking Add an output segment into the base class for sub-classes to use for their output segment, in a place where the base class can see it. --- gst/mpegtsdemux/mpegtsbase.c | 1 + gst/mpegtsdemux/mpegtsbase.h | 3 ++ gst/mpegtsdemux/mpegtsparse.c | 12 ++++---- gst/mpegtsdemux/tsdemux.c | 68 ++++++++++++++++++++++--------------------- gst/mpegtsdemux/tsdemux.h | 1 - 5 files changed, 46 insertions(+), 39 deletions(-) (limited to 'gst/mpegtsdemux') diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 1a68f8691..759b705a2 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -206,6 +206,7 @@ mpegts_base_reset (MpegTSBase * base) } gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); + gst_segment_init (&base->out_segment, GST_FORMAT_UNDEFINED); base->last_seek_seqnum = GST_SEQNUM_INVALID; base->mode = BASE_MODE_STREAMING; diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 5775cdd66..79705a77b 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -148,6 +148,9 @@ struct _MpegTSBase { /* Upstream segment */ GstSegment segment; + /* Downstream segment, for use by sub-classes */ + GstSegment out_segment; + /* Last received seek event seqnum (default GST_SEQNUM_INVALID) */ guint last_seek_seqnum; diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c index 8e227baad..d106b3ac0 100644 --- a/gst/mpegtsdemux/mpegtsparse.c +++ b/gst/mpegtsdemux/mpegtsparse.c @@ -343,14 +343,16 @@ prepare_src_pad (MpegTSBase * base, MpegTSParse2 * parse) /* If setting output timestamps, ensure that the output segment is TIME */ if (parse->set_timestamps == FALSE || base->segment.format == GST_FORMAT_TIME) - gst_pad_push_event (parse->srcpad, gst_event_new_segment (&base->segment)); + /* Just use the upstream segment */ + base->out_segment = base->segment; else { - GstSegment seg; - gst_segment_init (&seg, GST_FORMAT_TIME); + GstSegment *seg = &base->out_segment; + gst_segment_init (seg, GST_FORMAT_TIME); GST_DEBUG_OBJECT (parse, - "Generating time output segment %" GST_SEGMENT_FORMAT, &seg); - gst_pad_push_event (parse->srcpad, gst_event_new_segment (&seg)); + "Generating time output segment %" GST_SEGMENT_FORMAT, seg); } + gst_pad_push_event (parse->srcpad, + gst_event_new_segment (&base->out_segment)); parse->first = FALSE; diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 64f9d0bb7..2bc16c31e 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -413,7 +413,6 @@ gst_ts_demux_reset (MpegTSBase * base) GstTSDemux *demux = (GstTSDemux *) base; demux->rate = 1.0; - gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); if (demux->segment_event) { gst_event_unref (demux->segment_event); demux->segment_event = NULL; @@ -598,17 +597,18 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query) GstFormat format; gint64 start, stop; - format = demux->segment.format; + format = base->out_segment.format; start = - gst_segment_to_stream_time (&demux->segment, format, - demux->segment.start); - if ((stop = demux->segment.stop) == -1) - stop = demux->segment.duration; + gst_segment_to_stream_time (&base->out_segment, format, + base->out_segment.start); + if ((stop = base->out_segment.stop) == -1) + stop = base->out_segment.duration; else - stop = gst_segment_to_stream_time (&demux->segment, format, stop); + stop = gst_segment_to_stream_time (&base->out_segment, format, stop); - gst_query_set_segment (query, demux->segment.rate, format, start, stop); + gst_query_set_segment (query, base->out_segment.rate, format, start, + stop); res = TRUE; break; } @@ -871,7 +871,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) stream->need_newsegment = TRUE; } - gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); + gst_segment_init (&base->out_segment, GST_FORMAT_UNDEFINED); if (demux->segment_event) { gst_event_unref (demux->segment_event); demux->segment_event = NULL; @@ -887,7 +887,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) demux->rate = rate; res = GST_FLOW_OK; - gst_segment_do_seek (&demux->segment, rate, format, flags, start_type, + gst_segment_do_seek (&base->out_segment, rate, format, flags, start_type, start, stop_type, stop, NULL); /* Reset segment if we're not doing an accurate seek */ demux->reset_segment = (!(flags & GST_SEEK_FLAG_ACCURATE)); @@ -1795,7 +1795,8 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream, stream->need_newsegment = TRUE; /* Reset segment if we're not doing an accurate seek */ - demux->reset_segment = (!(demux->segment.flags & GST_SEEK_FLAG_ACCURATE)); + demux->reset_segment = + (!(base->out_segment.flags & GST_SEEK_FLAG_ACCURATE)); stream->needs_keyframe = FALSE; stream->discont = TRUE; stream->pts = GST_CLOCK_TIME_NONE; @@ -2482,37 +2483,37 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream, GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT, lowest_pts, GST_TIME_ARGS (firstts)); - if (demux->segment.format != GST_FORMAT_TIME || demux->reset_segment) { + if (base->out_segment.format != GST_FORMAT_TIME || demux->reset_segment) { /* It will happen only if it's first program or after flushes. */ GST_DEBUG ("Calculating actual segment"); if (base->segment.format == GST_FORMAT_TIME) { /* Try to recover segment info from base if it's in TIME format */ - demux->segment = base->segment; + base->out_segment = base->segment; } else { /* Start from the first ts/pts */ - GstClockTime base = - demux->segment.base + demux->segment.position - demux->segment.start; - gst_segment_init (&demux->segment, GST_FORMAT_TIME); - demux->segment.start = firstts; - demux->segment.stop = GST_CLOCK_TIME_NONE; - demux->segment.position = firstts; - demux->segment.time = firstts; - demux->segment.rate = demux->rate; - demux->segment.base = base; - } - } else if (demux->segment.start < firstts) { + GstSegment *seg = &base->out_segment; + GstClockTime base = seg->base + seg->position - seg->start; + gst_segment_init (seg, GST_FORMAT_TIME); + seg->start = firstts; + seg->stop = GST_CLOCK_TIME_NONE; + seg->position = firstts; + seg->time = firstts; + seg->rate = demux->rate; + seg->base = base; + } + } else if (base->out_segment.start < firstts) { /* Take into account the offset to the first buffer timestamp */ - if (demux->segment.rate > 0) { - demux->segment.start = firstts; + if (base->out_segment.rate > 0) { + base->out_segment.start = firstts; - if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop)) - demux->segment.stop += firstts - demux->segment.start; - demux->segment.position = firstts; + if (GST_CLOCK_TIME_IS_VALID (base->out_segment.stop)) + base->out_segment.stop += firstts - base->out_segment.start; + base->out_segment.position = firstts; } } if (!demux->segment_event) { - demux->segment_event = gst_event_new_segment (&demux->segment); + demux->segment_event = gst_event_new_segment (&base->out_segment); if (base->last_seek_seqnum != GST_SEQNUM_INVALID) gst_event_set_seqnum (demux->segment_event, base->last_seek_seqnum); @@ -2852,6 +2853,7 @@ static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream, MpegTSBaseProgram * target_program) { + MpegTSBase *base = GST_MPEGTS_BASE (demux); GstFlowReturn res = GST_FLOW_OK; MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; GstBuffer *buffer = NULL; @@ -3050,9 +3052,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream, GST_TIME_ARGS (stream->dts)); if (GST_CLOCK_TIME_IS_VALID (stream->dts)) - demux->segment.position = stream->dts; + base->out_segment.position = stream->dts; else if (GST_CLOCK_TIME_IS_VALID (stream->pts)) - demux->segment.position = stream->pts; + base->out_segment.position = stream->pts; if (buffer) { res = gst_pad_push (stream->pad, buffer); @@ -3158,7 +3160,7 @@ gst_ts_demux_flush (MpegTSBase * base, gboolean hard) if (hard) { /* For pull mode seeks the current segment needs to be preserved */ demux->rate = 1.0; - gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED); + gst_segment_init (&base->out_segment, GST_FORMAT_UNDEFINED); } } diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 394aefd72..aa79a7255 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -84,7 +84,6 @@ struct _GstTSDemux * the new program becomes active */ /* segments to be sent */ - GstSegment segment; GstEvent *segment_event; gboolean reset_segment; -- cgit v1.2.1