diff options
Diffstat (limited to 'third_party/aom/av1/common/convolve.h')
-rw-r--r-- | third_party/aom/av1/common/convolve.h | 173 |
1 files changed, 76 insertions, 97 deletions
diff --git a/third_party/aom/av1/common/convolve.h b/third_party/aom/av1/common/convolve.h index c43f649e0..1b2c2d0d5 100644 --- a/third_party/aom/av1/common/convolve.h +++ b/third_party/aom/av1/common/convolve.h @@ -17,140 +17,119 @@ extern "C" { #endif -typedef enum CONVOLVE_OPT { - // indicate the results in dst buf is rounded by FILTER_BITS or not - CONVOLVE_OPT_ROUND, - CONVOLVE_OPT_NO_ROUND, -} CONVOLVE_OPT; - -typedef int32_t CONV_BUF_TYPE; - +typedef uint16_t CONV_BUF_TYPE; typedef struct ConvolveParams { int ref; int do_average; - CONVOLVE_OPT round; CONV_BUF_TYPE *dst; int dst_stride; int round_0; int round_1; int plane; - int do_post_rounding; + int is_compound; + int use_jnt_comp_avg; + int fwd_offset; + int bck_offset; } ConvolveParams; -static INLINE ConvolveParams get_conv_params(int ref, int do_average, - int plane) { - ConvolveParams conv_params; - conv_params.ref = ref; - conv_params.do_average = do_average; - conv_params.round = CONVOLVE_OPT_ROUND; - conv_params.plane = plane; - conv_params.do_post_rounding = 0; - return conv_params; -} - -#if CONFIG_DUAL_FILTER && USE_EXTRA_FILTER -static INLINE void av1_convolve_filter_params_fixup_1212( - const InterpFilterParams *params_x, InterpFilterParams *params_y) { - if (params_x->interp_filter == MULTITAP_SHARP && - params_y->interp_filter == MULTITAP_SHARP) { - // Avoid two directions both using 12-tap filter. - // This will reduce hardware implementation cost. - *params_y = av1_get_interp_filter_params(EIGHTTAP_SHARP); - } -} -#endif - -static INLINE void av1_get_convolve_filter_params( - InterpFilters interp_filters, int avoid_1212, InterpFilterParams *params_x, - InterpFilterParams *params_y) { -#if CONFIG_DUAL_FILTER +#define ROUND0_BITS 3 +#define COMPOUND_ROUND1_BITS 7 +#define WIENER_ROUND0_BITS 3 + +#define WIENER_CLAMP_LIMIT(r0, bd) (1 << ((bd) + 1 + FILTER_BITS - r0)) + +typedef void (*aom_convolve_fn_t)(const uint8_t *src, int src_stride, + uint8_t *dst, int dst_stride, int w, int h, + InterpFilterParams *filter_params_x, + InterpFilterParams *filter_params_y, + const int subpel_x_q4, const int subpel_y_q4, + ConvolveParams *conv_params); + +typedef void (*aom_highbd_convolve_fn_t)( + const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride, int w, + int h, InterpFilterParams *filter_params_x, + InterpFilterParams *filter_params_y, const int subpel_x_q4, + const int subpel_y_q4, ConvolveParams *conv_params, int bd); + +static INLINE void av1_get_convolve_filter_params(InterpFilters interp_filters, + InterpFilterParams *params_x, + InterpFilterParams *params_y, + int w, int h) { InterpFilter filter_x = av1_extract_interp_filter(interp_filters, 1); InterpFilter filter_y = av1_extract_interp_filter(interp_filters, 0); -#else - InterpFilter filter_x = av1_extract_interp_filter(interp_filters, 0); - InterpFilter filter_y = av1_extract_interp_filter(interp_filters, 0); -#endif - - *params_x = av1_get_interp_filter_params(filter_x); - *params_y = av1_get_interp_filter_params(filter_y); - - if (avoid_1212) { -#if CONFIG_DUAL_FILTER && USE_EXTRA_FILTER - convolve_filter_params_fixup_1212(params_x, params_y); -#endif - } + *params_x = av1_get_interp_filter_params_with_block_size(filter_x, w); + *params_y = av1_get_interp_filter_params_with_block_size(filter_y, h); } struct AV1Common; -void av1_convolve_init(struct AV1Common *cm); +struct scale_factors; -#if CONFIG_CONVOLVE_ROUND void av1_convolve_2d_facade(const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int w, int h, InterpFilters interp_filters, const int subpel_x_q4, int x_step_q4, const int subpel_y_q4, int y_step_q4, - int scaled, ConvolveParams *conv_params); + int scaled, ConvolveParams *conv_params, + const struct scale_factors *sf); static INLINE ConvolveParams get_conv_params_no_round(int ref, int do_average, - int plane, int32_t *dst, - int dst_stride) { + int plane, + CONV_BUF_TYPE *dst, + int dst_stride, + int is_compound, int bd) { ConvolveParams conv_params; conv_params.ref = ref; conv_params.do_average = do_average; - conv_params.round = CONVOLVE_OPT_NO_ROUND; -#if CONFIG_COMPOUND_ROUND - conv_params.round_0 = FILTER_BITS; -#else - conv_params.round_0 = 5; -#endif - conv_params.round_1 = 0; + assert(IMPLIES(do_average, is_compound)); + conv_params.is_compound = is_compound; + conv_params.round_0 = ROUND0_BITS; + conv_params.round_1 = is_compound ? COMPOUND_ROUND1_BITS + : 2 * FILTER_BITS - conv_params.round_0; + const int intbufrange = bd + FILTER_BITS - conv_params.round_0 + 2; + assert(IMPLIES(bd < 12, intbufrange <= 16)); + if (intbufrange > 16) { + conv_params.round_0 += intbufrange - 16; + if (!is_compound) conv_params.round_1 -= intbufrange - 16; + } + // TODO(yunqing): The following dst should only be valid while + // is_compound = 1; conv_params.dst = dst; conv_params.dst_stride = dst_stride; conv_params.plane = plane; - conv_params.do_post_rounding = 0; return conv_params; } -#if CONFIG_HIGHBITDEPTH +static INLINE ConvolveParams get_conv_params(int ref, int do_average, int plane, + int bd) { + return get_conv_params_no_round(ref, do_average, plane, NULL, 0, 0, bd); +} + +static INLINE ConvolveParams get_conv_params_wiener(int bd) { + ConvolveParams conv_params; + (void)bd; + conv_params.ref = 0; + conv_params.do_average = 0; + conv_params.is_compound = 0; + conv_params.round_0 = WIENER_ROUND0_BITS; + conv_params.round_1 = 2 * FILTER_BITS - conv_params.round_0; + const int intbufrange = bd + FILTER_BITS - conv_params.round_0 + 2; + assert(IMPLIES(bd < 12, intbufrange <= 16)); + if (intbufrange > 16) { + conv_params.round_0 += intbufrange - 16; + conv_params.round_1 -= intbufrange - 16; + } + conv_params.dst = NULL; + conv_params.dst_stride = 0; + conv_params.plane = 0; + return conv_params; +} + void av1_highbd_convolve_2d_facade(const uint8_t *src8, int src_stride, uint8_t *dst, int dst_stride, int w, int h, InterpFilters interp_filters, const int subpel_x_q4, int x_step_q4, const int subpel_y_q4, int y_step_q4, int scaled, ConvolveParams *conv_params, - int bd); -#endif -#endif // CONFIG_CONVOLVE_ROUND - -void av1_convolve(const uint8_t *src, int src_stride, uint8_t *dst, - int dst_stride, int w, int h, InterpFilters interp_filters, - const int subpel_x, int xstep, const int subpel_y, int ystep, - ConvolveParams *conv_params); - -void av1_convolve_c(const uint8_t *src, int src_stride, uint8_t *dst, - int dst_stride, int w, int h, InterpFilters interp_filters, - const int subpel_x, int xstep, const int subpel_y, - int ystep, ConvolveParams *conv_params); - -void av1_convolve_scale(const uint8_t *src, int src_stride, uint8_t *dst, - int dst_stride, int w, int h, - InterpFilters interp_filters, const int subpel_x, - int xstep, const int subpel_y, int ystep, - ConvolveParams *conv_params); - -#if CONFIG_HIGHBITDEPTH -void av1_highbd_convolve(const uint8_t *src, int src_stride, uint8_t *dst, - int dst_stride, int w, int h, - InterpFilters interp_filters, const int subpel_x, - int xstep, const int subpel_y, int ystep, int avg, - int bd); - -void av1_highbd_convolve_scale(const uint8_t *src, int src_stride, uint8_t *dst, - int dst_stride, int w, int h, - InterpFilters interp_filters, const int subpel_x, - int xstep, const int subpel_y, int ystep, - int avg, int bd); -#endif // CONFIG_HIGHBITDEPTH + const struct scale_factors *sf, int bd); #ifdef __cplusplus } // extern "C" |