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