comparison ratecontrol.c @ 1697:f3287b5d8d9f libavcodec

vbv_delay
author michael
date Wed, 17 Dec 2003 19:53:05 +0000
parents cdc3d4106fb6
children 954593137d37
comparison
equal deleted inserted replaced
1696:f5af91b8be17 1697:f3287b5d8d9f
196 } 196 }
197 197
198 int ff_vbv_update(MpegEncContext *s, int frame_size){ 198 int ff_vbv_update(MpegEncContext *s, int frame_size){
199 RateControlContext *rcc= &s->rc_context; 199 RateControlContext *rcc= &s->rc_context;
200 const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; 200 const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
201 const double buffer_size= s->avctx->rc_buffer_size; 201 const int buffer_size= s->avctx->rc_buffer_size;
202 const double min_rate= s->avctx->rc_min_rate/fps; 202 const double min_rate= s->avctx->rc_min_rate/fps;
203 const double max_rate= s->avctx->rc_max_rate/fps; 203 const double max_rate= s->avctx->rc_max_rate/fps;
204 204
205 //printf("%f %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate); 205 //printf("%d %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate);
206 if(buffer_size){ 206 if(buffer_size){
207 int left; 207 int left;
208 208
209 rcc->buffer_index-= frame_size; 209 rcc->buffer_index-= frame_size;
210 if(rcc->buffer_index < 0){ 210 if(rcc->buffer_index < 0){
213 } 213 }
214 214
215 left= buffer_size - rcc->buffer_index - 1; 215 left= buffer_size - rcc->buffer_index - 1;
216 rcc->buffer_index += clip(left, min_rate, max_rate); 216 rcc->buffer_index += clip(left, min_rate, max_rate);
217 217
218 if(rcc->buffer_index > s->avctx->rc_buffer_size){ 218 if(rcc->buffer_index > buffer_size){
219 int stuffing= ceil((rcc->buffer_index - s->avctx->rc_buffer_size)/8); 219 int stuffing= ceil((rcc->buffer_index - buffer_size)/8);
220 220
221 if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4) 221 if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4)
222 stuffing=4; 222 stuffing=4;
223 rcc->buffer_index -= 8*stuffing; 223 rcc->buffer_index -= 8*stuffing;
224 224
411 bits= qp2bits(rce, q); 411 bits= qp2bits(rce, q);
412 //printf("q:%f\n", q); 412 //printf("q:%f\n", q);
413 /* buffer overflow/underflow protection */ 413 /* buffer overflow/underflow protection */
414 if(buffer_size){ 414 if(buffer_size){
415 double expected_size= rcc->buffer_index; 415 double expected_size= rcc->buffer_index;
416 double q_limit;
416 417
417 if(min_rate){ 418 if(min_rate){
418 double d= 2*(buffer_size - expected_size)/buffer_size; 419 double d= 2*(buffer_size - expected_size)/buffer_size;
419 if(d>1.0) d=1.0; 420 if(d>1.0) d=1.0;
420 else if(d<0.0001) d=0.0001; 421 else if(d<0.0001) d=0.0001;
421 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); 422 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
422 423
423 q= FFMIN(q, bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*3, 1))); 424 q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*3, 1));
425 if(q > q_limit){
426 if(s->avctx->debug&FF_DEBUG_RC){
427 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
428 }
429 q= q_limit;
430 }
424 } 431 }
425 432
426 if(max_rate){ 433 if(max_rate){
427 double d= 2*expected_size/buffer_size; 434 double d= 2*expected_size/buffer_size;
428 if(d>1.0) d=1.0; 435 if(d>1.0) d=1.0;
429 else if(d<0.0001) d=0.0001; 436 else if(d<0.0001) d=0.0001;
430 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); 437 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
431 438
432 q= FFMAX(q, bits2qp(rce, FFMAX(rcc->buffer_index/3, 1))); 439 q_limit= bits2qp(rce, FFMAX(rcc->buffer_index/3, 1));
440 if(q < q_limit){
441 if(s->avctx->debug&FF_DEBUG_RC){
442 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
443 }
444 q= q_limit;
445 }
433 } 446 }
434 } 447 }
435 //printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity); 448 //printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity);
436 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ 449 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
437 if (q<qmin) q=qmin; 450 if (q<qmin) q=qmin;