From 7a4703e8a90cae5b3c021af949c7e1387aff7309 Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Tue, 30 Apr 2019 11:54:07 -0700 Subject: [PATCH] Rework the wiener variance buffer Support the potential frame scaling use case. The operation flow now allows the codec to allocate the memory buffer only when perceptual AQ mode is enabled. Change-Id: I7529e63131276dbe3a29f910d3a227f20dbc94a2 --- vp9/encoder/vp9_encoder.c | 31 +++++++++++++++++++++++++------ vp9/encoder/vp9_encoder.h | 2 ++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index b5c37d6b6..0082a17f9 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -2381,14 +2381,13 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, } #endif // !CONFIG_REALTIME_ONLY + cpi->mb_wiener_var_cols = 0; + cpi->mb_wiener_var_rows = 0; + cpi->mb_wiener_variance = NULL; + vp9_set_speed_features_framesize_independent(cpi, oxcf->speed); vp9_set_speed_features_framesize_dependent(cpi, oxcf->speed); - // TODO(jingning): The buffer allocation will be refactored next. - CHECK_MEM_ERROR( - cm, cpi->mb_wiener_variance, - vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->mb_wiener_variance))); - { const int bsize = BLOCK_64X64; const int w = num_8x8_blocks_wide_lookup[bsize]; @@ -4836,6 +4835,23 @@ static int qsort_comp(const void *elem1, const void *elem2) { return 0; } +static void init_mb_wiener_var_buffer(VP9_COMP *cpi) { + VP9_COMMON *cm = &cpi->common; + + if (cpi->mb_wiener_variance && cpi->mb_wiener_var_rows >= cm->mb_rows && + cpi->mb_wiener_var_cols >= cm->mb_cols) + return; + + vpx_free(cpi->mb_wiener_variance); + cpi->mb_wiener_variance = NULL; + + CHECK_MEM_ERROR( + cm, cpi->mb_wiener_variance, + vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->mb_wiener_variance))); + cpi->mb_wiener_var_rows = cm->mb_rows; + cpi->mb_wiener_var_cols = cm->mb_cols; +} + static void set_mb_wiener_variance(VP9_COMP *cpi) { VP9_COMMON *cm = &cpi->common; uint8_t *buffer = cpi->Source->y_buffer; @@ -5019,7 +5035,10 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, size_t *size, if (oxcf->tuning == VP8_TUNE_SSIM) set_mb_ssim_rdmult_scaling(cpi); - if (oxcf->aq_mode == PERCEPTUAL_AQ) set_mb_wiener_variance(cpi); + if (oxcf->aq_mode == PERCEPTUAL_AQ) { + init_mb_wiener_var_buffer(cpi); + set_mb_wiener_variance(cpi); + } vpx_clear_system_state(); diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 0e3bd13e4..f448f961c 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -644,6 +644,8 @@ typedef struct VP9_COMP { int64_t norm_wiener_variance; int64_t *mb_wiener_variance; + int mb_wiener_var_rows; + int mb_wiener_var_cols; double *mi_ssim_rdmult_scaling_factors; YV12_BUFFER_CONFIG last_frame_uf; -- 2.40.0