diff --git a/encoder/encoder.c b/encoder/encoder.c index 4188baf..f07cc0e 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -548,7 +548,7 @@ static int x264_validate_parameters( x264_t *h ) else h->mb.i_psy_trellis = 0; h->param.analyse.i_chroma_qp_offset = x264_clip3(h->param.analyse.i_chroma_qp_offset, -12, 12); - h->param.rc.i_aq_mode = x264_clip3( h->param.rc.i_aq_mode, 0, 2 ); + h->param.rc.i_aq_mode = x264_clip3( h->param.rc.i_aq_mode, 0, 3 ); h->param.rc.f_aq_strength = x264_clip3f( h->param.rc.f_aq_strength, 0, 3 ); if( h->param.rc.f_aq_strength == 0 ) h->param.rc.i_aq_mode = 0; diff --git a/encoder/ratecontrol.c b/encoder/ratecontrol.c index 99831a6..442bbc9 100644 --- a/encoder/ratecontrol.c +++ b/encoder/ratecontrol.c @@ -204,6 +204,7 @@ void x264_adaptive_quant_frame( x264_t *h, x264_frame_t *frame ) int mb_x, mb_y; float strength; float avg_adj = 0.f; + float avg_offset = 0.f; /* Need to init it anyways for MB tree. */ if( h->param.rc.f_aq_strength == 0 ) { @@ -215,7 +216,7 @@ void x264_adaptive_quant_frame( x264_t *h, x264_frame_t *frame ) return; } - if( h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE ) + if( h->param.rc.i_aq_mode >= X264_AQ_AUTOVARIANCE ) { for( mb_y = 0; mb_y < h->sps->i_mb_height; mb_y++ ) for( mb_x = 0; mb_x < h->sps->i_mb_width; mb_x++ ) @@ -228,6 +229,8 @@ void x264_adaptive_quant_frame( x264_t *h, x264_frame_t *frame ) } avg_adj /= h->mb.i_mb_count; strength = h->param.rc.f_aq_strength * avg_adj * (1.f / 6000.f); + if( h->param.rc.i_aq_mode > X264_AQ_AUTOVARIANCE ) + avg_offset = h->param.rc.f_aq_strength * (avg_adj * avg_adj - 48000.f) * (1.f / 8000.f); } else strength = h->param.rc.f_aq_strength * 1.0397f; @@ -236,10 +239,10 @@ void x264_adaptive_quant_frame( x264_t *h, x264_frame_t *frame ) for( mb_x = 0; mb_x < h->sps->i_mb_width; mb_x++ ) { float qp_adj; - if( h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE ) + if( h->param.rc.i_aq_mode >= X264_AQ_AUTOVARIANCE ) { qp_adj = frame->f_qp_offset[mb_x + mb_y*h->mb.i_mb_stride]; - qp_adj = strength * (qp_adj - avg_adj); + qp_adj = strength * (qp_adj - avg_adj) + avg_offset; } else {