Move setup_tpl_buffers to tpl_model.c
When CONFIG_REALTIME_ONLY = 1, we can turn off tpl_model easily.
Change-Id: Idefaf10d4c1c58810a707e37ef2866a31e2022e8
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 27d0760..768c4f6 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1073,9 +1073,11 @@
}
#endif
+#if !CONFIG_REALTIME_ONLY
if (!is_stat_generation_stage(cpi)) {
- setup_tpl_buffers(cm, &cpi->tpl_data, cpi->oxcf.gf_cfg.lag_in_frames);
+ av1_setup_tpl_buffers(cm, &cpi->tpl_data, cpi->oxcf.gf_cfg.lag_in_frames);
}
+#endif
#if CONFIG_COLLECT_PARTITION_STATS
av1_zero(cpi->partition_stats);
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index 15f4ac9..43cc74c 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -105,64 +105,6 @@
aom_calloc(mi_params->mi_rows * mi_params->mi_cols, 1));
}
-static AOM_INLINE void set_tpl_stats_block_size(uint8_t *block_mis_log2,
- uint8_t *tpl_bsize_1d) {
- // tpl stats bsize: 2 means 16x16
- *block_mis_log2 = 2;
- // Block size used in tpl motion estimation
- *tpl_bsize_1d = 16;
- // MIN_TPL_BSIZE_1D = 16;
- assert(*tpl_bsize_1d >= 16);
-}
-
-static AOM_INLINE void setup_tpl_buffers(AV1_COMMON *const cm,
- TplParams *const tpl_data,
- int lag_in_frames) {
- CommonModeInfoParams *const mi_params = &cm->mi_params;
- set_tpl_stats_block_size(&tpl_data->tpl_stats_block_mis_log2,
- &tpl_data->tpl_bsize_1d);
- const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
- tpl_data->border_in_pixels =
- ALIGN_POWER_OF_TWO(tpl_data->tpl_bsize_1d + 2 * AOM_INTERP_EXTEND, 5);
-
- for (int frame = 0; frame < MAX_LENGTH_TPL_FRAME_STATS; ++frame) {
- const int mi_cols =
- ALIGN_POWER_OF_TWO(mi_params->mi_cols, MAX_MIB_SIZE_LOG2);
- const int mi_rows =
- ALIGN_POWER_OF_TWO(mi_params->mi_rows, MAX_MIB_SIZE_LOG2);
-
- tpl_data->tpl_stats_buffer[frame].is_valid = 0;
- tpl_data->tpl_stats_buffer[frame].width = mi_cols >> block_mis_log2;
- tpl_data->tpl_stats_buffer[frame].height = mi_rows >> block_mis_log2;
- tpl_data->tpl_stats_buffer[frame].stride =
- tpl_data->tpl_stats_buffer[frame].width;
- tpl_data->tpl_stats_buffer[frame].mi_rows = mi_params->mi_rows;
- tpl_data->tpl_stats_buffer[frame].mi_cols = mi_params->mi_cols;
- }
- tpl_data->tpl_frame = &tpl_data->tpl_stats_buffer[REF_FRAMES + 1];
-
- // If lag_in_frames <= 1, TPL module is not invoked. Hence tpl recon and
- // stats buffers are not allocated.
- if (lag_in_frames <= 1) return;
-
- // TODO(aomedia:2873): Explore the allocation of tpl buffers based on
- // lag_in_frames.
- for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
- CHECK_MEM_ERROR(
- cm, tpl_data->tpl_stats_pool[frame],
- aom_calloc(tpl_data->tpl_stats_buffer[frame].width *
- tpl_data->tpl_stats_buffer[frame].height,
- sizeof(*tpl_data->tpl_stats_buffer[frame].tpl_stats_ptr)));
- if (aom_alloc_frame_buffer(
- &tpl_data->tpl_rec_pool[frame], cm->width, cm->height,
- cm->seq_params.subsampling_x, cm->seq_params.subsampling_y,
- cm->seq_params.use_highbitdepth, tpl_data->border_in_pixels,
- cm->features.byte_alignment))
- aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
- "Failed to allocate frame buffer");
- }
-}
-
static AOM_INLINE void alloc_obmc_buffers(OBMCBuffer *obmc_buffer,
AV1_COMMON *cm) {
CHECK_MEM_ERROR(
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index e1500ec..50ed63d 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -74,6 +74,63 @@
*sse = AOMMAX(*sse, 1);
}
+static AOM_INLINE void set_tpl_stats_block_size(uint8_t *block_mis_log2,
+ uint8_t *tpl_bsize_1d) {
+ // tpl stats bsize: 2 means 16x16
+ *block_mis_log2 = 2;
+ // Block size used in tpl motion estimation
+ *tpl_bsize_1d = 16;
+ // MIN_TPL_BSIZE_1D = 16;
+ assert(*tpl_bsize_1d >= 16);
+}
+
+void av1_setup_tpl_buffers(AV1_COMMON *const cm, TplParams *const tpl_data,
+ int lag_in_frames) {
+ CommonModeInfoParams *const mi_params = &cm->mi_params;
+ set_tpl_stats_block_size(&tpl_data->tpl_stats_block_mis_log2,
+ &tpl_data->tpl_bsize_1d);
+ const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
+ tpl_data->border_in_pixels =
+ ALIGN_POWER_OF_TWO(tpl_data->tpl_bsize_1d + 2 * AOM_INTERP_EXTEND, 5);
+
+ for (int frame = 0; frame < MAX_LENGTH_TPL_FRAME_STATS; ++frame) {
+ const int mi_cols =
+ ALIGN_POWER_OF_TWO(mi_params->mi_cols, MAX_MIB_SIZE_LOG2);
+ const int mi_rows =
+ ALIGN_POWER_OF_TWO(mi_params->mi_rows, MAX_MIB_SIZE_LOG2);
+
+ tpl_data->tpl_stats_buffer[frame].is_valid = 0;
+ tpl_data->tpl_stats_buffer[frame].width = mi_cols >> block_mis_log2;
+ tpl_data->tpl_stats_buffer[frame].height = mi_rows >> block_mis_log2;
+ tpl_data->tpl_stats_buffer[frame].stride =
+ tpl_data->tpl_stats_buffer[frame].width;
+ tpl_data->tpl_stats_buffer[frame].mi_rows = mi_params->mi_rows;
+ tpl_data->tpl_stats_buffer[frame].mi_cols = mi_params->mi_cols;
+ }
+ tpl_data->tpl_frame = &tpl_data->tpl_stats_buffer[REF_FRAMES + 1];
+
+ // If lag_in_frames <= 1, TPL module is not invoked. Hence tpl recon and
+ // stats buffers are not allocated.
+ if (lag_in_frames <= 1) return;
+
+ // TODO(aomedia:2873): Explore the allocation of tpl buffers based on
+ // lag_in_frames.
+ for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
+ CHECK_MEM_ERROR(
+ cm, tpl_data->tpl_stats_pool[frame],
+ aom_calloc(tpl_data->tpl_stats_buffer[frame].width *
+ tpl_data->tpl_stats_buffer[frame].height,
+ sizeof(*tpl_data->tpl_stats_buffer[frame].tpl_stats_ptr)));
+ if (aom_alloc_frame_buffer(
+ &tpl_data->tpl_rec_pool[frame], cm->width, cm->height,
+ cm->seq_params.subsampling_x, cm->seq_params.subsampling_y,
+ cm->seq_params.use_highbitdepth, tpl_data->border_in_pixels,
+ cm->features.byte_alignment))
+ aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate frame buffer");
+ }
+}
+
static AOM_INLINE void tpl_fwd_txfm(const int16_t *src_diff, int bw,
tran_low_t *coeff, TX_SIZE tx_size,
int bit_depth, int is_hbd) {
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index b4bb377..8492b4f 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -194,6 +194,17 @@
int skip_tpl_setup_stats;
} TplParams;
+/*!\brief Allocate buffers used by tpl model
+ *
+ * \param[in] Top-level encode/decode structure
+ * \param[in] lag_in_frames number of lookahead frames
+ *
+ * \param[out] tpl_data tpl data structure
+ */
+
+void av1_setup_tpl_buffers(AV1_COMMON *const cm, TplParams *const tpl_data,
+ int lag_in_frames);
+
/*!\brief Implements temporal dependency modelling for a GOP (GF/ARF
* group) and selects between 16 and 32 frame GOP structure.
*