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
This commit is contained in:
Yunqing Wang 2011-11-01 16:20:00 -04:00
parent e0309e1509
commit e44720af84
3 changed files with 98 additions and 68 deletions

View File

@ -90,6 +90,7 @@ typedef struct
unsigned int * mb_activity_ptr; unsigned int * mb_activity_ptr;
int * mb_norm_activity_ptr; int * mb_norm_activity_ptr;
signed int act_zbin_adj; signed int act_zbin_adj;
signed int last_act_zbin_adj;
int mvcosts[2][MVvals+1]; int mvcosts[2][MVvals+1];
int *mvcost[2]; int *mvcost[2];

View File

@ -411,6 +411,8 @@ typedef struct VP8_COMP
int zbin_over_quant; int zbin_over_quant;
int zbin_mode_boost; int zbin_mode_boost;
int zbin_mode_boost_enabled; int zbin_mode_boost_enabled;
int last_zbin_over_quant;
int last_zbin_mode_boost;
int64_t total_byte_count; int64_t total_byte_count;

View File

@ -565,6 +565,23 @@ void vp8cx_init_quantizer(VP8_COMP *cpi)
} }
#endif #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) void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
{ {
@ -590,11 +607,10 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
else else
QIndex = cpi->common.base_qindex; QIndex = cpi->common.base_qindex;
if (QIndex != x->q_index)
{
// Y // Y
zbin_extra = ( cpi->common.Y1dequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_Y;
( cpi->zbin_over_quant +
cpi->zbin_mode_boost +
x->act_zbin_adj ) ) >> 7;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
@ -609,10 +625,7 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
} }
// UV // UV
zbin_extra = ( cpi->common.UVdequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_UV;
( cpi->zbin_over_quant +
cpi->zbin_mode_boost +
x->act_zbin_adj ) ) >> 7;
for (i = 16; i < 24; i++) for (i = 16; i < 24; i++)
{ {
@ -627,10 +640,7 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
} }
// Y2 // Y2
zbin_extra = ( cpi->common.Y2dequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_Y2;
( (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_fast = cpi->Y2quant_fast[QIndex];
x->block[24].quant = cpi->Y2quant[QIndex]; x->block[24].quant = cpi->Y2quant[QIndex];
@ -643,8 +653,36 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
/* save this macroblock QIndex for vp8_update_zbin_extra() */ /* save this macroblock QIndex for vp8_update_zbin_extra() */
x->q_index = QIndex; 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;
for (i = 0; i < 16; i++)
x->block[i].zbin_extra = (short)zbin_extra;
// 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) 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; int zbin_extra;
// Y // Y
zbin_extra = ( cpi->common.Y1dequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_Y;
( cpi->zbin_over_quant +
cpi->zbin_mode_boost +
x->act_zbin_adj ) ) >> 7;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{
x->block[i].zbin_extra = (short)zbin_extra; x->block[i].zbin_extra = (short)zbin_extra;
}
// UV // UV
zbin_extra = ( cpi->common.UVdequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_UV;
( cpi->zbin_over_quant +
cpi->zbin_mode_boost +
x->act_zbin_adj ) ) >> 7;
for (i = 16; i < 24; i++) for (i = 16; i < 24; i++)
{
x->block[i].zbin_extra = (short)zbin_extra; x->block[i].zbin_extra = (short)zbin_extra;
}
// Y2 // Y2
zbin_extra = ( cpi->common.Y2dequant[QIndex][1] * zbin_extra = ZBIN_EXTRA_Y2;
( (cpi->zbin_over_quant / 2) +
cpi->zbin_mode_boost +
x->act_zbin_adj ) ) >> 7;
x->block[24].zbin_extra = (short)zbin_extra; 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) void vp8cx_frame_init_quantizer(VP8_COMP *cpi)
{ {