summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Jiang <jianj@google.com>2023-04-20 11:06:32 -0400
committerJerome Jiang <jianj@google.com>2023-04-20 15:24:18 -0400
commitf49879a2a3420fd140692f3b23c5c57b6298c954 (patch)
tree3eb20572b3694c1606807658dbb57cd5a256e1df
parente85f9003be194ac3aa64f1c7c0027880c3137c08 (diff)
downloadlibvpx-f49879a2a3420fd140692f3b23c5c57b6298c954.tar.gz
Store tpl stats before propagation
Add two new structs TplBlockStats and TplFrameStats to store tpl stats before propagation Change-Id: I903db99326b199ed8f2d8b19ccb973a8c8910501
-rw-r--r--vp9/encoder/vp9_encoder.c5
-rw-r--r--vp9/encoder/vp9_encoder.h18
-rw-r--r--vp9/encoder/vp9_tpl_model.c37
3 files changed, 59 insertions, 1 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 354f08eae..662ec24b8 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -2622,7 +2622,10 @@ VP9_COMP *vp9_create_compressor(const VP9EncoderConfig *oxcf,
#if CONFIG_NON_GREEDY_MV
cpi->tpl_ready = 0;
#endif // CONFIG_NON_GREEDY_MV
- for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) cpi->tpl_stats[i].tpl_stats_ptr = NULL;
+ for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) {
+ cpi->tpl_stats[i].tpl_stats_ptr = NULL;
+ cpi->tpl_frame_stats[i].block_stats_list = NULL;
+ }
// Allocate memory to store variances for a frame.
CHECK_MEM_ERROR(cm, cpi->source_diff_var,
diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h
index 9e5e64629..43789864c 100644
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -324,6 +324,22 @@ typedef struct TplDepFrame {
#endif
} TplDepFrame;
+// Used to store the stats before propagation.
+typedef struct TplBlockStats {
+ int64_t intra_cost;
+ int64_t inter_cost;
+ int_mv mv;
+ int64_t recrf_rate;
+ int64_t recrf_dist;
+ int ref_frame_index;
+} TplBlockStats;
+
+typedef struct TplFrameStats {
+ int frame_width;
+ int frame_height;
+ TplBlockStats *block_stats_list;
+} TplFrameStats;
+
#define TPL_DEP_COST_SCALE_LOG2 4
// TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
@@ -743,6 +759,8 @@ typedef struct VP9_COMP {
BLOCK_SIZE tpl_bsize;
TplDepFrame tpl_stats[MAX_ARF_GOP_SIZE];
+ // Used to store TPL stats before propagation
+ TplFrameStats tpl_frame_stats[MAX_ARF_GOP_SIZE];
YV12_BUFFER_CONFIG *tpl_recon_frames[REF_FRAMES];
EncFrameBuf enc_frame_buf[REF_FRAMES];
#if CONFIG_MULTITHREAD
diff --git a/vp9/encoder/vp9_tpl_model.c b/vp9/encoder/vp9_tpl_model.c
index 53ef35698..c9565e8ca 100644
--- a/vp9/encoder/vp9_tpl_model.c
+++ b/vp9/encoder/vp9_tpl_model.c
@@ -157,9 +157,13 @@ static void init_tpl_stats(VP9_COMP *cpi) {
int frame_idx;
for (frame_idx = 0; frame_idx < MAX_ARF_GOP_SIZE; ++frame_idx) {
TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
+ TplFrameStats *tpl_frame_stats = &cpi->tpl_frame_stats[frame_idx];
memset(tpl_frame->tpl_stats_ptr, 0,
tpl_frame->height * tpl_frame->width *
sizeof(*tpl_frame->tpl_stats_ptr));
+ memset(tpl_frame_stats->block_stats_list, 0,
+ tpl_frame->height * tpl_frame->width *
+ sizeof(*tpl_frame_stats->block_stats_list));
tpl_frame->is_valid = 0;
}
}
@@ -355,6 +359,27 @@ static void tpl_model_store(TplDepStats *tpl_stats, int mi_row, int mi_col,
}
}
+static void tpl_store_before_propagation(TplBlockStats *tpl_block_stats,
+ TplDepStats *tpl_stats, int mi_row,
+ int mi_col, BLOCK_SIZE bsize,
+ int stride) {
+ const int mi_height = num_8x8_blocks_high_lookup[bsize];
+ const int mi_width = num_8x8_blocks_wide_lookup[bsize];
+ const TplDepStats *src_stats = &tpl_stats[mi_row * stride + mi_col];
+ int idx, idy;
+
+ for (idy = 0; idy < mi_height; ++idy) {
+ for (idx = 0; idx < mi_width; ++idx) {
+ TplBlockStats *tpl_block_stats_ptr =
+ &tpl_block_stats[(mi_row + idy) * stride + mi_col + idx];
+ tpl_block_stats_ptr->inter_cost = src_stats->inter_cost;
+ tpl_block_stats_ptr->intra_cost = src_stats->intra_cost;
+ tpl_block_stats_ptr->mv = src_stats->mv;
+ tpl_block_stats_ptr->ref_frame_index = src_stats->ref_frame_index;
+ }
+ }
+}
+
static void tpl_model_update_b(TplDepFrame *tpl_frame, TplDepStats *tpl_stats,
int mi_row, int mi_col, const BLOCK_SIZE bsize) {
TplDepFrame *ref_tpl_frame = &tpl_frame[tpl_stats->ref_frame_index];
@@ -1062,6 +1087,8 @@ static void build_motion_field(
static void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture,
int frame_idx, BLOCK_SIZE bsize) {
TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
+ TplFrameStats *tpl_frame_stats_before_propagation =
+ &cpi->tpl_frame_stats[frame_idx];
YV12_BUFFER_CONFIG *this_frame = gf_picture[frame_idx].frame;
YV12_BUFFER_CONFIG *ref_frame[MAX_INTER_REF_FRAMES] = { NULL, NULL, NULL };
@@ -1158,6 +1185,10 @@ static void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture,
tpl_model_store(tpl_frame->tpl_stats_ptr, mi_row, mi_col, bsize,
tpl_frame->stride);
+ tpl_store_before_propagation(
+ tpl_frame_stats_before_propagation->block_stats_list,
+ tpl_frame->tpl_stats_ptr, mi_row, mi_col, bsize, tpl_frame->stride);
+
tpl_model_update(cpi->tpl_stats, tpl_frame->tpl_stats_ptr, mi_row, mi_col,
bsize);
}
@@ -1294,6 +1325,11 @@ void vp9_init_tpl_buffer(VP9_COMP *cpi) {
CHECK_MEM_ERROR(cm, cpi->tpl_stats[frame].tpl_stats_ptr,
vpx_calloc(mi_rows * mi_cols,
sizeof(*cpi->tpl_stats[frame].tpl_stats_ptr)));
+ vpx_free(cpi->tpl_frame_stats[frame].block_stats_list);
+ CHECK_MEM_ERROR(
+ cm, cpi->tpl_frame_stats[frame].block_stats_list,
+ vpx_calloc(mi_rows * mi_cols,
+ sizeof(*cpi->tpl_frame_stats[frame].block_stats_list)));
cpi->tpl_stats[frame].is_valid = 0;
cpi->tpl_stats[frame].width = mi_cols;
cpi->tpl_stats[frame].height = mi_rows;
@@ -1324,6 +1360,7 @@ void vp9_free_tpl_buffer(VP9_COMP *cpi) {
#endif
vpx_free(cpi->tpl_stats[frame].tpl_stats_ptr);
cpi->tpl_stats[frame].is_valid = 0;
+ vpx_free(cpi->tpl_frame_stats[frame].block_stats_list);
}
}