From bc28882399409e6baae0e2789f544f32b2bf3da7 Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 14 May 2009 03:37:58 +0000 Subject: [PATCH] Fix VBV delay for mpeg1/2 CBR. git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18820 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b --- libavcodec/mpegvideo_enc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index fbabd0685..ec291bf5d 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1305,11 +1305,21 @@ vbv_retry: /* update mpeg1/2 vbv_delay for CBR */ if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){ - int vbv_delay; + int vbv_delay, min_delay; + double inbits = s->avctx->rc_max_rate*av_q2d(s->avctx->time_base); + int minbits= s->frame_bits - 8*(s->vbv_delay_ptr - s->pb.buf - 1); + double bits = s->rc_context.buffer_index + minbits - inbits; + + if(bits<0) + av_log(s->avctx, AV_LOG_ERROR, "Internal error, negative bits\n"); assert(s->repeat_first_field==0); - vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate); + vbv_delay= bits * 90000 / s->avctx->rc_max_rate; + min_delay= (minbits * 90000LL + s->avctx->rc_max_rate - 1)/ s->avctx->rc_max_rate; + + vbv_delay= FFMAX(vbv_delay, min_delay); + assert(vbv_delay < 0xFFFF); s->vbv_delay_ptr[0] &= 0xF8; -- 2.39.2