From 6594ca8897ea0293d44b825f7c7fe81a7eb540a4 Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Tue, 8 Oct 2013 09:06:08 -0700 Subject: [PATCH] All zero coeff skip in IDCT 32x32 When all coefficients are zeros, skip the corresponding 1-D inverse transform. This practice has been used in the SSE2 implementation of inverse 32x32 DCT. This commit imports this algorithm into the C code. Change-Id: I0f58bfcb183a569fab85d524d5d9cf8ae8653f86 --- vp9/common/vp9_idct.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/vp9/common/vp9_idct.c b/vp9/common/vp9_idct.c index dea923724..5598eb278 100644 --- a/vp9/common/vp9_idct.c +++ b/vp9/common/vp9_idct.c @@ -1253,7 +1253,20 @@ void vp9_short_idct32x32_add_c(int16_t *input, uint8_t *dest, int dest_stride) { // Rows for (i = 0; i < 32; ++i) { - idct32_1d(input, outptr); + int16_t zero_coeff[16]; + for (j = 0; j < 16; ++j) + zero_coeff[j] = input[2 * j] | input[2 * j + 1]; + for (j = 0; j < 8; ++j) + zero_coeff[j] = zero_coeff[2 * j] | zero_coeff[2 * j + 1]; + for (j = 0; j < 4; ++j) + zero_coeff[j] = zero_coeff[2 * j] | zero_coeff[2 * j + 1]; + for (j = 0; j < 2; ++j) + zero_coeff[j] = zero_coeff[2 * j] | zero_coeff[2 * j + 1]; + + if (zero_coeff[0] | zero_coeff[1]) + idct32_1d(input, outptr); + else + vpx_memset(outptr, 0, sizeof(int16_t) * 32); input += 32; outptr += 32; } -- 2.40.0