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 #ifndef AOM_AV1_ENCODER_PICKCDEF_H_
12 #define AOM_AV1_ENCODER_PICKCDEF_H_
13
14 #include "av1/common/cdef.h"
15 #include "av1/encoder/speed_features.h"
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 /*!\enum CDEF_CONTROL
22 * \brief This enum controls to which frames CDEF is applied.
23 */
24 typedef enum {
25 CDEF_NONE = 0, /*!< Disable CDEF on all frames. */
26 CDEF_ALL = 1, /*!< Enable CDEF for all frames. */
27 CDEF_REFERENCE = 2, /*!< Disable CDEF on non reference frames. */
28 } CDEF_CONTROL;
29
30 /*!\cond */
31 struct MultiThreadInfo;
32
33 #define REDUCED_PRI_STRENGTHS_LVL1 8
34 #define REDUCED_PRI_STRENGTHS_LVL2 5
35 #define REDUCED_SEC_STRENGTHS_LVL3 2
36 #define REDUCED_SEC_STRENGTHS_LVL5 1
37 #define REDUCED_PRI_STRENGTHS_LVL4 2
38
39 #define REDUCED_TOTAL_STRENGTHS_LVL1 \
40 (REDUCED_PRI_STRENGTHS_LVL1 * CDEF_SEC_STRENGTHS)
41 #define REDUCED_TOTAL_STRENGTHS_LVL2 \
42 (REDUCED_PRI_STRENGTHS_LVL2 * CDEF_SEC_STRENGTHS)
43 #define REDUCED_TOTAL_STRENGTHS_LVL3 \
44 (REDUCED_PRI_STRENGTHS_LVL2 * REDUCED_SEC_STRENGTHS_LVL3)
45 #define REDUCED_TOTAL_STRENGTHS_LVL4 \
46 (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL3)
47 #define REDUCED_TOTAL_STRENGTHS_LVL5 \
48 (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL5)
49 #define TOTAL_STRENGTHS (CDEF_PRI_STRENGTHS * CDEF_SEC_STRENGTHS)
50
51 static const int priconv_lvl1[REDUCED_PRI_STRENGTHS_LVL1] = { 0, 1, 2, 3,
52 5, 7, 10, 13 };
53 static const int priconv_lvl2[REDUCED_PRI_STRENGTHS_LVL2] = { 0, 2, 4, 8, 14 };
54 static const int priconv_lvl4[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 11 };
55 static const int priconv_lvl5[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 5 };
56 static const int secconv_lvl3[REDUCED_SEC_STRENGTHS_LVL3] = { 0, 2 };
57 static const int secconv_lvl5[REDUCED_SEC_STRENGTHS_LVL5] = { 0 };
58 static const int nb_cdef_strengths[CDEF_PICK_METHODS] = {
59 TOTAL_STRENGTHS,
60 REDUCED_TOTAL_STRENGTHS_LVL1,
61 REDUCED_TOTAL_STRENGTHS_LVL2,
62 REDUCED_TOTAL_STRENGTHS_LVL3,
63 REDUCED_TOTAL_STRENGTHS_LVL4,
64 REDUCED_TOTAL_STRENGTHS_LVL5,
65 TOTAL_STRENGTHS
66 };
67
68 typedef void (*copy_fn_t)(uint16_t *dst, int dstride, const uint8_t *src,
69 int src_voffset, int src_hoffset, int sstride,
70 int vsize, int hsize);
71 typedef uint64_t (*compute_cdef_dist_t)(void *dst, int dstride, uint16_t *src,
72 cdef_list *dlist, int cdef_count,
73 BLOCK_SIZE bsize, int coeff_shift,
74 int row, int col);
75
76 /*! \brief CDEF search context.
77 */
78 typedef struct {
79 /*!
80 * Pointer to the frame buffer holding the source frame
81 */
82 const YV12_BUFFER_CONFIG *ref;
83 /*!
84 * Pointer to params related to MB_MODE_INFO arrays and related info
85 */
86 CommonModeInfoParams *mi_params;
87 /*!
88 * Info specific to each plane
89 */
90 struct macroblockd_plane plane[MAX_MB_PLANE];
91 /*!
92 * Function pointer of copy_fn
93 */
94 copy_fn_t copy_fn;
95 /*!
96 * Function pointer of compute_cdef_dist_fn
97 */
98 compute_cdef_dist_t compute_cdef_dist_fn;
99 /*!
100 * Number of strenghts evaluated in CDEF filter search
101 */
102 int total_strengths;
103 /*!
104 * Bit-depth dependent shift
105 */
106 int coeff_shift;
107 /*!
108 * CDEF damping factor
109 */
110 int damping;
111 /*!
112 * Search method used to select CDEF parameters
113 */
114 int pick_method;
115 /*!
116 * Number of planes
117 */
118 int num_planes;
119 /*!
120 * Log2 of width of the MI unit in pixels. mi_wide_l2[i]
121 * indicates the width of the MI unit in pixels for the ith plane
122 */
123 int mi_wide_l2[MAX_MB_PLANE];
124 /*!
125 * Log2 of height of the MI unit in pixels. mi_high_l2[i]
126 * indicates the height of the MI unit in pixels for the ith plane
127 */
128 int mi_high_l2[MAX_MB_PLANE];
129 /*!
130 * Subsampling in x direction. xdec[i] indicates the subsampling
131 * for the ith plane
132 */
133 int xdec[MAX_MB_PLANE];
134 /*!
135 * Subsampling in y direction. ydec[i] indicates the subsampling
136 * for the ith plane
137 */
138 int ydec[MAX_MB_PLANE];
139 /*!
140 * bsize[i] indicates the block size of ith plane
141 */
142 int bsize[MAX_MB_PLANE];
143 /*!
144 * Number of 64x64 blocks in vertical direction of a frame
145 */
146 int nvfb;
147 /*!
148 * Number of 64x64 blocks in horizontal direction of a frame
149 */
150 int nhfb;
151 /*!
152 * Pointer to the mean squared error between the CDEF filtered block and the
153 * source block. mse[i][j][k] stores the MSE of the ith plane (i=0 corresponds
154 * to Y-plane, i=1 corresponds to U and V planes), jth block and kth strength
155 * index
156 */
157 uint64_t (*mse[2])[TOTAL_STRENGTHS];
158 /*!
159 * Holds the position (in units of mi's) of the cdef filtered
160 * block in raster scan order
161 */
162 int *sb_index;
163 /*!
164 * Holds the count of cdef filtered blocks
165 */
166 int sb_count;
167 /*!
168 * Indicates if 16bit frame buffers are to be used i.e., the content bit-depth
169 * is > 8-bit
170 */
171 bool use_highbitdepth;
172 } CdefSearchCtx;
173
sb_all_skip(const CommonModeInfoParams * const mi_params,int mi_row,int mi_col)174 static INLINE int sb_all_skip(const CommonModeInfoParams *const mi_params,
175 int mi_row, int mi_col) {
176 const int maxr = AOMMIN(mi_params->mi_rows - mi_row, MI_SIZE_64X64);
177 const int maxc = AOMMIN(mi_params->mi_cols - mi_col, MI_SIZE_64X64);
178 const int stride = mi_params->mi_stride;
179 MB_MODE_INFO **mbmi = mi_params->mi_grid_base + mi_row * stride + mi_col;
180 for (int r = 0; r < maxr; ++r, mbmi += stride) {
181 for (int c = 0; c < maxc; ++c) {
182 if (!mbmi[c]->skip_txfm) return 0;
183 }
184 }
185 return 1;
186 }
187
188 // Checks if cdef processing can be skipped for particular sb.
189 // Inputs:
190 // cdef_search_ctx: Pointer to the structure containing parameters related to
191 // CDEF search context.
192 // fbr: Row index in units of 64x64 block
193 // fbc: Column index in units of 64x64 block
194 // Returns:
195 // 1/0 will be returned to indicate skip/don't skip cdef processing of sb
196 // respectively.
cdef_sb_skip(const CommonModeInfoParams * const mi_params,int fbr,int fbc)197 static INLINE int cdef_sb_skip(const CommonModeInfoParams *const mi_params,
198 int fbr, int fbc) {
199 const MB_MODE_INFO *const mbmi =
200 mi_params->mi_grid_base[MI_SIZE_64X64 * fbr * mi_params->mi_stride +
201 MI_SIZE_64X64 * fbc];
202 // No filtering if the entire filter block is skipped.
203 if (sb_all_skip(mi_params, fbr * MI_SIZE_64X64, fbc * MI_SIZE_64X64))
204 return 1;
205 // Skip odd numbered 64x64 block rows(cols) when bsize is BLOCK_128X128,
206 // BLOCK_64X128(BLOCK_128X128, BLOCK_128X64) as for such blocks CDEF filtering
207 // is done at the corresponding block sizes.
208 if (((fbc & 1) &&
209 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_128X64)) ||
210 ((fbr & 1) &&
211 (mbmi->bsize == BLOCK_128X128 || mbmi->bsize == BLOCK_64X128)))
212 return 1;
213 return 0;
214 }
215
216 void av1_cdef_mse_calc_block(CdefSearchCtx *cdef_search_ctx, int fbr, int fbc,
217 int sb_count);
218 /*!\endcond */
219
220 /*!\brief AV1 CDEF parameter search
221 *
222 * \ingroup in_loop_cdef
223 *
224 * Searches for optimal CDEF parameters for frame
225 *
226 * \param[in] mt_info Pointer to multi-threading parameters
227 * \param[in] frame Compressed frame buffer
228 * \param[in] ref Source frame buffer
229 * \param[in,out] cm Pointer to top level common structure
230 * \param[in] xd Pointer to common current coding block structure
231 * \param[in] pick_method The method used to select params
232 * \param[in] rdmult rd multiplier to use in making param choices
233 * \param[in] skip_cdef_feature Speed feature to skip cdef
234 * \param[in] cdef_control Parameter that controls CDEF application
235 * \param[in] is_screen_content Whether it is screen content type
236 * \param[in] non_reference_frame Indicates if current frame is
237 * non-reference
238 *
239 * \remark Nothing is returned. Instead, optimal CDEF parameters are stored
240 * in the \c cdef_info structure of type \ref CdefInfo inside \c cm:
241 * \arg \c cdef_bits: Bits of strength parameters
242 * \arg \c nb_cdef_strengths: Number of strength parameters
243 * \arg \c cdef_strengths: list of \c nb_cdef_strengths strength parameters
244 * for the luma plane.
245 * \arg \c uv_cdef_strengths: list of \c nb_cdef_strengths strength parameters
246 * for the chroma planes.
247 * \arg \c damping_factor: CDEF damping factor.
248 *
249 */
250 void av1_cdef_search(struct MultiThreadInfo *mt_info,
251 const YV12_BUFFER_CONFIG *frame,
252 const YV12_BUFFER_CONFIG *ref, AV1_COMMON *cm,
253 MACROBLOCKD *xd, CDEF_PICK_METHOD pick_method, int rdmult,
254 int skip_cdef_feature, CDEF_CONTROL cdef_control,
255 const int is_screen_content, int non_reference_frame);
256
257 #ifdef __cplusplus
258 } // extern "C"
259 #endif
260 #endif // AOM_AV1_ENCODER_PICKCDEF_H_
261