r125: This commit was manufactured by cvs2svn to create tag 'r1_1_7-last'.
[cinelerra_cv/mob.git] / hvirtual / quicktime / libavcodec / ratecontrol.c
blob6be99cc4d0ced3ea768122fbbcd49936972ade1c
1 /*
2 * Rate control for video encoders
4 * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include <math.h>
21 #include "common.h"
22 #include "avcodec.h"
23 #include "dsputil.h"
24 #include "mpegvideo.h"
26 #undef NDEBUG // allways check asserts, the speed effect is far too small to disable them
27 #include <assert.h>
29 #ifndef M_PI
30 #define M_PI 3.14159265358979323846
31 #endif
33 #ifndef M_E
34 #define M_E 2.718281828
35 #endif
37 static int init_pass2(MpegEncContext *s);
38 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
40 void ff_write_pass1_stats(MpegEncContext *s){
41 sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n",
42 s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type,
43 s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits,
44 s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count);
47 int ff_rate_control_init(MpegEncContext *s)
49 RateControlContext *rcc= &s->rc_context;
50 int i;
51 emms_c();
53 for(i=0; i<5; i++){
54 rcc->pred[i].coeff= 7.0;
55 rcc->pred[i].count= 1.0;
57 rcc->pred[i].decay= 0.4;
58 rcc->i_cplx_sum [i]=
59 rcc->p_cplx_sum [i]=
60 rcc->mv_bits_sum[i]=
61 rcc->qscale_sum [i]=
62 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
63 rcc->last_qscale_for[i]=5;
65 rcc->buffer_index= s->avctx->rc_buffer_size/2;
67 if(s->flags&CODEC_FLAG_PASS2){
68 int i;
69 char *p;
71 /* find number of pics */
72 p= s->avctx->stats_in;
73 for(i=-1; p; i++){
74 p= strchr(p+1, ';');
76 i+= s->max_b_frames;
77 rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
78 rcc->num_entries= i;
80 /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */
81 for(i=0; i<rcc->num_entries; i++){
82 RateControlEntry *rce= &rcc->entry[i];
83 rce->pict_type= rce->new_pict_type=P_TYPE;
84 rce->qscale= rce->new_qscale=2;
85 rce->misc_bits= s->mb_num + 10;
86 rce->mb_var_sum= s->mb_num*100;
89 /* read stats */
90 p= s->avctx->stats_in;
91 for(i=0; i<rcc->num_entries - s->max_b_frames; i++){
92 RateControlEntry *rce;
93 int picture_number;
94 int e;
95 char *next;
97 next= strchr(p, ';');
98 if(next){
99 (*next)=0; //sscanf in unbelieavle slow on looong strings //FIXME copy / dont write
100 next++;
102 e= sscanf(p, " in:%d ", &picture_number);
104 assert(picture_number >= 0);
105 assert(picture_number < rcc->num_entries);
106 rce= &rcc->entry[picture_number];
108 e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d",
109 &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits,
110 &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count);
111 if(e!=12){
112 fprintf(stderr, "statistics are damaged at line %d, parser out=%d\n", i, e);
113 return -1;
115 p= next;
118 if(init_pass2(s) < 0) return -1;
121 if(!(s->flags&CODEC_FLAG_PASS2)){
123 rcc->short_term_qsum=0.001;
124 rcc->short_term_qcount=0.001;
126 rcc->pass1_rc_eq_output_sum= 0.001;
127 rcc->pass1_wanted_bits=0.001;
129 /* init stuff with the user specified complexity */
130 if(s->avctx->rc_initial_cplx){
131 for(i=0; i<60*30; i++){
132 double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num;
133 RateControlEntry rce;
134 double q;
136 if (i%((s->gop_size+3)/4)==0) rce.pict_type= I_TYPE;
137 else if(i%(s->max_b_frames+1)) rce.pict_type= B_TYPE;
138 else rce.pict_type= P_TYPE;
140 rce.new_pict_type= rce.pict_type;
141 rce.mc_mb_var_sum= bits*s->mb_num/100000;
142 rce.mb_var_sum = s->mb_num;
143 rce.qscale = 2;
144 rce.f_code = 2;
145 rce.b_code = 1;
146 rce.misc_bits= 1;
148 if(s->pict_type== I_TYPE){
149 rce.i_count = s->mb_num;
150 rce.i_tex_bits= bits;
151 rce.p_tex_bits= 0;
152 rce.mv_bits= 0;
153 }else{
154 rce.i_count = 0; //FIXME we do know this approx
155 rce.i_tex_bits= 0;
156 rce.p_tex_bits= bits*0.9;
157 rce.mv_bits= bits*0.1;
159 rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale;
160 rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale;
161 rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits;
162 rcc->frame_count[rce.pict_type] ++;
164 bits= rce.i_tex_bits + rce.p_tex_bits;
166 q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i);
167 rcc->pass1_wanted_bits+= s->bit_rate/(s->frame_rate / (double)FRAME_RATE_BASE);
173 return 0;
176 void ff_rate_control_uninit(MpegEncContext *s)
178 RateControlContext *rcc= &s->rc_context;
179 emms_c();
181 av_freep(&rcc->entry);
184 static inline double qp2bits(RateControlEntry *rce, double qp){
185 if(qp<=0.0){
186 fprintf(stderr, "qp<=0.0\n");
188 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ qp;
191 static inline double bits2qp(RateControlEntry *rce, double bits){
192 if(bits<0.9){
193 fprintf(stderr, "bits<0.9\n");
195 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
198 static void update_rc_buffer(MpegEncContext *s, int frame_size){
199 RateControlContext *rcc= &s->rc_context;
200 const double fps= (double)s->frame_rate / FRAME_RATE_BASE;
201 const double buffer_size= s->avctx->rc_buffer_size;
202 const double min_rate= s->avctx->rc_min_rate/fps;
203 const double max_rate= s->avctx->rc_max_rate/fps;
205 if(buffer_size){
206 rcc->buffer_index-= frame_size;
207 if(rcc->buffer_index < buffer_size/2 /*FIXME /2 */ || min_rate==0){
208 rcc->buffer_index+= max_rate;
209 if(rcc->buffer_index >= buffer_size)
210 rcc->buffer_index= buffer_size-1;
211 }else{
212 rcc->buffer_index+= min_rate;
215 if(rcc->buffer_index < 0)
216 fprintf(stderr, "rc buffer underflow\n");
217 if(rcc->buffer_index >= s->avctx->rc_buffer_size)
218 fprintf(stderr, "rc buffer overflow\n");
223 * modifies the bitrate curve from pass1 for one frame
225 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){
226 RateControlContext *rcc= &s->rc_context;
227 double q, bits;
228 const int pict_type= rce->new_pict_type;
229 const double mb_num= s->mb_num;
230 int i;
232 double const_values[]={
233 M_PI,
234 M_E,
235 rce->i_tex_bits*rce->qscale,
236 rce->p_tex_bits*rce->qscale,
237 (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale,
238 rce->mv_bits/mb_num,
239 rce->pict_type == B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code,
240 rce->i_count/mb_num,
241 rce->mc_mb_var_sum/mb_num,
242 rce->mb_var_sum/mb_num,
243 rce->pict_type == I_TYPE,
244 rce->pict_type == P_TYPE,
245 rce->pict_type == B_TYPE,
246 rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type],
247 s->qcompress,
248 /* rcc->last_qscale_for[I_TYPE],
249 rcc->last_qscale_for[P_TYPE],
250 rcc->last_qscale_for[B_TYPE],
251 rcc->next_non_b_qscale,*/
252 rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE],
253 rcc->i_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
254 rcc->p_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
255 rcc->p_cplx_sum[B_TYPE] / (double)rcc->frame_count[B_TYPE],
256 (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type],
259 char *const_names[]={
260 "PI",
261 "E",
262 "iTex",
263 "pTex",
264 "tex",
265 "mv",
266 "fCode",
267 "iCount",
268 "mcVar",
269 "var",
270 "isI",
271 "isP",
272 "isB",
273 "avgQP",
274 "qComp",
275 /* "lastIQP",
276 "lastPQP",
277 "lastBQP",
278 "nextNonBQP",*/
279 "avgIITex",
280 "avgPITex",
281 "avgPPTex",
282 "avgBPTex",
283 "avgTex",
284 NULL
286 static double (*func1[])(void *, double)={
287 (void *)bits2qp,
288 (void *)qp2bits,
289 NULL
291 char *func1_names[]={
292 "bits2qp",
293 "qp2bits",
294 NULL
297 bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
299 rcc->pass1_rc_eq_output_sum+= bits;
300 bits*=rate_factor;
301 if(bits<0.0) bits=0.0;
302 bits+= 1.0; //avoid 1/0 issues
304 /* user override */
305 for(i=0; i<s->avctx->rc_override_count; i++){
306 RcOverride *rco= s->avctx->rc_override;
307 if(rco[i].start_frame > frame_num) continue;
308 if(rco[i].end_frame < frame_num) continue;
310 if(rco[i].qscale)
311 bits= qp2bits(rce, rco[i].qscale); //FIXME move at end to really force it?
312 else
313 bits*= rco[i].quality_factor;
316 q= bits2qp(rce, bits);
318 /* I/B difference */
319 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0)
320 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
321 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0)
322 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
324 return q;
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];
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;
339 /* last qscale / qdiff stuff */
340 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
341 double last_q= rcc->last_qscale_for[pict_type];
343 if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff;
344 else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff;
347 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
349 if(pict_type!=B_TYPE)
350 rcc->last_non_b_pict_type= pict_type;
352 return q;
356 * gets the qmin & qmax for pict_type
358 static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
359 int qmin= s->qmin;
360 int qmax= s->qmax;
362 if(pict_type==B_TYPE){
363 qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
364 qmax= (int)(qmax*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
365 }else if(pict_type==I_TYPE){
366 qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
367 qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
370 if(qmin<1) qmin=1;
371 if(qmin==1 && s->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1
373 if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems
375 if(qmax>31) qmax=31;
376 if(qmax<=qmin) qmax= qmin= (qmax+qmin+1)>>1;
378 *qmin_ret= qmin;
379 *qmax_ret= qmax;
382 static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
383 RateControlContext *rcc= &s->rc_context;
384 int qmin, qmax;
385 double bits;
386 const int pict_type= rce->new_pict_type;
387 const double buffer_size= s->avctx->rc_buffer_size;
388 const double min_rate= s->avctx->rc_min_rate;
389 const double max_rate= s->avctx->rc_max_rate;
391 get_qminmax(&qmin, &qmax, s, pict_type);
393 /* modulation */
394 if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
395 q*= s->avctx->rc_qmod_amp;
397 bits= qp2bits(rce, q);
398 //printf("q:%f\n", q);
399 /* buffer overflow/underflow protection */
400 if(buffer_size){
401 double expected_size= rcc->buffer_index;
403 if(min_rate){
404 double d= 2*(buffer_size - expected_size)/buffer_size;
405 if(d>1.0) d=1.0;
406 else if(d<0.0001) d=0.0001;
407 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
409 q= FFMIN(q, bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*2, 1)));
412 if(max_rate){
413 double d= 2*expected_size/buffer_size;
414 if(d>1.0) d=1.0;
415 else if(d<0.0001) d=0.0001;
416 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
418 q= FFMAX(q, bits2qp(rce, FFMAX(rcc->buffer_index/2, 1)));
421 //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);
422 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
423 if (q<qmin) q=qmin;
424 else if(q>qmax) q=qmax;
425 }else{
426 double min2= log(qmin);
427 double max2= log(qmax);
429 q= log(q);
430 q= (q - min2)/(max2-min2) - 0.5;
431 q*= -4.0;
432 q= 1.0/(1.0 + exp(q));
433 q= q*(max2-min2) + min2;
435 q= exp(q);
438 return q;
441 //----------------------------------
442 // 1 Pass Code
444 static double predict_size(Predictor *p, double q, double var)
446 return p->coeff*var / (q*p->count);
449 static double predict_qp(Predictor *p, double size, double var)
451 //printf("coeff:%f, count:%f, var:%f, size:%f//\n", p->coeff, p->count, var, size);
452 return p->coeff*var / (size*p->count);
455 static void update_predictor(Predictor *p, double q, double var, double size)
457 double new_coeff= size*q / (var + 1);
458 if(var<10) return;
460 p->count*= p->decay;
461 p->coeff*= p->decay;
462 p->count++;
463 p->coeff+= new_coeff;
466 static void adaptive_quantization(MpegEncContext *s, double q){
467 int i;
468 const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);
469 const float dark_masking= s->avctx->dark_masking / (128.0*128.0);
470 const float temp_cplx_masking= s->avctx->temporal_cplx_masking;
471 const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;
472 const float p_masking = s->avctx->p_masking;
473 float bits_sum= 0.0;
474 float cplx_sum= 0.0;
475 float cplx_tab[s->mb_num];
476 float bits_tab[s->mb_num];
477 const int qmin= s->avctx->mb_qmin;
478 const int qmax= s->avctx->mb_qmax;
479 Picture * const pic= &s->current_picture;
481 for(i=0; i<s->mb_num; i++){
482 float temp_cplx= sqrt(pic->mc_mb_var[i]);
483 float spat_cplx= sqrt(pic->mb_var[i]);
484 const int lumi= pic->mb_mean[i];
485 float bits, cplx, factor;
487 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
488 if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune
490 if((s->mb_type[i]&MB_TYPE_INTRA)){//FIXME hq mode
491 cplx= spat_cplx;
492 factor= 1.0 + p_masking;
493 }else{
494 cplx= temp_cplx;
495 factor= pow(temp_cplx, - temp_cplx_masking);
497 factor*=pow(spat_cplx, - spatial_cplx_masking);
499 if(lumi>127)
500 factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
501 else
502 factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
504 if(factor<0.00001) factor= 0.00001;
506 bits= cplx*factor;
507 cplx_sum+= cplx;
508 bits_sum+= bits;
509 cplx_tab[i]= cplx;
510 bits_tab[i]= bits;
513 /* handle qmin/qmax cliping */
514 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
515 for(i=0; i<s->mb_num; i++){
516 float newq= q*cplx_tab[i]/bits_tab[i];
517 newq*= bits_sum/cplx_sum;
519 if (newq > qmax){
520 bits_sum -= bits_tab[i];
521 cplx_sum -= cplx_tab[i]*q/qmax;
523 else if(newq < qmin){
524 bits_sum -= bits_tab[i];
525 cplx_sum -= cplx_tab[i]*q/qmin;
530 for(i=0; i<s->mb_num; i++){
531 float newq= q*cplx_tab[i]/bits_tab[i];
532 int intq;
534 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
535 newq*= bits_sum/cplx_sum;
538 if(i && ABS(pic->qscale_table[i-1] - newq)<0.75)
539 intq= pic->qscale_table[i-1];
540 else
541 intq= (int)(newq + 0.5);
543 if (intq > qmax) intq= qmax;
544 else if(intq < qmin) intq= qmin;
545 //if(i%s->mb_width==0) printf("\n");
546 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
547 pic->qscale_table[i]= intq;
551 float ff_rate_estimate_qscale(MpegEncContext *s)
553 float q;
554 int qmin, qmax;
555 float br_compensation;
556 double diff;
557 double short_term_q;
558 double fps;
559 int picture_number= s->picture_number;
560 int64_t wanted_bits;
561 RateControlContext *rcc= &s->rc_context;
562 RateControlEntry local_rce, *rce;
563 double bits;
564 double rate_factor;
565 int var;
566 const int pict_type= s->pict_type;
567 Picture * const pic= &s->current_picture;
568 emms_c();
570 get_qminmax(&qmin, &qmax, s, pict_type);
572 fps= (double)s->frame_rate / FRAME_RATE_BASE;
573 //printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
574 /* update predictors */
575 if(picture_number>2){
576 const int last_var= s->last_pict_type == I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum;
577 update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits);
580 if(s->flags&CODEC_FLAG_PASS2){
581 assert(picture_number>=0);
582 assert(picture_number<rcc->num_entries);
583 rce= &rcc->entry[picture_number];
584 wanted_bits= rce->expected_bits;
585 }else{
586 rce= &local_rce;
587 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
590 diff= s->total_bits - wanted_bits;
591 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
592 if(br_compensation<=0.0) br_compensation=0.001;
594 var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
596 if(s->flags&CODEC_FLAG_PASS2){
597 if(pict_type!=I_TYPE)
598 assert(pict_type == rce->new_pict_type);
600 q= rce->new_qscale / br_compensation;
601 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type);
602 }else{
603 rce->pict_type=
604 rce->new_pict_type= pict_type;
605 rce->mc_mb_var_sum= pic->mc_mb_var_sum;
606 rce->mb_var_sum = pic-> mb_var_sum;
607 rce->qscale = 2;
608 rce->f_code = s->f_code;
609 rce->b_code = s->b_code;
610 rce->misc_bits= 1;
612 if(picture_number>0)
613 update_rc_buffer(s, s->frame_bits);
615 bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var));
616 if(pict_type== I_TYPE){
617 rce->i_count = s->mb_num;
618 rce->i_tex_bits= bits;
619 rce->p_tex_bits= 0;
620 rce->mv_bits= 0;
621 }else{
622 rce->i_count = 0; //FIXME we do know this approx
623 rce->i_tex_bits= 0;
624 rce->p_tex_bits= bits*0.9;
626 rce->mv_bits= bits*0.1;
628 rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale;
629 rcc->p_cplx_sum [pict_type] += rce->p_tex_bits*rce->qscale;
630 rcc->mv_bits_sum[pict_type] += rce->mv_bits;
631 rcc->frame_count[pict_type] ++;
633 bits= rce->i_tex_bits + rce->p_tex_bits;
634 rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
636 q= get_qscale(s, rce, rate_factor, picture_number);
638 assert(q>0.0);
639 //printf("%f ", q);
640 q= get_diff_limited_q(s, rce, q);
641 //printf("%f ", q);
642 assert(q>0.0);
644 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass
645 rcc->short_term_qsum*=s->qblur;
646 rcc->short_term_qcount*=s->qblur;
648 rcc->short_term_qsum+= q;
649 rcc->short_term_qcount++;
650 //printf("%f ", q);
651 q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount;
652 //printf("%f ", q);
654 assert(q>0.0);
656 q= modify_qscale(s, rce, q, picture_number);
658 rcc->pass1_wanted_bits+= s->bit_rate/fps;
660 assert(q>0.0);
663 if(s->avctx->debug&FF_DEBUG_RC){
664 printf("%c qp:%d<%2.1f<%d %d want:%d total:%d comp:%f st_q:%2.2f size:%d var:%d/%d br:%d fps:%d\n",
665 ff_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
666 br_compensation, short_term_q, s->frame_bits, pic->mb_var_sum, pic->mc_mb_var_sum, s->bit_rate/1000, (int)fps
670 if (q<qmin) q=qmin;
671 else if(q>qmax) q=qmax;
673 if(s->adaptive_quant)
674 adaptive_quantization(s, q);
675 else
676 q= (int)(q + 0.5);
678 rcc->last_qscale= q;
679 rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum;
680 rcc->last_mb_var_sum= pic->mb_var_sum;
681 #if 0
683 static int mvsum=0, texsum=0;
684 mvsum += s->mv_bits;
685 texsum += s->i_tex_bits + s->p_tex_bits;
686 printf("%d %d//\n\n", mvsum, texsum);
688 #endif
689 return q;
692 //----------------------------------------------
693 // 2-Pass code
695 static int init_pass2(MpegEncContext *s)
697 RateControlContext *rcc= &s->rc_context;
698 int i;
699 double fps= (double)s->frame_rate / FRAME_RATE_BASE;
700 double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1
701 double avg_quantizer[5];
702 uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
703 uint64_t available_bits[5];
704 uint64_t all_const_bits;
705 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
706 double rate_factor=0;
707 double step;
708 int last_i_frame=-10000000;
709 const int filter_size= (int)(s->qblur*4) | 1;
710 double expected_bits;
711 double *qscale, *blured_qscale;
713 /* find complexity & const_bits & decide the pict_types */
714 for(i=0; i<rcc->num_entries; i++){
715 RateControlEntry *rce= &rcc->entry[i];
717 rce->new_pict_type= rce->pict_type;
718 rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale;
719 rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale;
720 rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits;
721 rcc->frame_count[rce->pict_type] ++;
723 complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale;
724 const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits;
726 all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE];
728 if(all_available_bits < all_const_bits){
729 fprintf(stderr, "requested bitrate is to low\n");
730 return -1;
733 /* find average quantizers */
734 avg_quantizer[P_TYPE]=0;
735 for(step=256*256; step>0.0000001; step*=0.5){
736 double expected_bits=0;
737 avg_quantizer[P_TYPE]+= step;
739 avg_quantizer[I_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset;
740 avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
742 expected_bits=
743 + all_const_bits
744 + complexity[I_TYPE]/avg_quantizer[I_TYPE]
745 + complexity[P_TYPE]/avg_quantizer[P_TYPE]
746 + complexity[B_TYPE]/avg_quantizer[B_TYPE];
748 if(expected_bits < all_available_bits) avg_quantizer[P_TYPE]-= step;
749 //printf("%f %lld %f\n", expected_bits, all_available_bits, avg_quantizer[P_TYPE]);
751 //printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
753 for(i=0; i<5; i++){
754 available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i];
756 //printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits);
758 qscale= malloc(sizeof(double)*rcc->num_entries);
759 blured_qscale= malloc(sizeof(double)*rcc->num_entries);
761 for(step=256*256; step>0.0000001; step*=0.5){
762 expected_bits=0;
763 rate_factor+= step;
765 rcc->buffer_index= s->avctx->rc_buffer_size/2;
767 /* find qscale */
768 for(i=0; i<rcc->num_entries; i++){
769 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i);
771 assert(filter_size%2==1);
773 /* fixed I/B QP relative to P mode */
774 for(i=rcc->num_entries-1; i>=0; i--){
775 RateControlEntry *rce= &rcc->entry[i];
777 qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
780 /* smooth curve */
781 for(i=0; i<rcc->num_entries; i++){
782 RateControlEntry *rce= &rcc->entry[i];
783 const int pict_type= rce->new_pict_type;
784 int j;
785 double q=0.0, sum=0.0;
787 for(j=0; j<filter_size; j++){
788 int index= i+j-filter_size/2;
789 double d= index-i;
790 double coeff= s->qblur==0 ? 1.0 : exp(-d*d/(s->qblur * s->qblur));
792 if(index < 0 || index >= rcc->num_entries) continue;
793 if(pict_type != rcc->entry[index].new_pict_type) continue;
794 q+= qscale[index] * coeff;
795 sum+= coeff;
797 blured_qscale[i]= q/sum;
800 /* find expected bits */
801 for(i=0; i<rcc->num_entries; i++){
802 RateControlEntry *rce= &rcc->entry[i];
803 double bits;
804 rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
805 bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
806 //printf("%d %f\n", rce->new_bits, blured_qscale[i]);
807 update_rc_buffer(s, bits);
809 rce->expected_bits= expected_bits;
810 expected_bits += bits;
813 // printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
814 if(expected_bits > all_available_bits) rate_factor-= step;
816 free(qscale);
817 free(blured_qscale);
819 if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
820 fprintf(stderr, "Error: 2pass curve failed to converge\n");
821 return -1;
824 return 0;