*/
/**
- * @file ratecontrol.c
+ * @file libavcodec/ratecontrol.c
* Rate control for video encoders.
*/
RateControlContext *rcc= &s->rc_context;
int i;
const char *error = NULL;
- static const char *const_names[]={
+ static const char * const const_names[]={
"PI",
"E",
"iTex",
"avgTex",
NULL
};
- static double (*func1[])(void *, double)={
+ static double (* const func1[])(void *, double)={
(void *)bits2qp,
(void *)qp2bits,
NULL
};
- static const char *func1_names[]={
+ static const char * const func1_names[]={
"bits2qp",
"qp2bits",
NULL
};
emms_c();
- rcc->rc_eq_eval = ff_parse(s->avctx->rc_eq, const_names, func1, func1_names, NULL, NULL, &error);
+ rcc->rc_eq_eval = ff_parse(s->avctx->rc_eq ? s->avctx->rc_eq : "tex^qComp", const_names, func1, func1_names, NULL, NULL, &error);
if (!rcc->rc_eq_eval) {
av_log(s->avctx, AV_LOG_ERROR, "Error parsing rc_eq \"%s\": %s\n", s->avctx->rc_eq, error? error : "");
return -1;
rcc->p_cplx_sum [i]=
rcc->mv_bits_sum[i]=
rcc->qscale_sum [i]=
- rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
+ rcc->frame_count[i]= 1; // 1 is better because of 1/0 and such
rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5;
}
rcc->buffer_index= s->avctx->rc_initial_buffer_occupancy;
//FIXME maybe move to end
if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID) {
-#ifdef CONFIG_LIBXVID
+#if CONFIG_LIBXVID
return ff_xvid_rate_control_init(s);
#else
- av_log(s->avctx, AV_LOG_ERROR, "XviD ratecontrol requires libavcodec compiled with XviD support\n");
+ av_log(s->avctx, AV_LOG_ERROR, "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
return -1;
#endif
}
for(i=0; i<60*30; i++){
double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num;
RateControlEntry rce;
- double q;
if (i%((s->gop_size+3)/4)==0) rce.pict_type= FF_I_TYPE;
else if(i%(s->max_b_frames+1)) rce.pict_type= FF_B_TYPE;
rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits;
rcc->frame_count[rce.pict_type] ++;
- bits= rce.i_tex_bits + rce.p_tex_bits;
-
- q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i);
+ get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i);
rcc->pass1_wanted_bits+= s->bit_rate/(1/av_q2d(s->avctx->time_base)); //FIXME misbehaves a little for variable fps
}
}
ff_eval_free(rcc->rc_eq_eval);
av_freep(&rcc->entry);
-#ifdef CONFIG_LIBXVID
+#if CONFIG_LIBXVID
if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID)
ff_xvid_rate_control_uninit(s);
#endif
static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
RateControlContext *rcc= &s->rc_context;
int qmin, qmax;
- double bits;
const int pict_type= rce->new_pict_type;
const double buffer_size= s->avctx->rc_buffer_size;
const double fps= 1/av_q2d(s->avctx->time_base);
if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==FF_P_TYPE)
q*= s->avctx->rc_qmod_amp;
- bits= qp2bits(rce, q);
//printf("q:%f\n", q);
/* buffer overflow/underflow protection */
if(buffer_size){
else if(d<0.0001) d=0.0001;
q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
- q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*3, 1));
+ q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index) * s->avctx->rc_min_vbv_overflow_use, 1));
if(q > q_limit){
if(s->avctx->debug&FF_DEBUG_RC){
av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
else if(d<0.0001) d=0.0001;
q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
- q_limit= bits2qp(rce, FFMAX(rcc->buffer_index/3, 1));
+ q_limit= bits2qp(rce, FFMAX(rcc->buffer_index * s->avctx->rc_max_available_vbv_use, 1));
if(q < q_limit){
if(s->avctx->debug&FF_DEBUG_RC){
av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
Picture * const pic= &s->current_picture;
emms_c();
-#ifdef CONFIG_LIBXVID
+#if CONFIG_LIBXVID
if((s->flags&CODEC_FLAG_PASS2) && s->avctx->rc_strategy == FF_RC_STRATEGY_XVID)
return ff_xvid_rate_estimate_qscale(s, dry_run);
#endif
//int last_i_frame=-10000000;
const int filter_size= (int)(a->qblur*4) | 1;
double expected_bits;
- double *qscale, *blured_qscale, qscale_sum;
+ double *qscale, *blurred_qscale, qscale_sum;
/* find complexity & const_bits & decide the pict_types */
for(i=0; i<rcc->num_entries; i++){
}
qscale= av_malloc(sizeof(double)*rcc->num_entries);
- blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
+ blurred_qscale= av_malloc(sizeof(double)*rcc->num_entries);
toobig = 0;
for(step=256*256; step>0.0000001; step*=0.5){
q+= qscale[index] * coeff;
sum+= coeff;
}
- blured_qscale[i]= q/sum;
+ blurred_qscale[i]= q/sum;
}
/* find expected bits */
for(i=0; i<rcc->num_entries; i++){
RateControlEntry *rce= &rcc->entry[i];
double bits;
- rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
+ rce->new_qscale= modify_qscale(s, rce, blurred_qscale[i], i);
bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
-//printf("%d %f\n", rce->new_bits, blured_qscale[i]);
+//printf("%d %f\n", rce->new_bits, blurred_qscale[i]);
bits += 8*ff_vbv_update(s, bits);
rce->expected_bits= expected_bits;
}
}
av_free(qscale);
- av_free(blured_qscale);
+ av_free(blurred_qscale);
/* check bitrate calculations and print info */
qscale_sum = 0.0;