diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-26 17:56:52 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-26 17:56:52 +0200 |
commit | c76a5365bbe3832bd0e36025416d034a6b1eaae4 (patch) | |
tree | 164c75f397cf83787837043360cf4354b3245b28 | |
parent | 9b1fdb1c5ae3916d8796f7b96377ba20e18dbd47 (diff) | |
download | ffmpeg-c76a5365bbe3832bd0e36025416d034a6b1eaae4.tar.gz |
ffmpeg: Fix rounding errors in decoded_frame->pts computation
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | ffmpeg.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -2389,6 +2389,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) AVFrame *decoded_frame; AVCodecContext *avctx = ist->st->codec; int i, ret, resample_changed; + AVRational decoded_frame_tb; if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame())) return AVERROR(ENOMEM); @@ -2420,14 +2421,19 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) the decoder could be delaying output by a packet or more. */ if (decoded_frame->pts != AV_NOPTS_VALUE) { ist->dts = ist->next_dts = ist->pts = ist->next_pts = av_rescale_q(decoded_frame->pts, avctx->time_base, AV_TIME_BASE_Q); + decoded_frame_tb = avctx->time_base; } else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) { decoded_frame->pts = decoded_frame->pkt_pts; pkt->pts = AV_NOPTS_VALUE; + decoded_frame_tb = ist->st->time_base; } else if (pkt->pts != AV_NOPTS_VALUE) { decoded_frame->pts = pkt->pts; pkt->pts = AV_NOPTS_VALUE; - }else - decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base); + decoded_frame_tb = ist->st->time_base; + }else { + decoded_frame->pts = ist->dts; + decoded_frame_tb = AV_TIME_BASE_Q; + } #if 1 @@ -2494,7 +2500,7 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) if (decoded_frame->pts != AV_NOPTS_VALUE) decoded_frame->pts = av_rescale_q(decoded_frame->pts, - ist->st->time_base, + decoded_frame_tb, (AVRational){1, ist->st->codec->sample_rate}); for (i = 0; i < ist->nb_filters; i++) av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0); |