]> granicus.if.org Git - libvpx/commitdiff
Rework the wiener variance buffer
authorJingning Han <jingning@google.com>
Tue, 30 Apr 2019 18:54:07 +0000 (11:54 -0700)
committerJingning Han <jingning@google.com>
Wed, 1 May 2019 03:40:03 +0000 (03:40 +0000)
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
vp9/encoder/vp9_encoder.h

index b5c37d6b602f86765e63ff6a034a4af2cdfe2943..0082a17f97f05becf37940216feee73b32cc113d 100644 (file)
@@ -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();
 
index 0e3bd13e4fecf8796c2bbf576d7990c7de7380b9..f448f961c73e49f491009f6e0d59105fd72b5f27 100644 (file)
@@ -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;