1*77c1e3ccSAndroid Build Coastguard Worker /* 2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2016, Alliance for Open Media. All rights reserved. 3*77c1e3ccSAndroid Build Coastguard Worker * 4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and 5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can 7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the 9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10*77c1e3ccSAndroid Build Coastguard Worker */ 11*77c1e3ccSAndroid Build Coastguard Worker 12*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_AOM_DSP_VARIANCE_H_ 13*77c1e3ccSAndroid Build Coastguard Worker #define AOM_AOM_DSP_VARIANCE_H_ 14*77c1e3ccSAndroid Build Coastguard Worker 15*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_config.h" 16*77c1e3ccSAndroid Build Coastguard Worker 17*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h" 18*77c1e3ccSAndroid Build Coastguard Worker 19*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus 20*77c1e3ccSAndroid Build Coastguard Worker extern "C" { 21*77c1e3ccSAndroid Build Coastguard Worker #endif 22*77c1e3ccSAndroid Build Coastguard Worker 23*77c1e3ccSAndroid Build Coastguard Worker #define FILTER_BITS 7 24*77c1e3ccSAndroid Build Coastguard Worker #define FILTER_WEIGHT 128 25*77c1e3ccSAndroid Build Coastguard Worker 26*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_sad_fn_t)(const uint8_t *a, int a_stride, 27*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride); 28*77c1e3ccSAndroid Build Coastguard Worker 29*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_sad_avg_fn_t)(const uint8_t *a, int a_stride, 30*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, 31*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred); 32*77c1e3ccSAndroid Build Coastguard Worker 33*77c1e3ccSAndroid Build Coastguard Worker typedef void (*aom_copy32xn_fn_t)(const uint8_t *a, int a_stride, uint8_t *b, 34*77c1e3ccSAndroid Build Coastguard Worker int b_stride, int n); 35*77c1e3ccSAndroid Build Coastguard Worker 36*77c1e3ccSAndroid Build Coastguard Worker typedef void (*aom_sad_multi_d_fn_t)(const uint8_t *a, int a_stride, 37*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const b_array[], 38*77c1e3ccSAndroid Build Coastguard Worker int b_stride, unsigned int *sad_array); 39*77c1e3ccSAndroid Build Coastguard Worker 40*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_variance_fn_t)(const uint8_t *a, int a_stride, 41*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, 42*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse); 43*77c1e3ccSAndroid Build Coastguard Worker 44*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_subpixvariance_fn_t)(const uint8_t *a, int a_stride, 45*77c1e3ccSAndroid Build Coastguard Worker int xoffset, int yoffset, 46*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, 47*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse); 48*77c1e3ccSAndroid Build Coastguard Worker 49*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_subp_avg_variance_fn_t)( 50*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, int xoffset, int yoffset, const uint8_t *b, 51*77c1e3ccSAndroid Build Coastguard Worker int b_stride, unsigned int *sse, const uint8_t *second_pred); 52*77c1e3ccSAndroid Build Coastguard Worker 53*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_dist_wtd_sad_avg_fn_t)( 54*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, const uint8_t *b, int b_stride, 55*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param); 56*77c1e3ccSAndroid Build Coastguard Worker 57*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_dist_wtd_subp_avg_variance_fn_t)( 58*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, int xoffset, int yoffset, const uint8_t *b, 59*77c1e3ccSAndroid Build Coastguard Worker int b_stride, unsigned int *sse, const uint8_t *second_pred, 60*77c1e3ccSAndroid Build Coastguard Worker const DIST_WTD_COMP_PARAMS *jcp_param); 61*77c1e3ccSAndroid Build Coastguard Worker 62*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_masked_sad_fn_t)(const uint8_t *src, int src_stride, 63*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, 64*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, 65*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, 66*77c1e3ccSAndroid Build Coastguard Worker int invert_mask); 67*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_masked_subpixvariance_fn_t)( 68*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, 69*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, const uint8_t *second_pred, 70*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse); 71*77c1e3ccSAndroid Build Coastguard Worker 72*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_obmc_sad_fn_t)(const uint8_t *pred, int pred_stride, 73*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, 74*77c1e3ccSAndroid Build Coastguard Worker const int32_t *msk); 75*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_obmc_variance_fn_t)(const uint8_t *pred, 76*77c1e3ccSAndroid Build Coastguard Worker int pred_stride, 77*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, 78*77c1e3ccSAndroid Build Coastguard Worker const int32_t *msk, 79*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse); 80*77c1e3ccSAndroid Build Coastguard Worker typedef unsigned int (*aom_obmc_subpixvariance_fn_t)( 81*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pred, int pred_stride, int xoffset, int yoffset, 82*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *msk, unsigned int *sse); 83*77c1e3ccSAndroid Build Coastguard Worker 84*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_variance_vtable { 85*77c1e3ccSAndroid Build Coastguard Worker aom_sad_fn_t sdf; 86*77c1e3ccSAndroid Build Coastguard Worker // Same as normal sad, but downsample the rows by a factor of 2. 87*77c1e3ccSAndroid Build Coastguard Worker aom_sad_fn_t sdsf; 88*77c1e3ccSAndroid Build Coastguard Worker aom_sad_avg_fn_t sdaf; 89*77c1e3ccSAndroid Build Coastguard Worker aom_variance_fn_t vf; 90*77c1e3ccSAndroid Build Coastguard Worker aom_subpixvariance_fn_t svf; 91*77c1e3ccSAndroid Build Coastguard Worker aom_subp_avg_variance_fn_t svaf; 92*77c1e3ccSAndroid Build Coastguard Worker aom_sad_multi_d_fn_t sdx4df; 93*77c1e3ccSAndroid Build Coastguard Worker aom_sad_multi_d_fn_t sdx3df; 94*77c1e3ccSAndroid Build Coastguard Worker // Same as sadx4, but downsample the rows by a factor of 2. 95*77c1e3ccSAndroid Build Coastguard Worker aom_sad_multi_d_fn_t sdsx4df; 96*77c1e3ccSAndroid Build Coastguard Worker aom_masked_sad_fn_t msdf; 97*77c1e3ccSAndroid Build Coastguard Worker aom_masked_subpixvariance_fn_t msvf; 98*77c1e3ccSAndroid Build Coastguard Worker aom_obmc_sad_fn_t osdf; 99*77c1e3ccSAndroid Build Coastguard Worker aom_obmc_variance_fn_t ovf; 100*77c1e3ccSAndroid Build Coastguard Worker aom_obmc_subpixvariance_fn_t osvf; 101*77c1e3ccSAndroid Build Coastguard Worker aom_dist_wtd_sad_avg_fn_t jsdaf; 102*77c1e3ccSAndroid Build Coastguard Worker aom_dist_wtd_subp_avg_variance_fn_t jsvaf; 103*77c1e3ccSAndroid Build Coastguard Worker } aom_variance_fn_ptr_t; 104*77c1e3ccSAndroid Build Coastguard Worker 105*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_var_filter_block2d_bil_first_pass( 106*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src_ptr8, uint16_t *output_ptr, 107*77c1e3ccSAndroid Build Coastguard Worker unsigned int src_pixels_per_line, int pixel_step, 108*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_height, unsigned int output_width, 109*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *filter); 110*77c1e3ccSAndroid Build Coastguard Worker 111*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_var_filter_block2d_bil_second_pass( 112*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *src_ptr, uint16_t *output_ptr, 113*77c1e3ccSAndroid Build Coastguard Worker unsigned int src_pixels_per_line, unsigned int pixel_step, 114*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_height, unsigned int output_width, 115*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *filter); 116*77c1e3ccSAndroid Build Coastguard Worker 117*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_sse_odd_size(const uint8_t *a, int a_stride, const uint8_t *b, 118*77c1e3ccSAndroid Build Coastguard Worker int b_stride, int w, int h); 119*77c1e3ccSAndroid Build Coastguard Worker 120*77c1e3ccSAndroid Build Coastguard Worker uint64_t aom_highbd_sse_odd_size(const uint8_t *a, int a_stride, 121*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, int w, int h); 122*77c1e3ccSAndroid Build Coastguard Worker 123*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus 124*77c1e3ccSAndroid Build Coastguard Worker } // extern "C" 125*77c1e3ccSAndroid Build Coastguard Worker #endif 126*77c1e3ccSAndroid Build Coastguard Worker 127*77c1e3ccSAndroid Build Coastguard Worker #endif // AOM_AOM_DSP_VARIANCE_H_ 128