From f501188191c63bc531437d6311f46a9a7d535f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 23 Sep 2015 20:23:40 +0200 Subject: [PATCH] asfdemux: Update segment.position when pushing buffers Without this, non-flushing seeks are not going to work well. https://bugzilla.gnome.org/show_bug.cgi?id=755469 --- gst/asfdemux/gstasfdemux.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c index 6c2544b6b1..2a92ac22f3 100644 --- a/gst/asfdemux/gstasfdemux.c +++ b/gst/asfdemux/gstasfdemux.c @@ -1595,6 +1595,8 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) while ((stream = gst_asf_demux_find_stream_with_complete_payload (demux))) { AsfPayload *payload; + GstClockTime timestamp = GST_CLOCK_TIME_NONE; + GstClockTime duration = GST_CLOCK_TIME_NONE; /* wait until we had a chance to "lock on" some payload's timestamp */ if (G_UNLIKELY (demux->need_newsegment @@ -1708,16 +1710,20 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) * typically useful for live src, but might (unavoidably) mess with * position reporting if a live src is playing not so live content * (e.g. rtspsrc taking some time to fall back to tcp) */ - GST_BUFFER_PTS (payload->buf) = payload->ts; - if (GST_BUFFER_PTS_IS_VALID (payload->buf)) { - GST_BUFFER_PTS (payload->buf) += demux->in_gap; + timestamp = payload->ts; + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + timestamp += demux->in_gap; } + + GST_BUFFER_PTS (payload->buf) = timestamp; + if (payload->duration == GST_CLOCK_TIME_NONE - && stream->ext_props.avg_time_per_frame != 0) - GST_BUFFER_DURATION (payload->buf) = - stream->ext_props.avg_time_per_frame * 100; - else - GST_BUFFER_DURATION (payload->buf) = payload->duration; + && stream->ext_props.avg_time_per_frame != 0) { + duration = stream->ext_props.avg_time_per_frame * 100; + } else { + duration = payload->duration; + } + GST_BUFFER_DURATION (payload->buf) = duration; /* FIXME: we should really set durations on buffers if we can */ @@ -1734,6 +1740,13 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) stream->first_buffer = FALSE; } + if (GST_CLOCK_TIME_IS_VALID (timestamp) + && timestamp > demux->segment.position) { + demux->segment.position = timestamp; + if (GST_CLOCK_TIME_IS_VALID (duration)) + demux->segment.position += timestamp; + } + ret = gst_pad_push (stream->pad, payload->buf); ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret); } else {