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