From: Sebastian Dröge Date: Tue, 23 Jun 2015 16:19:35 +0000 (+0200) Subject: adaptivedemux: Also update segment.base and segment.time when switching periods X-Git-Tag: 1.19.3~507^2~8427 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c6b39215ebbb112df67171533d0a3a2919135a0;p=platform%2Fupstream%2Fgstreamer.git adaptivedemux: Also update segment.base and segment.time when switching periods And include the presentation offset in the last known position for each stream, and just because we can also keep track of the latest known position inside the demuxer segment. --- diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c index aaad3e7..28a0808 100644 --- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c @@ -762,8 +762,13 @@ gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux, offset = gst_adaptive_demux_stream_get_presentation_offset (demux, stream); stream->segment = demux->segment; - stream->segment.start = stream->segment.position = + stream->segment.start = stream->segment.position = stream->segment.time = stream->fragment.timestamp + offset; + + stream->segment.base = + gst_segment_to_running_time (&demux->segment, GST_FORMAT_TIME, + stream->segment.start); + stream->pending_segment = gst_event_new_segment (&stream->segment); } @@ -1365,10 +1370,11 @@ gst_adaptive_demux_stream_push_buffer (GstAdaptiveDemuxStream * stream, GstAdaptiveDemux *demux = stream->demux; GstFlowReturn ret = GST_FLOW_OK; gboolean discont = FALSE; - GstClockTime offset = - gst_adaptive_demux_stream_get_presentation_offset (demux, stream); if (stream->first_fragment_buffer) { + GstClockTime offset = + gst_adaptive_demux_stream_get_presentation_offset (demux, stream); + if (demux->segment.rate < 0) /* Set DISCONT flag for every first buffer in reverse playback mode * as each fragment for its own has to be reversed */ @@ -1376,7 +1382,13 @@ gst_adaptive_demux_stream_push_buffer (GstAdaptiveDemuxStream * stream, GST_BUFFER_PTS (buffer) = stream->fragment.timestamp; if (GST_BUFFER_PTS_IS_VALID (buffer)) + GST_BUFFER_PTS (buffer) += offset; + + if (GST_BUFFER_PTS_IS_VALID (buffer)) { stream->segment.position = GST_BUFFER_PTS (buffer); + if (stream->segment.position > demux->segment.position) + demux->segment.position = stream->segment.position; + } } else { GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE; } @@ -1395,8 +1407,6 @@ gst_adaptive_demux_stream_push_buffer (GstAdaptiveDemuxStream * stream, stream->first_fragment_buffer = FALSE; - if (GST_BUFFER_PTS (buffer) != GST_CLOCK_TIME_NONE) - GST_BUFFER_PTS (buffer) += offset; GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; @@ -1460,18 +1470,26 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) GstFlowReturn ret = GST_FLOW_OK; if (stream->starting_fragment) { + GstClockTime offset = + gst_adaptive_demux_stream_get_presentation_offset (demux, stream); + stream->starting_fragment = FALSE; if (klass->start_fragment) { klass->start_fragment (demux, stream); } GST_BUFFER_PTS (buffer) = stream->fragment.timestamp; + if (GST_BUFFER_PTS_IS_VALID (buffer)) + GST_BUFFER_PTS (buffer) += offset; GST_LOG_OBJECT (stream->pad, "set fragment pts=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buffer))); - if (GST_BUFFER_PTS_IS_VALID (buffer)) + if (GST_BUFFER_PTS_IS_VALID (buffer)) { stream->segment.position = GST_BUFFER_PTS (buffer); + if (stream->segment.position > demux->segment.position) + demux->segment.position = stream->segment.position; + } } else { GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE; @@ -2390,8 +2408,11 @@ gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux, GST_TYPE_CLOCK_TIME, stream->download_total_time * GST_USECOND, NULL))); - if (GST_CLOCK_TIME_IS_VALID (duration)) + if (GST_CLOCK_TIME_IS_VALID (duration)) { stream->segment.position += duration; + if (stream->segment.position > demux->segment.position) + demux->segment.position = stream->segment.position; + } if (gst_adaptive_demux_is_live (demux) || gst_adaptive_demux_stream_has_next_fragment (demux, stream)) {