diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/ratecontrol.c')
-rw-r--r-- | src/libffmpeg/libavcodec/ratecontrol.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/libffmpeg/libavcodec/ratecontrol.c b/src/libffmpeg/libavcodec/ratecontrol.c index 473645def..19641d453 100644 --- a/src/libffmpeg/libavcodec/ratecontrol.c +++ b/src/libffmpeg/libavcodec/ratecontrol.c @@ -38,7 +38,7 @@ static int init_pass2(MpegEncContext *s); static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num); void ff_write_pass1_stats(MpegEncContext *s){ - sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", + snprintf(s->avctx->stats_out, 256, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type, s->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count); @@ -74,6 +74,8 @@ int ff_rate_control_init(MpegEncContext *s) p= strchr(p+1, ';'); } i+= s->max_b_frames; + if(i<=0 || i>=INT_MAX / sizeof(RateControlEntry)) + return -1; rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry)); rcc->num_entries= i; @@ -499,13 +501,16 @@ static void adaptive_quantization(MpegEncContext *s, double q){ const float temp_cplx_masking= s->avctx->temporal_cplx_masking; const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; const float p_masking = s->avctx->p_masking; + const float border_masking = s->avctx->border_masking; float bits_sum= 0.0; float cplx_sum= 0.0; float cplx_tab[s->mb_num]; float bits_tab[s->mb_num]; - const int qmin= s->avctx->lmin; - const int qmax= s->avctx->lmax; + const int qmin= s->avctx->mb_lmin; + const int qmax= s->avctx->mb_lmax; Picture * const pic= &s->current_picture; + const int mb_width = s->mb_width; + const int mb_height = s->mb_height; for(i=0; i<s->mb_num; i++){ const int mb_xy= s->mb_index2xy[i]; @@ -513,6 +518,10 @@ static void adaptive_quantization(MpegEncContext *s, double q){ float spat_cplx= sqrt(pic->mb_var[mb_xy]); const int lumi= pic->mb_mean[mb_xy]; float bits, cplx, factor; + int mb_x = mb_xy % s->mb_stride; + int mb_y = mb_xy / s->mb_stride; + int mb_distance; + float mb_factor = 0.0; #if 0 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune @@ -533,6 +542,23 @@ static void adaptive_quantization(MpegEncContext *s, double q){ factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking); else factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking); + + if(mb_x < mb_width/5){ + mb_distance = mb_width/5 - mb_x; + mb_factor = (float)mb_distance / (float)(mb_width/5); + }else if(mb_x > 4*mb_width/5){ + mb_distance = mb_x - 4*mb_width/5; + mb_factor = (float)mb_distance / (float)(mb_width/5); + } + if(mb_y < mb_height/5){ + mb_distance = mb_height/5 - mb_y; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + }else if(mb_y > 4*mb_height/5){ + mb_distance = mb_y - 4*mb_height/5; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + } + + factor*= 1.0 - border_masking*mb_factor; if(factor<0.00001) factor= 0.00001; |