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];