summaryrefslogtreecommitdiff
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-07-26 17:56:52 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-07-26 17:56:52 +0200
commitc76a5365bbe3832bd0e36025416d034a6b1eaae4 (patch)
tree164c75f397cf83787837043360cf4354b3245b28 /ffmpeg.c
parent9b1fdb1c5ae3916d8796f7b96377ba20e18dbd47 (diff)
downloadffmpeg-c76a5365bbe3832bd0e36025416d034a6b1eaae4.tar.gz
ffmpeg: Fix rounding errors in decoded_frame->pts computation
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index b2dc463673..6f03b9308e 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -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);