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