Mercurial > libavcodec.hg
comparison mpegvideo_enc.c @ 9638:cbd09311872d libavcodec
Fix VBV delay for mpeg1/2 CBR.
author | michael |
---|---|
date | Thu, 14 May 2009 03:37:58 +0000 |
parents | 483ba97736f8 |
children | cc0380d2bbc3 |
comparison
equal
deleted
inserted
replaced
9637:f1dc62781766 | 9638:cbd09311872d |
---|---|
1303 } | 1303 } |
1304 | 1304 |
1305 /* update mpeg1/2 vbv_delay for CBR */ | 1305 /* update mpeg1/2 vbv_delay for CBR */ |
1306 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1 | 1306 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1 |
1307 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){ | 1307 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){ |
1308 int vbv_delay; | 1308 int vbv_delay, min_delay; |
1309 double inbits = s->avctx->rc_max_rate*av_q2d(s->avctx->time_base); | |
1310 int minbits= s->frame_bits - 8*(s->vbv_delay_ptr - s->pb.buf - 1); | |
1311 double bits = s->rc_context.buffer_index + minbits - inbits; | |
1312 | |
1313 if(bits<0) | |
1314 av_log(s->avctx, AV_LOG_ERROR, "Internal error, negative bits\n"); | |
1309 | 1315 |
1310 assert(s->repeat_first_field==0); | 1316 assert(s->repeat_first_field==0); |
1311 | 1317 |
1312 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate); | 1318 vbv_delay= bits * 90000 / s->avctx->rc_max_rate; |
1319 min_delay= (minbits * 90000LL + s->avctx->rc_max_rate - 1)/ s->avctx->rc_max_rate; | |
1320 | |
1321 vbv_delay= FFMAX(vbv_delay, min_delay); | |
1322 | |
1313 assert(vbv_delay < 0xFFFF); | 1323 assert(vbv_delay < 0xFFFF); |
1314 | 1324 |
1315 s->vbv_delay_ptr[0] &= 0xF8; | 1325 s->vbv_delay_ptr[0] &= 0xF8; |
1316 s->vbv_delay_ptr[0] |= vbv_delay>>13; | 1326 s->vbv_delay_ptr[0] |= vbv_delay>>13; |
1317 s->vbv_delay_ptr[1] = vbv_delay>>5; | 1327 s->vbv_delay_ptr[1] = vbv_delay>>5; |