summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorJerome Jiang <jianj@google.com>2023-05-08 19:47:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2023-05-08 19:47:30 +0000
commitf5f3a6486200a76a1e22de5554ad0377237326fb (patch)
tree40f1886dd1f762f6387f5b0e857c66d2097bfd23 /vp9
parent7ab013f8a9aad0dd14e3070349329209a243ee86 (diff)
parent745c6392f795f43138cfca164b9e54ef895f87b9 (diff)
downloadlibvpx-f5f3a6486200a76a1e22de5554ad0377237326fb.tar
libvpx-f5f3a6486200a76a1e22de5554ad0377237326fb.tar.gz
libvpx-f5f3a6486200a76a1e22de5554ad0377237326fb.tar.bz2
libvpx-f5f3a6486200a76a1e22de5554ad0377237326fb.zip
Merge "Add VpxTplGopStats" into main
Diffstat (limited to 'vp9')
-rw-r--r--vp9/encoder/vp9_encoder.c1
-rw-r--r--vp9/encoder/vp9_encoder.h2
-rw-r--r--vp9/encoder/vp9_tpl_model.c47
-rw-r--r--vp9/vp9_cx_iface.c12
4 files changed, 42 insertions, 20 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 42c3d69c8..9d5c0030a 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -2628,7 +2628,6 @@ VP9_COMP *vp9_create_compressor(const VP9EncoderConfig *oxcf,
#endif // CONFIG_NON_GREEDY_MV
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.
diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h
index 230a8315b..2528bc231 100644
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -745,7 +745,7 @@ typedef struct VP9_COMP {
BLOCK_SIZE tpl_bsize;
TplDepFrame tpl_stats[MAX_ARF_GOP_SIZE];
// Used to store TPL stats before propagation
- VpxTplFrameStats tpl_frame_stats[MAX_ARF_GOP_SIZE];
+ VpxTplGopStats tpl_gop_stats;
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 de3783f9a..9f4bafdf8 100644
--- a/vp9/encoder/vp9_tpl_model.c
+++ b/vp9/encoder/vp9_tpl_model.c
@@ -154,17 +154,43 @@ 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];
- VpxTplFrameStats *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;
}
}
+static void free_tpl_frame_stats_list(VpxTplGopStats *tpl_gop_stats) {
+ int frame_idx;
+ for (frame_idx = 0; frame_idx < tpl_gop_stats->size; ++frame_idx) {
+ vpx_free(tpl_gop_stats->frame_stats_list[frame_idx].block_stats_list);
+ }
+ vpx_free(tpl_gop_stats->frame_stats_list);
+}
+
+static void init_tpl_stats_before_propagation(
+ struct vpx_internal_error_info *error_info, VpxTplGopStats *tpl_gop_stats,
+ TplDepFrame *tpl_stats, int tpl_gop_frames) {
+ int frame_idx;
+ free_tpl_frame_stats_list(tpl_gop_stats);
+ CHECK_MEM_ERROR(
+ error_info, tpl_gop_stats->frame_stats_list,
+ vpx_calloc(tpl_gop_frames, sizeof(*tpl_gop_stats->frame_stats_list)));
+ tpl_gop_stats->size = tpl_gop_frames;
+ for (frame_idx = 0; frame_idx < tpl_gop_frames; ++frame_idx) {
+ const int mi_rows = tpl_stats[frame_idx].height;
+ const int mi_cols = tpl_stats[frame_idx].width;
+ CHECK_MEM_ERROR(
+ error_info, tpl_gop_stats->frame_stats_list[frame_idx].block_stats_list,
+ vpx_calloc(
+ mi_rows * mi_cols,
+ sizeof(
+ *tpl_gop_stats->frame_stats_list[frame_idx].block_stats_list)));
+ tpl_gop_stats->frame_stats_list[frame_idx].num_blocks = mi_rows * mi_cols;
+ }
+}
+
#if CONFIG_NON_GREEDY_MV
static uint32_t full_pixel_motion_search(VP9_COMP *cpi, ThreadData *td,
MotionField *motion_field,
@@ -1106,7 +1132,7 @@ 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];
VpxTplFrameStats *tpl_frame_stats_before_propagation =
- &cpi->tpl_frame_stats[frame_idx];
+ &cpi->tpl_gop_stats.frame_stats_list[frame_idx];
YV12_BUFFER_CONFIG *this_frame = gf_picture[frame_idx].frame;
YV12_BUFFER_CONFIG *ref_frame[MAX_INTER_REF_FRAMES] = { NULL, NULL, NULL };
@@ -1349,12 +1375,6 @@ void vp9_init_tpl_buffer(VP9_COMP *cpi) {
CHECK_MEM_ERROR(&cm->error, 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->error, 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_frame_stats[frame].num_blocks = mi_rows * mi_cols;
cpi->tpl_stats[frame].is_valid = 0;
cpi->tpl_stats[frame].width = mi_cols;
cpi->tpl_stats[frame].height = mi_rows;
@@ -1385,8 +1405,8 @@ 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);
}
+ free_tpl_frame_stats_list(&cpi->tpl_gop_stats);
}
#if CONFIG_RATE_CTRL
@@ -1442,6 +1462,9 @@ void vp9_setup_tpl_stats(VP9_COMP *cpi) {
init_tpl_stats(cpi);
+ init_tpl_stats_before_propagation(&cpi->common.error, &cpi->tpl_gop_stats,
+ cpi->tpl_stats, tpl_group_frames);
+
// Backward propagation from tpl_group_frames to 1.
for (frame_idx = tpl_group_frames - 1; frame_idx > 0; --frame_idx) {
if (gf_picture[frame_idx].update_type == USE_BUF_FRAME) continue;
diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c
index 7150f7428..62128ff28 100644
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -1789,16 +1789,16 @@ static vpx_codec_err_t ctrl_get_svc_ref_frame_config(vpx_codec_alg_priv_t *ctx,
static vpx_codec_err_t ctrl_get_tpl_stats(vpx_codec_alg_priv_t *ctx,
va_list args) {
VP9_COMP *const cpi = ctx->cpi;
- VpxTplFrameStats *data = va_arg(args, VpxTplFrameStats *);
+ VpxTplGopStats *data = va_arg(args, VpxTplGopStats *);
+ VpxTplFrameStats *frame_stats_list = cpi->tpl_gop_stats.frame_stats_list;
int i;
if (data == NULL) {
return VPX_CODEC_INVALID_PARAM;
}
- for (i = 0; i < MAX_ARF_GOP_SIZE; i++) {
- data[i].frame_width = cpi->tpl_frame_stats[i].frame_width;
- data[i].frame_height = cpi->tpl_frame_stats[i].frame_height;
- data[i].num_blocks = cpi->tpl_frame_stats[i].num_blocks;
- data[i].block_stats_list = cpi->tpl_frame_stats[i].block_stats_list;
+ data->size = cpi->tpl_gop_stats.size;
+
+ for (i = 0; i < data->size; i++) {
+ data->frame_stats_list[i] = frame_stats_list[i];
}
return VPX_CODEC_OK;