From 7a4703e8a90cae5b3c021af949c7e1387aff7309 Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Tue, 30 Apr 2019 11:54:07 -0700 Subject: 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 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'vp9/encoder/vp9_encoder.c') 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(); -- cgit v1.2.3