Refactor av1_compute_rd_mult_based_on_qindex()
Clarify the dependency by changing function interface.
Change-Id: Id97ca5c33fe9501197bcb9d4f2dfd9124e4b6a08
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 4ce34f0..3ef5e5f 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2941,6 +2941,10 @@
int64_t rate2 = INT64_MAX;
int largest_tile_id2;
double proj_rdcost1 = DBL_MAX;
+ const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
+ const FRAME_UPDATE_TYPE update_type =
+ gf_group->update_type[cpi->gf_frame_index];
+ const aom_bit_depth_t bit_depth = cm->seq_params->bit_depth;
// Encode with superres.
if (cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_ALL) {
@@ -2949,9 +2953,7 @@
int64_t superres_rates[SCALE_NUMERATOR];
int superres_largest_tile_ids[SCALE_NUMERATOR];
// Use superres for Key-frames and Alt-ref frames only.
- const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
- if (gf_group->update_type[cpi->gf_frame_index] != OVERLAY_UPDATE &&
- gf_group->update_type[cpi->gf_frame_index] != INTNL_OVERLAY_UPDATE) {
+ if (update_type != OVERLAY_UPDATE && update_type != INTNL_OVERLAY_UPDATE) {
for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
++denom) {
superres_cfg->superres_scale_denominator = denom;
@@ -2985,8 +2987,8 @@
if (err != AOM_CODEC_OK) return err;
// Note: Both use common rdmult based on base qindex of fullres.
- const int64_t rdmult =
- av1_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);
+ const int64_t rdmult = av1_compute_rd_mult_based_on_qindex(
+ bit_depth, update_type, cm->quant_params.base_qindex);
// Find the best rdcost among all superres denoms.
int best_denom = -1;
@@ -2997,7 +2999,7 @@
const int64_t this_rate = superres_rates[this_index];
const int this_largest_tile_id = superres_largest_tile_ids[this_index];
const double this_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, this_rate, this_sse, cm->seq_params->bit_depth);
+ rdmult, this_rate, this_sse, bit_depth);
if (this_rdcost < proj_rdcost1) {
sse1 = this_sse;
rate1 = this_rate;
@@ -3006,8 +3008,8 @@
best_denom = denom;
}
}
- const double proj_rdcost2 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, rate2, sse2, cm->seq_params->bit_depth);
+ const double proj_rdcost2 =
+ RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate2, sse2, bit_depth);
// Re-encode with superres if it's better.
if (proj_rdcost1 < proj_rdcost2) {
restore_all_coding_context(cpi);
@@ -3049,12 +3051,12 @@
if (err != AOM_CODEC_OK) return err;
// Note: Both use common rdmult based on base qindex of fullres.
- const int64_t rdmult =
- av1_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);
- proj_rdcost1 = RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate1, sse1,
- cm->seq_params->bit_depth);
- const double proj_rdcost2 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, rate2, sse2, cm->seq_params->bit_depth);
+ const int64_t rdmult = av1_compute_rd_mult_based_on_qindex(
+ bit_depth, update_type, cm->quant_params.base_qindex);
+ proj_rdcost1 =
+ RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate1, sse1, bit_depth);
+ const double proj_rdcost2 =
+ RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate2, sse2, bit_depth);
// Re-encode with superres if it's better.
if (proj_rdcost1 < proj_rdcost2) {
restore_all_coding_context(cpi);
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 635a183..bef4b6c 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -374,12 +374,11 @@
return 3.3 + (0.0035 * (double)qindex);
}
-int av1_compute_rd_mult_based_on_qindex(const AV1_COMP *cpi, int qindex) {
- const int q = av1_dc_quant_QTX(qindex, 0, cpi->common.seq_params->bit_depth);
- const FRAME_UPDATE_TYPE update_type =
- cpi->ppi->gf_group.update_type[cpi->gf_frame_index];
+int av1_compute_rd_mult_based_on_qindex(aom_bit_depth_t bit_depth,
+ FRAME_UPDATE_TYPE update_type,
+ int qindex) {
+ const int q = av1_dc_quant_QTX(qindex, 0, bit_depth);
int rdmult = q * q;
-
if (update_type == KF_UPDATE) {
double def_rd_q_mult = def_kf_rd_multiplier(qindex);
rdmult = (int)((double)rdmult * def_rd_q_mult);
@@ -391,7 +390,7 @@
rdmult = (int)((double)rdmult * def_rd_q_mult);
}
- switch (cpi->common.seq_params->bit_depth) {
+ switch (bit_depth) {
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;
@@ -403,7 +402,11 @@
}
int av1_compute_rd_mult(const AV1_COMP *cpi, int qindex) {
- int64_t rdmult = av1_compute_rd_mult_based_on_qindex(cpi, qindex);
+ const aom_bit_depth_t bit_depth = cpi->common.seq_params->bit_depth;
+ const FRAME_UPDATE_TYPE update_type =
+ cpi->ppi->gf_group.update_type[cpi->gf_frame_index];
+ int64_t rdmult =
+ av1_compute_rd_mult_based_on_qindex(bit_depth, update_type, qindex);
if (is_stat_consumption_stage(cpi) &&
(cpi->common.current_frame.frame_type != KEY_FRAME)) {
const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index c9a4ae0..db61df7 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -19,6 +19,7 @@
#include "av1/encoder/block.h"
#include "av1/encoder/context_tree.h"
#include "av1/encoder/cost.h"
+#include "av1/encoder/ratectrl.h"
#ifdef __cplusplus
extern "C" {
@@ -191,7 +192,17 @@
struct AV1_COMP;
struct macroblock;
-int av1_compute_rd_mult_based_on_qindex(const struct AV1_COMP *cpi, int qindex);
+/*!\brief Compute rdmult based on q index and frame update type
+ *
+ * \param[in] bit_depth bit depth
+ * \param[in] update_type frame update type
+ * \param[in] qindex q index
+ *
+ * \return rdmult
+ */
+int av1_compute_rd_mult_based_on_qindex(aom_bit_depth_t bit_depth,
+ FRAME_UPDATE_TYPE update_type,
+ int qindex);
int av1_compute_rd_mult(const struct AV1_COMP *cpi, int qindex);
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 0116398..aee3828 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1057,7 +1057,7 @@
const YV12_BUFFER_CONFIG *this_frame = tpl_frame->gf_picture;
const YV12_BUFFER_CONFIG *ref_frames_ordered[INTER_REFS_PER_FRAME];
uint32_t ref_frame_display_indices[INTER_REFS_PER_FRAME];
- GF_GROUP *gf_group = &cpi->ppi->gf_group;
+ const GF_GROUP *gf_group = &cpi->ppi->gf_group;
int ref_pruning_enabled = is_frame_eligible_for_ref_pruning(
gf_group, cpi->sf.inter_sf.selective_ref_frame,
cpi->sf.tpl_sf.prune_ref_frames_in_tpl, frame_idx);
@@ -1144,8 +1144,12 @@
cm->quant_params.base_qindex = base_qindex;
av1_frame_init_quantizer(cpi);
- tpl_frame->base_rdmult =
- av1_compute_rd_mult_based_on_qindex(cpi, pframe_qindex) / 6;
+ const BitDepthInfo bd_info = get_bit_depth_info(xd);
+ const FRAME_UPDATE_TYPE update_type =
+ gf_group->update_type[cpi->gf_frame_index];
+ tpl_frame->base_rdmult = av1_compute_rd_mult_based_on_qindex(
+ bd_info.bit_depth, update_type, pframe_qindex) /
+ 6;
av1_init_tpl_txfm_stats(tpl_txfm_stats);
}