/src/aom/av1/encoder/intra_mode_search.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2020, 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 | | /*!\file |
13 | | * \brief Declares high level functions to search through intra modes. |
14 | | */ |
15 | | #ifndef AOM_AV1_ENCODER_INTRA_MODE_SEARCH_H_ |
16 | | #define AOM_AV1_ENCODER_INTRA_MODE_SEARCH_H_ |
17 | | |
18 | | #include "av1/encoder/encoder.h" |
19 | | |
20 | | #ifdef __cplusplus |
21 | | extern "C" { |
22 | | #endif |
23 | | |
24 | | /*! \brief Variables related to intra-mode search during inter frame coding. |
25 | | * |
26 | | * \ingroup intra_mode_search |
27 | | * This is a set of variables used during intra-mode search for inter frames. |
28 | | * This includes an histogram of gradient speed features and a cache of uv |
29 | | * prediction to avoid repeated search of chroma prediction. |
30 | | */ |
31 | | typedef struct IntraModeSearchState { |
32 | | /*! |
33 | | * \brief The best luma intra-mode found so far |
34 | | */ |
35 | | PREDICTION_MODE best_intra_mode; |
36 | | |
37 | | /** \name Speed feature variables |
38 | | * Variables to help with pruning some luma intra-modes during inter frame |
39 | | * coding process. |
40 | | */ |
41 | | /**@{*/ |
42 | | /*! |
43 | | * \brief Whether to terminate all intra mode search. |
44 | | */ |
45 | | int skip_intra_modes; |
46 | | /*! |
47 | | * \brief Whether a directional mode is pruned. |
48 | | */ |
49 | | uint8_t directional_mode_skip_mask[INTRA_MODES]; |
50 | | /*! |
51 | | * \brief Whether \ref directional_mode_skip_mask is valid for pruning. |
52 | | */ |
53 | | int dir_mode_skip_mask_ready; |
54 | | /**@}*/ |
55 | | |
56 | | /** \name Chroma mode search cache |
57 | | * A cache of the best chroma prediction mode to avoid having to search for |
58 | | * chroma predictions repeatedly in \ref |
59 | | * av1_search_intra_uv_modes_in_interframe() |
60 | | */ |
61 | | /**@{*/ |
62 | | int rate_uv_intra; /*!< \brief Total rate to transmit uv_mode */ |
63 | | int rate_uv_tokenonly; /*!< \brief Rate transmit txfm tokens */ |
64 | | int64_t dist_uvs; /*!< \brief Distortion of the uv_mode's recon */ |
65 | | uint8_t skip_uvs; /*!< \brief Whether the uv txfm is skippable */ |
66 | | UV_PREDICTION_MODE mode_uv; /*!< \brief The best uv mode */ |
67 | | PALETTE_MODE_INFO pmi_uv; /*!< \brief Color map if mode_uv is palette */ |
68 | | int8_t uv_angle_delta; /*!< \brief Angle delta if mode_uv directional */ |
69 | | /**@}*/ |
70 | | } IntraModeSearchState; |
71 | | |
72 | | /*!\brief Evaluate a given luma intra-mode for inter frames. |
73 | | * |
74 | | * \ingroup intra_mode_search |
75 | | * \callgraph |
76 | | * \callergraph |
77 | | * This function handles an intra-mode luma prediction when the current frame |
78 | | * is an inter frame. This is the intra-mode counterpart of handle_inter_mode. |
79 | | * This function performs an intra luma prediction using the mode specified by |
80 | | * x->e_mbd.mi[0]->mode. This function does *not* support palette mode |
81 | | * prediction in the luma channel. |
82 | | * |
83 | | * \param[in,out] intra_search_state Structure to intra search state. |
84 | | * \param[in] cpi Top-level encoder structure. |
85 | | * \param[in,out] x Pointer to structure holding all the |
86 | | * data for the current macroblock. |
87 | | * \param[in] bsize Current partition block size. |
88 | | * \param[in] ref_frame_cost The entropy cost for signaling that the |
89 | | * current ref frame is an intra frame. |
90 | | * \param[in] ctx Structure to hold the number of 4x4 blks |
91 | | * to copy tx_type and txfm_skip arrays. |
92 | | * \param[out] rd_stats_y Struct to keep track of the current |
93 | | * intra-mode's rd_stats (luma only). |
94 | | * \param[in] best_rd Best RD seen for this block so far. |
95 | | * \param[out] mode_cost_y The cost needed to signal the current |
96 | | * intra mode. |
97 | | * \param[out] rd_y The rdcost of the chosen mode. |
98 | | * \param[in] best_model_rd Best model RD seen for this block so far |
99 | | * \param[in] top_intra_model_rd Top intra model RD seen for this |
100 | | * block so far. |
101 | | * |
102 | | * \return Returns 1 if a valid intra mode is found, 0 otherwise. |
103 | | * The corresponding values in x->e_mbd.mi[0], rd_stats_y, mode_cost_y, and |
104 | | * rd_y are also updated. Moreover, in the first evaluation with directional |
105 | | * mode, a prune_mask computed with histogram of gradient is also stored in |
106 | | * intra_search_state. |
107 | | */ |
108 | | int av1_handle_intra_y_mode(IntraModeSearchState *intra_search_state, |
109 | | const AV1_COMP *cpi, MACROBLOCK *x, |
110 | | BLOCK_SIZE bsize, unsigned int ref_frame_cost, |
111 | | const PICK_MODE_CONTEXT *ctx, RD_STATS *rd_stats_y, |
112 | | int64_t best_rd, int *mode_cost_y, int64_t *rd_y, |
113 | | int64_t *best_model_rd, |
114 | | int64_t top_intra_model_rd[]); |
115 | | |
116 | | /*!\brief Search through all chroma intra-modes for inter frames. |
117 | | * |
118 | | * \ingroup intra_mode_search |
119 | | * \callgraph |
120 | | * \callergraph |
121 | | * This function handles intra-mode chroma prediction when the current frame |
122 | | * is an inter frame. This is done by calling \ref av1_rd_pick_intra_sbuv_mode |
123 | | * with some additional book-keeping. |
124 | | * |
125 | | * \param[in,out] intra_search_state Structure to intra search state. |
126 | | * \param[in] cpi Top-level encoder structure. |
127 | | * \param[in,out] x Pointer to structure holding all the |
128 | | * data for the current macroblock. |
129 | | * \param[in] bsize Current partition block size. |
130 | | * \param[out] rd_stats Struct to keep track of the current |
131 | | * intra-mode's rd_stats (all planes). |
132 | | * \param[out] rd_stats_y Struct to keep track of the current |
133 | | * intra-mode's rd_stats (luma only). |
134 | | * \param[out] rd_stats_uv Struct to keep track of the current |
135 | | * intra-mode's rd_stats (chroma only). |
136 | | * \param[in] best_rd Best RD seen for this block so far. |
137 | | * |
138 | | * \return Returns 1 if a valid intra mode is found, 0 otherwise. |
139 | | * The corresponding values in x->e_mbd.mi[0], rd_stats(_y|_uv) are also |
140 | | * updated. Moreover, in the first evocation of the function, the chroma intra |
141 | | * mode result is cached in intra_search_state to be used in subsequent calls. |
142 | | */ |
143 | | int av1_search_intra_uv_modes_in_interframe( |
144 | | IntraModeSearchState *intra_search_state, const AV1_COMP *cpi, |
145 | | MACROBLOCK *x, BLOCK_SIZE bsize, RD_STATS *rd_stats, |
146 | | const RD_STATS *rd_stats_y, RD_STATS *rd_stats_uv, int64_t best_rd); |
147 | | |
148 | | /*!\brief Evaluate luma palette mode for inter frames. |
149 | | * |
150 | | * \ingroup intra_mode_search |
151 | | * \callergraph |
152 | | * \callgraph |
153 | | * This function handles luma palette mode when the current frame is an |
154 | | * inter frame. |
155 | | * |
156 | | * \param[in] intra_search_state Structure to hold the best luma intra mode |
157 | | * and cache chroma prediction for speed up. |
158 | | * \param[in] cpi Top-level encoder structure. |
159 | | * \param[in] x Pointer to structure holding all the data |
160 | | * for the current macroblock. |
161 | | * \param[in] bsize Current partition block size. |
162 | | * \param[in] ref_frame_cost The entropy cost for signaling that the |
163 | | * current ref frame is an intra frame. |
164 | | * \param[in] ctx Structure to hold the number of 4x4 blks to |
165 | | * copy the tx_type and txfm_skip arrays. |
166 | | * \param[in] this_rd_cost Struct to keep track of palette mode's |
167 | | * rd_stats. |
168 | | * \param[in] best_rd Best RD seen for this block so far. |
169 | | * |
170 | | * \return Returns whether luma palette mode can skip the txfm. The |
171 | | * corresponding mbmi, this_rd_costs, intra_search_state, and tx_type arrays in |
172 | | * ctx are also updated. |
173 | | */ |
174 | | int av1_search_palette_mode(IntraModeSearchState *intra_search_state, |
175 | | const AV1_COMP *cpi, MACROBLOCK *x, |
176 | | BLOCK_SIZE bsize, unsigned int ref_frame_cost, |
177 | | PICK_MODE_CONTEXT *ctx, RD_STATS *this_rd_cost, |
178 | | int64_t best_rd); |
179 | | |
180 | | /*!\brief Evaluate luma palette mode for inter frames. |
181 | | * |
182 | | * \ingroup intra_mode_search |
183 | | * \callergraph |
184 | | * \callgraph |
185 | | * This function handles luma palette mode when the current frame is an |
186 | | * inter frame. |
187 | | * |
188 | | * \param[in] cpi Top-level encoder structure. |
189 | | * \param[in] x Pointer to structure holding all the data |
190 | | * for the current macroblock. |
191 | | * \param[in] bsize Current partition block size. |
192 | | * \param[in] ref_frame_cost The entropy cost for signaling that the |
193 | | * current ref frame is an intra frame. |
194 | | * \param[in] ctx Structure to hold the number of 4x4 blks to |
195 | | * copy the tx_type and txfm_skip arrays. |
196 | | * \param[in] this_rd_cost Struct to keep track of palette mode's |
197 | | * rd_stats. |
198 | | * \param[in] best_rd Best RD seen for this block so far. |
199 | | */ |
200 | | void av1_search_palette_mode_luma(const AV1_COMP *cpi, MACROBLOCK *x, |
201 | | BLOCK_SIZE bsize, unsigned int ref_frame_cost, |
202 | | PICK_MODE_CONTEXT *ctx, |
203 | | RD_STATS *this_rd_cost, int64_t best_rd); |
204 | | |
205 | | /*!\brief Perform intra-mode search on luma channels for intra frames. |
206 | | * |
207 | | * \ingroup intra_mode_search |
208 | | * \callgraph |
209 | | * \callergraph |
210 | | * This function performs intra-mode search on the luma channel when the |
211 | | * current frame is intra-only. This function does not search intrabc mode, |
212 | | * but it does search palette and filter_intra. |
213 | | * |
214 | | * \param[in] cpi Top-level encoder structure. |
215 | | * \param[in] x Pointer to structure holding all the data |
216 | | * for the current macroblock. |
217 | | * \param[in] rate The total rate needed to predict the current |
218 | | * chroma block. |
219 | | * \param[in] rate_tokenonly The rate without the cost of sending the |
220 | | * prediction modes. |
221 | | * chroma block. |
222 | | * after the reconstruction. |
223 | | * \param[in] distortion The chroma distortion of the best prediction |
224 | | * after the reconstruction. |
225 | | * \param[in] skippable Whether we can skip txfm process. |
226 | | * \param[in] bsize Current partition block size. |
227 | | * \param[in] best_rd Best RD seen for this block so far. |
228 | | * \param[in] ctx Structure to hold the number of 4x4 blks to |
229 | | * copy the tx_type and txfm_skip arrays. |
230 | | * |
231 | | * \return Returns the rd_cost if this function finds a mode better than |
232 | | * best_rd, otherwise returns INT64_MAX. This also updates the mbmi, the rate |
233 | | * and distortion, and the tx_type arrays in ctx. |
234 | | */ |
235 | | int64_t av1_rd_pick_intra_sby_mode(const AV1_COMP *const cpi, MACROBLOCK *x, |
236 | | int *rate, int *rate_tokenonly, |
237 | | int64_t *distortion, uint8_t *skippable, |
238 | | BLOCK_SIZE bsize, int64_t best_rd, |
239 | | PICK_MODE_CONTEXT *ctx); |
240 | | |
241 | | /*!\brief Perform intra-mode search on chroma channels. |
242 | | * |
243 | | * \ingroup intra_mode_search |
244 | | * \callergraph |
245 | | * \callgraph |
246 | | * This function performs intra-mode search on the chroma channels. Just like |
247 | | * \ref av1_rd_pick_intra_sby_mode(), this function searches over palette mode |
248 | | * (filter_intra is not available on chroma planes). Unlike \ref |
249 | | * av1_rd_pick_intra_sby_mode() this function is used by both inter and intra |
250 | | * frames. |
251 | | * |
252 | | * \param[in] cpi Top-level encoder structure. |
253 | | * \param[in] x Pointer to structure holding all the data |
254 | | * for the current macroblock. |
255 | | * \param[in] rate The total rate needed to predict the current |
256 | | * chroma block. |
257 | | * \param[in] rate_tokenonly The rate without the cost of sending the |
258 | | * prediction modes. |
259 | | * chroma block. |
260 | | * after the reconstruction. |
261 | | * \param[in] distortion The chroma distortion of the best prediction |
262 | | * after the reconstruction. |
263 | | * \param[in] skippable Whether we can skip txfm process. |
264 | | * \param[in] bsize Current partition block size. |
265 | | * \param[in] max_tx_size The maximum tx_size available |
266 | | * |
267 | | * \return Returns the rd_cost of the best uv mode found. This also updates the |
268 | | * mbmi, the rate and distortion, distortion. |
269 | | */ |
270 | | int64_t av1_rd_pick_intra_sbuv_mode(const AV1_COMP *const cpi, MACROBLOCK *x, |
271 | | int *rate, int *rate_tokenonly, |
272 | | int64_t *distortion, uint8_t *skippable, |
273 | | BLOCK_SIZE bsize, TX_SIZE max_tx_size); |
274 | | |
275 | | /*! \brief Return the number of colors in src. Used by palette mode. |
276 | | */ |
277 | | void av1_count_colors(const uint8_t *src, int stride, int rows, int cols, |
278 | | int *val_count, int *num_colors); |
279 | | |
280 | | /*! \brief See \ref av1_count_colors(), but for highbd. |
281 | | */ |
282 | | void av1_count_colors_highbd(const uint8_t *src8, int stride, int rows, |
283 | | int cols, int bit_depth, int *val_count, |
284 | | int *val_count_8bit, int *num_color_bins, |
285 | | int *num_colors); |
286 | | |
287 | | /*! \brief Initializes the \ref IntraModeSearchState struct. |
288 | | */ |
289 | | static inline void init_intra_mode_search_state( |
290 | 0 | IntraModeSearchState *intra_search_state) { |
291 | 0 | memset(intra_search_state, 0, sizeof(*intra_search_state)); |
292 | 0 | intra_search_state->rate_uv_intra = INT_MAX; |
293 | 0 | } Unexecuted instantiation: encoder.c:init_intra_mode_search_state Unexecuted instantiation: palette.c:init_intra_mode_search_state Unexecuted instantiation: rdopt.c:init_intra_mode_search_state Unexecuted instantiation: nonrd_pickmode.c:init_intra_mode_search_state Unexecuted instantiation: intra_mode_search.c:init_intra_mode_search_state |
294 | | |
295 | | /*! \brief set the luma intra mode and delta angles for a given mode index. |
296 | | * The total number of luma intra mode is LUMA_MODE_COUNT = 61. |
297 | | * The first 13 modes are from DC_PRED to PAETH_PRED, followed by directional |
298 | | * modes. Each of the main 8 directional modes have 6 = MAX_ANGLE_DELTA * 2 |
299 | | * delta angles. |
300 | | * \param[in] mode_idx mode index in intra mode decision |
301 | | * process. |
302 | | * \param[in] mbmi Pointer to structure holding the mode |
303 | | * info for the current macroblock. |
304 | | * \param[in] reorder_delta_angle_eval Indicates whether to reorder the |
305 | | * evaluation of delta angle modes. |
306 | | */ |
307 | | void set_y_mode_and_delta_angle(const int mode_idx, MB_MODE_INFO *const mbmi, |
308 | | int reorder_delta_angle_eval); |
309 | | #ifdef __cplusplus |
310 | | } // extern "C" |
311 | | #endif |
312 | | |
313 | | #endif // AOM_AV1_ENCODER_INTRA_MODE_SEARCH_H_ |