diff options
author | Jingning Han <jingning@google.com> | 2019-04-30 11:54:07 -0700 |
---|---|---|
committer | Jingning Han <jingning@google.com> | 2019-05-01 03:40:03 +0000 |
commit | 7a4703e8a90cae5b3c021af949c7e1387aff7309 (patch) | |
tree | 5f5e5151904a9fdfa1633a3c6bdae83b22609184 /vp9/encoder/vp9_encoder.c | |
parent | 37c8030a2a79fc6aa8fab686fd60117d3833d1b2 (diff) | |
download | libvpx-7a4703e8a90cae5b3c021af949c7e1387aff7309.tar libvpx-7a4703e8a90cae5b3c021af949c7e1387aff7309.tar.gz libvpx-7a4703e8a90cae5b3c021af949c7e1387aff7309.tar.bz2 libvpx-7a4703e8a90cae5b3c021af949c7e1387aff7309.zip |
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
Diffstat (limited to 'vp9/encoder/vp9_encoder.c')
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 31 |
1 files changed, 25 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(); |