diff --git a/vp9/decoder/vp9_idct_blk.c b/vp9/decoder/vp9_idct_blk.c index 70eb77f8a18c0afc4ad788fe9fda1fa67b70224c..42b805f8ec0791dd269b2ff2ec1f1b4fe79a6bb7 100644 --- a/vp9/decoder/vp9_idct_blk.c +++ b/vp9/decoder/vp9_idct_blk.c @@ -95,6 +95,9 @@ void vp9_idct_add_8x8_c(int16_t *input, uint8_t *dest, int stride, int eob) { // DC only DCT coefficient vp9_short_idct8x8_1_add(input, dest, stride); input[0] = 0; + } else if (eob <= 10) { + vp9_short_idct10_8x8_add(input, dest, stride); + vpx_memset(input, 0, 128); } else { vp9_short_idct8x8_add(input, dest, stride); vpx_memset(input, 0, 128); @@ -128,6 +131,9 @@ void vp9_idct_add_16x16_c(int16_t *input, uint8_t *dest, int stride, int eob) { input[0] = 0; vp9_add_constant_residual_16x16(out, dest, stride); + } else if (eob <= 10) { + vp9_short_idct10_16x16_add(input, dest, stride); + vpx_memset(input, 0, 512); } else { vp9_short_idct16x16_add(input, dest, stride); vpx_memset(input, 0, 512); diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c index e3f1f1f4758ae2f123d4ca28cbca90d43b1682d6..3597e73e630756b4a4f9db3562baab8d4d016ec7 100644 --- a/vp9/encoder/vp9_encodemb.c +++ b/vp9/encoder/vp9_encodemb.c @@ -52,10 +52,21 @@ static void inverse_transform_b_8x8_add(MACROBLOCKD *xd, int eob, int stride) { if (eob <= 1) vp9_short_idct8x8_1_add(dqcoeff, dest, stride); + else if (eob <= 10) + vp9_short_idct10_8x8_add(dqcoeff, dest, stride); else vp9_short_idct8x8_add(dqcoeff, dest, stride); } +static void inverse_transform_b_16x16_add(MACROBLOCKD *xd, int eob, + int16_t *dqcoeff, uint8_t *dest, + int stride) { + if (eob <= 10) + vp9_short_idct10_16x16_add(dqcoeff, dest, stride); + else + vp9_short_idct16x16_add(dqcoeff, dest, stride); +} + static void subtract_plane(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize, int plane) { struct macroblock_plane *const p = &x->plane[plane]; const MACROBLOCKD *const xd = &x->e_mbd; @@ -538,7 +549,8 @@ static void encode_block(int plane, int block, BLOCK_SIZE_TYPE bsize, vp9_short_idct32x32_add(dqcoeff, dst, pd->dst.stride); break; case TX_16X16: - vp9_short_idct16x16_add(dqcoeff, dst, pd->dst.stride); + inverse_transform_b_16x16_add(xd, pd->eobs[block], dqcoeff, + dst, pd->dst.stride); break; case TX_8X8: inverse_transform_b_8x8_add(xd, pd->eobs[block], dqcoeff, @@ -691,7 +703,7 @@ void encode_block_intra(int plane, int block, BLOCK_SIZE_TYPE bsize, pd->dequant, p->zbin_extra, eob, scan, iscan); if (!x->skip_encode && *eob) { if (tx_type == DCT_DCT) - vp9_short_idct16x16_add(dqcoeff, dst, pd->dst.stride); + inverse_transform_b_16x16_add(xd, *eob, dqcoeff, dst, pd->dst.stride); else vp9_short_iht16x16_add(dqcoeff, dst, pd->dst.stride, tx_type); }