summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2011-11-04 11:52:27 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2011-11-04 11:52:27 -0700
commite1a55b504a625771ad41f42f66f16879d386033d (patch)
treec2b3aa0d1733ea60619fdf1e0366c8eea6563959
parent44b5f76e3476e27840371539cf68ed04a6f85c6c (diff)
parente44720af84cccb1663b9260f35597d9d77c25eae (diff)
downloadlibvpx-e1a55b504a625771ad41f42f66f16879d386033d.tar
libvpx-e1a55b504a625771ad41f42f66f16879d386033d.tar.gz
libvpx-e1a55b504a625771ad41f42f66f16879d386033d.tar.bz2
libvpx-e1a55b504a625771ad41f42f66f16879d386033d.zip
Merge "Add checks in MB quantizer initialization"
-rw-r--r--vp8/encoder/block.h1
-rw-r--r--vp8/encoder/onyx_int.h2
-rw-r--r--vp8/encoder/quantize.c159
3 files changed, 96 insertions, 66 deletions
diff --git a/vp8/encoder/block.h b/vp8/encoder/block.h
index 0d14b545c..5e5a60db7 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 0686a108a..a0828a479 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 22cbbee85..9c759fd7e 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)
{