Port simplified rdmult computation from libvpx Change-Id: Id4d4e1c87d8df8657d7b3c488a777d67906f4491
diff --git a/av1/common/quant_common.c b/av1/common/quant_common.c index 72bcee3..d4bdb98 100644 --- a/av1/common/quant_common.c +++ b/av1/common/quant_common.c
@@ -191,10 +191,11 @@ // underflow to 0 in the actual quantization routines. int16_t av1_dc_quant_Q3(int qindex, int delta, aom_bit_depth_t bit_depth) { + const int q_clamped = clamp(qindex + delta, 0, MAXQ); switch (bit_depth) { - case AOM_BITS_8: return dc_qlookup_Q3[clamp(qindex + delta, 0, MAXQ)]; - case AOM_BITS_10: return dc_qlookup_10_Q3[clamp(qindex + delta, 0, MAXQ)]; - case AOM_BITS_12: return dc_qlookup_12_Q3[clamp(qindex + delta, 0, MAXQ)]; + case AOM_BITS_8: return dc_qlookup_Q3[q_clamped]; + case AOM_BITS_10: return dc_qlookup_10_Q3[q_clamped]; + case AOM_BITS_12: return dc_qlookup_12_Q3[q_clamped]; default: assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12"); return -1; @@ -202,10 +203,11 @@ } int16_t av1_ac_quant_Q3(int qindex, int delta, aom_bit_depth_t bit_depth) { + const int q_clamped = clamp(qindex + delta, 0, MAXQ); switch (bit_depth) { - case AOM_BITS_8: return ac_qlookup_Q3[clamp(qindex + delta, 0, MAXQ)]; - case AOM_BITS_10: return ac_qlookup_10_Q3[clamp(qindex + delta, 0, MAXQ)]; - case AOM_BITS_12: return ac_qlookup_12_Q3[clamp(qindex + delta, 0, MAXQ)]; + case AOM_BITS_8: return ac_qlookup_Q3[q_clamped]; + case AOM_BITS_10: return ac_qlookup_10_Q3[q_clamped]; + case AOM_BITS_12: return ac_qlookup_12_Q3[q_clamped]; default: assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12"); return -1;
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c index f273f2e..f3019b4 100644 --- a/av1/encoder/rd.c +++ b/av1/encoder/rd.c
@@ -353,19 +353,19 @@ 128 // INTNL_ARF_UPDATE }; -int64_t av1_compute_rd_mult_based_on_qindex(const AV1_COMP *cpi, int qindex) { - const int64_t q = - av1_dc_quant_Q3(qindex, 0, cpi->common.seq_params.bit_depth); - int64_t rdmult = 0; +int av1_compute_rd_mult_based_on_qindex(const AV1_COMP *cpi, int qindex) { + const int q = av1_dc_quant_Q3(qindex, 0, cpi->common.seq_params.bit_depth); + int rdmult = q * q; + rdmult = rdmult * 3 + (rdmult * 2 / 3); switch (cpi->common.seq_params.bit_depth) { - case AOM_BITS_8: rdmult = 88 * q * q / 24; break; - case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 4); break; - case AOM_BITS_12: rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 8); break; + case AOM_BITS_8: break; + case AOM_BITS_10: rdmult = ROUND_POWER_OF_TWO(rdmult, 4); break; + case AOM_BITS_12: rdmult = ROUND_POWER_OF_TWO(rdmult, 8); break; default: assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12"); return -1; } - return rdmult; + return rdmult > 0 ? rdmult : 1; } int av1_compute_rd_mult(const AV1_COMP *cpi, int qindex) { @@ -378,7 +378,6 @@ rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7; rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7); } - if (rdmult < 1) rdmult = 1; return (int)rdmult; }
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h index 6250df6..2e2a30d 100644 --- a/av1/encoder/rd.h +++ b/av1/encoder/rd.h
@@ -643,8 +643,7 @@ struct AV1_COMP; struct macroblock; -int64_t av1_compute_rd_mult_based_on_qindex(const struct AV1_COMP *cpi, - int qindex); +int av1_compute_rd_mult_based_on_qindex(const struct AV1_COMP *cpi, int qindex); int av1_compute_rd_mult(const struct AV1_COMP *cpi, int qindex);
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c index 2769b52..da707a1 100644 --- a/av1/encoder/temporal_filter.c +++ b/av1/encoder/temporal_filter.c
@@ -713,8 +713,7 @@ } // Initialize errorperbit, sadperbit16 and sadperbit4. - rdmult = (int)av1_compute_rd_mult_based_on_qindex(cpi, ARNR_FILT_QINDEX); - if (rdmult < 1) rdmult = 1; + rdmult = av1_compute_rd_mult_based_on_qindex(cpi, ARNR_FILT_QINDEX); set_error_per_bit(&cpi->td.mb, rdmult); av1_initialize_me_consts(cpi, &cpi->td.mb, ARNR_FILT_QINDEX); av1_initialize_cost_tables(&cpi->common, &cpi->td.mb);