Abstract tpl_data to AV1_PRIMARY
The elements tpl_data, tpl_rdmult_scaling_factors and
tpl_sb_rdmult_scaling_factors are moved to AV1_PRIMARY.
The corresponding allocations are also moved to
av1_create_primary_compressor.
Change-Id: I3bd2e957a6e87c02468f82090aed3822cadc18a7
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 238a27d..3715344 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -973,9 +973,10 @@
if (allow_tpl == 0) {
// Avoid the use of unintended TPL stats from previous GOP's results.
- if (cpi->gf_frame_index == 0) av1_init_tpl_stats(&cpi->tpl_data);
+ if (cpi->gf_frame_index == 0 && !is_stat_generation_stage(cpi))
+ av1_init_tpl_stats(&cpi->ppi->tpl_data);
} else {
- if (!cpi->tpl_data.skip_tpl_setup_stats)
+ if (!cpi->skip_tpl_setup_stats)
av1_tpl_setup_stats(cpi, 0, frame_params, frame_input);
}
@@ -1138,7 +1139,7 @@
AOMMIN(gf_cfg->gf_min_pyr_height, gf_cfg->gf_max_pyr_height);
}
- cpi->tpl_data.skip_tpl_setup_stats = 0;
+ cpi->skip_tpl_setup_stats = 0;
#if !CONFIG_REALTIME_ONLY
const int use_one_pass_rt_params = has_no_stats_stage(cpi) &&
oxcf->mode == REALTIME &&
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 3aaa382..c403d70 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -332,7 +332,7 @@
const CommonModeInfoParams *const mi_params = &cm->mi_params;
MACROBLOCK *x = &td->mb;
const int frame_idx = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[frame_idx];
const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
diff --git a/av1/encoder/encodeframe_utils.c b/av1/encoder/encodeframe_utils.c
index 69532cd..9b8ae0d 100644
--- a/av1/encoder/encodeframe_utils.c
+++ b/av1/encoder/encodeframe_utils.c
@@ -90,7 +90,7 @@
assert(IMPLIES(cpi->ppi->gf_group.size > 0,
cpi->gf_frame_index < cpi->ppi->gf_group.size));
const int tpl_idx = cpi->gf_frame_index;
- const TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx];
+ const TplDepFrame *tpl_frame = &cpi->ppi->tpl_data.tpl_frame[tpl_idx];
const int deltaq_rdmult = set_deltaq_rdmult(cpi, x);
if (tpl_frame->is_valid == 0) return deltaq_rdmult;
if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index))
@@ -125,7 +125,7 @@
col < sb_bcol_end;
++col) {
const int index = row * num_cols + col;
- geom_mean_of_scale += log(cpi->tpl_sb_rdmult_scaling_factors[index]);
+ geom_mean_of_scale += log(cpi->ppi->tpl_sb_rdmult_scaling_factors[index]);
base_block_count += 1.0;
}
}
@@ -687,7 +687,7 @@
assert(IMPLIES(cpi->ppi->gf_group.size > 0,
cpi->gf_frame_index < cpi->ppi->gf_group.size));
const int tpl_idx = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx];
TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr;
const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
@@ -824,7 +824,7 @@
AV1_COMMON *const cm = &cpi->common;
const int gf_group_index = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[gf_group_index];
TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr;
int tpl_stride = tpl_frame->stride;
@@ -895,7 +895,7 @@
assert(IMPLIES(cpi->ppi->gf_group.size > 0,
cpi->gf_frame_index < cpi->ppi->gf_group.size));
const int tpl_idx = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx];
TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr;
const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 2b2227b..34fad88 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1150,6 +1150,38 @@
highbd_set_var_fns(ppi);
#endif
+ {
+ // As cm->mi_params is a part of the frame level context (cpi), it is
+ // unavailable at this point. mi_params is created as a local temporary
+ // variable, to be passed into the functions used for allocating tpl
+ // buffers. The values in this variable are populated according to initial
+ // width and height of the frame.
+ CommonModeInfoParams mi_params;
+ enc_set_mb_mi(&mi_params, oxcf->frm_dim_cfg.width,
+ oxcf->frm_dim_cfg.height);
+
+ const int bsize = BLOCK_16X16;
+ const int w = mi_size_wide[bsize];
+ const int h = mi_size_high[bsize];
+ const int num_cols = (mi_params.mi_cols + w - 1) / w;
+ const int num_rows = (mi_params.mi_rows + h - 1) / h;
+ AOM_CHECK_MEM_ERROR(&ppi->error, ppi->tpl_rdmult_scaling_factors,
+ aom_calloc(num_rows * num_cols,
+ sizeof(*ppi->tpl_rdmult_scaling_factors)));
+ AOM_CHECK_MEM_ERROR(
+ &ppi->error, ppi->tpl_sb_rdmult_scaling_factors,
+ aom_calloc(num_rows * num_cols,
+ sizeof(*ppi->tpl_sb_rdmult_scaling_factors)));
+
+#if !CONFIG_REALTIME_ONLY
+ if (oxcf->pass != 1) {
+ av1_setup_tpl_buffers(ppi, &mi_params, oxcf->frm_dim_cfg.width,
+ oxcf->frm_dim_cfg.height, 0,
+ oxcf->gf_cfg.lag_in_frames);
+ }
+#endif
+ }
+
ppi->error.setjmp = 0;
return ppi;
@@ -1327,20 +1359,6 @@
const int h = mi_size_high[bsize];
const int num_cols = (mi_params->mi_cols + w - 1) / w;
const int num_rows = (mi_params->mi_rows + h - 1) / h;
- CHECK_MEM_ERROR(cm, cpi->tpl_rdmult_scaling_factors,
- aom_calloc(num_rows * num_cols,
- sizeof(*cpi->tpl_rdmult_scaling_factors)));
- CHECK_MEM_ERROR(cm, cpi->tpl_sb_rdmult_scaling_factors,
- aom_calloc(num_rows * num_cols,
- sizeof(*cpi->tpl_sb_rdmult_scaling_factors)));
- }
-
- {
- const int bsize = BLOCK_16X16;
- const int w = mi_size_wide[bsize];
- const int h = mi_size_high[bsize];
- const int num_cols = (mi_params->mi_cols + w - 1) / w;
- const int num_rows = (mi_params->mi_rows + h - 1) / h;
CHECK_MEM_ERROR(cm, cpi->ssim_rdmult_scaling_factors,
aom_calloc(num_rows * num_cols,
sizeof(*cpi->ssim_rdmult_scaling_factors)));
@@ -1384,12 +1402,6 @@
}
#endif
-#if !CONFIG_REALTIME_ONLY
- if (!is_stat_generation_stage(cpi)) {
- 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);
#endif // CONFIG_COLLECT_PARTITION_STATS
@@ -1474,6 +1486,22 @@
aom_free(ppi->level_params.level_info[i]);
}
av1_lookahead_destroy(ppi->lookahead);
+
+ aom_free(ppi->tpl_rdmult_scaling_factors);
+ ppi->tpl_rdmult_scaling_factors = NULL;
+ aom_free(ppi->tpl_sb_rdmult_scaling_factors);
+ ppi->tpl_sb_rdmult_scaling_factors = NULL;
+
+ TplParams *const tpl_data = &ppi->tpl_data;
+ for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
+ aom_free(tpl_data->tpl_stats_pool[frame]);
+ aom_free_frame_buffer(&tpl_data->tpl_rec_pool[frame]);
+ }
+
+#if !CONFIG_REALTIME_ONLY
+ av1_tpl_dealloc(&tpl_data->tpl_mt_sync);
+#endif
+
aom_free(ppi);
}
@@ -1621,12 +1649,6 @@
av1_denoiser_free(&(cpi->denoiser));
#endif
- TplParams *const tpl_data = &cpi->tpl_data;
- for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
- aom_free(tpl_data->tpl_stats_pool[frame]);
- aom_free_frame_buffer(&tpl_data->tpl_rec_pool[frame]);
- }
-
if (cpi->compressor_stage != LAP_STAGE) {
terminate_worker_data(cpi);
free_thread_data(cpi);
@@ -1656,9 +1678,6 @@
aom_free(mt_info->workers);
}
-#if !CONFIG_REALTIME_ONLY
- av1_tpl_dealloc(&tpl_data->tpl_mt_sync);
-#endif
if (mt_info->num_workers > 1) {
av1_loop_filter_dealloc(&mt_info->lf_row_sync);
av1_cdef_mt_dealloc(&mt_info->cdef_sync);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index e2d9f86..e3d3ab1 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -2215,6 +2215,27 @@
* size i.
*/
aom_variance_fn_ptr_t fn_ptr[BLOCK_SIZES_ALL];
+
+ /*!
+ * Scaling factors used in the RD multiplier modulation.
+ * TODO(sdeng): consider merge the following arrays.
+ * tpl_rdmult_scaling_factors is a temporary buffer used to store the
+ * intermediate scaling factors which are used in the calculation of
+ * tpl_sb_rdmult_scaling_factors. tpl_rdmult_scaling_factors[i] stores the
+ * intermediate scaling factor of the ith 16 x 16 block in raster scan order.
+ */
+ double *tpl_rdmult_scaling_factors;
+
+ /*!
+ * tpl_sb_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
+ * the ith 16 x 16 block in raster scan order.
+ */
+ double *tpl_sb_rdmult_scaling_factors;
+
+ /*!
+ * Parameters related to tpl.
+ */
+ TplParams tpl_data;
} AV1_PRIMARY;
/*!
@@ -2325,9 +2346,9 @@
YV12_BUFFER_CONFIG *unfiltered_source;
/*!
- * Parameters related to tpl.
+ * Skip tpl setup when tpl data from gop length decision can be reused.
*/
- TplParams tpl_data;
+ int skip_tpl_setup_stats;
/*!
* Temporal filter context.
@@ -2687,20 +2708,6 @@
RefFrameDistanceInfo ref_frame_dist_info;
/*!
- * Scaling factors used in the RD multiplier modulation.
- * TODO(sdeng): consider merge the following arrays.
- * tpl_rdmult_scaling_factors is a temporary buffer used to store the
- * intermediate scaling factors which are used in the calculation of
- * tpl_sb_rdmult_scaling_factors. tpl_rdmult_scaling_factors[i] stores the
- * intermediate scaling factor of the ith 16 x 16 block in raster scan order.
- */
- double *tpl_rdmult_scaling_factors;
- /*!
- * tpl_sb_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
- * the ith 16 x 16 block in raster scan order.
- */
- double *tpl_sb_rdmult_scaling_factors;
- /*!
* ssim_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
* the ith 16 x 16 block in raster scan order. This scaling factor is used for
* RD multiplier modulation when SSIM tuning is enabled.
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index 75d4b5f..6eb44e7 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -193,12 +193,6 @@
aom_free(cpi->ssim_rdmult_scaling_factors);
cpi->ssim_rdmult_scaling_factors = NULL;
- aom_free(cpi->tpl_rdmult_scaling_factors);
- cpi->tpl_rdmult_scaling_factors = NULL;
-
- aom_free(cpi->tpl_sb_rdmult_scaling_factors);
- cpi->tpl_sb_rdmult_scaling_factors = NULL;
-
#if CONFIG_TUNE_VMAF
aom_free(cpi->vmaf_info.rdmult_scaling_factors);
cpi->vmaf_info.rdmult_scaling_factors = NULL;
diff --git a/av1/encoder/encoder_utils.c b/av1/encoder/encoder_utils.c
index 33131de..cbc3ceb 100644
--- a/av1/encoder/encoder_utils.c
+++ b/av1/encoder/encoder_utils.c
@@ -465,7 +465,7 @@
assert(IMPLIES(gf_group->size > 0, cpi->gf_frame_index < gf_group->size));
const int tpl_idx = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx];
TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr;
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 387c21d..075ec67 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -1303,10 +1303,10 @@
MACROBLOCKD *xd = &x->e_mbd;
TplTxfmStats *tpl_txfm_stats = &thread_data->td->tpl_txfm_stats;
CommonModeInfoParams *mi_params = &cm->mi_params;
- BLOCK_SIZE bsize = convert_length_to_bsize(cpi->tpl_data.tpl_bsize_1d);
+ BLOCK_SIZE bsize = convert_length_to_bsize(cpi->ppi->tpl_data.tpl_bsize_1d);
TX_SIZE tx_size = max_txsize_lookup[bsize];
int mi_height = mi_size_high[bsize];
- int num_active_workers = cpi->tpl_data.tpl_mt_sync.num_threads_working;
+ int num_active_workers = cpi->ppi->tpl_data.tpl_mt_sync.num_threads_working;
memset(tpl_txfm_stats, 0, sizeof(*tpl_txfm_stats));
@@ -1408,7 +1408,7 @@
static void tpl_accumulate_txfm_stats(AV1_COMP *cpi, int num_workers) {
double *total_abs_coeff_sum = cpi->td.tpl_txfm_stats.abs_coeff_sum;
int *txfm_block_count = &cpi->td.tpl_txfm_stats.txfm_block_count;
- TplParams *tpl_data = &cpi->tpl_data;
+ TplParams *tpl_data = &cpi->ppi->tpl_data;
int coeff_num = tpl_data->tpl_frame[tpl_data->frame_idx].coeff_num;
for (int i = num_workers - 1; i >= 0; i--) {
AVxWorker *const worker = &cpi->mt_info.workers[i];
@@ -1429,7 +1429,7 @@
AV1_COMMON *cm = &cpi->common;
CommonModeInfoParams *mi_params = &cm->mi_params;
MultiThreadInfo *mt_info = &cpi->mt_info;
- TplParams *tpl_data = &cpi->tpl_data;
+ TplParams *tpl_data = &cpi->ppi->tpl_data;
AV1TplRowMultiThreadSync *tpl_sync = &tpl_data->tpl_mt_sync;
int mb_rows = mi_params->mb_rows;
int num_workers =
diff --git a/av1/encoder/motion_search_facade.c b/av1/encoder/motion_search_facade.c
index 5ed9308..86a8b5d 100644
--- a/av1/encoder/motion_search_facade.c
+++ b/av1/encoder/motion_search_facade.c
@@ -62,7 +62,7 @@
const int mi_col = xd->mi_col;
const BLOCK_SIZE tpl_bsize =
- convert_length_to_bsize(cpi->tpl_data.tpl_bsize_1d);
+ convert_length_to_bsize(cpi->ppi->tpl_data.tpl_bsize_1d);
const int tplw = mi_size_wide[tpl_bsize];
const int tplh = mi_size_high[tpl_bsize];
const int nw = mi_size_wide[bsize] / tplw;
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 9752c65..c26f9d3 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -1063,7 +1063,7 @@
// Tpl stats is reused when the ARF is temporally filtered and GF
// interval is not shortened.
if (is_temporal_filter_enabled && !shorten_gf_interval)
- cpi->tpl_data.skip_tpl_setup_stats = 1;
+ cpi->skip_tpl_setup_stats = 1;
}
}
return shorten_gf_interval;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c41f3ef..900f1e3 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2177,7 +2177,7 @@
assert(IMPLIES(cpi->ppi->gf_group.size > 0,
cpi->gf_frame_index < cpi->ppi->gf_group.size));
const int tpl_idx = cpi->gf_frame_index;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
const TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx];
if (tpl_idx >= MAX_TPL_FRAME_IDX || !tpl_frame->is_valid) {
return;
@@ -2661,7 +2661,7 @@
const PREDICTION_MODE this_mode = mbmi->mode;
const int tpl_idx = cpi->gf_frame_index;
- TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx];
+ TplDepFrame *tpl_frame = &cpi->ppi->tpl_data.tpl_frame[tpl_idx];
const int prune_modes_based_on_tpl =
cpi->sf.inter_sf.prune_inter_modes_based_on_tpl &&
tpl_idx < MAX_TPL_FRAME_IDX && tpl_frame->is_valid;
@@ -5421,7 +5421,7 @@
cpi->oxcf.algo_cfg.enable_tpl_model) {
// Only consider full SB.
const BLOCK_SIZE sb_size = cm->seq_params->sb_size;
- const int tpl_bsize_1d = cpi->tpl_data.tpl_bsize_1d;
+ const int tpl_bsize_1d = cpi->ppi->tpl_data.tpl_bsize_1d;
const int len = (block_size_wide[sb_size] / tpl_bsize_1d) *
(block_size_high[sb_size] / tpl_bsize_1d);
SuperBlockEnc *sb_enc = &x->sb_enc;
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index a286d2d..00c9178 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -116,9 +116,11 @@
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;
+void av1_setup_tpl_buffers(AV1_PRIMARY *const ppi,
+ CommonModeInfoParams *const mi_params, int width,
+ int height, int byte_alignment, int lag_in_frames) {
+ SequenceHeader *const seq_params = &ppi->seq_params;
+ TplParams *const tpl_data = &ppi->tpl_data;
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;
@@ -148,17 +150,18 @@
// 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_CHECK_MEM_ERROR(
+ &ppi->error, 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,
+
+ if (aom_alloc_frame_buffer(&tpl_data->tpl_rec_pool[frame], width, height,
+ seq_params->subsampling_x,
+ seq_params->subsampling_y,
+ seq_params->use_highbitdepth,
+ tpl_data->border_in_pixels, byte_alignment))
+ aom_internal_error(&ppi->error, AOM_CODEC_MEM_ERROR,
"Failed to allocate frame buffer");
}
}
@@ -405,7 +408,7 @@
MACROBLOCKD *xd = &x->e_mbd;
const BitDepthInfo bd_info = get_bit_depth_info(xd);
- TplParams *tpl_data = &cpi->tpl_data;
+ TplParams *tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_data->frame_idx];
const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2;
@@ -1032,7 +1035,7 @@
// Initialize the mc_flow parameters used in computing tpl data.
static AOM_INLINE void init_mc_flow_dispenser(AV1_COMP *cpi, int frame_idx,
int pframe_qindex) {
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[frame_idx];
const YV12_BUFFER_CONFIG *this_frame = tpl_frame->gf_picture;
const YV12_BUFFER_CONFIG *ref_frames_ordered[INTER_REFS_PER_FRAME];
@@ -1141,7 +1144,7 @@
AV1TplRowMultiThreadInfo *const tpl_row_mt = &mt_info->tpl_row_mt;
const CommonModeInfoParams *const mi_params = &cm->mi_params;
const int mi_width = mi_size_wide[bsize];
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_data->frame_idx];
MACROBLOCKD *xd = &x->e_mbd;
@@ -1180,13 +1183,14 @@
ThreadData *td = &cpi->td;
MACROBLOCK *x = &td->mb;
MACROBLOCKD *xd = &x->e_mbd;
- const BLOCK_SIZE bsize = convert_length_to_bsize(cpi->tpl_data.tpl_bsize_1d);
+ const BLOCK_SIZE bsize =
+ convert_length_to_bsize(cpi->ppi->tpl_data.tpl_bsize_1d);
const TX_SIZE tx_size = max_txsize_lookup[bsize];
const int mi_height = mi_size_high[bsize];
for (int mi_row = 0; mi_row < mi_params->mi_rows; mi_row += mi_height) {
// Motion estimation row boundary
av1_set_mv_row_limits(mi_params, &x->mv_limits, mi_row, mi_height,
- cpi->tpl_data.border_in_pixels);
+ cpi->ppi->tpl_data.border_in_pixels);
xd->mb_to_top_edge = -GET_MV_SUBPEL(mi_row * MI_SIZE);
xd->mb_to_bottom_edge =
GET_MV_SUBPEL((mi_params->mi_rows - mi_height - mi_row) * MI_SIZE);
@@ -1223,7 +1227,7 @@
RefBufferStack ref_buffer_stack = cpi->ref_buffer_stack;
EncodeFrameParams frame_params = *init_frame_params;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
int ref_picture_map[REF_FRAMES];
@@ -1444,7 +1448,7 @@
GF_GROUP *gf_group = &cpi->ppi->gf_group;
int bottom_index, top_index;
EncodeFrameParams this_frame_params = *frame_params;
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
int approx_gop_eval = (gop_eval > 1);
int num_arf_layers = MAX_ARF_LAYERS;
@@ -1609,7 +1613,7 @@
assert(
IMPLIES(cpi->ppi->gf_group.size > 0, tpl_idx < cpi->ppi->gf_group.size));
- TplParams *const tpl_data = &cpi->tpl_data;
+ TplParams *const tpl_data = &cpi->ppi->tpl_data;
const TplDepFrame *const tpl_frame = &tpl_data->tpl_frame[tpl_idx];
if (!tpl_frame->is_valid) return;
@@ -1648,7 +1652,7 @@
}
const double rk = intra_cost / mc_dep_cost;
const int index = row * num_cols + col;
- cpi->tpl_rdmult_scaling_factors[index] = rk / cpi->rd.r0 + c;
+ cpi->ppi->tpl_rdmult_scaling_factors[index] = rk / cpi->rd.r0 + c;
}
}
}
@@ -1660,7 +1664,7 @@
assert(IMPLIES(cpi->ppi->gf_group.size > 0,
cpi->gf_frame_index < cpi->ppi->gf_group.size));
const int tpl_idx = cpi->gf_frame_index;
- TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx];
+ TplDepFrame *tpl_frame = &cpi->ppi->tpl_data.tpl_frame[tpl_idx];
if (tpl_frame->is_valid == 0) return;
if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return;
@@ -1690,7 +1694,7 @@
for (col = mi_col_sr / num_mi_h;
col < num_cols && col < mi_col_sr / num_mi_h + num_bcols; ++col) {
const int index = row * num_cols + col;
- log_sum += log(cpi->tpl_rdmult_scaling_factors[index]);
+ log_sum += log(cpi->ppi->tpl_rdmult_scaling_factors[index]);
base_block_count += 1.0;
}
}
@@ -1711,8 +1715,8 @@
for (col = mi_col_sr / num_mi_h;
col < num_cols && col < mi_col_sr / num_mi_h + num_bcols; ++col) {
const int index = row * num_cols + col;
- cpi->tpl_sb_rdmult_scaling_factors[index] =
- scale_adj * cpi->tpl_rdmult_scaling_factors[index];
+ cpi->ppi->tpl_sb_rdmult_scaling_factors[index] =
+ scale_adj * cpi->ppi->tpl_rdmult_scaling_factors[index];
}
}
}
diff --git a/av1/encoder/tpl_model.h b/av1/encoder/tpl_model.h
index 75f2b99..0e7eb31 100644
--- a/av1/encoder/tpl_model.h
+++ b/av1/encoder/tpl_model.h
@@ -18,7 +18,9 @@
/*!\cond */
+struct AV1_PRIMARY;
struct AV1_COMP;
+struct AV1_SEQ_CODING_TOOLS;
struct EncodeFrameParams;
struct EncodeFrameInput;
@@ -205,11 +207,6 @@
* Frame border for tpl frame.
*/
int border_in_pixels;
-
- /*!
- * Skip tpl setup when tpl data from gop length decision can be reused.
- */
- int skip_tpl_setup_stats;
} TplParams;
/*!\brief Allocate buffers used by tpl model
@@ -220,8 +217,9 @@
* \param[out] tpl_data tpl data structure
*/
-void av1_setup_tpl_buffers(AV1_COMMON *const cm, TplParams *const tpl_data,
- int lag_in_frames);
+void av1_setup_tpl_buffers(struct AV1_PRIMARY *const ppi,
+ CommonModeInfoParams *const mi_params, int width,
+ int height, int byte_alignment, int lag_in_frames);
/*!\brief Implements temporal dependency modelling for a GOP (GF/ARF
* group) and selects between 16 and 32 frame GOP structure.