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
This commit is contained in:
Sebastian Dröge 2015-09-23 20:23:40 +02:00
parent c526153ec9
commit f501188191

View file

@ -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))) { while ((stream = gst_asf_demux_find_stream_with_complete_payload (demux))) {
AsfPayload *payload; 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 */ /* wait until we had a chance to "lock on" some payload's timestamp */
if (G_UNLIKELY (demux->need_newsegment 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 * typically useful for live src, but might (unavoidably) mess with
* position reporting if a live src is playing not so live content * position reporting if a live src is playing not so live content
* (e.g. rtspsrc taking some time to fall back to tcp) */ * (e.g. rtspsrc taking some time to fall back to tcp) */
GST_BUFFER_PTS (payload->buf) = payload->ts; timestamp = payload->ts;
if (GST_BUFFER_PTS_IS_VALID (payload->buf)) { if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
GST_BUFFER_PTS (payload->buf) += demux->in_gap; timestamp += demux->in_gap;
} }
GST_BUFFER_PTS (payload->buf) = timestamp;
if (payload->duration == GST_CLOCK_TIME_NONE if (payload->duration == GST_CLOCK_TIME_NONE
&& stream->ext_props.avg_time_per_frame != 0) && stream->ext_props.avg_time_per_frame != 0) {
GST_BUFFER_DURATION (payload->buf) = duration = stream->ext_props.avg_time_per_frame * 100;
stream->ext_props.avg_time_per_frame * 100; } else {
else duration = payload->duration;
GST_BUFFER_DURATION (payload->buf) = payload->duration; }
GST_BUFFER_DURATION (payload->buf) = duration;
/* FIXME: we should really set durations on buffers if we can */ /* 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; 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_pad_push (stream->pad, payload->buf);
ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret); ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret);
} else { } else {