diff options
author | Jerome Jiang <jianj@google.com> | 2023-04-20 11:06:32 -0400 |
---|---|---|
committer | Jerome Jiang <jianj@google.com> | 2023-04-20 15:24:18 -0400 |
commit | f49879a2a3420fd140692f3b23c5c57b6298c954 (patch) | |
tree | 3eb20572b3694c1606807658dbb57cd5a256e1df | |
parent | e85f9003be194ac3aa64f1c7c0027880c3137c08 (diff) | |
download | libvpx-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.c | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 18 | ||||
-rw-r--r-- | vp9/encoder/vp9_tpl_model.c | 37 |
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); } } |