| Index: source/libvpx/vp9/encoder/vp9_quantize.c
|
| diff --git a/source/libvpx/vp9/encoder/vp9_quantize.c b/source/libvpx/vp9/encoder/vp9_quantize.c
|
| index 7143987d444728c528429ead9b2b49ebb93f94ee..2523d1ea3fe64d422fd2a35f426190dc8e47da36 100644
|
| --- a/source/libvpx/vp9/encoder/vp9_quantize.c
|
| +++ b/source/libvpx/vp9/encoder/vp9_quantize.c
|
| @@ -19,7 +19,8 @@
|
| #include "vp9/encoder/vp9_quantize.h"
|
| #include "vp9/encoder/vp9_rd.h"
|
|
|
| -void vp9_quantize_dc(const tran_low_t *coeff_ptr, int skip_block,
|
| +void vp9_quantize_dc(const tran_low_t *coeff_ptr,
|
| + int n_coeffs, int skip_block,
|
| const int16_t *round_ptr, const int16_t quant,
|
| tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
|
| const int16_t dequant_ptr, uint16_t *eob_ptr) {
|
| @@ -29,6 +30,9 @@ void vp9_quantize_dc(const tran_low_t *coeff_ptr, int skip_block,
|
| const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
|
| int tmp, eob = -1;
|
|
|
| + vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
|
| + vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
|
| +
|
| if (!skip_block) {
|
| tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX);
|
| tmp = (tmp * quant) >> 16;
|
| @@ -41,12 +45,16 @@ void vp9_quantize_dc(const tran_low_t *coeff_ptr, int skip_block,
|
| }
|
|
|
| #if CONFIG_VP9_HIGHBITDEPTH
|
| -void vp9_highbd_quantize_dc(const tran_low_t *coeff_ptr, int skip_block,
|
| +void vp9_highbd_quantize_dc(const tran_low_t *coeff_ptr,
|
| + int n_coeffs, int skip_block,
|
| const int16_t *round_ptr, const int16_t quant,
|
| tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
|
| const int16_t dequant_ptr, uint16_t *eob_ptr) {
|
| int eob = -1;
|
|
|
| + vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
|
| + vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
|
| +
|
| if (!skip_block) {
|
| const int rc = 0;
|
| const int coeff = coeff_ptr[rc];
|
| @@ -69,15 +77,20 @@ void vp9_quantize_dc_32x32(const tran_low_t *coeff_ptr, int skip_block,
|
| const int16_t *round_ptr, const int16_t quant,
|
| tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
|
| const int16_t dequant_ptr, uint16_t *eob_ptr) {
|
| + const int n_coeffs = 1024;
|
| const int rc = 0;
|
| const int coeff = coeff_ptr[rc];
|
| const int coeff_sign = (coeff >> 31);
|
| const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
|
| int tmp, eob = -1;
|
|
|
| + vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
|
| + vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
|
| +
|
| if (!skip_block) {
|
|
|
| - tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX);
|
| + tmp = clamp(abs_coeff + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1),
|
| + INT16_MIN, INT16_MAX);
|
| tmp = (tmp * quant) >> 15;
|
| qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
|
| dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2;
|
| @@ -96,8 +109,12 @@ void vp9_highbd_quantize_dc_32x32(const tran_low_t *coeff_ptr,
|
| tran_low_t *dqcoeff_ptr,
|
| const int16_t dequant_ptr,
|
| uint16_t *eob_ptr) {
|
| + const int n_coeffs = 1024;
|
| int eob = -1;
|
|
|
| + vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
|
| + vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
|
| +
|
| if (!skip_block) {
|
| const int rc = 0;
|
| const int coeff = coeff_ptr[rc];
|
| @@ -105,8 +122,8 @@ void vp9_highbd_quantize_dc_32x32(const tran_low_t *coeff_ptr,
|
| const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
|
|
|
| const int64_t tmp =
|
| - (clamp(abs_coeff + round_ptr[rc != 0], INT32_MIN, INT32_MAX) *
|
| - quant) >> 15;
|
| + (clamp(abs_coeff + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1),
|
| + INT32_MIN, INT32_MAX) * quant) >> 15;
|
| qcoeff_ptr[rc] = (tran_low_t)((tmp ^ coeff_sign) - coeff_sign);
|
| dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2;
|
| if (tmp)
|
| @@ -521,21 +538,21 @@ void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block,
|
| #if CONFIG_VP9_HIGHBITDEPTH
|
| if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
|
| vp9_highbd_quantize_b(BLOCK_OFFSET(p->coeff, block),
|
| - 16, x->skip_block,
|
| - p->zbin, p->round, p->quant, p->quant_shift,
|
| - BLOCK_OFFSET(p->qcoeff, block),
|
| - BLOCK_OFFSET(pd->dqcoeff, block),
|
| - pd->dequant, &p->eobs[block],
|
| - scan, iscan);
|
| + 16, x->skip_block,
|
| + p->zbin, p->round, p->quant, p->quant_shift,
|
| + BLOCK_OFFSET(p->qcoeff, block),
|
| + BLOCK_OFFSET(pd->dqcoeff, block),
|
| + pd->dequant, &p->eobs[block],
|
| + scan, iscan);
|
| return;
|
| }
|
| #endif
|
| vp9_quantize_b(BLOCK_OFFSET(p->coeff, block),
|
| - 16, x->skip_block,
|
| - p->zbin, p->round, p->quant, p->quant_shift,
|
| - BLOCK_OFFSET(p->qcoeff, block),
|
| - BLOCK_OFFSET(pd->dqcoeff, block),
|
| - pd->dequant, &p->eobs[block], scan, iscan);
|
| + 16, x->skip_block,
|
| + p->zbin, p->round, p->quant, p->quant_shift,
|
| + BLOCK_OFFSET(p->qcoeff, block),
|
| + BLOCK_OFFSET(pd->dqcoeff, block),
|
| + pd->dequant, &p->eobs[block], scan, iscan);
|
| }
|
|
|
| static void invert_quant(int16_t *quant, int16_t *shift, int d) {
|
|
|