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