ref: ff90269431610bd9ffab66366b5ec53ba2376c1d
parent: 3572f3958675bfda7270b9703cb9f73a99dbaacc
 parent: 6e122b6f825a4d043214f53c0d8437d91b7b2457
	author: Dan Zhu <zxdan@google.com>
	date: Fri Aug 16 13:52:34 EDT 2019
	
Merge "estimate local variation of reference frame"
--- a/vp9/encoder/vp9_non_greedy_mv.c
+++ b/vp9/encoder/vp9_non_greedy_mv.c
@@ -295,3 +295,53 @@
free(input);
free(output);
}
+
+void vp9_get_local_structure(const YV12_BUFFER_CONFIG *ref_frame,
+ const vp9_variance_fn_ptr_t *fn_ptr, int mi_rows,
+                             int mi_cols, BLOCK_SIZE bsize, int (*M)[4]) {+ int stride = ref_frame->y_stride;
+ const int mi_height = num_8x8_blocks_high_lookup[bsize];
+ const int mi_width = num_8x8_blocks_wide_lookup[bsize];
+ int cols = mi_cols / mi_width;
+ int mi_row, mi_col;
+  for (mi_row = 0; mi_row < mi_rows; mi_row += mi_height) {+    for (mi_col = 0; mi_col < mi_cols; mi_col += mi_width) {+ const int mb_y_offset = mi_row * MI_SIZE * stride + mi_col * MI_SIZE;
+ int row = mi_row / mi_height;
+ int col = mi_col / mi_width;
+ uint8_t *center = ref_frame->y_buffer + mb_y_offset;
+ uint8_t *nb;
+ int I_row = 0, I_col = 0;
+ // up
+      if (mi_row > 0) {+ nb = center - MI_SIZE * stride * mi_height;
+ I_row += fn_ptr->sdf(center, stride, nb, stride);
+ }
+ // down
+      if (mi_row < mi_rows - 1) {+ nb = center + MI_SIZE * stride * mi_height;
+ I_row += fn_ptr->sdf(center, stride, nb, stride);
+ }
+      if (mi_row > 0 && mi_row < mi_rows - 1) {+ I_row /= 2;
+ }
+ // left
+      if (mi_col > 0) {+ nb = center - MI_SIZE * mi_width;
+ I_col += fn_ptr->sdf(center, stride, nb, stride);
+ }
+ // right
+      if (mi_col < mi_cols - 1) {+ nb = center + MI_SIZE * mi_width;
+ I_col += fn_ptr->sdf(center, stride, nb, stride);
+ }
+      if (mi_col > 0 && mi_col < mi_cols - 1) {+ I_col /= 2;
+ }
+ M[row * cols + col][0] = I_row * I_row;
+ M[row * cols + col][1] = I_row * I_col;
+ M[row * cols + col][2] = I_col * I_row;
+ M[row * cols + col][3] = I_col * I_col;
+ }
+ }
+}
--- a/vp9/encoder/vp9_non_greedy_mv.h
+++ b/vp9/encoder/vp9_non_greedy_mv.h
@@ -11,6 +11,11 @@
#ifndef VPX_VP9_ENCODER_VP9_NON_GREEDY_MV_H_
#define VPX_VP9_ENCODER_VP9_NON_GREEDY_MV_H_
+#include "vp9/common/vp9_enums.h"
+#include "vp9/common/vp9_blockd.h"
+#include "vpx_scale/yv12config.h"
+#include "vpx_dsp/variance.h"
+
#ifdef __cplusplus
 extern "C" {#endif
@@ -23,6 +28,10 @@
void vp9_get_smooth_motion_field(const MV *search_mf, const int (*M)[4],
int rows, int cols, float alpha, int num_iters,
MV *smooth_mf);
+
+void vp9_get_local_structure(const YV12_BUFFER_CONFIG *ref_frame,
+ const vp9_variance_fn_ptr_t *fn_ptr, int mi_rows,
+ int mi_cols, BLOCK_SIZE bsize, int (*M)[4]);
#ifdef __cplusplus
} // extern "C"
--
⑨