diff --git a/vp9/common/vp9_idctllm.c b/vp9/common/vp9_idctllm.c index 7dd2776f65712b78151b1aa756a1566edc257b76..85f8fd7db2d5d0a22a7d6e267de9bf6654638b1d 100644 --- a/vp9/common/vp9_idctllm.c +++ b/vp9/common/vp9_idctllm.c @@ -1644,6 +1644,16 @@ void vp9_short_idct32x32_c(int16_t *input, int16_t *output, int pitch) { } } +void vp9_short_idct1_32x32_c(int16_t *input, int16_t *output) { + int tmp; + int16_t out; + tmp = input[0] * cospi_16_64; + out = dct_const_round_shift(tmp); + tmp = out * cospi_16_64; + out = dct_const_round_shift(tmp); + *output = (out + 32) >> 6; +} + #else // !CONFIG_DWTDCTHYBRID #if DWT_TYPE == 53 diff --git a/vp9/common/vp9_rtcd_defs.sh b/vp9/common/vp9_rtcd_defs.sh index 7822ee8572f94422564a52beef3f81049b51ff0b..8f66e06c83ca1564eede754c49d9b89399691f98 100644 --- a/vp9/common/vp9_rtcd_defs.sh +++ b/vp9/common/vp9_rtcd_defs.sh @@ -408,6 +408,9 @@ specialize vp9_short_idct1_16x16 prototype void vp9_short_idct32x32 "int16_t *input, int16_t *output, int pitch" specialize vp9_short_idct32x32 +prototype void vp9_short_idct1_32x32 "int16_t *input, int16_t *output" +specialize vp9_short_idct1_32x32 + prototype void vp9_ihtllm "const int16_t *input, int16_t *output, int pitch, int tx_type, int tx_dim, int16_t eobs" specialize vp9_ihtllm diff --git a/vp9/decoder/vp9_dequantize.c b/vp9/decoder/vp9_dequantize.c index e46be3ac7e9caaec73dc0f844c0e496eea3f62d2..18d4e59c710d3a88a1cb01993c9000744dd7e9b3 100644 --- a/vp9/decoder/vp9_dequantize.c +++ b/vp9/decoder/vp9_dequantize.c @@ -349,13 +349,22 @@ void vp9_dequant_idct_add_32x32_c(int16_t *input, const int16_t *dq, int i; if (eob) { - input[0]= input[0] * dq[0] / 2; - for (i = 1; i < 1024; i++) - input[i] = input[i] * dq[1] / 2; - vp9_short_idct32x32_c(input, output, 64); - vpx_memset(input, 0, 2048); - - add_residual(output, pred, pitch, dest, stride, 32, 32); + input[0] = input[0] * dq[0] / 2; +#if !CONFIG_DWTDCTHYBRID + if (eob == 1) { + vp9_short_idct1_32x32_c(input, output); + add_constant_residual(output[0], pred, pitch, dest, stride, 32, 32); + input[0] = 0; + } else { +#endif + for (i = 1; i < 1024; i++) + input[i] = input[i] * dq[1] / 2; + vp9_short_idct32x32_c(input, output, 64); + vpx_memset(input, 0, 2048); + add_residual(output, pred, pitch, dest, stride, 32, 32); +#if !CONFIG_DWTDCTHYBRID + } +#endif } }