Commit ab9a4ce0 authored by Paul Wilkins's avatar Paul Wilkins Committed by On2 (Google) Code Review
Browse files

Merge "Change to prevent encoding of effect-less 2nd order coefficients" into experimental

parents 2b450a46 c8ef79d2
...@@ -606,6 +606,73 @@ static void optimize_b(MACROBLOCK *mb, int ib, int type, ...@@ -606,6 +606,73 @@ static void optimize_b(MACROBLOCK *mb, int ib, int type,
*a = *l = (d->eob != !type); *a = *l = (d->eob != !type);
} }
static void check_reset_2nd_coeffs(MACROBLOCKD *x)
{
int sum=0;
int i;
BLOCKD *bd = &x->block[24];
int eob_pos = (bd->eob<16)? vp8_default_zig_zag1d[bd->eob]:16;
for(i=0;i<bd->eob;i++)
{
int coef = bd->dqcoeff[vp8_default_zig_zag1d[i]];
sum+= (coef>=0)?coef:-coef;
}
/**************************************************************************
our inverse hadamard transform effectively is weighted sum of all 16 inputs
with weight either 1 or -1. It has a last stage scaling of (sum+3)>>3. And
dc only idct is (dc+4)>>3. So if all the sums are between -35 and 29, the
output after inverse wht and idct will be all zero. A sum of absolute value
smaller than 35 guarantees all 16 different (+1/-1) weighted sums in wht
fall between -35 and +35.
**************************************************************************/
if(sum < 35)
{
vpx_memset(bd->qcoeff,0,eob_pos*2);
vpx_memset(bd->dqcoeff,0,eob_pos*2);
bd->eob = 0;
}
}
static void check_reset_8x8_2nd_coeffs(MACROBLOCKD *x)
{
int sum=0;
int i;
BLOCKD *bd = &x->block[24];
int coef;
coef = bd->dqcoeff[0];
sum+= (coef>=0)?coef:-coef;
coef = bd->dqcoeff[1];
sum+= (coef>=0)?coef:-coef;
coef = bd->dqcoeff[4];
sum+= (coef>=0)?coef:-coef;
coef = bd->dqcoeff[8];
sum+= (coef>=0)?coef:-coef;
/**************************************************************************
our inverse haar transform effectively is weighted sum of all 4 inputs
with weight either 1 or -1. It has a last stage scaling of (sum)>>2. And
dc only idct8x8 is effectively (dc+8)>>4. So if all the sums are between
-31 and 31, outputs after inverse txfm be all 0s. A sum of absolute value
smaller than 32 guarantees all 4 different (+1/-1) weighted sums in wht
fall between -31 and +31.
**************************************************************************/
if(sum < 32)
{
bd->qcoeff[0] = 0;
bd->dqcoeff[0] = 0;
bd->qcoeff[1] = 0;
bd->dqcoeff[1] = 0;
bd->qcoeff[4] = 0;
bd->dqcoeff[4] = 0;
bd->qcoeff[8] = 0;
bd->dqcoeff[8] = 0;
bd->eob = 0;
}
}
static void optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) static void optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
{ {
int b; int b;
...@@ -642,6 +709,7 @@ static void optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) ...@@ -642,6 +709,7 @@ static void optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
b=24; b=24;
optimize_b(x, b, PLANE_TYPE_Y2, optimize_b(x, b, PLANE_TYPE_Y2,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
check_reset_2nd_coeffs(&x->e_mbd);
} }
} }
...@@ -684,6 +752,7 @@ void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) ...@@ -684,6 +752,7 @@ void vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
b=24; b=24;
optimize_b(x, b, PLANE_TYPE_Y2, optimize_b(x, b, PLANE_TYPE_Y2,
ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
check_reset_2nd_coeffs(&x->e_mbd);
} }
} }
...@@ -1040,16 +1109,8 @@ void optimize_mb_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) ...@@ -1040,16 +1109,8 @@ void optimize_mb_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
*(tl + vp8_block2left[b]); *(tl + vp8_block2left[b]);
} }
//8x8 always have 2nd roder haar block
check_reset_8x8_2nd_coeffs(&x->e_mbd);
/*
if (has_2nd_order)
{
vp8_setup_temp_context(&t, x->e_mbd.above_context[Y2CONTEXT],
x->e_mbd.left_context[Y2CONTEXT], 1);
optimize_b(x, 24, 1, t.a, t.l, rtcd);
}
*/
} }
void vp8_optimize_mby_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) void vp8_optimize_mby_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
...@@ -1114,14 +1175,8 @@ void vp8_optimize_mby_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) ...@@ -1114,14 +1175,8 @@ void vp8_optimize_mby_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
} }
/* //8x8 always have 2nd roder haar block
if (has_2nd_order) check_reset_8x8_2nd_coeffs(&x->e_mbd);
{
vp8_setup_temp_context(&t, x->e_mbd.above_context[Y2CONTEXT],
x->e_mbd.left_context[Y2CONTEXT], 1);
optimize_b(x, 24, 1, t.a, t.l, rtcd);
}
*/
} }
void vp8_optimize_mbuv_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) void vp8_optimize_mbuv_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment