diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-09-26 22:54:57 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-09-26 22:58:02 +0200 |
commit | 2e4ec8947d954f1d00e724c520920499397b8ef7 (patch) | |
tree | 5ec18159e941a75064e7edf57a0ae5bcc5037cde /libavformat/utils.c | |
parent | a8e3815db5095fc52b9bd8637fc19cb638bd3aad (diff) | |
download | ffmpeg-2e4ec8947d954f1d00e724c520920499397b8ef7.tar.gz |
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: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index 83b2d269f8..05c4b7f5cc 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -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; |