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
);
450 static double predict_qp(Predictor *p, double size, double var)
452 //printf("coeff:%f, count:%f, var:%f, size:%f//\n", p->coeff, p->count, var, size);
453 return p->coeff*var / (size*p->count);
457 static void update_predictor(Predictor
*p
, double q
, double var
, double size
)
459 double new_coeff
= size
*q
/ (var
+ 1);
465 p
->coeff
+= new_coeff
;
468 static void adaptive_quantization(MpegEncContext
*s
, double q
){
470 const float lumi_masking
= s
->avctx
->lumi_masking
/ (128.0*128.0);
471 const float dark_masking
= s
->avctx
->dark_masking
/ (128.0*128.0);
472 const float temp_cplx_masking
= s
->avctx
->temporal_cplx_masking
;
473 const float spatial_cplx_masking
= s
->avctx
->spatial_cplx_masking
;
474 const float p_masking
= s
->avctx
->p_masking
;
477 float cplx_tab
[s
->mb_num
];
478 float bits_tab
[s
->mb_num
];
479 const int qmin
= s
->avctx
->mb_qmin
;
480 const int qmax
= s
->avctx
->mb_qmax
;
481 Picture
* const pic
= &s
->current_picture
;
483 for(i
=0; i
<s
->mb_num
; i
++){
484 float temp_cplx
= sqrt(pic
->mc_mb_var
[i
]);
485 float spat_cplx
= sqrt(pic
->mb_var
[i
]);
486 const int lumi
= pic
->mb_mean
[i
];
487 float bits
, cplx
, factor
;
489 if(spat_cplx
< q
/3) spat_cplx
= q
/3; //FIXME finetune
490 if(temp_cplx
< q
/3) temp_cplx
= q
/3; //FIXME finetune
492 if((s
->mb_type
[i
]&MB_TYPE_INTRA
)){//FIXME hq mode
494 factor
= 1.0 + p_masking
;
497 factor
= pow(temp_cplx
, - temp_cplx_masking
);
499 factor
*=pow(spat_cplx
, - spatial_cplx_masking
);
502 factor
*= (1.0 - (lumi
-128)*(lumi
-128)*lumi_masking
);
504 factor
*= (1.0 - (lumi
-128)*(lumi
-128)*dark_masking
);
506 if(factor
<0.00001) factor
= 0.00001;
515 /* handle qmin/qmax cliping */
516 if(s
->flags
&CODEC_FLAG_NORMALIZE_AQP
){
517 for(i
=0; i
<s
->mb_num
; i
++){
518 float newq
= q
*cplx_tab
[i
]/bits_tab
[i
];
519 newq
*= bits_sum
/cplx_sum
;
522 bits_sum
-= bits_tab
[i
];
523 cplx_sum
-= cplx_tab
[i
]*q
/qmax
;
525 else if(newq
< qmin
){
526 bits_sum
-= bits_tab
[i
];
527 cplx_sum
-= cplx_tab
[i
]*q
/qmin
;
532 for(i
=0; i
<s
->mb_num
; i
++){
533 float newq
= q
*cplx_tab
[i
]/bits_tab
[i
];
536 if(s
->flags
&CODEC_FLAG_NORMALIZE_AQP
){
537 newq
*= bits_sum
/cplx_sum
;
540 if(i
&& ABS(pic
->qscale_table
[i
-1] - newq
)<0.75)
541 intq
= pic
->qscale_table
[i
-1];
543 intq
= (int)(newq
+ 0.5);
545 if (intq
> qmax
) intq
= qmax
;
546 else if(intq
< qmin
) intq
= qmin
;
547 //if(i%s->mb_width==0) printf("\n");
548 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
549 pic
->qscale_table
[i
]= intq
;
553 float ff_rate_estimate_qscale(MpegEncContext
*s
)
557 float br_compensation
;
561 int picture_number
= s
->picture_number
;
563 RateControlContext
*rcc
= &s
->rc_context
;
564 RateControlEntry local_rce
, *rce
;
568 const int pict_type
= s
->pict_type
;
569 Picture
* const pic
= &s
->current_picture
;
572 get_qminmax(&qmin
, &qmax
, s
, pict_type
);
574 fps
= (double)s
->frame_rate
/ FRAME_RATE_BASE
;
575 //printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
576 /* update predictors */
577 if(picture_number
>2){
578 const int last_var
= s
->last_pict_type
== I_TYPE ? rcc
->last_mb_var_sum
: rcc
->last_mc_mb_var_sum
;
579 update_predictor(&rcc
->pred
[s
->last_pict_type
], rcc
->last_qscale
, sqrt(last_var
), s
->frame_bits
);
582 if(s
->flags
&CODEC_FLAG_PASS2
){
583 assert(picture_number
>=0);
584 assert(picture_number
<rcc
->num_entries
);
585 rce
= &rcc
->entry
[picture_number
];
586 wanted_bits
= rce
->expected_bits
;
589 wanted_bits
= (uint64_t)(s
->bit_rate
*(double)picture_number
/fps
);
592 diff
= s
->total_bits
- wanted_bits
;
593 br_compensation
= (s
->bit_rate_tolerance
- diff
)/s
->bit_rate_tolerance
;
594 if(br_compensation
<=0.0) br_compensation
=0.001;
596 var
= pict_type
== I_TYPE ? pic
->mb_var_sum
: pic
->mc_mb_var_sum
;
598 if(s
->flags
&CODEC_FLAG_PASS2
){
599 if(pict_type
!=I_TYPE
)
600 assert(pict_type
== rce
->new_pict_type
);
602 q
= rce
->new_qscale
/ br_compensation
;
603 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type);
606 rce
->new_pict_type
= pict_type
;
607 rce
->mc_mb_var_sum
= pic
->mc_mb_var_sum
;
608 rce
->mb_var_sum
= pic
-> mb_var_sum
;
610 rce
->f_code
= s
->f_code
;
611 rce
->b_code
= s
->b_code
;
615 update_rc_buffer(s
, s
->frame_bits
);
617 bits
= predict_size(&rcc
->pred
[pict_type
], rce
->qscale
, sqrt(var
));
618 if(pict_type
== I_TYPE
){
619 rce
->i_count
= s
->mb_num
;
620 rce
->i_tex_bits
= bits
;
624 rce
->i_count
= 0; //FIXME we do know this approx
626 rce
->p_tex_bits
= bits
*0.9;
628 rce
->mv_bits
= bits
*0.1;
630 rcc
->i_cplx_sum
[pict_type
] += rce
->i_tex_bits
*rce
->qscale
;
631 rcc
->p_cplx_sum
[pict_type
] += rce
->p_tex_bits
*rce
->qscale
;
632 rcc
->mv_bits_sum
[pict_type
] += rce
->mv_bits
;
633 rcc
->frame_count
[pict_type
] ++;
635 bits
= rce
->i_tex_bits
+ rce
->p_tex_bits
;
636 rate_factor
= rcc
->pass1_wanted_bits
/rcc
->pass1_rc_eq_output_sum
* br_compensation
;
638 q
= get_qscale(s
, rce
, rate_factor
, picture_number
);
642 q
= get_diff_limited_q(s
, rce
, q
);
646 if(pict_type
==P_TYPE
|| s
->intra_only
){ //FIXME type dependant blur like in 2-pass
647 rcc
->short_term_qsum
*=s
->qblur
;
648 rcc
->short_term_qcount
*=s
->qblur
;
650 rcc
->short_term_qsum
+= q
;
651 rcc
->short_term_qcount
++;
653 q
= short_term_q
= rcc
->short_term_qsum
/rcc
->short_term_qcount
;
658 q
= modify_qscale(s
, rce
, q
, picture_number
);
660 rcc
->pass1_wanted_bits
+= s
->bit_rate
/fps
;
665 if(s
->avctx
->debug
&FF_DEBUG_RC
){
666 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",
667 ff_get_pict_type_char(pict_type
), qmin
, q
, qmax
, picture_number
, (int)wanted_bits
/1000, (int)s
->total_bits
/1000,
668 br_compensation
, short_term_q
, s
->frame_bits
, pic
->mb_var_sum
, pic
->mc_mb_var_sum
, s
->bit_rate
/1000, (int)fps
673 else if(q
>qmax
) q
=qmax
;
675 if(s
->adaptive_quant
)
676 adaptive_quantization(s
, q
);
681 rcc
->last_mc_mb_var_sum
= pic
->mc_mb_var_sum
;
682 rcc
->last_mb_var_sum
= pic
->mb_var_sum
;
685 static int mvsum
=0, texsum
=0;
687 texsum
+= s
->i_tex_bits
+ s
->p_tex_bits
;
688 printf("%d %d//\n\n", mvsum
, texsum
);
694 //----------------------------------------------
697 static int init_pass2(MpegEncContext
*s
)
699 RateControlContext
*rcc
= &s
->rc_context
;
701 double fps
= (double)s
->frame_rate
/ FRAME_RATE_BASE
;
702 double complexity
[5]={0,0,0,0,0}; // aproximate bits at quant=1
703 double avg_quantizer
[5];
704 uint64_t const_bits
[5]={0,0,0,0,0}; // quantizer idependant bits
705 uint64_t available_bits
[5];
706 uint64_t all_const_bits
;
707 uint64_t all_available_bits
= (uint64_t)(s
->bit_rate
*(double)rcc
->num_entries
/fps
);
708 double rate_factor
=0;
710 //int last_i_frame=-10000000;
711 const int filter_size
= (int)(s
->qblur
*4) | 1;
712 double expected_bits
;
713 double *qscale
, *blured_qscale
;
715 /* find complexity & const_bits & decide the pict_types */
716 for(i
=0; i
<rcc
->num_entries
; i
++){
717 RateControlEntry
*rce
= &rcc
->entry
[i
];
719 rce
->new_pict_type
= rce
->pict_type
;
720 rcc
->i_cplx_sum
[rce
->pict_type
] += rce
->i_tex_bits
*rce
->qscale
;
721 rcc
->p_cplx_sum
[rce
->pict_type
] += rce
->p_tex_bits
*rce
->qscale
;
722 rcc
->mv_bits_sum
[rce
->pict_type
] += rce
->mv_bits
;
723 rcc
->frame_count
[rce
->pict_type
] ++;
725 complexity
[rce
->new_pict_type
]+= (rce
->i_tex_bits
+ rce
->p_tex_bits
)*(double)rce
->qscale
;
726 const_bits
[rce
->new_pict_type
]+= rce
->mv_bits
+ rce
->misc_bits
;
728 all_const_bits
= const_bits
[I_TYPE
] + const_bits
[P_TYPE
] + const_bits
[B_TYPE
];
730 if(all_available_bits
< all_const_bits
){
731 fprintf(stderr
, "requested bitrate is to low\n");
735 /* find average quantizers */
736 avg_quantizer
[P_TYPE
]=0;
737 for(step
=256*256; step
>0.0000001; step
*=0.5){
738 double expected_bits
=0;
739 avg_quantizer
[P_TYPE
]+= step
;
741 avg_quantizer
[I_TYPE
]= avg_quantizer
[P_TYPE
]*ABS(s
->avctx
->i_quant_factor
) + s
->avctx
->i_quant_offset
;
742 avg_quantizer
[B_TYPE
]= avg_quantizer
[P_TYPE
]*ABS(s
->avctx
->b_quant_factor
) + s
->avctx
->b_quant_offset
;
746 + complexity
[I_TYPE
]/avg_quantizer
[I_TYPE
]
747 + complexity
[P_TYPE
]/avg_quantizer
[P_TYPE
]
748 + complexity
[B_TYPE
]/avg_quantizer
[B_TYPE
];
750 if(expected_bits
< all_available_bits
) avg_quantizer
[P_TYPE
]-= step
;
751 //printf("%f %lld %f\n", expected_bits, all_available_bits, avg_quantizer[P_TYPE]);
753 //printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
756 available_bits
[i
]= const_bits
[i
] + complexity
[i
]/avg_quantizer
[i
];
758 //printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits);
760 qscale
= malloc(sizeof(double)*rcc
->num_entries
);
761 blured_qscale
= malloc(sizeof(double)*rcc
->num_entries
);
763 for(step
=256*256; step
>0.0000001; step
*=0.5){
767 rcc
->buffer_index
= s
->avctx
->rc_buffer_size
/2;
770 for(i
=0; i
<rcc
->num_entries
; i
++){
771 qscale
[i
]= get_qscale(s
, &rcc
->entry
[i
], rate_factor
, i
);
773 assert(filter_size
%2==1);
775 /* fixed I/B QP relative to P mode */
776 for(i
=rcc
->num_entries
-1; i
>=0; i
--){
777 RateControlEntry
*rce
= &rcc
->entry
[i
];
779 qscale
[i
]= get_diff_limited_q(s
, rce
, qscale
[i
]);
783 for(i
=0; i
<rcc
->num_entries
; i
++){
784 RateControlEntry
*rce
= &rcc
->entry
[i
];
785 const int pict_type
= rce
->new_pict_type
;
787 double q
=0.0, sum
=0.0;
789 for(j
=0; j
<filter_size
; j
++){
790 int index
= i
+j
-filter_size
/2;
792 double coeff
= s
->qblur
==0 ?
1.0 : exp(-d
*d
/(s
->qblur
* s
->qblur
));
794 if(index
< 0 || index
>= rcc
->num_entries
) continue;
795 if(pict_type
!= rcc
->entry
[index
].new_pict_type
) continue;
796 q
+= qscale
[index
] * coeff
;
799 blured_qscale
[i
]= q
/sum
;
802 /* find expected bits */
803 for(i
=0; i
<rcc
->num_entries
; i
++){
804 RateControlEntry
*rce
= &rcc
->entry
[i
];
806 rce
->new_qscale
= modify_qscale(s
, rce
, blured_qscale
[i
], i
);
807 bits
= qp2bits(rce
, rce
->new_qscale
) + rce
->mv_bits
+ rce
->misc_bits
;
808 //printf("%d %f\n", rce->new_bits, blured_qscale[i]);
809 update_rc_buffer(s
, bits
);
811 rce
->expected_bits
= expected_bits
;
812 expected_bits
+= bits
;
815 // printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
816 if(expected_bits
> all_available_bits
) rate_factor
-= step
;
821 if(abs(expected_bits
/all_available_bits
- 1.0) > 0.01 ){
822 fprintf(stderr
, "Error: 2pass curve failed to converge\n");