summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_encoder.c
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2019-04-30 11:54:07 -0700
committerJingning Han <jingning@google.com>2019-05-01 03:40:03 +0000
commit7a4703e8a90cae5b3c021af949c7e1387aff7309 (patch)
tree5f5e5151904a9fdfa1633a3c6bdae83b22609184 /vp9/encoder/vp9_encoder.c
parent37c8030a2a79fc6aa8fab686fd60117d3833d1b2 (diff)
downloadlibvpx-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.c31
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();