Mercurial > libavcodec.hg
comparison ratecontrol.c @ 679:3d2da9b44cd8 libavcodec
better min/max rate handling
cleanup
author | michaelni |
---|---|
date | Wed, 18 Sep 2002 18:28:11 +0000 |
parents | 9c7a661a9fbe |
children | a1c69cb685b3 |
comparison
equal
deleted
inserted
replaced
678:9c7a661a9fbe | 679:3d2da9b44cd8 |
---|---|
62 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such | 62 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such |
63 rcc->last_qscale_for[i]=5; | 63 rcc->last_qscale_for[i]=5; |
64 } | 64 } |
65 rcc->buffer_index= s->avctx->rc_buffer_size/2; | 65 rcc->buffer_index= s->avctx->rc_buffer_size/2; |
66 | 66 |
67 rcc->next_non_b_qscale=10; | |
68 rcc->next_p_qscale=10; | |
69 | |
70 if(s->flags&CODEC_FLAG_PASS2){ | 67 if(s->flags&CODEC_FLAG_PASS2){ |
71 int i; | 68 int i; |
72 char *p; | 69 char *p; |
73 | 70 |
74 /* find number of pics */ | 71 /* find number of pics */ |
229 RateControlContext *rcc= &s->rc_context; | 226 RateControlContext *rcc= &s->rc_context; |
230 double q, bits; | 227 double q, bits; |
231 const int pict_type= rce->new_pict_type; | 228 const int pict_type= rce->new_pict_type; |
232 const double mb_num= s->mb_num; | 229 const double mb_num= s->mb_num; |
233 int i; | 230 int i; |
234 const double last_q= rcc->last_qscale_for[pict_type]; | |
235 | 231 |
236 double const_values[]={ | 232 double const_values[]={ |
237 M_PI, | 233 M_PI, |
238 M_E, | 234 M_E, |
239 rce->i_tex_bits*rce->qscale, | 235 rce->i_tex_bits*rce->qscale, |
322 /* I/B difference */ | 318 /* I/B difference */ |
323 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0) | 319 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0) |
324 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | 320 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; |
325 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0) | 321 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0) |
326 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | 322 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; |
327 | 323 |
324 return q; | |
325 } | |
326 | |
327 static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q){ | |
328 RateControlContext *rcc= &s->rc_context; | |
329 AVCodecContext *a= s->avctx; | |
330 const int pict_type= rce->new_pict_type; | |
331 const double last_p_q = rcc->last_qscale_for[P_TYPE]; | |
332 const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type]; | |
333 | |
334 if (pict_type==I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==P_TYPE)) | |
335 q= last_p_q *ABS(a->i_quant_factor) + a->i_quant_offset; | |
336 else if(pict_type==B_TYPE && a->b_quant_factor>0.0) | |
337 q= last_non_b_q* a->b_quant_factor + a->b_quant_offset; | |
338 | |
328 /* last qscale / qdiff stuff */ | 339 /* last qscale / qdiff stuff */ |
329 if (q > last_q + s->max_qdiff) q= last_q + s->max_qdiff; | 340 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){ |
330 else if(q < last_q - s->max_qdiff) q= last_q - s->max_qdiff; | 341 double last_q= rcc->last_qscale_for[pict_type]; |
342 if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff; | |
343 else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff; | |
344 } | |
331 | 345 |
332 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring | 346 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring |
333 | 347 |
348 if(pict_type!=B_TYPE) | |
349 rcc->last_non_b_pict_type= pict_type; | |
350 | |
334 return q; | 351 return q; |
335 } | 352 } |
336 | 353 |
337 /** | 354 /** |
338 * gets the qmin & qmax for pict_type | 355 * gets the qmin & qmax for pict_type |
378 | 395 |
379 bits= qp2bits(rce, q); | 396 bits= qp2bits(rce, q); |
380 //printf("q:%f\n", q); | 397 //printf("q:%f\n", q); |
381 /* buffer overflow/underflow protection */ | 398 /* buffer overflow/underflow protection */ |
382 if(buffer_size){ | 399 if(buffer_size){ |
383 double expected_size= rcc->buffer_index - bits; | 400 double expected_size= rcc->buffer_index; |
384 | 401 |
385 if(min_rate){ | 402 if(min_rate){ |
386 double d= 2*(buffer_size - (expected_size + min_rate))/buffer_size; | 403 double d= 2*(buffer_size - expected_size)/buffer_size; |
387 if(d>1.0) d=1.0; | 404 if(d>1.0) d=1.0; |
388 else if(d<0.0001) d=0.0001; | 405 else if(d<0.0001) d=0.0001; |
389 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); | 406 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); |
407 | |
408 q= MIN(q, bits2qp(rce, MAX((min_rate - buffer_size + rcc->buffer_index)*2, 1))); | |
390 } | 409 } |
391 | 410 |
392 if(max_rate){ | 411 if(max_rate){ |
393 double d= 2*expected_size/buffer_size; | 412 double d= 2*expected_size/buffer_size; |
394 if(d>1.0) d=1.0; | 413 if(d>1.0) d=1.0; |
395 else if(d<0.0001) d=0.0001; | 414 else if(d<0.0001) d=0.0001; |
396 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); | 415 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); |
416 | |
417 q= MAX(q, bits2qp(rce, MAX(rcc->buffer_index/2, 1))); | |
397 } | 418 } |
398 } | 419 } |
399 //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); | 420 //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); |
400 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ | 421 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ |
401 if (q<qmin) q=qmin; | 422 if (q<qmin) q=qmin; |
527 | 548 |
528 q= get_qscale(s, rce, rate_factor, picture_number); | 549 q= get_qscale(s, rce, rate_factor, picture_number); |
529 | 550 |
530 assert(q>0.0); | 551 assert(q>0.0); |
531 //printf("%f ", q); | 552 //printf("%f ", q); |
532 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0) | 553 q= get_diff_limited_q(s, rce, q); |
533 q= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | |
534 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0) | |
535 q= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | |
536 //printf("%f ", q); | 554 //printf("%f ", q); |
537 assert(q>0.0); | 555 assert(q>0.0); |
538 | 556 |
539 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass | 557 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass |
540 rcc->short_term_qsum*=s->qblur; | 558 rcc->short_term_qsum*=s->qblur; |
551 q= modify_qscale(s, rce, q, picture_number); | 569 q= modify_qscale(s, rce, q, picture_number); |
552 | 570 |
553 rcc->pass1_wanted_bits+= s->bit_rate/fps; | 571 rcc->pass1_wanted_bits+= s->bit_rate/fps; |
554 | 572 |
555 assert(q>0.0); | 573 assert(q>0.0); |
556 | |
557 if(pict_type != B_TYPE) rcc->next_non_b_qscale= q; | |
558 if(pict_type == P_TYPE) rcc->next_p_qscale= q; | |
559 } | 574 } |
560 //printf("qmin:%d, qmax:%d, q:%f\n", qmin, qmax, q); | 575 //printf("qmin:%d, qmax:%d, q:%f\n", qmin, qmax, q); |
561 | 576 |
562 | 577 |
563 if (q<qmin) q=qmin; | 578 if (q<qmin) q=qmin; |
564 else if(q>qmax) q=qmax; | 579 else if(q>qmax) q=qmax; |
565 | 580 |
566 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); | 581 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); |
567 | 582 |
568 | |
569 //printf("%f %f %f\n", q, br_compensation, short_term_q); | 583 //printf("%f %f %f\n", q, br_compensation, short_term_q); |
570 qscale= (int)(q + 0.5); | 584 qscale= (int)(q + 0.5); |
571 //printf("%d ", qscale); | 585 |
572 | 586 //printf("q:%d diff:%d comp:%f st_q:%f last_size:%d type:%d\n", qscale, (int)diff, br_compensation, |
573 //printf("q:%d diff:%d comp:%f st_q:%f last_size:%d\n", qscale, (int)diff, br_compensation, | 587 // short_term_q, s->frame_bits, pict_type); |
574 // short_term_q, s->frame_bits); | |
575 //printf("%d %d\n", s->bit_rate, (int)fps); | 588 //printf("%d %d\n", s->bit_rate, (int)fps); |
576 | 589 |
577 rcc->last_qscale= qscale; | 590 rcc->last_qscale= qscale; |
578 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; | 591 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; |
579 rcc->last_mb_var_sum= s->mb_var_sum; | 592 rcc->last_mb_var_sum= s->mb_var_sum; |
691 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); | 704 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); |
692 } | 705 } |
693 assert(filter_size%2==1); | 706 assert(filter_size%2==1); |
694 | 707 |
695 /* fixed I/B QP relative to P mode */ | 708 /* fixed I/B QP relative to P mode */ |
696 rcc->next_non_b_qscale= 10; | |
697 rcc->next_p_qscale= 10; | |
698 for(i=rcc->num_entries-1; i>=0; i--){ | 709 for(i=rcc->num_entries-1; i>=0; i--){ |
699 RateControlEntry *rce= &rcc->entry[i]; | 710 RateControlEntry *rce= &rcc->entry[i]; |
700 const int pict_type= rce->new_pict_type; | 711 |
701 | 712 qscale[i]= get_diff_limited_q(s, rce, qscale[i]); |
702 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0) | |
703 qscale[i]= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | |
704 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0) | |
705 qscale[i]= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | |
706 | |
707 if(pict_type!=B_TYPE) | |
708 rcc->next_non_b_qscale= qscale[i]; | |
709 if(pict_type==P_TYPE) | |
710 rcc->next_p_qscale= qscale[i]; | |
711 } | 713 } |
712 | 714 |
713 /* smooth curve */ | 715 /* smooth curve */ |
714 for(i=0; i<rcc->num_entries; i++){ | 716 for(i=0; i<rcc->num_entries; i++){ |
715 RateControlEntry *rce= &rcc->entry[i]; | 717 RateControlEntry *rce= &rcc->entry[i]; |