mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 10:10:32 +00:00
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:
parent
c526153ec9
commit
f501188191
1 changed files with 21 additions and 8 deletions
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue