From e44720af84cccb1663b9260f35597d9d77c25eae Mon Sep 17 00:00:00 2001 From: Yunqing Wang <yunqingwang@google.com> Date: Tue, 1 Nov 2011 16:20:00 -0400 Subject: [PATCH] Add checks in MB quantizer initialization In some situations (f.g. error-resilient is turned on), vp8cx_mb _init_quantizer() was called once per macroblock. Added checks to avoid calculations when there is no change. Change-Id: Ie4f0a5ade2202041254990a4e9d5b03bd1ac5aea --- vp8/encoder/block.h | 1 + vp8/encoder/onyx_int.h | 2 + vp8/encoder/quantize.c | 159 ++++++++++++++++++++++++----------------- 3 files changed, 96 insertions(+), 66 deletions(-) diff --git a/vp8/encoder/block.h b/vp8/encoder/block.h index 0d14b545c8..5e5a60db73 100644 --- a/vp8/encoder/block.h +++ b/vp8/encoder/block.h @@ -90,6 +90,7 @@ typedef struct unsigned int * mb_activity_ptr; int * mb_norm_activity_ptr; signed int act_zbin_adj; + signed int last_act_zbin_adj; int mvcosts[2][MVvals+1]; int *mvcost[2]; diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index 0686a108ae..a0828a479a 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -411,6 +411,8 @@ typedef struct VP8_COMP int zbin_over_quant; int zbin_mode_boost; int zbin_mode_boost_enabled; + int last_zbin_over_quant; + int last_zbin_mode_boost; int64_t total_byte_count; diff --git a/vp8/encoder/quantize.c b/vp8/encoder/quantize.c index 503d241238..3609f9afab 100644 --- a/vp8/encoder/quantize.c +++ b/vp8/encoder/quantize.c @@ -565,6 +565,23 @@ void vp8cx_init_quantizer(VP8_COMP *cpi) } #endif +#define ZBIN_EXTRA_Y \ + (( cpi->common.Y1dequant[QIndex][1] * \ + ( cpi->zbin_over_quant + \ + cpi->zbin_mode_boost + \ + x->act_zbin_adj ) ) >> 7) + +#define ZBIN_EXTRA_UV \ + (( cpi->common.UVdequant[QIndex][1] * \ + ( cpi->zbin_over_quant + \ + cpi->zbin_mode_boost + \ + x->act_zbin_adj ) ) >> 7) + +#define ZBIN_EXTRA_Y2 \ + (( cpi->common.Y2dequant[QIndex][1] * \ + ( (cpi->zbin_over_quant / 2) + \ + cpi->zbin_mode_boost + \ + x->act_zbin_adj ) ) >> 7) void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x) { @@ -590,61 +607,82 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x) else QIndex = cpi->common.base_qindex; - // Y - zbin_extra = ( cpi->common.Y1dequant[QIndex][1] * - ( cpi->zbin_over_quant + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; - - for (i = 0; i < 16; i++) + if (QIndex != x->q_index) { - x->block[i].quant = cpi->Y1quant[QIndex]; - x->block[i].quant_fast = cpi->Y1quant_fast[QIndex]; - x->block[i].quant_shift = cpi->Y1quant_shift[QIndex]; - x->block[i].zbin = cpi->Y1zbin[QIndex]; - x->block[i].round = cpi->Y1round[QIndex]; - x->e_mbd.block[i].dequant = cpi->common.Y1dequant[QIndex]; - x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex]; - x->block[i].zbin_extra = (short)zbin_extra; - } + // Y + zbin_extra = ZBIN_EXTRA_Y; - // UV - zbin_extra = ( cpi->common.UVdequant[QIndex][1] * - ( cpi->zbin_over_quant + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; + for (i = 0; i < 16; i++) + { + x->block[i].quant = cpi->Y1quant[QIndex]; + x->block[i].quant_fast = cpi->Y1quant_fast[QIndex]; + x->block[i].quant_shift = cpi->Y1quant_shift[QIndex]; + x->block[i].zbin = cpi->Y1zbin[QIndex]; + x->block[i].round = cpi->Y1round[QIndex]; + x->e_mbd.block[i].dequant = cpi->common.Y1dequant[QIndex]; + x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex]; + x->block[i].zbin_extra = (short)zbin_extra; + } - for (i = 16; i < 24; i++) - { - x->block[i].quant = cpi->UVquant[QIndex]; - x->block[i].quant_fast = cpi->UVquant_fast[QIndex]; - x->block[i].quant_shift = cpi->UVquant_shift[QIndex]; - x->block[i].zbin = cpi->UVzbin[QIndex]; - x->block[i].round = cpi->UVround[QIndex]; - x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex]; - x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex]; - x->block[i].zbin_extra = (short)zbin_extra; + // UV + zbin_extra = ZBIN_EXTRA_UV; + + for (i = 16; i < 24; i++) + { + x->block[i].quant = cpi->UVquant[QIndex]; + x->block[i].quant_fast = cpi->UVquant_fast[QIndex]; + x->block[i].quant_shift = cpi->UVquant_shift[QIndex]; + x->block[i].zbin = cpi->UVzbin[QIndex]; + x->block[i].round = cpi->UVround[QIndex]; + x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex]; + x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex]; + x->block[i].zbin_extra = (short)zbin_extra; + } + + // Y2 + zbin_extra = ZBIN_EXTRA_Y2; + + x->block[24].quant_fast = cpi->Y2quant_fast[QIndex]; + x->block[24].quant = cpi->Y2quant[QIndex]; + x->block[24].quant_shift = cpi->Y2quant_shift[QIndex]; + x->block[24].zbin = cpi->Y2zbin[QIndex]; + x->block[24].round = cpi->Y2round[QIndex]; + x->e_mbd.block[24].dequant = cpi->common.Y2dequant[QIndex]; + x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex]; + x->block[24].zbin_extra = (short)zbin_extra; + + /* save this macroblock QIndex for vp8_update_zbin_extra() */ + x->q_index = QIndex; + + cpi->last_zbin_over_quant = cpi->zbin_over_quant; + cpi->last_zbin_mode_boost = cpi->zbin_mode_boost; + x->last_act_zbin_adj = x->act_zbin_adj; } + else if(cpi->last_zbin_over_quant != cpi->zbin_over_quant + || cpi->last_zbin_mode_boost != cpi->zbin_mode_boost + || x->last_act_zbin_adj != x->act_zbin_adj) + { + // Y + zbin_extra = ZBIN_EXTRA_Y; - // Y2 - zbin_extra = ( cpi->common.Y2dequant[QIndex][1] * - ( (cpi->zbin_over_quant / 2) + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; - - x->block[24].quant_fast = cpi->Y2quant_fast[QIndex]; - x->block[24].quant = cpi->Y2quant[QIndex]; - x->block[24].quant_shift = cpi->Y2quant_shift[QIndex]; - x->block[24].zbin = cpi->Y2zbin[QIndex]; - x->block[24].round = cpi->Y2round[QIndex]; - x->e_mbd.block[24].dequant = cpi->common.Y2dequant[QIndex]; - x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex]; - x->block[24].zbin_extra = (short)zbin_extra; + for (i = 0; i < 16; i++) + x->block[i].zbin_extra = (short)zbin_extra; - /* save this macroblock QIndex for vp8_update_zbin_extra() */ - x->q_index = QIndex; -} + // UV + zbin_extra = ZBIN_EXTRA_UV; + + for (i = 16; i < 24; i++) + x->block[i].zbin_extra = (short)zbin_extra; + // Y2 + zbin_extra = ZBIN_EXTRA_Y2; + x->block[24].zbin_extra = (short)zbin_extra; + + cpi->last_zbin_over_quant = cpi->zbin_over_quant; + cpi->last_zbin_mode_boost = cpi->zbin_mode_boost; + x->last_act_zbin_adj = x->act_zbin_adj; + } +} void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x) { @@ -653,35 +691,24 @@ void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x) int zbin_extra; // Y - zbin_extra = ( cpi->common.Y1dequant[QIndex][1] * - ( cpi->zbin_over_quant + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; + zbin_extra = ZBIN_EXTRA_Y; + for (i = 0; i < 16; i++) - { x->block[i].zbin_extra = (short)zbin_extra; - } // UV - zbin_extra = ( cpi->common.UVdequant[QIndex][1] * - ( cpi->zbin_over_quant + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; + zbin_extra = ZBIN_EXTRA_UV; for (i = 16; i < 24; i++) - { x->block[i].zbin_extra = (short)zbin_extra; - } // Y2 - zbin_extra = ( cpi->common.Y2dequant[QIndex][1] * - ( (cpi->zbin_over_quant / 2) + - cpi->zbin_mode_boost + - x->act_zbin_adj ) ) >> 7; - + zbin_extra = ZBIN_EXTRA_Y2; x->block[24].zbin_extra = (short)zbin_extra; } - +#undef ZBIN_EXTRA_Y +#undef ZBIN_EXTRA_UV +#undef ZBIN_EXTRA_Y2 void vp8cx_frame_init_quantizer(VP8_COMP *cpi) { -- GitLab