Simplify new_quant experiment

Changes number of non-uniform bins from 5 to 3.
Changed all references to 'KNOTES' to 'KNOTS'.

Change-Id: If39d7cef00dbe07307035e44cb29194d0783b475
This commit is contained in:
Brandon Young 2015-12-17 12:17:50 -08:00
parent d7eb423a72
commit 604b909e06
4 changed files with 110 additions and 110 deletions

View File

@ -29,71 +29,71 @@ int tx_skip_q_thresh_intra = 255;
// There are four sets of values for 4 different quantizer ranges.
//
// TODO(debargha): Optimize these tables
static const uint8_t vp9_nuq_knotes_lossless[COEF_BANDS][NUQ_KNOTES] = {
{64, 128, 128, 128, 128}, // dc, band 0
{64, 128, 128, 128, 128}, // band 1
{64, 128, 128, 128, 128}, // band 2
{64, 128, 128, 128, 128}, // band 3
{64, 128, 128, 128, 128}, // band 4
{64, 128, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_lossless[COEF_BANDS][NUQ_KNOTS] = {
{64, 128, 128}, // dc, band 0
{64, 128, 128}, // band 1
{64, 128, 128}, // band 2
{64, 128, 128}, // band 3
{64, 128, 128}, // band 4
{64, 128, 128}, // band 5
#if CONFIG_TX_SKIP
{64, 128, 128, 128, 128}, // band 6
{64, 128, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
static const uint8_t vp9_nuq_knotes_tiny[COEF_BANDS][NUQ_KNOTES] = {
{84, 124, 128, 128, 128}, // dc, band 0
{84, 124, 128, 128, 128}, // band 1
{84, 124, 128, 128, 128}, // band 2
{86, 124, 128, 128, 128}, // band 3
{86, 124, 128, 128, 128}, // band 4
{86, 124, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_tiny[COEF_BANDS][NUQ_KNOTS] = {
{84, 124, 128}, // dc, band 0
{84, 124, 128}, // band 1
{84, 124, 128}, // band 2
{86, 124, 128}, // band 3
{86, 124, 128}, // band 4
{86, 124, 128}, // band 5
#if CONFIG_TX_SKIP
{84, 124, 128, 128, 128}, // band 6
{84, 124, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
static const uint8_t vp9_nuq_knotes_low[COEF_BANDS][NUQ_KNOTES] = {
{84, 124, 128, 128, 128}, // dc, band 0
{84, 124, 128, 128, 128}, // band 1
{84, 124, 128, 128, 128}, // band 2
{86, 124, 128, 128, 128}, // band 3
{86, 124, 128, 128, 128}, // band 4
{86, 124, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_low[COEF_BANDS][NUQ_KNOTS] = {
{84, 124, 128}, // dc, band 0
{84, 124, 128}, // band 1
{84, 124, 128}, // band 2
{86, 124, 128}, // band 3
{86, 124, 128}, // band 4
{86, 124, 128}, // band 5
#if CONFIG_TX_SKIP
{84, 124, 128, 128, 128}, // band 6
{84, 124, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
static const uint8_t vp9_nuq_knotes_mid[COEF_BANDS][NUQ_KNOTES] = {
{84, 124, 128, 128, 128}, // dc, band 0
{84, 124, 128, 128, 128}, // band 1
{84, 124, 128, 128, 128}, // band 2
{86, 124, 128, 128, 128}, // band 3
{86, 124, 128, 128, 128}, // band 4
{86, 124, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_mid[COEF_BANDS][NUQ_KNOTS] = {
{84, 124, 128}, // dc, band 0
{84, 124, 128}, // band 1
{84, 124, 128}, // band 2
{86, 124, 128}, // band 3
{86, 124, 128}, // band 4
{86, 124, 128}, // band 5
#if CONFIG_TX_SKIP
{84, 124, 128, 128, 128}, // band 6
{84, 124, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
static const uint8_t vp9_nuq_knotes_high[COEF_BANDS][NUQ_KNOTES] = {
{84, 124, 128, 128, 128}, // dc, band 0
{84, 124, 128, 128, 128}, // band 1
{84, 124, 128, 128, 128}, // band 2
{86, 124, 128, 128, 128}, // band 3
{86, 124, 128, 128, 128}, // band 4
{86, 124, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_high[COEF_BANDS][NUQ_KNOTS] = {
{84, 124, 128}, // dc, band 0
{84, 124, 128}, // band 1
{84, 124, 128}, // band 2
{86, 124, 128}, // band 3
{86, 124, 128}, // band 4
{86, 124, 128}, // band 5
#if CONFIG_TX_SKIP
{84, 124, 128, 128, 128}, // band 6
{84, 124, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
static const uint8_t vp9_nuq_knotes_huge[COEF_BANDS][NUQ_KNOTES] = {
{84, 124, 128, 128, 128}, // dc, band 0
{84, 124, 128, 128, 128}, // band 1
{84, 124, 128, 128, 128}, // band 2
{86, 124, 128, 128, 128}, // band 3
{86, 124, 128, 128, 128}, // band 4
{86, 124, 128, 128, 128}, // band 5
static const uint8_t vp9_nuq_knots_huge[COEF_BANDS][NUQ_KNOTS] = {
{84, 124, 128}, // dc, band 0
{84, 124, 128}, // band 1
{84, 124, 128}, // band 2
{86, 124, 128}, // band 3
{86, 124, 128}, // band 4
{86, 124, 128}, // band 5
#if CONFIG_TX_SKIP
{84, 124, 128, 128, 128}, // band 6
{84, 124, 128}, // band 6
#endif // CONFIG_TX_SKIP
};
@ -131,21 +131,21 @@ static const uint8_t vp9_nuq_doff_huge[COEF_BANDS] = { 8, 16, 17, 22, 23, 24
// Allow different quantization profiles in different q ranges,
// to enable entropy-constraints in scalar quantization.
static const uint8_t *get_nuq_knotes(int16_t quant, int lossless,
static const uint8_t *get_nuq_knots(int16_t quant, int lossless,
int band, int bd) {
const int shift = bd - 8;
if (lossless)
return vp9_nuq_knotes_lossless[band];
return vp9_nuq_knots_lossless[band];
if (quant > (512 << shift))
return vp9_nuq_knotes_huge[band];
return vp9_nuq_knots_huge[band];
else if (quant > (256 << shift))
return vp9_nuq_knotes_high[band];
return vp9_nuq_knots_high[band];
else if (quant > (128 << shift))
return vp9_nuq_knotes_mid[band];
return vp9_nuq_knots_mid[band];
else if (quant > (64 << shift))
return vp9_nuq_knotes_low[band];
return vp9_nuq_knots_low[band];
else
return vp9_nuq_knotes_tiny[band];
return vp9_nuq_knots_tiny[band];
}
static INLINE int16_t quant_to_doff_fixed(int16_t quant, int lossless,
@ -167,41 +167,41 @@ static INLINE int16_t quant_to_doff_fixed(int16_t quant, int lossless,
static INLINE void get_cumbins_nuq(int q, int lossless, int band, int bd,
tran_low_t *cumbins) {
const uint8_t *knotes = get_nuq_knotes(q, lossless, band, bd);
int16_t cumknotes[NUQ_KNOTES];
const uint8_t *knots = get_nuq_knots(q, lossless, band, bd);
int16_t cumknots[NUQ_KNOTS];
int i;
cumknotes[0] = knotes[0];
for (i = 1; i < NUQ_KNOTES; ++i)
cumknotes[i] = cumknotes[i - 1] + knotes[i];
for (i = 0; i < NUQ_KNOTES; ++i)
cumbins[i] = (cumknotes[i] * q + 64) >> 7;
cumknots[0] = knots[0];
for (i = 1; i < NUQ_KNOTS; ++i)
cumknots[i] = cumknots[i - 1] + knots[i];
for (i = 0; i < NUQ_KNOTS; ++i)
cumbins[i] = (cumknots[i] * q + 64) >> 7;
}
void vp9_get_dequant_val_nuq(int q, int lossless, int band, int bd,
tran_low_t *dq, tran_low_t *cumbins) {
const uint8_t *knotes = get_nuq_knotes(q, lossless, band, bd);
tran_low_t cumbins_[NUQ_KNOTES], *cumbins_ptr;
const uint8_t *knots = get_nuq_knots(q, lossless, band, bd);
tran_low_t cumbins_[NUQ_KNOTS], *cumbins_ptr;
tran_low_t doff;
int i;
cumbins_ptr = (cumbins ? cumbins : cumbins_);
get_cumbins_nuq(q, lossless, band, bd, cumbins_ptr);
dq[0] = 0;
for (i = 1; i < NUQ_KNOTES; ++i) {
const int16_t qstep = (knotes[i] * q + 64) >> 7;
for (i = 1; i < NUQ_KNOTS; ++i) {
const int16_t qstep = (knots[i] * q + 64) >> 7;
doff = quant_to_doff_fixed(qstep, lossless, band, bd);
doff = (2 * doff * qstep + q) / (2 * q);
dq[i] = cumbins_ptr[i - 1] + (((knotes[i] - doff * 2) * q + 128) >> 8);
dq[i] = cumbins_ptr[i - 1] + (((knots[i] - doff * 2) * q + 128) >> 8);
}
doff = quant_to_doff_fixed(q, lossless, band, bd);
dq[NUQ_KNOTES] =
cumbins_ptr[NUQ_KNOTES - 1] + (((64 - doff) * q + 64) >> 7);
dq[NUQ_KNOTS] =
cumbins_ptr[NUQ_KNOTS - 1] + (((64 - doff) * q + 64) >> 7);
}
tran_low_t vp9_dequant_abscoeff_nuq(int v, int q, const tran_low_t *dq) {
if (v <= NUQ_KNOTES)
if (v <= NUQ_KNOTS)
return dq[v];
else
return dq[NUQ_KNOTES] + (v - NUQ_KNOTES) * q;
return dq[NUQ_KNOTS] + (v - NUQ_KNOTS) * q;
}
tran_low_t vp9_dequant_coeff_nuq(int v, int q, const tran_low_t *dq) {

View File

@ -44,9 +44,9 @@ static INLINE int16_t vp9_round_factor_to_round(int16_t quant,
}
#if CONFIG_NEW_QUANT
#define NUQ_KNOTES 5
typedef tran_low_t dequant_val_type_nuq[NUQ_KNOTES + 1];
typedef tran_low_t cumbins_type_nuq[NUQ_KNOTES];
#define NUQ_KNOTS 3
typedef tran_low_t dequant_val_type_nuq[NUQ_KNOTS + 1];
typedef tran_low_t cumbins_type_nuq[NUQ_KNOTS];
void vp9_get_dequant_val_nuq(int q, int lossless, int band, int bd,
tran_low_t *dq, tran_low_t *cumbins);
tran_low_t vp9_dequant_abscoeff_nuq(int v, int q, const tran_low_t *dq);

View File

@ -54,15 +54,15 @@ static INLINE int quantize_coeff_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int tmp = clamp(abs_coeff, INT16_MIN, INT16_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < cumbins_ptr[i]) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
tmp -= cumbins_ptr[NUQ_KNOTES - 1];
q = NUQ_KNOTES + (((((tmp * quant) >> 16) + tmp) * quant_shift) >> 16);
if (i == NUQ_KNOTS) {
tmp -= cumbins_ptr[NUQ_KNOTS - 1];
q = NUQ_KNOTS + (((((tmp * quant) >> 16) + tmp) * quant_shift) >> 16);
}
if (q) {
*dqcoeff_ptr =
@ -90,15 +90,15 @@ static INLINE int quantize_coeff_bigtx_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int tmp = clamp(abs_coeff, INT16_MIN, INT16_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < ROUND_POWER_OF_TWO(cumbins_ptr[i], 1 + logsizeby32)) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
tmp -= ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTES - 1], 1 + logsizeby32);
q = NUQ_KNOTES +
if (i == NUQ_KNOTS) {
tmp -= ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTS - 1], 1 + logsizeby32);
q = NUQ_KNOTS +
(((((tmp * quant) >> 16) + tmp) * quant_shift) >> (15 - logsizeby32));
}
if (q) {
@ -130,15 +130,15 @@ static INLINE int highbd_quantize_coeff_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int64_t tmp = clamp(abs_coeff, INT32_MIN, INT32_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < cumbins_ptr[i]) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
tmp -= cumbins_ptr[NUQ_KNOTES - 1];
q = NUQ_KNOTES + (((((tmp * quant) >> 16) + tmp) * quant_shift) >> 16);
if (i == NUQ_KNOTS) {
tmp -= cumbins_ptr[NUQ_KNOTS - 1];
q = NUQ_KNOTS + (((((tmp * quant) >> 16) + tmp) * quant_shift) >> 16);
}
if (q) {
*dqcoeff_ptr =
@ -166,15 +166,15 @@ static INLINE int highbd_quantize_coeff_bigtx_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int64_t tmp = clamp(abs_coeff, INT32_MIN, INT32_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < ROUND_POWER_OF_TWO(cumbins_ptr[i], 1 + logsizeby32)) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
tmp -= ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTES - 1], 1 + logsizeby32);
q = NUQ_KNOTES +
if (i == NUQ_KNOTS) {
tmp -= ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTS - 1], 1 + logsizeby32);
q = NUQ_KNOTS +
(((((tmp * quant) >> 16) + tmp) * quant_shift) >> (15 - logsizeby32));
}
if (q) {
@ -203,15 +203,15 @@ static INLINE int quantize_coeff_fp_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int tmp = clamp(abs_coeff, INT16_MIN, INT16_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < cumbins_ptr[i]) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
q = NUQ_KNOTES +
((((int64_t)tmp - cumbins_ptr[NUQ_KNOTES - 1]) * quant) >> 16);
if (i == NUQ_KNOTS) {
q = NUQ_KNOTS +
((((int64_t)tmp - cumbins_ptr[NUQ_KNOTS - 1]) * quant) >> 16);
}
if (q) {
*dqcoeff_ptr =
@ -238,15 +238,15 @@ static INLINE int quantize_coeff_bigtx_fp_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int tmp = clamp(abs_coeff, INT16_MIN, INT16_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < ROUND_POWER_OF_TWO(cumbins_ptr[i], 1 + logsizeby32)) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
q = NUQ_KNOTES +
((((int64_t)tmp - ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTES - 1],
if (i == NUQ_KNOTS) {
q = NUQ_KNOTS +
((((int64_t)tmp - ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTS - 1],
1 + logsizeby32)) * quant) >>
(15 - logsizeby32));
}
@ -278,15 +278,15 @@ static INLINE int highbd_quantize_coeff_fp_nuq(const tran_low_t coeffv,
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int64_t tmp = clamp(abs_coeff, INT32_MIN, INT32_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < cumbins_ptr[i]) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
q = NUQ_KNOTES +
(((tmp - cumbins_ptr[NUQ_KNOTES - 1]) * quant) >> 16);
if (i == NUQ_KNOTS) {
q = NUQ_KNOTS +
(((tmp - cumbins_ptr[NUQ_KNOTS - 1]) * quant) >> 16);
}
if (q) {
*dqcoeff_ptr =
@ -314,15 +314,15 @@ static INLINE int highbd_quantize_coeff_bigtx_fp_nuq(
const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
int i, q;
int64_t tmp = clamp(abs_coeff, INT32_MIN, INT32_MAX);
for (i = 0; i < NUQ_KNOTES; i++) {
for (i = 0; i < NUQ_KNOTS; i++) {
if (tmp < ROUND_POWER_OF_TWO(cumbins_ptr[i], 1 + logsizeby32)) {
q = i;
break;
}
}
if (i == NUQ_KNOTES) {
q = NUQ_KNOTES +
(((tmp - ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTES - 1],
if (i == NUQ_KNOTS) {
q = NUQ_KNOTS +
(((tmp - ROUND_POWER_OF_TWO(cumbins_ptr[NUQ_KNOTS - 1],
1 + logsizeby32)) * quant) >>
(15 - logsizeby32));
}

View File

@ -21,9 +21,9 @@ extern "C" {
typedef struct {
#if CONFIG_NEW_QUANT
DECLARE_ALIGNED(16, tran_low_t,
y_cumbins_nuq[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTES]);
y_cumbins_nuq[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTS]);
DECLARE_ALIGNED(16, tran_low_t,
uv_cumbins_nuq[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTES]);
uv_cumbins_nuq[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTS]);
#endif // CONFIG_NEW_QUANT
DECLARE_ALIGNED(16, int16_t, y_quant[QINDEX_RANGE][8]);
@ -62,9 +62,9 @@ typedef struct {
DECLARE_ALIGNED(16, int16_t, uv_round_pxd[QINDEX_RANGE][8]);
#if CONFIG_NEW_QUANT
DECLARE_ALIGNED(16, tran_low_t,
y_cumbins_nuq_pxd[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTES]);
y_cumbins_nuq_pxd[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTS]);
DECLARE_ALIGNED(16, tran_low_t,
uv_cumbins_nuq_pxd[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTES]);
uv_cumbins_nuq_pxd[QINDEX_RANGE][COEF_BANDS][NUQ_KNOTS]);
#endif // CONFIG_NEW_QUANT
#endif // CONFIG_TX_SKIP
} QUANTS;