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
24 #include "mpegvideo.h"
26 #undef NDEBUG // allways check asserts, the speed effect is far too small to disable them
30 #define M_PI 3.14159265358979323846
34 #define M_E 2.718281828
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
;
54 rcc
->pred
[i
].coeff
= 7.0;
55 rcc
->pred
[i
].count
= 1.0;
57 rcc
->pred
[i
].decay
= 0.4;
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
){
71 /* find number of pics */
72 p
= s
->avctx
->stats_in
;
77 rcc
->entry
= (RateControlEntry
*)av_mallocz(i
*sizeof(RateControlEntry
));
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;
90 p
= s
->avctx
->stats_in
;
91 for(i
=0; i
<rcc
->num_entries
- s
->max_b_frames
; i
++){
92 RateControlEntry
*rce
;
99 (*next
)=0; //sscanf in unbelieavle slow on looong strings //FIXME copy / dont write
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
);
112 fprintf(stderr
, "statistics are damaged at line %d, parser out=%d\n", i
, e
);
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
;
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
;
148 if(s
->pict_type
== I_TYPE
){
149 rce
.i_count
= s
->mb_num
;
150 rce
.i_tex_bits
= bits
;
154 rce
.i_count
= 0; //FIXME we do know this approx
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
);
176 void ff_rate_control_uninit(MpegEncContext
*s
)
178 RateControlContext
*rcc
= &s
->rc_context
;
181 av_freep(&rcc
->entry
);
184 static inline double qp2bits(RateControlEntry
*rce
, double qp
){
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
){
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
;
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;
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
;
228 const int pict_type
= rce
->new_pict_type
;
229 const double mb_num
= s
->mb_num
;
232 double const_values
[]={
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
,
239 rce
->pict_type
== B_TYPE
? (rce
->f_code
+ rce
->b_code
)*0.5 : rce
->f_code
,
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
],
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
[]={
286 static double (*func1
[])(void *, double)={
291 char *func1_names
[]={
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
;
301 if(bits
<0.0) bits
=0.0;
302 bits
+= 1.0; //avoid 1/0 issues
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;
311 bits
= qp2bits(rce
, rco
[i
].qscale
); //FIXME move at end to really force it?
313 bits
*= rco
[i
].quality_factor
;
316 q
= bits2qp(rce
, bits
);
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
;
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
;
356 * gets the qmin & qmax for pict_type
358 static void get_qminmax(int *qmin_ret
, int *qmax_ret
, MpegEncContext
*s
, int pict_type
){
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);
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
376 if(qmax
<=qmin
) qmax
= qmin
= (qmax
+qmin
+1)>>1;
382 static double modify_qscale(MpegEncContext
*s
, RateControlEntry
*rce
, double q
, int frame_num
){
383 RateControlContext
*rcc
= &s
->rc_context
;
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
);
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 */
401 double expected_size
= rcc
->buffer_index
;
404 double d
= 2*(buffer_size
- expected_size
)/buffer_size
;
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)));
413 double d
= 2*expected_size
/buffer_size
;
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
){
424 else if(q
>qmax
) q
=qmax
;
426 double min2
= log(qmin
);
427 double max2
= log(qmax
);
430 q
= (q
- min2
)/(max2
-min2
) - 0.5;
432 q
= 1.0/(1.0 + exp(q
));
433 q
= q
*(max2
-min2
) + min2
;
441 //----------------------------------
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);
463 p
->coeff
+= new_coeff
;
466 static void adaptive_quantization(MpegEncContext
*s
, double q
){
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
;
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
492 factor
= 1.0 + p_masking
;
495 factor
= pow(temp_cplx
, - temp_cplx_masking
);
497 factor
*=pow(spat_cplx
, - spatial_cplx_masking
);
500 factor
*= (1.0 - (lumi
-128)*(lumi
-128)*lumi_masking
);
502 factor
*= (1.0 - (lumi
-128)*(lumi
-128)*dark_masking
);
504 if(factor
<0.00001) factor
= 0.00001;
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
;
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
];
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];
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
)
555 float br_compensation
;
559 int picture_number
= s
->picture_number
;
561 RateControlContext
*rcc
= &s
->rc_context
;
562 RateControlEntry local_rce
, *rce
;
566 const int pict_type
= s
->pict_type
;
567 Picture
* const pic
= &s
->current_picture
;
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
;
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);
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
;
608 rce
->f_code
= s
->f_code
;
609 rce
->b_code
= s
->b_code
;
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
;
622 rce
->i_count
= 0; //FIXME we do know this approx
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
);
640 q
= get_diff_limited_q(s
, rce
, q
);
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
++;
651 q
= short_term_q
= rcc
->short_term_qsum
/rcc
->short_term_qcount
;
656 q
= modify_qscale(s
, rce
, q
, picture_number
);
658 rcc
->pass1_wanted_bits
+= s
->bit_rate
/fps
;
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
671 else if(q
>qmax
) q
=qmax
;
673 if(s
->adaptive_quant
)
674 adaptive_quantization(s
, q
);
679 rcc
->last_mc_mb_var_sum
= pic
->mc_mb_var_sum
;
680 rcc
->last_mb_var_sum
= pic
->mb_var_sum
;
683 static int mvsum
=0, texsum
=0;
685 texsum
+= s
->i_tex_bits
+ s
->p_tex_bits
;
686 printf("%d %d//\n\n", mvsum
, texsum
);
692 //----------------------------------------------
695 static int init_pass2(MpegEncContext
*s
)
697 RateControlContext
*rcc
= &s
->rc_context
;
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;
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");
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
;
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]);
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){
765 rcc
->buffer_index
= s
->avctx
->rc_buffer_size
/2;
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
]);
781 for(i
=0; i
<rcc
->num_entries
; i
++){
782 RateControlEntry
*rce
= &rcc
->entry
[i
];
783 const int pict_type
= rce
->new_pict_type
;
785 double q
=0.0, sum
=0.0;
787 for(j
=0; j
<filter_size
; j
++){
788 int index
= i
+j
-filter_size
/2;
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
;
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
];
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
;
819 if(abs(expected_bits
/all_available_bits
- 1.0) > 0.01 ){
820 fprintf(stderr
, "Error: 2pass curve failed to converge\n");