Merge "dc quantizer fix for 32x32 transforms"
This commit is contained in:
commit
87d1a488ed
@ -3907,7 +3907,7 @@ static void encode_frame_internal(VP9_COMP *cpi) {
|
||||
// Special case: set prev_mi to NULL when the previous mode info
|
||||
// context cannot be used.
|
||||
cm->prev_mi = cm->use_prev_frame_mvs ?
|
||||
cm->prev_mip + cm->mi_stride + 1 : NULL;
|
||||
cm->prev_mip + cm->mi_stride + 1 : NULL;
|
||||
|
||||
x->quant_fp = cpi->sf.use_quant_fp;
|
||||
vp9_zero(x->skip_txfm);
|
||||
|
@ -476,19 +476,19 @@ void vp9_xform_quant_dc(MACROBLOCK *x, int plane, int block,
|
||||
break;
|
||||
case TX_16X16:
|
||||
vp9_highbd_fdct16x16_1(src_diff, coeff, diff_stride);
|
||||
vp9_highbd_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_highbd_quantize_dc(coeff, 256, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
case TX_8X8:
|
||||
vp9_highbd_fdct8x8_1(src_diff, coeff, diff_stride);
|
||||
vp9_highbd_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_highbd_quantize_dc(coeff, 64, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
case TX_4X4:
|
||||
x->fwd_txm4x4(src_diff, coeff, diff_stride);
|
||||
vp9_highbd_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_highbd_quantize_dc(coeff, 16, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
@ -508,19 +508,19 @@ void vp9_xform_quant_dc(MACROBLOCK *x, int plane, int block,
|
||||
break;
|
||||
case TX_16X16:
|
||||
vp9_fdct16x16_1(src_diff, coeff, diff_stride);
|
||||
vp9_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_quantize_dc(coeff, 256, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
case TX_8X8:
|
||||
vp9_fdct8x8_1(src_diff, coeff, diff_stride);
|
||||
vp9_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_quantize_dc(coeff, 64, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
case TX_4X4:
|
||||
x->fwd_txm4x4(src_diff, coeff, diff_stride);
|
||||
vp9_quantize_dc(coeff, x->skip_block, p->round,
|
||||
vp9_quantize_dc(coeff, 16, x->skip_block, p->round,
|
||||
p->quant_fp[0], qcoeff, dqcoeff,
|
||||
pd->dequant[0], eob);
|
||||
break;
|
||||
|
@ -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) {
|
||||
|
@ -37,7 +37,8 @@ typedef struct {
|
||||
DECLARE_ALIGNED(16, int16_t, uv_round[QINDEX_RANGE][8]);
|
||||
} QUANTS;
|
||||
|
||||
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_ptr,
|
||||
tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
|
||||
const int16_t dequant_ptr, uint16_t *eob_ptr);
|
||||
@ -49,7 +50,8 @@ void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block,
|
||||
const int16_t *scan, const int16_t *iscan);
|
||||
|
||||
#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_ptr,
|
||||
tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
|
||||
const int16_t dequant_ptr, uint16_t *eob_ptr);
|
||||
|
Loading…
Reference in New Issue
Block a user