Commit 2e4ec894 authored by Michael Niedermayer's avatar Michael Niedermayer

lavf: fill in past dts based on reordered pts once the delay becomes known.

Previously we had ignored the past dts and just filled in from the
point where we have had sufficient information.

This should fix Ticket1734
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent a8e3815d
......@@ -940,15 +940,21 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
{
AVStream *st= s->streams[stream_index];
AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
int64_t pts_buffer[MAX_REORDER_DELAY];
int64_t shift;
int i, delay;
if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
return;
delay = st->codec->has_b_frames;
st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
st->cur_dts= dts;
shift = st->first_dts - RELATIVE_TS_BASE;
for (i=0; i<MAX_REORDER_DELAY; i++)
pts_buffer[i] = AV_NOPTS_VALUE;
if (is_relative(pts))
pts += shift;
......@@ -963,6 +969,14 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
st->start_time= pktl->pkt.pts;
if(pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
pts_buffer[0]= pktl->pkt.pts;
for(i=0; i<delay && pts_buffer[i] > pts_buffer[i+1]; i++)
FFSWAP(int64_t, pts_buffer[i], pts_buffer[i+1]);
if(pktl->pkt.dts == AV_NOPTS_VALUE)
pktl->pkt.dts= pts_buffer[0];
}
}
if (st->start_time == AV_NOPTS_VALUE)
st->start_time = pts;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment