diff options
author | Jingning Han <jingning@google.com> | 2013-07-29 11:04:07 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-07-29 11:04:07 -0700 |
commit | decb1b94deb4420ab540b0963f1ca91ed20137c6 (patch) | |
tree | 3a2a254193741c709f99a65aa609f13a6654823a | |
parent | cc0ff7ecfa5e687d617511c9e7e779e943740e31 (diff) | |
parent | 38fa4871647667b5c36c2482993887ad479f7c6d (diff) | |
download | libvpx-decb1b94deb4420ab540b0963f1ca91ed20137c6.tar libvpx-decb1b94deb4420ab540b0963f1ca91ed20137c6.tar.gz libvpx-decb1b94deb4420ab540b0963f1ca91ed20137c6.tar.bz2 libvpx-decb1b94deb4420ab540b0963f1ca91ed20137c6.zip |
Merge "Shortcut 8x8/16x16 inverse 2D-DCT"
-rw-r--r-- | vp9/decoder/vp9_idct_blk.c | 6 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodemb.c | 16 |
2 files changed, 20 insertions, 2 deletions
diff --git a/vp9/decoder/vp9_idct_blk.c b/vp9/decoder/vp9_idct_blk.c index 70eb77f8a..42b805f8e 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 e3f1f1f47..3597e73e6 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); } |