Populate fields in ducky encoder
BUG=b/257303751
Change-Id: I34d52cabcf8b1194072e0d1cc856db5159db2b0e
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index ea3cfc0..0a41665 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -577,6 +577,7 @@
tpl_stats->intra_dist = recon_error << TPL_DEP_COST_SCALE_LOG2;
tpl_stats->intra_sse = pred_error << TPL_DEP_COST_SCALE_LOG2;
+ tpl_stats->intra_rate = rate_cost;
if (cpi->third_pass_ctx &&
frame_offset < cpi->third_pass_ctx->frame_info_count &&
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index ed98478..71cc320 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -118,6 +118,7 @@
int32_t inter_cost;
int32_t srcrf_rate;
int32_t recrf_rate;
+ int32_t intra_rate;
int32_t cmp_recrf_rate[2];
int_mv mv[INTER_REFS_PER_FRAME];
int8_t ref_frame_index[2];
diff --git a/av1/qmode_rc/ducky_encode.cc b/av1/qmode_rc/ducky_encode.cc
index 6e3e6d2..df69426 100644
--- a/av1/qmode_rc/ducky_encode.cc
+++ b/av1/qmode_rc/ducky_encode.cc
@@ -16,6 +16,7 @@
#include <vector>
#include "av1/common/enums.h"
+#include "av1/encoder/rd.h"
#include "config/aom_config.h"
#include "aom/aom_encoder.h"
@@ -433,7 +434,8 @@
obu_header_size + obu_payload_size + length_field_size;
}
-TplGopStats DuckyEncode::ObtainTplStats(const GopStruct gop_struct) {
+TplGopStats DuckyEncode::ObtainTplStats(const GopStruct gop_struct,
+ bool rate_dist_present) {
TplGopStats tpl_gop_stats;
AV1_PRIMARY *ppi = impl_ptr_->enc_resource.ppi;
@@ -441,6 +443,8 @@
for (size_t idx = 0; idx < gop_struct.gop_frame_list.size(); ++idx) {
TplFrameStats tpl_frame_stats = {};
+ tpl_frame_stats.rate_dist_present = rate_dist_present;
+
TplDepFrame *tpl_frame = &ppi->tpl_data.tpl_frame[idx];
if (gop_struct.gop_frame_list[idx].update_type == GopFrameType::kOverlay ||
gop_struct.gop_frame_list[idx].update_type ==
@@ -475,10 +479,21 @@
block_stats.col = mi_col * MI_SIZE;
block_stats.height = (1 << block_mis_log2) * MI_SIZE;
block_stats.width = (1 << block_mis_log2) * MI_SIZE;
- block_stats.inter_cost = tpl_stats_ptr->inter_cost
- << TPL_DEP_COST_SCALE_LOG2;
- block_stats.intra_cost = tpl_stats_ptr->intra_cost
- << TPL_DEP_COST_SCALE_LOG2;
+
+ block_stats.inter_cost =
+ RDCOST(tpl_frame->base_rdmult, tpl_stats_ptr->recrf_rate,
+ tpl_stats_ptr->recrf_dist);
+ block_stats.intra_cost =
+ RDCOST(tpl_frame->base_rdmult, tpl_stats_ptr->intra_rate,
+ tpl_stats_ptr->intra_dist);
+
+ if (tpl_frame_stats.rate_dist_present) {
+ block_stats.recrf_dist = tpl_stats_ptr->recrf_dist;
+ block_stats.recrf_rate = tpl_stats_ptr->recrf_rate;
+ block_stats.intra_pred_err = tpl_stats_ptr->intra_sse;
+ block_stats.inter_pred_err = tpl_stats_ptr->recrf_sse;
+ }
+
block_stats.ref_frame_index = { -1, -1 };
for (int i = 0; i < kBlockRefCount; ++i) {
@@ -502,6 +517,7 @@
}
// Obtain TPL stats through ducky_encode.
+// TODO(jianj): Populate rate_dist_present flag through qmode_rc_encoder
std::vector<TplGopStats> DuckyEncode::ComputeTplStats(
const GopStructList &gop_list,
const GopEncodeInfoList &gop_encode_info_list) {
@@ -528,7 +544,8 @@
if (ppi->cpi->common.show_frame) pending_ctx_size_ = 0;
write_temp_delimiter_ = ppi->cpi->common.show_frame;
}
- tpl_gop_stats = ObtainTplStats(gop_struct);
+ // The rate_dist_present needs to be populated.
+ tpl_gop_stats = ObtainTplStats(gop_struct, 0);
tpl_gop_stats_list.push_back(tpl_gop_stats);
}
diff --git a/av1/qmode_rc/ducky_encode.h b/av1/qmode_rc/ducky_encode.h
index 984c03a..c5ac536 100644
--- a/av1/qmode_rc/ducky_encode.h
+++ b/av1/qmode_rc/ducky_encode.h
@@ -78,7 +78,9 @@
~DuckyEncode();
std::vector<FIRSTPASS_STATS> ComputeFirstPassStats();
void StartEncode(const std::vector<FIRSTPASS_STATS> &stats_list);
- TplGopStats ObtainTplStats(const GopStruct gop_struct);
+
+ TplGopStats ObtainTplStats(const GopStruct gop_struct, bool rate_dist_flag);
+
std::vector<TplGopStats> ComputeTplStats(
const GopStructList &gop_list,
const GopEncodeInfoList &gop_encode_info_list);