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 AV1_COMMON_ENTROPYMODE_H_
13 #define AV1_COMMON_ENTROPYMODE_H_
14
15 #include "av1/common/entropy.h"
16 #include "av1/common/entropymv.h"
17 #include "av1/common/filter.h"
18 #include "av1/common/seg_common.h"
19 #include "aom_dsp/aom_filter.h"
20
21 #if CONFIG_PVQ
22 #include "av1/common/pvq.h"
23 #include "av1/common/pvq_state.h"
24 #include "av1/common/generic_code.h"
25 #endif // CONFIG_PVQ
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #define BLOCK_SIZE_GROUPS 4
32
33 #define TX_SIZE_CONTEXTS 2
34
35 #define INTER_OFFSET(mode) ((mode)-NEARESTMV)
36 #if CONFIG_COMPOUND_SINGLEREF
37 #define INTER_SINGLEREF_COMP_OFFSET(mode) ((mode)-SR_NEAREST_NEARMV)
38 #endif // CONFIG_COMPOUND_SINGLEREF
39 #define INTER_COMPOUND_OFFSET(mode) ((mode)-NEAREST_NEARESTMV)
40
41 // Number of possible contexts for a color index.
42 // As can be seen from av1_get_palette_color_index_context(), the possible
43 // contexts are (2,0,0), (2,2,1), (3,2,0), (4,1,0), (5,0,0). These are mapped to
44 // a value from 0 to 4 using 'palette_color_index_context_lookup' table.
45 #define PALETTE_COLOR_INDEX_CONTEXTS 5
46
47 // Maximum number of colors in a palette.
48 #define PALETTE_MAX_SIZE 8
49 // Minimum number of colors in a palette.
50 #define PALETTE_MIN_SIZE 2
51
52 // Palette mode is available for block sizes >= 8x8.
53 #define PALETTE_BLOCK_SIZES (BLOCK_LARGEST - BLOCK_8X8 + 1)
54
55 // Palette Y mode context for a block is determined by number of neighboring
56 // blocks (top and/or left) using a palette for Y plane. So, possible Y mode'
57 // context values are:
58 // 0 if neither left nor top block uses palette for Y plane,
59 // 1 if exactly one of left or top block uses palette for Y plane, and
60 // 2 if both left and top blocks use palette for Y plane.
61 #define PALETTE_Y_MODE_CONTEXTS 3
62
63 // Palette UV mode context for a block is determined by whether this block uses
64 // palette for the Y plane. So, possible values are:
65 // 0 if this block doesn't use palette for Y plane.
66 // 1 if this block uses palette for Y plane (i.e. Y palette size > 0).
67 #define PALETTE_UV_MODE_CONTEXTS 2
68
69 #define PALETTE_MAX_BLOCK_SIZE (64 * 64)
70
71 #if CONFIG_KF_CTX
72 #define KF_MODE_CONTEXTS 5
73 #endif
74
75 struct AV1Common;
76
77 typedef struct {
78 const int16_t *scan;
79 const int16_t *iscan;
80 const int16_t *neighbors;
81 } SCAN_ORDER;
82
83 struct seg_counts {
84 unsigned int tree_total[MAX_SEGMENTS];
85 unsigned int tree_mispred[MAX_SEGMENTS];
86 unsigned int pred[PREDICTION_PROBS][2];
87 };
88
89 typedef struct frame_contexts {
90 aom_prob y_mode_prob[BLOCK_SIZE_GROUPS][INTRA_MODES - 1];
91 aom_prob uv_mode_prob[INTRA_MODES][UV_INTRA_MODES - 1];
92 #if CONFIG_EXT_PARTITION_TYPES
93 aom_prob partition_prob[PARTITION_CONTEXTS][EXT_PARTITION_TYPES - 1];
94 #else
95 aom_prob partition_prob[PARTITION_CONTEXTS][PARTITION_TYPES - 1];
96 #endif
97 coeff_cdf_model coef_tail_cdfs[TX_SIZES][PLANE_TYPES];
98 coeff_cdf_model coef_head_cdfs[TX_SIZES][PLANE_TYPES];
99 #if CONFIG_ADAPT_SCAN
100 // TODO(angiebird): try aom_prob
101 #if CONFIG_CHROMA_2X2
102 uint32_t non_zero_prob_2x2[TX_TYPES][4];
103 #endif
104 uint32_t non_zero_prob_4X4[TX_TYPES][16];
105 uint32_t non_zero_prob_8X8[TX_TYPES][64];
106 uint32_t non_zero_prob_16X16[TX_TYPES][256];
107 uint32_t non_zero_prob_32X32[TX_TYPES][1024];
108
109 uint32_t non_zero_prob_4X8[TX_TYPES][32];
110 uint32_t non_zero_prob_8X4[TX_TYPES][32];
111 uint32_t non_zero_prob_16X8[TX_TYPES][128];
112 uint32_t non_zero_prob_8X16[TX_TYPES][128];
113 uint32_t non_zero_prob_32X16[TX_TYPES][512];
114 uint32_t non_zero_prob_16X32[TX_TYPES][512];
115
116 #if CONFIG_CHROMA_2X2
117 DECLARE_ALIGNED(16, int16_t, scan_2x2[TX_TYPES][4]);
118 #endif
119 DECLARE_ALIGNED(16, int16_t, scan_4X4[TX_TYPES][16]);
120 DECLARE_ALIGNED(16, int16_t, scan_8X8[TX_TYPES][64]);
121 DECLARE_ALIGNED(16, int16_t, scan_16X16[TX_TYPES][256]);
122 DECLARE_ALIGNED(16, int16_t, scan_32X32[TX_TYPES][1024]);
123
124 DECLARE_ALIGNED(16, int16_t, scan_4X8[TX_TYPES][32]);
125 DECLARE_ALIGNED(16, int16_t, scan_8X4[TX_TYPES][32]);
126 DECLARE_ALIGNED(16, int16_t, scan_8X16[TX_TYPES][128]);
127 DECLARE_ALIGNED(16, int16_t, scan_16X8[TX_TYPES][128]);
128 DECLARE_ALIGNED(16, int16_t, scan_16X32[TX_TYPES][512]);
129 DECLARE_ALIGNED(16, int16_t, scan_32X16[TX_TYPES][512]);
130
131 #if CONFIG_CHROMA_2X2
132 DECLARE_ALIGNED(16, int16_t, iscan_2x2[TX_TYPES][4]);
133 #endif
134 DECLARE_ALIGNED(16, int16_t, iscan_4X4[TX_TYPES][16]);
135 DECLARE_ALIGNED(16, int16_t, iscan_8X8[TX_TYPES][64]);
136 DECLARE_ALIGNED(16, int16_t, iscan_16X16[TX_TYPES][256]);
137 DECLARE_ALIGNED(16, int16_t, iscan_32X32[TX_TYPES][1024]);
138
139 DECLARE_ALIGNED(16, int16_t, iscan_4X8[TX_TYPES][32]);
140 DECLARE_ALIGNED(16, int16_t, iscan_8X4[TX_TYPES][32]);
141 DECLARE_ALIGNED(16, int16_t, iscan_8X16[TX_TYPES][128]);
142 DECLARE_ALIGNED(16, int16_t, iscan_16X8[TX_TYPES][128]);
143 DECLARE_ALIGNED(16, int16_t, iscan_16X32[TX_TYPES][512]);
144 DECLARE_ALIGNED(16, int16_t, iscan_32X16[TX_TYPES][512]);
145
146 #if CONFIG_CHROMA_2X2
147 int16_t nb_2x2[TX_TYPES][(4 + 1) * 2];
148 #endif
149 int16_t nb_4X4[TX_TYPES][(16 + 1) * 2];
150 int16_t nb_8X8[TX_TYPES][(64 + 1) * 2];
151 int16_t nb_16X16[TX_TYPES][(256 + 1) * 2];
152 int16_t nb_32X32[TX_TYPES][(1024 + 1) * 2];
153
154 int16_t nb_4X8[TX_TYPES][(32 + 1) * 2];
155 int16_t nb_8X4[TX_TYPES][(32 + 1) * 2];
156 int16_t nb_8X16[TX_TYPES][(128 + 1) * 2];
157 int16_t nb_16X8[TX_TYPES][(128 + 1) * 2];
158 int16_t nb_16X32[TX_TYPES][(512 + 1) * 2];
159 int16_t nb_32X16[TX_TYPES][(512 + 1) * 2];
160
161 SCAN_ORDER sc[TX_SIZES_ALL][TX_TYPES];
162
163 int16_t eob_threshold[TX_SIZES_ALL][TX_TYPES][EOB_THRESHOLD_NUM];
164 #endif // CONFIG_ADAPT_SCAN
165
166 #if CONFIG_LV_MAP
167 aom_prob txb_skip[TX_SIZES][TXB_SKIP_CONTEXTS];
168 aom_prob nz_map[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS];
169 aom_prob eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS];
170 aom_prob dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS];
171 aom_prob coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
172 [COEFF_BASE_CONTEXTS];
173 aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS];
174 #if BR_NODE
175 aom_prob coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS];
176 #endif
177 #if CONFIG_CTX1D
178 aom_prob eob_mode[TX_SIZES][PLANE_TYPES][TX_CLASSES];
179 aom_prob empty_line[TX_SIZES][PLANE_TYPES][TX_CLASSES][EMPTY_LINE_CONTEXTS];
180 aom_prob hv_eob[TX_SIZES][PLANE_TYPES][TX_CLASSES][HV_EOB_CONTEXTS];
181 #endif // CONFIG_CTX1D
182
183 #if LV_MAP_PROB
184 aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
185 aom_cdf_prob nz_map_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]
186 [CDF_SIZE(2)];
187 aom_cdf_prob eob_flag_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]
188 [CDF_SIZE(2)];
189 aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
190 aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
191 [COEFF_BASE_CONTEXTS][CDF_SIZE(2)];
192 aom_cdf_prob coeff_lps_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS]
193 [CDF_SIZE(2)];
194 #if BR_NODE
195 aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS]
196 [LEVEL_CONTEXTS][CDF_SIZE(2)];
197 #endif
198 #if CONFIG_CTX1D
199 aom_cdf_prob eob_mode_cdf[TX_SIZES][PLANE_TYPES][TX_CLASSES][CDF_SIZE(2)];
200 aom_cdf_prob empty_line_cdf[TX_SIZES][PLANE_TYPES][TX_CLASSES]
201 [EMPTY_LINE_CONTEXTS][CDF_SIZE(2)];
202 aom_cdf_prob hv_eob_cdf[TX_SIZES][PLANE_TYPES][TX_CLASSES][HV_EOB_CONTEXTS]
203 [CDF_SIZE(2)];
204 #endif // CONFIG_CTX1D
205 #endif // LV_MAP_PROB
206 #endif
207
208 aom_prob newmv_prob[NEWMV_MODE_CONTEXTS];
209 aom_prob zeromv_prob[ZEROMV_MODE_CONTEXTS];
210 aom_prob refmv_prob[REFMV_MODE_CONTEXTS];
211 aom_prob drl_prob[DRL_MODE_CONTEXTS];
212 #if CONFIG_NEW_MULTISYMBOL
213 aom_cdf_prob newmv_cdf[NEWMV_MODE_CONTEXTS][CDF_SIZE(2)];
214 aom_cdf_prob zeromv_cdf[ZEROMV_MODE_CONTEXTS][CDF_SIZE(2)];
215 aom_cdf_prob refmv_cdf[REFMV_MODE_CONTEXTS][CDF_SIZE(2)];
216 aom_cdf_prob drl_cdf[DRL_MODE_CONTEXTS][CDF_SIZE(2)];
217 #endif
218
219 aom_prob inter_compound_mode_probs[INTER_MODE_CONTEXTS]
220 [INTER_COMPOUND_MODES - 1];
221 aom_cdf_prob inter_compound_mode_cdf[INTER_MODE_CONTEXTS]
222 [CDF_SIZE(INTER_COMPOUND_MODES)];
223 #if CONFIG_COMPOUND_SINGLEREF
224 aom_prob inter_singleref_comp_mode_probs[INTER_MODE_CONTEXTS]
225 [INTER_SINGLEREF_COMP_MODES - 1];
226 aom_cdf_prob inter_singleref_comp_mode_cdf[INTER_MODE_CONTEXTS][CDF_SIZE(
227 INTER_SINGLEREF_COMP_MODES)];
228 #endif // CONFIG_COMPOUND_SINGLEREF
229 aom_prob compound_type_prob[BLOCK_SIZES_ALL][COMPOUND_TYPES - 1];
230 #if CONFIG_WEDGE || CONFIG_COMPOUND_SEGMENT
231 aom_cdf_prob compound_type_cdf[BLOCK_SIZES_ALL][CDF_SIZE(COMPOUND_TYPES)];
232 #endif // CONFIG_WEDGE || CONFIG_COMPOUND_SEGMENT
233 #if CONFIG_INTERINTRA
234 aom_prob interintra_prob[BLOCK_SIZE_GROUPS];
235 aom_prob wedge_interintra_prob[BLOCK_SIZES_ALL];
236 aom_prob interintra_mode_prob[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1];
237 #if CONFIG_NEW_MULTISYMBOL
238 aom_cdf_prob interintra_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(2)];
239 aom_cdf_prob wedge_interintra_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
240 #endif
241 aom_cdf_prob interintra_mode_cdf[BLOCK_SIZE_GROUPS]
242 [CDF_SIZE(INTERINTRA_MODES)];
243 #endif // CONFIG_INTERINTRA
244 #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
245 aom_prob motion_mode_prob[BLOCK_SIZES_ALL][MOTION_MODES - 1];
246 aom_cdf_prob motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)];
247 #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
248 aom_prob ncobmc_mode_prob[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES - 1];
249 aom_cdf_prob ncobmc_mode_cdf[ADAPT_OVERLAP_BLOCKS]
250 [CDF_SIZE(MAX_NCOBMC_MODES)];
251 #endif
252 #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
253 #if CONFIG_NCOBMC_ADAPT_WEIGHT
254 aom_prob ncobmc_prob[BLOCK_SIZES_ALL][OBMC_FAMILY_MODES - 1];
255 aom_cdf_prob ncobmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(OBMC_FAMILY_MODES)];
256 #endif // CONFIG_NCOBMC_ADAPT_WEIGHT
257 aom_prob obmc_prob[BLOCK_SIZES_ALL];
258 #if CONFIG_NEW_MULTISYMBOL || CONFIG_NCOBMC_ADAPT_WEIGHT
259 aom_cdf_prob obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
260 #endif // CONFIG_NEW_MULTISYMBOL
261 #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
262 #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
263 aom_prob intra_inter_prob[INTRA_INTER_CONTEXTS];
264 aom_prob comp_inter_prob[COMP_INTER_CONTEXTS];
265 aom_cdf_prob palette_y_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(PALETTE_SIZES)];
266 aom_cdf_prob palette_uv_size_cdf[PALETTE_BLOCK_SIZES]
267 [CDF_SIZE(PALETTE_SIZES)];
268 aom_cdf_prob palette_y_color_index_cdf[PALETTE_SIZES]
269 [PALETTE_COLOR_INDEX_CONTEXTS]
270 [CDF_SIZE(PALETTE_COLORS)];
271 aom_cdf_prob palette_uv_color_index_cdf[PALETTE_SIZES]
272 [PALETTE_COLOR_INDEX_CONTEXTS]
273 [CDF_SIZE(PALETTE_COLORS)];
274 #if CONFIG_MRC_TX
275 aom_cdf_prob mrc_mask_inter_cdf[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
276 [CDF_SIZE(PALETTE_COLORS)];
277 aom_cdf_prob mrc_mask_intra_cdf[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
278 [CDF_SIZE(PALETTE_COLORS)];
279 #endif // CONFIG_MRC_TX
280 #if CONFIG_NEW_MULTISYMBOL
281 aom_cdf_prob palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS]
282 [CDF_SIZE(2)];
283 aom_cdf_prob palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
284 aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
285 aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
286 #endif
287 #if CONFIG_EXT_COMP_REFS
288 aom_prob comp_ref_type_prob[COMP_REF_TYPE_CONTEXTS];
289 aom_prob uni_comp_ref_prob[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1];
290 #if CONFIG_NEW_MULTISYMBOL
291 aom_cdf_prob comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][CDF_SIZE(2)];
292 aom_cdf_prob uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1]
293 [CDF_SIZE(2)];
294 #endif // CONFIG_NEW_MULTISYMBOL
295 #endif // CONFIG_EXT_COMP_REFS
296 aom_prob single_ref_prob[REF_CONTEXTS][SINGLE_REFS - 1];
297 #if CONFIG_EXT_REFS
298 aom_prob comp_ref_prob[REF_CONTEXTS][FWD_REFS - 1];
299 aom_prob comp_bwdref_prob[REF_CONTEXTS][BWD_REFS - 1];
300 #else
301 aom_prob comp_ref_prob[REF_CONTEXTS][COMP_REFS - 1];
302 #endif // CONFIG_EXT_REFS
303 #if CONFIG_NEW_MULTISYMBOL
304 #if CONFIG_EXT_REFS
305 aom_cdf_prob comp_ref_cdf[REF_CONTEXTS][FWD_REFS - 1][CDF_SIZE(2)];
306 aom_cdf_prob comp_bwdref_cdf[REF_CONTEXTS][BWD_REFS - 1][CDF_SIZE(2)];
307 #else
308 aom_cdf_prob comp_ref_cdf[REF_CONTEXTS][COMP_REFS - 1][CDF_SIZE(2)];
309 #endif // CONFIG_EXT_REFS
310 #endif
311 #if CONFIG_COMPOUND_SINGLEREF
312 aom_prob comp_inter_mode_prob[COMP_INTER_MODE_CONTEXTS];
313 #endif // CONFIG_COMPOUND_SINGLEREF
314 #if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX)
315 aom_prob quarter_tx_size_prob;
316 #if CONFIG_NEW_MULTISYMBOL
317 aom_cdf_prob quarter_tx_size_cdf[CDF_SIZE(2)];
318 #endif
319 #endif
320 #if CONFIG_VAR_TX
321 aom_prob txfm_partition_prob[TXFM_PARTITION_CONTEXTS];
322 #if CONFIG_NEW_MULTISYMBOL
323 aom_cdf_prob txfm_partition_cdf[TXFM_PARTITION_CONTEXTS][CDF_SIZE(2)];
324 #endif
325 #endif // CONFIG_VAR_TX
326 aom_prob skip_probs[SKIP_CONTEXTS];
327 #if CONFIG_NEW_MULTISYMBOL
328 aom_cdf_prob skip_cdfs[SKIP_CONTEXTS][CDF_SIZE(2)];
329 aom_cdf_prob intra_inter_cdf[INTRA_INTER_CONTEXTS][CDF_SIZE(2)];
330 #endif
331 nmv_context nmvc[NMV_CONTEXTS];
332 #if CONFIG_INTRABC
333 nmv_context ndvc;
334 aom_cdf_prob intrabc_cdf[CDF_SIZE(2)];
335 #endif
336 int initialized;
337 #if CONFIG_SUPERTX
338 aom_prob supertx_prob[PARTITION_SUPERTX_CONTEXTS][TX_SIZES];
339 #endif // CONFIG_SUPERTX
340 struct segmentation_probs seg;
341 #if CONFIG_EXT_INTRA
342 #if CONFIG_INTRA_INTERP
343 aom_prob intra_filter_probs[INTRA_FILTERS + 1][INTRA_FILTERS - 1];
344 #endif // CONFIG_INTRA_INTERP
345 #endif // CONFIG_EXT_INTRA
346 #if CONFIG_FILTER_INTRA
347 aom_prob filter_intra_probs[PLANE_TYPES];
348 #endif // CONFIG_FILTER_INTRA
349 #if CONFIG_LOOP_RESTORATION
350 aom_prob switchable_restore_prob[RESTORE_SWITCHABLE_TYPES - 1];
351 #endif // CONFIG_LOOP_RESTORATION
352 aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)];
353 aom_cdf_prob uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)];
354 #if CONFIG_EXT_PARTITION_TYPES
355 aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(EXT_PARTITION_TYPES)];
356 #else
357 aom_cdf_prob partition_cdf[PARTITION_CONTEXTS][CDF_SIZE(PARTITION_TYPES)];
358 #endif
359 aom_cdf_prob switchable_interp_cdf[SWITCHABLE_FILTER_CONTEXTS]
360 [CDF_SIZE(SWITCHABLE_FILTERS)];
361 /* kf_y_cdf is discarded after use, so does not require persistent storage.
362 However, we keep it with the other CDFs in this struct since it needs to
363 be copied to each tile to support parallelism just like the others.
364 */
365 #if CONFIG_KF_CTX
366 aom_cdf_prob kf_y_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
367 [CDF_SIZE(INTRA_MODES)];
368 #else
369 aom_cdf_prob kf_y_cdf[INTRA_MODES][INTRA_MODES][CDF_SIZE(INTRA_MODES)];
370 #endif
371 aom_cdf_prob tx_size_cdf[MAX_TX_DEPTH][TX_SIZE_CONTEXTS]
372 [CDF_SIZE(MAX_TX_DEPTH + 1)];
373 aom_cdf_prob delta_q_cdf[CDF_SIZE(DELTA_Q_PROBS + 1)];
374 #if CONFIG_EXT_DELTA_Q
375 #if CONFIG_LOOPFILTER_LEVEL
376 aom_cdf_prob delta_lf_multi_cdf[FRAME_LF_COUNT][CDF_SIZE(DELTA_LF_PROBS + 1)];
377 #endif // CONFIG_LOOPFILTER_LEVEL
378 aom_cdf_prob delta_lf_cdf[CDF_SIZE(DELTA_LF_PROBS + 1)];
379 #endif
380 #if CONFIG_EXT_TX
381 aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
382 [CDF_SIZE(TX_TYPES)];
383 aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SETS_INTER][EXT_TX_SIZES]
384 [CDF_SIZE(TX_TYPES)];
385 #else
386 aom_cdf_prob intra_ext_tx_cdf[EXT_TX_SIZES][TX_TYPES][CDF_SIZE(TX_TYPES)];
387 aom_cdf_prob inter_ext_tx_cdf[EXT_TX_SIZES][CDF_SIZE(TX_TYPES)];
388 #endif // CONFIG_EXT_TX
389 #if CONFIG_LGT_FROM_PRED
390 aom_prob intra_lgt_prob[LGT_SIZES][INTRA_MODES];
391 aom_prob inter_lgt_prob[LGT_SIZES];
392 #endif // CONFIG_LGT_FROM_PRED
393 #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
394 aom_cdf_prob intra_filter_cdf[INTRA_FILTERS + 1][CDF_SIZE(INTRA_FILTERS)];
395 #endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
396 aom_prob delta_q_prob[DELTA_Q_PROBS];
397 #if CONFIG_EXT_DELTA_Q
398 #if CONFIG_LOOPFILTER_LEVEL
399 aom_prob delta_lf_multi_prob[FRAME_LF_COUNT][DELTA_LF_PROBS];
400 #endif // CONFIG_LOOPFILTER_LEVEL
401 aom_prob delta_lf_prob[DELTA_LF_PROBS];
402 #endif
403 #if CONFIG_PVQ
404 // TODO(any): If PVQ is enabled, most of coefficient related cdf,
405 // such as coef_cdfs[], coef_tail_cdfs[], and coef_heaf_cdfs[] can be removed.
406 od_adapt_ctx pvq_context;
407 #endif // CONFIG_PVQ
408 #if CONFIG_CFL
409 aom_cdf_prob cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
410 aom_cdf_prob cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
411 #endif
412 #if CONFIG_LPF_SB
413 aom_cdf_prob lpf_reuse_cdf[LPF_REUSE_CONTEXT][CDF_SIZE(2)];
414 aom_cdf_prob lpf_delta_cdf[LPF_DELTA_CONTEXT][CDF_SIZE(DELTA_RANGE)];
415 aom_cdf_prob lpf_sign_cdf[LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][CDF_SIZE(2)];
416 #endif // CONFIG_LPF_SB
417 } FRAME_CONTEXT;
418
419 typedef struct FRAME_COUNTS {
420 // Note: This structure should only contain 'unsigned int' fields, or
421 // aggregates built solely from 'unsigned int' fields/elements
422 #if CONFIG_ENTROPY_STATS
423 unsigned int kf_y_mode[INTRA_MODES][INTRA_MODES][INTRA_MODES];
424 unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES];
425 unsigned int uv_mode[INTRA_MODES][UV_INTRA_MODES];
426 #endif // CONFIG_ENTROPY_STATS
427 #if CONFIG_EXT_PARTITION_TYPES
428 unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
429 #else
430 unsigned int partition[PARTITION_CONTEXTS][PARTITION_TYPES];
431 #endif
432 unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS]
433 [SWITCHABLE_FILTERS];
434 #if CONFIG_ADAPT_SCAN
435 #if CONFIG_CHROMA_2X2
436 unsigned int non_zero_count_2x2[TX_TYPES][4];
437 #endif // CONFIG_CHROMA_2X2
438 unsigned int non_zero_count_4X4[TX_TYPES][16];
439 unsigned int non_zero_count_8X8[TX_TYPES][64];
440 unsigned int non_zero_count_16X16[TX_TYPES][256];
441 unsigned int non_zero_count_32X32[TX_TYPES][1024];
442
443 unsigned int non_zero_count_4x8[TX_TYPES][32];
444 unsigned int non_zero_count_8x4[TX_TYPES][32];
445 unsigned int non_zero_count_8x16[TX_TYPES][128];
446 unsigned int non_zero_count_16x8[TX_TYPES][128];
447 unsigned int non_zero_count_16x32[TX_TYPES][512];
448 unsigned int non_zero_count_32x16[TX_TYPES][512];
449
450 unsigned int txb_count[TX_SIZES_ALL][TX_TYPES];
451 #endif // CONFIG_ADAPT_SCAN
452
453 #if CONFIG_LV_MAP
454 unsigned int txb_skip[TX_SIZES][TXB_SKIP_CONTEXTS][2];
455 unsigned int nz_map[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][2];
456 unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2];
457 unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2];
458 unsigned int coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
459 [COEFF_BASE_CONTEXTS][2];
460 unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][2];
461 unsigned int coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS]
462 [2];
463 #if CONFIG_CTX1D
464 unsigned int eob_mode[TX_SIZES][PLANE_TYPES][TX_CLASSES][2];
465 unsigned int empty_line[TX_SIZES][PLANE_TYPES][TX_CLASSES]
466 [EMPTY_LINE_CONTEXTS][2];
467 unsigned int hv_eob[TX_SIZES][PLANE_TYPES][TX_CLASSES][HV_EOB_CONTEXTS][2];
468 #endif // CONFIG_CTX1D
469 #endif // CONFIG_LV_MAP
470
471 #if CONFIG_SYMBOLRATE
472 unsigned int coeff_num[2]; // 0: zero coeff 1: non-zero coeff
473 unsigned int symbol_num[2]; // 0: entropy symbol 1: non-entropy symbol
474 #endif
475
476 unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2];
477 unsigned int zeromv_mode[ZEROMV_MODE_CONTEXTS][2];
478 unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2];
479 unsigned int drl_mode[DRL_MODE_CONTEXTS][2];
480
481 unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
482 #if CONFIG_COMPOUND_SINGLEREF
483 unsigned int inter_singleref_comp_mode[INTER_MODE_CONTEXTS]
484 [INTER_SINGLEREF_COMP_MODES];
485 #endif // CONFIG_COMPOUND_SINGLEREF
486 #if CONFIG_INTERINTRA
487 unsigned int interintra[BLOCK_SIZE_GROUPS][2];
488 unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
489 unsigned int wedge_interintra[BLOCK_SIZES_ALL][2];
490 #endif // CONFIG_INTERINTRA
491 unsigned int compound_interinter[BLOCK_SIZES_ALL][COMPOUND_TYPES];
492 #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
493 unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES];
494 #if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
495 unsigned int ncobmc_mode[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES];
496 #endif
497 #if CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
498 #if CONFIG_NCOBMC_ADAPT_WEIGHT
499 unsigned int ncobmc[BLOCK_SIZES_ALL][OBMC_FAMILY_MODES];
500 #endif // CONFIG_NCOBMC_ADAPT_WEIGHT
501 unsigned int obmc[BLOCK_SIZES_ALL][2];
502 #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
503 #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
504 unsigned int intra_inter[INTRA_INTER_CONTEXTS][2];
505 unsigned int comp_inter[COMP_INTER_CONTEXTS][2];
506 #if CONFIG_EXT_COMP_REFS
507 unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2];
508 unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2];
509 #endif // CONFIG_EXT_COMP_REFS
510 unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2];
511 #if CONFIG_EXT_REFS
512 unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2];
513 unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2];
514 #else
515 unsigned int comp_ref[REF_CONTEXTS][COMP_REFS - 1][2];
516 #endif // CONFIG_EXT_REFS
517 #if CONFIG_COMPOUND_SINGLEREF
518 unsigned int comp_inter_mode[COMP_INTER_MODE_CONTEXTS][2];
519 #endif // CONFIG_COMPOUND_SINGLEREF
520 // TODO(urvang): Only needed for !CONFIG_VAR_TX case. So can be removed when
521 // CONFIG_VAR_TX flag is removed.
522 unsigned int tx_size[MAX_TX_DEPTH][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1];
523 #if CONFIG_RECT_TX_EXT && (CONFIG_EXT_TX || CONFIG_VAR_TX)
524 unsigned int quarter_tx_size[2];
525 #endif
526 #if CONFIG_VAR_TX
527 unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2];
528 #endif
529 unsigned int skip[SKIP_CONTEXTS][2];
530 nmv_context_counts mv[NMV_CONTEXTS];
531 #if CONFIG_INTRABC
532 unsigned int intrabc[2];
533 nmv_context_counts dv;
534 #endif
535 #if CONFIG_LGT_FROM_PRED
536 unsigned int intra_lgt[LGT_SIZES][INTRA_MODES][2];
537 unsigned int inter_lgt[LGT_SIZES][2];
538 #endif // CONFIG_LGT_FROM_PRED
539 unsigned int delta_q[DELTA_Q_PROBS][2];
540 #if CONFIG_EXT_DELTA_Q
541 #if CONFIG_LOOPFILTER_LEVEL
542 unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2];
543 #endif // CONFIG_LOOPFILTER_LEVEL
544 unsigned int delta_lf[DELTA_LF_PROBS][2];
545 #endif
546 #if CONFIG_EXT_TX && CONFIG_RECT_TX
547 unsigned int tx_size_implied[TX_SIZES][TX_SIZES];
548 #endif // CONFIG_EXT_TX && CONFIG_RECT_TX
549 #if CONFIG_ENTROPY_STATS
550 #if CONFIG_EXT_TX
551 unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
552 unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
553 [TX_TYPES];
554 #else
555 unsigned int intra_ext_tx[EXT_TX_SIZES][TX_TYPES][TX_TYPES];
556 unsigned int inter_ext_tx[EXT_TX_SIZES][TX_TYPES];
557 #endif // CONFIG_EXT_TX
558 #endif // CONFIG_ENTROPY_STATS
559 #if CONFIG_SUPERTX
560 unsigned int supertx[PARTITION_SUPERTX_CONTEXTS][TX_SIZES][2];
561 unsigned int supertx_size[TX_SIZES];
562 #endif // CONFIG_SUPERTX
563 struct seg_counts seg;
564 #if CONFIG_EXT_INTRA
565 #if CONFIG_INTRA_INTERP
566 unsigned int intra_filter[INTRA_FILTERS + 1][INTRA_FILTERS];
567 #endif // CONFIG_INTRA_INTERP
568 #endif // CONFIG_EXT_INTRA
569 #if CONFIG_FILTER_INTRA
570 unsigned int filter_intra[PLANE_TYPES][2];
571 #endif // CONFIG_FILTER_INTRA
572 #if CONFIG_LPF_SB
573 unsigned int lpf_reuse[LPF_REUSE_CONTEXT][2];
574 unsigned int lpf_delta[LPF_DELTA_CONTEXT][DELTA_RANGE];
575 unsigned int lpf_sign[LPF_SIGN_CONTEXT][2];
576 #endif // CONFIG_LPF_SB
577 } FRAME_COUNTS;
578
579 #if CONFIG_KF_CTX
580 extern const aom_cdf_prob default_kf_y_mode_cdf[KF_MODE_CONTEXTS]
581 [KF_MODE_CONTEXTS]
582 [CDF_SIZE(INTRA_MODES)];
583 #else
584 extern const aom_cdf_prob default_kf_y_mode_cdf[INTRA_MODES][INTRA_MODES]
585 [CDF_SIZE(INTRA_MODES)];
586 #endif
587
588 extern const aom_prob av1_default_palette_y_mode_prob[PALETTE_BLOCK_SIZES]
589 [PALETTE_Y_MODE_CONTEXTS];
590 extern const aom_prob
591 av1_default_palette_uv_mode_prob[PALETTE_UV_MODE_CONTEXTS];
592
593 #if CONFIG_EXT_TX
594 static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = {
595 {
596 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
597 },
598 {
599 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
600 },
601 #if CONFIG_MRC_TX
602 {
603 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
604 },
605 {
606 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
607 },
608 #endif // CONFIG_MRC_TX
609 {
610 1, 3, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
611 },
612 {
613 1, 5, 6, 4, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0,
614 },
615 {
616 3, 4, 5, 8, 6, 7, 9, 10, 11, 0, 1, 2, 0, 0, 0, 0,
617 },
618 {
619 7, 8, 9, 12, 10, 11, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6,
620 },
621 };
622
623 static const int av1_ext_tx_inv[EXT_TX_SET_TYPES][TX_TYPES] = {
624 {
625 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
626 },
627 {
628 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
629 },
630 #if CONFIG_MRC_TX
631 {
632 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
633 },
634 {
635 9, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
636 },
637 #endif // CONFIG_MRC_TX
638 {
639 9, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 },
641 {
642 9, 0, 10, 11, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
643 },
644 {
645 9, 10, 11, 0, 1, 2, 4, 5, 3, 6, 7, 8, 0, 0, 0, 0,
646 },
647 {
648 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 4, 5, 3, 6, 7, 8,
649 },
650 };
651 #else
652 #if CONFIG_MRC_TX
653 static const int av1_ext_tx_ind[TX_TYPES] = {
654 0, 3, 4, 2, 1,
655 };
656 static const int av1_ext_tx_inv[TX_TYPES] = {
657 0, 4, 3, 1, 2,
658 };
659 #else
660 static const int av1_ext_tx_ind[TX_TYPES] = {
661 0, 2, 3, 1,
662 };
663 static const int av1_ext_tx_inv[TX_TYPES] = {
664 0, 3, 1, 2,
665 };
666 #endif // CONFIG_MRC_TX
667 #endif // CONFIG_EXT_TX
668
669 #if CONFIG_INTERINTRA
670 extern const aom_tree_index
671 av1_interintra_mode_tree[TREE_SIZE(INTERINTRA_MODES)];
672 #endif
673 extern const aom_tree_index
674 av1_inter_compound_mode_tree[TREE_SIZE(INTER_COMPOUND_MODES)];
675 #if CONFIG_COMPOUND_SINGLEREF
676 extern const aom_tree_index
677 av1_inter_singleref_comp_mode_tree[TREE_SIZE(INTER_SINGLEREF_COMP_MODES)];
678 #endif // CONFIG_COMPOUND_SINGLEREF
679 extern const aom_tree_index av1_compound_type_tree[TREE_SIZE(COMPOUND_TYPES)];
680 extern const aom_tree_index av1_partition_tree[TREE_SIZE(PARTITION_TYPES)];
681 #if CONFIG_EXT_PARTITION_TYPES
682 extern const aom_tree_index
683 av1_ext_partition_tree[TREE_SIZE(EXT_PARTITION_TYPES)];
684 #endif
685 extern const aom_tree_index
686 av1_palette_color_index_tree[PALETTE_SIZES][TREE_SIZE(PALETTE_COLORS)];
687 #if CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
688 extern const aom_tree_index av1_intra_filter_tree[TREE_SIZE(INTRA_FILTERS)];
689 #endif // CONFIG_EXT_INTRA && CONFIG_INTRA_INTERP
690 #if CONFIG_EXT_TX
691 extern const aom_tree_index av1_ext_tx_tree[EXT_TX_SET_TYPES]
692 [TREE_SIZE(TX_TYPES)];
693 #else
694 extern const aom_tree_index av1_ext_tx_tree[TREE_SIZE(TX_TYPES)];
695 #endif // CONFIG_EXT_TX
696 #if CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
697 extern const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)];
698 #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
699 #if CONFIG_NCOBMC_ADAPT_WEIGHT
700 extern const aom_tree_index av1_ncobmc_mode_tree[TREE_SIZE(MAX_NCOBMC_MODES)];
701 #if CONFIG_WARPED_MOTION
702 extern const aom_tree_index av1_ncobmc_tree[TREE_SIZE(OBMC_FAMILY_MODES)];
703 #endif // CONFIG_WARPED_MOTION
704 #endif // CONFIG_NCOBMC_ADAPT_WEIGHT
705 #if CONFIG_LOOP_RESTORATION
706 #define RESTORE_NONE_SGRPROJ_PROB 64
707 #define RESTORE_NONE_BILATERAL_PROB 16
708 #define RESTORE_NONE_WIENER_PROB 64
709 #define RESTORE_NONE_DOMAINTXFMRF_PROB 64
710 extern const aom_tree_index
711 av1_switchable_restore_tree[TREE_SIZE(RESTORE_SWITCHABLE_TYPES)];
712 #endif // CONFIG_LOOP_RESTORATION
713
714 void av1_setup_past_independence(struct AV1Common *cm);
715
716 void av1_adapt_intra_frame_probs(struct AV1Common *cm);
717 void av1_adapt_inter_frame_probs(struct AV1Common *cm);
718
av1_ceil_log2(int n)719 static INLINE int av1_ceil_log2(int n) {
720 int i = 1, p = 2;
721 while (p < n) {
722 i++;
723 p = p << 1;
724 }
725 return i;
726 }
727
728 // Returns the context for palette color index at row 'r' and column 'c',
729 // along with the 'color_order' of neighbors and the 'color_idx'.
730 // The 'color_map' is a 2D array with the given 'stride'.
731 int av1_get_palette_color_index_context(const uint8_t *color_map, int stride,
732 int r, int c, int palette_size,
733 uint8_t *color_order, int *color_idx);
734
735 #ifdef __cplusplus
736 } // extern "C"
737 #endif
738
739 #endif // AV1_COMMON_ENTROPYMODE_H_
740