Make tpl rc estimate function standalone
Allow a standalone rc estimator for tpl model build.
Slight stats change due to gop rc initial setup.
STATS_CHANGED
Change-Id: I7fbb4ac008ca7af9a242b6389525daee09df6dbf
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 3715344..8475e60 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -976,8 +976,10 @@
if (cpi->gf_frame_index == 0 && !is_stat_generation_stage(cpi))
av1_init_tpl_stats(&cpi->ppi->tpl_data);
} else {
- if (!cpi->skip_tpl_setup_stats)
+ if (!cpi->skip_tpl_setup_stats) {
+ av1_tpl_preload_rc_estimate(cpi, frame_params);
av1_tpl_setup_stats(cpi, 0, frame_params, frame_input);
+ }
}
if (av1_encode(cpi, dest, frame_input, frame_params, frame_results) !=
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index c26f9d3..2937034 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -1020,6 +1020,8 @@
int gop_length_decision_method = cpi->sf.tpl_sf.gop_length_decision_method;
int shorten_gf_interval;
+ av1_tpl_preload_rc_estimate(cpi, frame_params);
+
if (gop_length_decision_method == 2) {
// GF group length is decided based on GF boost and tpl stats of ARFs from
// base layer, (base+1) layer.
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 00c9178..be1dae8 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1436,6 +1436,24 @@
}
}
+// TODO(jingning): Restructure av1_rc_pick_q_and_bounds() to narrow down
+// the scope of input arguments.
+void av1_tpl_preload_rc_estimate(AV1_COMP *cpi,
+ const EncodeFrameParams *const frame_params) {
+ AV1_COMMON *cm = &cpi->common;
+ GF_GROUP *gf_group = &cpi->ppi->gf_group;
+ int bottom_index, top_index;
+ cm->current_frame.frame_type = frame_params->frame_type;
+ for (int gf_index = cpi->gf_frame_index; gf_index < gf_group->size;
+ ++gf_index) {
+ cm->current_frame.frame_type = gf_group->frame_type[gf_index];
+ cm->show_frame = gf_group->update_type[gf_index] != ARF_UPDATE &&
+ gf_group->update_type[gf_index] != INTNL_ARF_UPDATE;
+ gf_group->q_val[gf_index] = av1_rc_pick_q_and_bounds(
+ cpi, cm->width, cm->height, gf_index, &bottom_index, &top_index);
+ }
+}
+
int av1_tpl_setup_stats(AV1_COMP *cpi, int gop_eval,
const EncodeFrameParams *const frame_params,
const EncodeFrameInput *const frame_input) {
@@ -1446,7 +1464,6 @@
MultiThreadInfo *const mt_info = &cpi->mt_info;
AV1TplRowMultiThreadInfo *const tpl_row_mt = &mt_info->tpl_row_mt;
GF_GROUP *gf_group = &cpi->ppi->gf_group;
- int bottom_index, top_index;
EncodeFrameParams this_frame_params = *frame_params;
TplParams *const tpl_data = &cpi->ppi->tpl_data;
int approx_gop_eval = (gop_eval > 1);
@@ -1474,12 +1491,6 @@
memcpy(&cpi->refresh_frame, &this_frame_params.refresh_frame,
sizeof(cpi->refresh_frame));
-
- cm->show_frame = gf_group->update_type[gf_index] != ARF_UPDATE &&
- gf_group->update_type[gf_index] != INTNL_ARF_UPDATE;
-
- gf_group->q_val[gf_index] = av1_rc_pick_q_and_bounds(
- cpi, cm->width, cm->height, gf_index, &bottom_index, &top_index);
}
int pframe_qindex;
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index 0e7eb31..4bc94bd 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -239,6 +239,9 @@
/*!\cond */
+void av1_tpl_preload_rc_estimate(
+ struct AV1_COMP *cpi, const struct EncodeFrameParams *const frame_params);
+
int av1_tpl_ptr_pos(int mi_row, int mi_col, int stride, uint8_t right_shift);
void av1_init_tpl_stats(TplParams *const tpl_data);