Mercurial > libavcodec.hg
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; |