ref: ff90269431610bd9ffab66366b5ec53ba2376c1d
parent: 3572f3958675bfda7270b9703cb9f73a99dbaacc
parent: 6e122b6f825a4d043214f53c0d8437d91b7b2457
author: Dan Zhu <[email protected]>
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"