diff options
author | Dmitry Kovalev <dkovalev@google.com> | 2013-10-02 12:45:27 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-10-02 12:45:27 -0700 |
commit | d958c0486a755101146b81b58a01a37798afccee (patch) | |
tree | 1427c04e2c22043f8348659b3cf321f1b7b461d8 /vp9/decoder/vp9_decodframe.c | |
parent | 54bc73151b0562ceb68ad1f1857fc40fe05ae1f2 (diff) | |
parent | c4d1ab573ae8120e6020c9e986b4cdc6b9f5b802 (diff) | |
download | libvpx-d958c0486a755101146b81b58a01a37798afccee.tar libvpx-d958c0486a755101146b81b58a01a37798afccee.tar.gz libvpx-d958c0486a755101146b81b58a01a37798afccee.tar.bz2 libvpx-d958c0486a755101146b81b58a01a37798afccee.zip |
Merge "Removing memset calls inside idct/iht functions."
Diffstat (limited to 'vp9/decoder/vp9_decodframe.c')
-rw-r--r-- | vp9/decoder/vp9_decodframe.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 77fec5061..018f94954 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -92,32 +92,44 @@ static void decode_block(int plane, int block, BLOCK_SIZE plane_bsize, int16_t* const qcoeff = BLOCK_OFFSET(pd->qcoeff, block); const int stride = pd->dst.stride; const int eob = pd->eobs[block]; - const int raster_block = txfrm_block_to_raster_block(plane_bsize, tx_size, - block); - uint8_t* const dst = raster_block_offset_uint8(plane_bsize, raster_block, - pd->dst.buf, stride); - switch (tx_size) { - case TX_4X4: { - const TX_TYPE tx_type = get_tx_type_4x4(pd->plane_type, xd, raster_block); - if (tx_type == DCT_DCT) - xd->itxm_add(qcoeff, dst, stride, eob); + if (eob > 0) { + TX_TYPE tx_type; + const int raster_block = txfrm_block_to_raster_block(plane_bsize, tx_size, + block); + uint8_t* const dst = raster_block_offset_uint8(plane_bsize, raster_block, + pd->dst.buf, stride); + switch (tx_size) { + case TX_4X4: + tx_type = get_tx_type_4x4(pd->plane_type, xd, raster_block); + if (tx_type == DCT_DCT) + xd->itxm_add(qcoeff, dst, stride, eob); + else + vp9_iht_add_c(tx_type, qcoeff, dst, stride, eob); + break; + case TX_8X8: + tx_type = get_tx_type_8x8(pd->plane_type, xd); + vp9_iht_add_8x8_c(tx_type, qcoeff, dst, stride, eob); + break; + case TX_16X16: + tx_type = get_tx_type_16x16(pd->plane_type, xd); + vp9_iht_add_16x16_c(tx_type, qcoeff, dst, stride, eob); + break; + case TX_32X32: + tx_type = DCT_DCT; + vp9_idct_add_32x32(qcoeff, dst, stride, eob); + break; + default: + assert(!"Invalid transform size"); + } + + if (eob == 1) { + *((int32_t *)qcoeff) = 0; + } else { + if (tx_type == DCT_DCT && tx_size <= TX_16X16 && eob <= 10) + vpx_memset(qcoeff, 0, 4 * (4 << tx_size) * sizeof(qcoeff[0])); else - vp9_iht_add_c(tx_type, qcoeff, dst, stride, eob); - break; + vpx_memset(qcoeff, 0, (16 << (tx_size << 1)) * sizeof(qcoeff[0])); } - case TX_8X8: - vp9_iht_add_8x8_c(get_tx_type_8x8(pd->plane_type, xd), qcoeff, dst, - stride, eob); - break; - case TX_16X16: - vp9_iht_add_16x16_c(get_tx_type_16x16(pd->plane_type, xd), qcoeff, dst, - stride, eob); - break; - case TX_32X32: - vp9_idct_add_32x32(qcoeff, dst, stride, eob); - break; - default: - assert(!"Invalid transform size"); } } |