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);