Properly populate alt_unit_stats field
Fix an issue that caused the alt_unit_stats field not properly
populated. Use the corresponding rdmult for the ARFs in the second
TPL pass accordingly.
This fix improves the coding performance by 8% in PSNR and 7% in
VMAF for the 4K testsets.
Change-Id: Ib1cfcf009da35356bf2aaa2c449a6f8553d85ff7
diff --git a/av1/qmode_rc/ratectrl_qmode.cc b/av1/qmode_rc/ratectrl_qmode.cc
index f4b4887..ed36d47 100644
--- a/av1/qmode_rc/ratectrl_qmode.cc
+++ b/av1/qmode_rc/ratectrl_qmode.cc
@@ -22,6 +22,7 @@
#include "aom/aom_codec.h"
#include "av1/encoder/pass2_strategy.h"
+#include "av1/encoder/ratectrl.h"
#include "av1/encoder/tpl_model.h"
namespace aom {
@@ -1002,9 +1003,10 @@
}
} // namespace
-Status FillTplUnitDepStats(TplFrameDepStats &frame_dep_stats,
- const TplFrameStats &frame_stats,
- const std::vector<TplBlockStats> &block_stats_list) {
+Status FillTplUnitDepStats(
+ std::vector<std::vector<TplUnitDepStats>> &unit_stats,
+ const TplFrameStats &frame_stats,
+ const std::vector<TplBlockStats> &block_stats_list) {
const int min_block_size = frame_stats.min_block_size;
const int unit_rows =
(frame_stats.frame_height + min_block_size - 1) / min_block_size;
@@ -1026,12 +1028,11 @@
const int block_unit_cols = std::min(block_stats.width / min_block_size,
unit_cols - block_unit_col);
const int unit_count = block_unit_rows * block_unit_cols;
- TplUnitDepStats unit_stats =
+ TplUnitDepStats this_unit_stats =
TplBlockStatsToDepStats(block_stats, unit_count);
for (int r = 0; r < block_unit_rows; r++) {
for (int c = 0; c < block_unit_cols; c++) {
- frame_dep_stats.unit_stats[block_unit_row + r][block_unit_col + c] =
- unit_stats;
+ unit_stats[block_unit_row + r][block_unit_col + c] = this_unit_stats;
}
}
}
@@ -1048,12 +1049,12 @@
frame_stats.frame_height, frame_stats.frame_width, min_block_size,
!frame_stats.alternate_block_stats_list.empty());
- Status status = FillTplUnitDepStats(frame_dep_stats, frame_stats,
+ Status status = FillTplUnitDepStats(frame_dep_stats.unit_stats, frame_stats,
frame_stats.block_stats_list);
if (!status.ok()) return status;
if (!frame_stats.alternate_block_stats_list.empty()) {
- status = FillTplUnitDepStats(frame_dep_stats, frame_stats,
+ status = FillTplUnitDepStats(frame_dep_stats.alt_unit_stats, frame_stats,
frame_stats.alternate_block_stats_list);
if (!status.ok()) return status;
frame_dep_stats.rdcost =
@@ -1556,6 +1557,8 @@
gop_frame.update_type == GopFrameType::kRegularKey ||
gop_frame.update_type == GopFrameType::kRegularArf) {
param.q_index = 5;
+ param.rdmult = av1_compute_rd_mult_based_on_qindex(
+ AOM_BITS_8, ARF_UPDATE, param.q_index);
}
}
gop_encode_info.param_list.push_back(param);