1 /*
2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 *
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 */
11
12 #ifndef AOM_AV1_ENCODER_RECONINTER_ENC_H_
13 #define AOM_AV1_ENCODER_RECONINTER_ENC_H_
14
15 #include "aom/aom_integer.h"
16 #include "av1/common/filter.h"
17 #include "av1/common/blockd.h"
18 #include "av1/common/onyxc_int.h"
19 #include "av1/common/convolve.h"
20 #include "av1/common/warped_motion.h"
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 void av1_enc_build_inter_predictor(const AV1_COMMON *cm, MACROBLOCKD *xd,
27 int mi_row, int mi_col,
28 const BUFFER_SET *ctx, BLOCK_SIZE bsize,
29 int plane_from, int plane_to);
30
31 void av1_build_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
32 int dst_stride, const MV *src_mv,
33 const struct scale_factors *sf, int w, int h,
34 ConvolveParams *conv_params,
35 InterpFilters interp_filters,
36 const WarpTypesAllowed *warp_types, int p_col,
37 int p_row, int plane, int ref,
38 mv_precision precision, int x, int y,
39 const MACROBLOCKD *xd, int can_use_previous);
40
41 // Detect if the block have sub-pixel level motion vectors
42 // per component.
43 #define CHECK_SUBPEL 0
has_subpel_mv_component(const MB_MODE_INFO * const mbmi,const MACROBLOCKD * const xd,int dir)44 static INLINE int has_subpel_mv_component(const MB_MODE_INFO *const mbmi,
45 const MACROBLOCKD *const xd,
46 int dir) {
47 #if CHECK_SUBPEL
48 const BLOCK_SIZE bsize = mbmi->sb_type;
49 int plane;
50 int ref = (dir >> 1);
51
52 if (dir & 0x01) {
53 if (mbmi->mv[ref].as_mv.col & SUBPEL_MASK) return 1;
54 } else {
55 if (mbmi->mv[ref].as_mv.row & SUBPEL_MASK) return 1;
56 }
57
58 return 0;
59 #else
60 (void)mbmi;
61 (void)xd;
62 (void)dir;
63 return 1;
64 #endif
65 }
66
av1_is_interp_search_needed(const MACROBLOCKD * const xd)67 static INLINE int av1_is_interp_search_needed(const MACROBLOCKD *const xd) {
68 MB_MODE_INFO *const mi = xd->mi[0];
69 const int is_compound = has_second_ref(mi);
70 int ref;
71 for (ref = 0; ref < 1 + is_compound; ++ref) {
72 int row_col;
73 for (row_col = 0; row_col < 2; ++row_col) {
74 const int dir = (ref << 1) + row_col;
75 if (has_subpel_mv_component(mi, xd, dir)) {
76 return 1;
77 }
78 }
79 }
80 return 0;
81 }
82
83 void av1_build_prediction_by_above_preds(const AV1_COMMON *cm, MACROBLOCKD *xd,
84 int mi_row, int mi_col,
85 uint8_t *tmp_buf[MAX_MB_PLANE],
86 int tmp_width[MAX_MB_PLANE],
87 int tmp_height[MAX_MB_PLANE],
88 int tmp_stride[MAX_MB_PLANE]);
89
90 void av1_build_prediction_by_left_preds(const AV1_COMMON *cm, MACROBLOCKD *xd,
91 int mi_row, int mi_col,
92 uint8_t *tmp_buf[MAX_MB_PLANE],
93 int tmp_width[MAX_MB_PLANE],
94 int tmp_height[MAX_MB_PLANE],
95 int tmp_stride[MAX_MB_PLANE]);
96
97 void av1_build_obmc_inter_predictors_sb(const AV1_COMMON *cm, MACROBLOCKD *xd,
98 int mi_row, int mi_col);
99
100 void av1_build_inter_predictors_for_planes_single_buf(
101 MACROBLOCKD *xd, BLOCK_SIZE bsize, int plane_from, int plane_to, int mi_row,
102 int mi_col, int ref, uint8_t *ext_dst[3], int ext_dst_stride[3],
103 int can_use_previous);
104
105 void av1_build_wedge_inter_predictor_from_buf(MACROBLOCKD *xd, BLOCK_SIZE bsize,
106 int plane_from, int plane_to,
107 uint8_t *ext_dst0[3],
108 int ext_dst_stride0[3],
109 uint8_t *ext_dst1[3],
110 int ext_dst_stride1[3]);
111
112 #ifdef __cplusplus
113 } // extern "C"
114 #endif
115
116 #endif // AOM_AV1_ENCODER_RECONINTER_ENC_H_
117