comparison ratecontrol.c @ 1687:cdc3d4106fb6 libavcodec

cleanup
author michael
date Sat, 13 Dec 2003 20:41:33 +0000
parents 19e781619e3f
children f3287b5d8d9f
comparison
equal deleted inserted replaced
1686:68abbec33289 1687:cdc3d4106fb6
234 /** 234 /**
235 * modifies the bitrate curve from pass1 for one frame 235 * modifies the bitrate curve from pass1 for one frame
236 */ 236 */
237 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){ 237 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){
238 RateControlContext *rcc= &s->rc_context; 238 RateControlContext *rcc= &s->rc_context;
239 AVCodecContext *a= s->avctx;
239 double q, bits; 240 double q, bits;
240 const int pict_type= rce->new_pict_type; 241 const int pict_type= rce->new_pict_type;
241 const double mb_num= s->mb_num; 242 const double mb_num= s->mb_num;
242 int i; 243 int i;
243 244
254 rce->mb_var_sum/mb_num, 255 rce->mb_var_sum/mb_num,
255 rce->pict_type == I_TYPE, 256 rce->pict_type == I_TYPE,
256 rce->pict_type == P_TYPE, 257 rce->pict_type == P_TYPE,
257 rce->pict_type == B_TYPE, 258 rce->pict_type == B_TYPE,
258 rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type], 259 rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type],
259 s->qcompress, 260 a->qcompress,
260 /* rcc->last_qscale_for[I_TYPE], 261 /* rcc->last_qscale_for[I_TYPE],
261 rcc->last_qscale_for[P_TYPE], 262 rcc->last_qscale_for[P_TYPE],
262 rcc->last_qscale_for[B_TYPE], 263 rcc->last_qscale_for[B_TYPE],
263 rcc->next_non_b_qscale,*/ 264 rcc->next_non_b_qscale,*/
264 rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE], 265 rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE],
575 double short_term_q; 576 double short_term_q;
576 double fps; 577 double fps;
577 int picture_number= s->picture_number; 578 int picture_number= s->picture_number;
578 int64_t wanted_bits; 579 int64_t wanted_bits;
579 RateControlContext *rcc= &s->rc_context; 580 RateControlContext *rcc= &s->rc_context;
581 AVCodecContext *a= s->avctx;
580 RateControlEntry local_rce, *rce; 582 RateControlEntry local_rce, *rce;
581 double bits; 583 double bits;
582 double rate_factor; 584 double rate_factor;
583 int var; 585 int var;
584 const int pict_type= s->pict_type; 586 const int pict_type= s->pict_type;
604 rce= &local_rce; 606 rce= &local_rce;
605 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); 607 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
606 } 608 }
607 609
608 diff= s->total_bits - wanted_bits; 610 diff= s->total_bits - wanted_bits;
609 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance; 611 br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
610 if(br_compensation<=0.0) br_compensation=0.001; 612 if(br_compensation<=0.0) br_compensation=0.001;
611 613
612 var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum; 614 var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
613 615
614 short_term_q = 0; /* avoid warning */ 616 short_term_q = 0; /* avoid warning */
656 q= get_diff_limited_q(s, rce, q); 658 q= get_diff_limited_q(s, rce, q);
657 //printf("%f ", q); 659 //printf("%f ", q);
658 assert(q>0.0); 660 assert(q>0.0);
659 661
660 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass 662 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass
661 rcc->short_term_qsum*=s->qblur; 663 rcc->short_term_qsum*=a->qblur;
662 rcc->short_term_qcount*=s->qblur; 664 rcc->short_term_qcount*=a->qblur;
663 665
664 rcc->short_term_qsum+= q; 666 rcc->short_term_qsum+= q;
665 rcc->short_term_qcount++; 667 rcc->short_term_qcount++;
666 //printf("%f ", q); 668 //printf("%f ", q);
667 q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount; 669 q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount;
709 // 2-Pass code 711 // 2-Pass code
710 712
711 static int init_pass2(MpegEncContext *s) 713 static int init_pass2(MpegEncContext *s)
712 { 714 {
713 RateControlContext *rcc= &s->rc_context; 715 RateControlContext *rcc= &s->rc_context;
716 AVCodecContext *a= s->avctx;
714 int i; 717 int i;
715 double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; 718 double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
716 double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1 719 double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1
717 double avg_quantizer[5]; 720 double avg_quantizer[5];
718 uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits 721 uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
720 uint64_t all_const_bits; 723 uint64_t all_const_bits;
721 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps); 724 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
722 double rate_factor=0; 725 double rate_factor=0;
723 double step; 726 double step;
724 //int last_i_frame=-10000000; 727 //int last_i_frame=-10000000;
725 const int filter_size= (int)(s->qblur*4) | 1; 728 const int filter_size= (int)(a->qblur*4) | 1;
726 double expected_bits; 729 double expected_bits;
727 double *qscale, *blured_qscale; 730 double *qscale, *blured_qscale;
728 731
729 /* find complexity & const_bits & decide the pict_types */ 732 /* find complexity & const_bits & decide the pict_types */
730 for(i=0; i<rcc->num_entries; i++){ 733 for(i=0; i<rcc->num_entries; i++){
801 double q=0.0, sum=0.0; 804 double q=0.0, sum=0.0;
802 805
803 for(j=0; j<filter_size; j++){ 806 for(j=0; j<filter_size; j++){
804 int index= i+j-filter_size/2; 807 int index= i+j-filter_size/2;
805 double d= index-i; 808 double d= index-i;
806 double coeff= s->qblur==0 ? 1.0 : exp(-d*d/(s->qblur * s->qblur)); 809 double coeff= a->qblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur));
807 810
808 if(index < 0 || index >= rcc->num_entries) continue; 811 if(index < 0 || index >= rcc->num_entries) continue;
809 if(pict_type != rcc->entry[index].new_pict_type) continue; 812 if(pict_type != rcc->entry[index].new_pict_type) continue;
810 q+= qscale[index] * coeff; 813 q+= qscale[index] * coeff;
811 sum+= coeff; 814 sum+= coeff;