xref: /OK3568_Linux_fs/external/mpp/mpp/codec/dec/av1/av1d_common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2021 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef __AV1D_COMMON_H__
18*4882a593Smuzhiyun #define __AV1D_COMMON_H__
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include "mpp_common.h"
21*4882a593Smuzhiyun // #include "hal_av1d_common.h"
22*4882a593Smuzhiyun #define AV1_REF_SCALE_SHIFT 14
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define NUM_REF_FRAMES 8
25*4882a593Smuzhiyun #define NUM_REF_FRAMES_LG2 3
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun // Max tiles for AV1 (custom size) for Level <= 6.x
28*4882a593Smuzhiyun #define AV1_MAX_TILES 128
29*4882a593Smuzhiyun #define AV1_MAX_TILE_COL 64
30*4882a593Smuzhiyun #define AV1_MAX_TILE_ROW 64
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define AV1_MIN_COMP_BASIS 8
33*4882a593Smuzhiyun #define AV1_MAX_CODED_FRAME_SIZE \
34*4882a593Smuzhiyun   (8192 * 4352 * 10 * 6 / 32 / AV1_MIN_COMP_BASIS) /* approx 8 MB */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define ALLOWED_REFS_PER_FRAME_EX 7
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_LG2_EX 3
39*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_EX (1 << NUM_FRAME_CONTEXTS_LG2_EX)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define MIN_TILE_WIDTH 256
42*4882a593Smuzhiyun #define MAX_TILE_WIDTH 4096
43*4882a593Smuzhiyun #define MIN_TILE_WIDTH_SBS (MIN_TILE_WIDTH >> 6)
44*4882a593Smuzhiyun #define MAX_TILE_WIDTH_SBS (MAX_TILE_WIDTH >> 6)
45*4882a593Smuzhiyun #define FRAME_OFFSET_BITS 5
46*4882a593Smuzhiyun #define MAX_TILE_AREA (4096 * 2304)
47*4882a593Smuzhiyun // #define AV1_MAX_TILE_COLS 64
48*4882a593Smuzhiyun // #define AV1_MAX_TILE_ROWS 64
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define ALLOWED_REFS_PER_FRAME 3
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS_LG2 2
53*4882a593Smuzhiyun #define NUM_FRAME_CONTEXTS (1 << NUM_FRAME_CONTEXTS_LG2)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define DCPREDSIMTHRESH 0
56*4882a593Smuzhiyun #define DCPREDCNTTHRESH 3
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define PREDICTION_PROBS 3
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_0 120
61*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_1 80
62*4882a593Smuzhiyun #define DEFAULT_PRED_PROB_2 40
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define AV1_DEF_UPDATE_PROB 252
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define MBSKIP_CONTEXTS 3
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define MAX_MB_SEGMENTS 8
69*4882a593Smuzhiyun #define MB_SEG_TREE_PROBS (MAX_MB_SEGMENTS - 1)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define MAX_REF_LF_DELTAS_EX 8
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define MAX_REF_LF_DELTAS 4
74*4882a593Smuzhiyun #define MAX_MODE_LF_DELTAS 2
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* Segment Feature Masks */
77*4882a593Smuzhiyun #define SEGMENT_DELTADATA 0
78*4882a593Smuzhiyun #define SEGMENT_ABSDATA 1
79*4882a593Smuzhiyun #define MAX_MV_REFS 9
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define AV1_SWITCHABLE_FILTERS 3 /* number of switchable filters */
82*4882a593Smuzhiyun #define SWITCHABLE_FILTER_CONTEXTS ((AV1_SWITCHABLE_FILTERS + 1) * 4)
83*4882a593Smuzhiyun #ifdef DUAL_FILTER
84*4882a593Smuzhiyun #define AV1_SWITCHABLE_EXT_FILTERS 4 /* number of switchable filters */
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define COMP_PRED_CONTEXTS 2
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define COEF_UPDATE_PROB 252
90*4882a593Smuzhiyun #define AV1_PROB_HALF 128
91*4882a593Smuzhiyun #define AV1_NMV_UPDATE_PROB 252
92*4882a593Smuzhiyun #define AV1_MV_UPDATE_PRECISION 7
93*4882a593Smuzhiyun #define MV_JOINTS 4
94*4882a593Smuzhiyun #define MV_FP_SIZE 4
95*4882a593Smuzhiyun #define MV_CLASSES 11
96*4882a593Smuzhiyun #define CLASS0_BITS 1
97*4882a593Smuzhiyun #define CLASS0_SIZE (1 << CLASS0_BITS)
98*4882a593Smuzhiyun #define MV_OFFSET_BITS (MV_CLASSES + CLASS0_BITS - 2)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define MV_MAX_BITS (MV_CLASSES + CLASS0_BITS + 2)
101*4882a593Smuzhiyun #define MV_MAX ((1 << MV_MAX_BITS) - 1)
102*4882a593Smuzhiyun #define MV_VALS ((MV_MAX << 1) + 1)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define MAX_ENTROPY_TOKENS 12
105*4882a593Smuzhiyun #define ENTROPY_NODES 11
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /* The first nodes of the entropy probs are unconstrained, the rest are
108*4882a593Smuzhiyun  * modeled with statistic distribution. */
109*4882a593Smuzhiyun #define UNCONSTRAINED_NODES 3
110*4882a593Smuzhiyun #define MODEL_NODES (ENTROPY_NODES - UNCONSTRAINED_NODES)
111*4882a593Smuzhiyun #define PIVOT_NODE 2  // which node is pivot
112*4882a593Smuzhiyun #define COEFPROB_MODELS 128
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* Entropy nodes above is divided in two parts, first three probs in part1
115*4882a593Smuzhiyun  * and the modeled probs in part2. Part1 is padded so that tables align with
116*4882a593Smuzhiyun  *  32 byte addresses, so there is four bytes for each table. */
117*4882a593Smuzhiyun #define ENTROPY_NODES_PART1 4
118*4882a593Smuzhiyun #define ENTROPY_NODES_PART2 8
119*4882a593Smuzhiyun #define INTER_MODE_CONTEXTS 7
120*4882a593Smuzhiyun #define AV1_INTER_MODE_CONTEXTS 15
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #define CFL_JOINT_SIGNS 8
123*4882a593Smuzhiyun #define CFL_ALPHA_CONTEXTS 6
124*4882a593Smuzhiyun #define CFL_ALPHABET_SIZE 16
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define NEWMV_MODE_CONTEXTS 6
127*4882a593Smuzhiyun #define ZEROMV_MODE_CONTEXTS 2
128*4882a593Smuzhiyun #define GLOBALMV_MODE_CONTEXTS 2
129*4882a593Smuzhiyun #define REFMV_MODE_CONTEXTS 9
130*4882a593Smuzhiyun #define DRL_MODE_CONTEXTS 3
131*4882a593Smuzhiyun #define NMV_CONTEXTS 3
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define INTRA_INTER_CONTEXTS 4
134*4882a593Smuzhiyun #define COMP_INTER_CONTEXTS 5
135*4882a593Smuzhiyun #define REF_CONTEXTS 5
136*4882a593Smuzhiyun #define AV1_REF_CONTEXTS 3
137*4882a593Smuzhiyun #define FWD_REFS 4
138*4882a593Smuzhiyun #define BWD_REFS 3
139*4882a593Smuzhiyun #define SINGLE_REFS 7
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define BLOCK_TYPES 2
142*4882a593Smuzhiyun #define REF_TYPES 2  // intra=0, inter=1
143*4882a593Smuzhiyun #define COEF_BANDS 6
144*4882a593Smuzhiyun #define PREV_COEF_CONTEXTS 6
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define MODULUS_PARAM 13 /* Modulus parameter */
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define ACTIVE_HT 110  // quantization stepsize threshold
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define MAX_MV_REF_CANDIDATES 2
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* Coefficient token alphabet */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define ZERO_TOKEN 0         /* 0         Extra Bits 0+0 */
155*4882a593Smuzhiyun #define ONE_TOKEN 1          /* 1         Extra Bits 0+1 */
156*4882a593Smuzhiyun #define TWO_TOKEN 2          /* 2         Extra Bits 0+1 */
157*4882a593Smuzhiyun #define THREE_TOKEN 3        /* 3         Extra Bits 0+1 */
158*4882a593Smuzhiyun #define FOUR_TOKEN 4         /* 4         Extra Bits 0+1 */
159*4882a593Smuzhiyun #define DCT_VAL_CATEGORY1 5  /* 5-6       Extra Bits 1+1 */
160*4882a593Smuzhiyun #define DCT_VAL_CATEGORY2 6  /* 7-10      Extra Bits 2+1 */
161*4882a593Smuzhiyun #define DCT_VAL_CATEGORY3 7  /* 11-18     Extra Bits 3+1 */
162*4882a593Smuzhiyun #define DCT_VAL_CATEGORY4 8  /* 19-34     Extra Bits 4+1 */
163*4882a593Smuzhiyun #define DCT_VAL_CATEGORY5 9  /* 35-66     Extra Bits 5+1 */
164*4882a593Smuzhiyun #define DCT_VAL_CATEGORY6 10 /* 67+       Extra Bits 13+1 */
165*4882a593Smuzhiyun #define DCT_EOB_TOKEN 11     /* EOB       Extra Bits 0+0 */
166*4882a593Smuzhiyun #define MAX_ENTROPY_TOKENS 12
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define INTERINTRA_MODES 4
169*4882a593Smuzhiyun #define INTER_COMPOUND_MODES 8
170*4882a593Smuzhiyun #define COMPOUND_TYPES 3
171*4882a593Smuzhiyun #define HEAD_TOKENS 5
172*4882a593Smuzhiyun #define TAIL_TOKENS 9
173*4882a593Smuzhiyun #define ONE_TOKEN_EOB 1
174*4882a593Smuzhiyun #define ONE_TOKEN_NEOB 2
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #define MULTICORE_LEFT_TILE 1
177*4882a593Smuzhiyun #define MULTICORE_INNER_TILE 2
178*4882a593Smuzhiyun #define MULTICORE_RIGHT_TILE 3
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #define DCT_EOB_MODEL_TOKEN 3 /* EOB       Extra Bits 0+0 */
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun typedef RK_U32 av1_coeff_count[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
183*4882a593Smuzhiyun [UNCONSTRAINED_NODES + 1];
184*4882a593Smuzhiyun typedef RK_U8 av1_coeff_probs[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
185*4882a593Smuzhiyun [UNCONSTRAINED_NODES];
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #define BLOCK_SIZE_GROUPS 4
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun // AV1 extended transforms (ext_tx)
190*4882a593Smuzhiyun #define EXT_TX_SETS_INTER 4  // Sets of transform selections for INTER
191*4882a593Smuzhiyun #define EXT_TX_SETS_INTRA 3  // Sets of transform selections for INTRA
192*4882a593Smuzhiyun #define EXTTX_SIZES 4        // ext_tx experiment tx sizes
193*4882a593Smuzhiyun #define EXT_TX_TYPES 16
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #define EXT_TX_SIZES 3
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #define TX_TYPES 4
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO(value, n) (((value) + (1 << ((n)-1))) >> (n))
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /* Shift down with rounding for use when n >= 0, value >= 0 for (64 bit) */
202*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_64(value, n) \
203*4882a593Smuzhiyun   (((value) + ((((int64)1 << (n)) >> 1))) >> (n))
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun /* Shift down with rounding for signed integers, for use when n >= 0 (64 bit) */
206*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_SIGNED_64(value, n)           \
207*4882a593Smuzhiyun   (((value) < 0) ? -ROUND_POWER_OF_TWO_64(-(value), (n)) \
208*4882a593Smuzhiyun                  : ROUND_POWER_OF_TWO_64((value), (n)))
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun /* Shift down with rounding for signed integers, for use when n >= 0 */
211*4882a593Smuzhiyun #define ROUND_POWER_OF_TWO_SIGNED(value, n)           \
212*4882a593Smuzhiyun   (((value) < 0) ? -ROUND_POWER_OF_TWO(-(value), (n)) \
213*4882a593Smuzhiyun                  : ROUND_POWER_OF_TWO((value), (n)))
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun typedef RK_U16 av1_cdf;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun #define MAX_MB_SEGMENTS 8
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun enum Av1SegLevelFeatures {
220*4882a593Smuzhiyun     SEG_AV1_LVL_ALT_Q,       // Use alternate Quantizer ....
221*4882a593Smuzhiyun     SEG_AV1_LVL_ALT_LF_Y_V,  // Use alternate loop filter value on y plane
222*4882a593Smuzhiyun     // vertical
223*4882a593Smuzhiyun     SEG_AV1_LVL_ALT_LF_Y_H,  // Use alternate loop filter value on y plane
224*4882a593Smuzhiyun     // horizontal
225*4882a593Smuzhiyun     SEG_AV1_LVL_ALT_LF_U,    // Use alternate loop filter value on u plane
226*4882a593Smuzhiyun     SEG_AV1_LVL_ALT_LF_V,    // Use alternate loop filter value on v plane
227*4882a593Smuzhiyun     SEG_AV1_LVL_REF_FRAME,   // Optional Segment reference frame
228*4882a593Smuzhiyun     SEG_AV1_LVL_SKIP,        // Optional Segment (0,0) + skip mode
229*4882a593Smuzhiyun     SEG_AV1_LVL_GLOBALMV,
230*4882a593Smuzhiyun     SEG_AV1_LVL_MAX
231*4882a593Smuzhiyun };
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #define AV1_ACTIVE_REFS 3
234*4882a593Smuzhiyun #define AV1_ACTIVE_REFS_EX 7
235*4882a593Smuzhiyun #define AV1_REF_LIST_SIZE 8
236*4882a593Smuzhiyun #define AV1_REF_SCALE_SHIFT 14
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun enum MvReferenceFrame {
239*4882a593Smuzhiyun     NONE              = -1,
240*4882a593Smuzhiyun     INTRA_FRAME       = 0,
241*4882a593Smuzhiyun     LAST_FRAME        = 1,
242*4882a593Smuzhiyun     LAST2_FRAME_EX    = 2,
243*4882a593Smuzhiyun     LAST3_FRAME_EX    = 3,
244*4882a593Smuzhiyun     GOLDEN_FRAME_EX   = 4,
245*4882a593Smuzhiyun     BWDREF_FRAME_EX   = 5,
246*4882a593Smuzhiyun     ALTREF2_FRAME_EX  = 6,
247*4882a593Smuzhiyun     ALTREF_FRAME_EX   = 7,
248*4882a593Smuzhiyun     MAX_REF_FRAMES_EX = 8,
249*4882a593Smuzhiyun     GOLDEN_FRAME      = 2,
250*4882a593Smuzhiyun     ALTREF_FRAME      = 3,
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun     MAX_REF_FRAMES    = 4
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun enum BlockSizeType {
256*4882a593Smuzhiyun     BLOCK_SIZE_AB4X4,
257*4882a593Smuzhiyun     BLOCK_SIZE_SB4X8,
258*4882a593Smuzhiyun     BLOCK_SIZE_SB8X4,
259*4882a593Smuzhiyun     BLOCK_SIZE_SB8X8,
260*4882a593Smuzhiyun     BLOCK_SIZE_SB8X16,
261*4882a593Smuzhiyun     BLOCK_SIZE_SB16X8,
262*4882a593Smuzhiyun     BLOCK_SIZE_MB16X16,
263*4882a593Smuzhiyun     BLOCK_SIZE_SB16X32,
264*4882a593Smuzhiyun     BLOCK_SIZE_SB32X16,
265*4882a593Smuzhiyun     BLOCK_SIZE_SB32X32,
266*4882a593Smuzhiyun     BLOCK_SIZE_SB32X64,
267*4882a593Smuzhiyun     BLOCK_SIZE_SB64X32,
268*4882a593Smuzhiyun     BLOCK_SIZE_SB64X64,
269*4882a593Smuzhiyun     BLOCK_SIZE_SB64X128,
270*4882a593Smuzhiyun     BLOCK_SIZE_SB128X64,
271*4882a593Smuzhiyun     BLOCK_SIZE_SB128X128,
272*4882a593Smuzhiyun     BLOCK_SIZE_SB4X16,
273*4882a593Smuzhiyun     BLOCK_SIZE_SB16X4,
274*4882a593Smuzhiyun     BLOCK_SIZE_SB8X32,
275*4882a593Smuzhiyun     BLOCK_SIZE_SB32X8,
276*4882a593Smuzhiyun     BLOCK_SIZE_SB16X64,
277*4882a593Smuzhiyun     BLOCK_SIZE_SB64X16,
278*4882a593Smuzhiyun     BLOCK_SIZE_TYPES,
279*4882a593Smuzhiyun     BLOCK_SIZES_ALL = BLOCK_SIZE_TYPES
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun enum PartitionType {
284*4882a593Smuzhiyun     PARTITION_NONE,
285*4882a593Smuzhiyun     PARTITION_HORZ,
286*4882a593Smuzhiyun     PARTITION_VERT,
287*4882a593Smuzhiyun     PARTITION_SPLIT,
288*4882a593Smuzhiyun     /*
289*4882a593Smuzhiyun     PARTITION_HORZ_A,
290*4882a593Smuzhiyun     PARTITION_HORZ_B,
291*4882a593Smuzhiyun     PARTITION_VERT_A,
292*4882a593Smuzhiyun     PARTITION_VERT_B,
293*4882a593Smuzhiyun     PARTITION_HORZ_4,
294*4882a593Smuzhiyun     PARTITION_VERT_4,
295*4882a593Smuzhiyun     */
296*4882a593Smuzhiyun     PARTITION_TYPES
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun #define PARTITION_PLOFFSET 4  // number of probability models per block size
300*4882a593Smuzhiyun #define NUM_PARTITION_CONTEXTS (4 * PARTITION_PLOFFSET)
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun enum FrameType {
303*4882a593Smuzhiyun     KEY_FRAME = 0,
304*4882a593Smuzhiyun     INTER_FRAME = 1,
305*4882a593Smuzhiyun     NUM_FRAME_TYPES,
306*4882a593Smuzhiyun };
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun enum MbPredictionMode {
309*4882a593Smuzhiyun     DC_PRED,  /* average of above and left pixels */
310*4882a593Smuzhiyun     V_PRED,   /* vertical prediction */
311*4882a593Smuzhiyun     H_PRED,   /* horizontal prediction */
312*4882a593Smuzhiyun     D45_PRED, /* Directional 45 deg prediction  [anti-clockwise from 0 deg hor] */
313*4882a593Smuzhiyun     D135_PRED, /* Directional 135 deg prediction [anti-clockwise from 0 deg hor]
314*4882a593Smuzhiyun               */
315*4882a593Smuzhiyun     D117_PRED, /* Directional 112 deg prediction [anti-clockwise from 0 deg hor]
316*4882a593Smuzhiyun               */
317*4882a593Smuzhiyun     D153_PRED, /* Directional 157 deg prediction [anti-clockwise from 0 deg hor]
318*4882a593Smuzhiyun               */
319*4882a593Smuzhiyun     D27_PRED, /* Directional 22 deg prediction  [anti-clockwise from 0 deg hor] */
320*4882a593Smuzhiyun     D63_PRED, /* Directional 67 deg prediction  [anti-clockwise from 0 deg hor] */
321*4882a593Smuzhiyun     SMOOTH_PRED,
322*4882a593Smuzhiyun     TM_PRED_AV1 = SMOOTH_PRED,
323*4882a593Smuzhiyun     SMOOTH_V_PRED,  // Vertical interpolation
324*4882a593Smuzhiyun     SMOOTH_H_PRED,  // Horizontal interpolation
325*4882a593Smuzhiyun     TM_PRED,        /* Truemotion prediction */
326*4882a593Smuzhiyun     PAETH_PRED = TM_PRED,
327*4882a593Smuzhiyun     NEARESTMV,
328*4882a593Smuzhiyun     NEARMV,
329*4882a593Smuzhiyun     ZEROMV,
330*4882a593Smuzhiyun     NEWMV,
331*4882a593Smuzhiyun     NEAREST_NEARESTMV,
332*4882a593Smuzhiyun     NEAR_NEARMV,
333*4882a593Smuzhiyun     NEAREST_NEWMV,
334*4882a593Smuzhiyun     NEW_NEARESTMV,
335*4882a593Smuzhiyun     NEAR_NEWMV,
336*4882a593Smuzhiyun     NEW_NEARMV,
337*4882a593Smuzhiyun     ZERO_ZEROMV,
338*4882a593Smuzhiyun     NEW_NEWMV,
339*4882a593Smuzhiyun     SPLITMV,
340*4882a593Smuzhiyun     MB_MODE_COUNT
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun // Must match hardware/src/include/common_defs.h
344*4882a593Smuzhiyun #define AV1_INTRA_MODES 13
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun #define MAX_INTRA_MODES AV1_INTRA_MODES
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun #define MAX_INTRA_MODES_DRAM_ALIGNED ((MAX_INTRA_MODES + 15) & (~15))
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun #define AV1_INTER_MODES (1 + NEWMV - NEARESTMV)
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun #define MOTION_MODE_CONTEXTS 10
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun #define DIRECTIONAL_MODES 8
355*4882a593Smuzhiyun #define MAX_ANGLE_DELTA 3
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun enum FilterIntraModeType {
358*4882a593Smuzhiyun     FILTER_DC_PRED,
359*4882a593Smuzhiyun     FILTER_V_PRED,
360*4882a593Smuzhiyun     FILTER_H_PRED,
361*4882a593Smuzhiyun     FILTER_D153_PRED,
362*4882a593Smuzhiyun     FILTER_PAETH_PRED,
363*4882a593Smuzhiyun     FILTER_INTRA_MODES,
364*4882a593Smuzhiyun     FILTER_INTRA_UNUSED = 7
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun #define FILTER_INTRA_SIZES 19
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun enum { SIMPLE_TRANSLATION, OBMC_CAUSAL, MOTION_MODE_COUNT };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define SUBMVREF_COUNT 5
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /* Integer pel reference mv threshold for use of high-precision 1/8 mv */
374*4882a593Smuzhiyun #define COMPANDED_MVREF_THRESH 8
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun #define TX_SIZE_CONTEXTS 2
377*4882a593Smuzhiyun #define AV1_TX_SIZE_CONTEXTS 3
378*4882a593Smuzhiyun #define VARTX_PART_CONTEXTS 22
379*4882a593Smuzhiyun #define TXFM_PARTITION_CONTEXTS 22
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun enum InterpolationFilterType {
382*4882a593Smuzhiyun     EIGHTTAP_SMOOTH,
383*4882a593Smuzhiyun     EIGHTTAP,
384*4882a593Smuzhiyun     EIGHTTAP_SHARP,
385*4882a593Smuzhiyun #ifdef DUAL_FILTER
386*4882a593Smuzhiyun     EIGHTTAP_SMOOTH2,
387*4882a593Smuzhiyun     BILINEAR,
388*4882a593Smuzhiyun     SWITCHABLE, /* should be the last one */
389*4882a593Smuzhiyun #else
390*4882a593Smuzhiyun     BILINEAR,
391*4882a593Smuzhiyun     SWITCHABLE, /* should be the last one */
392*4882a593Smuzhiyun #endif
393*4882a593Smuzhiyun     MULTITAP_SHARP = EIGHTTAP_SHARP
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun static const int av1_literal_to_filter[4] = {EIGHTTAP_SMOOTH, EIGHTTAP,
397*4882a593Smuzhiyun                                              EIGHTTAP_SHARP, BILINEAR
398*4882a593Smuzhiyun                                             };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun extern const enum InterpolationFilterType
401*4882a593Smuzhiyun av1hwd_switchable_interp[AV1_SWITCHABLE_FILTERS];
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun enum CompPredModeType {
404*4882a593Smuzhiyun     SINGLE_PREDICTION_ONLY = 0,
405*4882a593Smuzhiyun     COMP_PREDICTION_ONLY = 1,
406*4882a593Smuzhiyun     HYBRID_PREDICTION = 2,
407*4882a593Smuzhiyun     NB_PREDICTION_TYPES = 3,
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun enum TxfmMode {
411*4882a593Smuzhiyun     ONLY_4X4 = 0,
412*4882a593Smuzhiyun     ALLOW_8X8 = 1,
413*4882a593Smuzhiyun     ALLOW_16X16 = 2,
414*4882a593Smuzhiyun     ALLOW_32X32 = 3,
415*4882a593Smuzhiyun     TX_MODE_LARGEST = ALLOW_32X32,  // AV1
416*4882a593Smuzhiyun     TX_MODE_SELECT = 4,
417*4882a593Smuzhiyun     NB_TXFM_MODES = 5,
418*4882a593Smuzhiyun };
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun enum SegLevelFeatures {
421*4882a593Smuzhiyun     SEG_LVL_ALT_Q = 0,
422*4882a593Smuzhiyun     SEG_LVL_ALT_LF = 1,
423*4882a593Smuzhiyun     SEG_LVL_REF_FRAME = 2,
424*4882a593Smuzhiyun     SEG_LVL_SKIP = 3,
425*4882a593Smuzhiyun     SEG_LVL_MAX = 4
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun enum { AV1_SEG_FEATURE_DELTA, AV1_SEG_FEATURE_ABS };
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun static const int av1_seg_feature_data_signed[SEG_AV1_LVL_MAX] = {1, 1, 1, 1,
431*4882a593Smuzhiyun                                                                  1, 0, 0
432*4882a593Smuzhiyun                                                                 };
433*4882a593Smuzhiyun static const int av1_seg_feature_data_max[SEG_AV1_LVL_MAX] = {255, 63, 63, 63,
434*4882a593Smuzhiyun                                                               63,  7,  0
435*4882a593Smuzhiyun                                                              };
436*4882a593Smuzhiyun static const int av1_seg_feature_data_bits[SEG_AV1_LVL_MAX] = {8, 6, 6, 6,
437*4882a593Smuzhiyun                                                                6, 3, 0
438*4882a593Smuzhiyun                                                               };
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun enum TxSize {
441*4882a593Smuzhiyun     TX_4X4 = 0,
442*4882a593Smuzhiyun     TX_8X8 = 1,
443*4882a593Smuzhiyun     TX_16X16 = 2,
444*4882a593Smuzhiyun     TX_32X32 = 3,
445*4882a593Smuzhiyun     TX_SIZE_MAX_SB,
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun #define MAX_TX_DEPTH 2
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun enum TxType { DCT_DCT = 0, ADST_DCT = 1, DCT_ADST = 2, ADST_ADST = 3 };
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun enum SplitMvPartitioningType {
452*4882a593Smuzhiyun     PARTITIONING_16X8 = 0,
453*4882a593Smuzhiyun     PARTITIONING_8X16,
454*4882a593Smuzhiyun     PARTITIONING_8X8,
455*4882a593Smuzhiyun     PARTITIONING_4X4,
456*4882a593Smuzhiyun     NB_PARTITIONINGS,
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun enum PredId {
460*4882a593Smuzhiyun     PRED_SEG_ID = 0,
461*4882a593Smuzhiyun     PRED_MBSKIP = 1,
462*4882a593Smuzhiyun     PRED_SWITCHABLE_INTERP = 2,
463*4882a593Smuzhiyun     PRED_INTRA_INTER = 3,
464*4882a593Smuzhiyun     PRED_COMP_INTER_INTER = 4,
465*4882a593Smuzhiyun     PRED_SINGLE_REF_P1 = 5,
466*4882a593Smuzhiyun     PRED_SINGLE_REF_P2 = 6,
467*4882a593Smuzhiyun     PRED_COMP_REF_P = 7,
468*4882a593Smuzhiyun     PRED_TX_SIZE = 8
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun /* Symbols for coding which components are zero jointly */
472*4882a593Smuzhiyun enum MvJointType {
473*4882a593Smuzhiyun     MV_JOINT_ZERO = 0,   /* Zero vector */
474*4882a593Smuzhiyun     MV_JOINT_HNZVZ = 1,  /* Vert zero, hor nonzero */
475*4882a593Smuzhiyun     MV_JOINT_HZVNZ = 2,  /* Hor zero, vert nonzero */
476*4882a593Smuzhiyun     MV_JOINT_HNZVNZ = 3, /* Both components nonzero */
477*4882a593Smuzhiyun };
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun /* Symbols for coding magnitude class of nonzero components */
480*4882a593Smuzhiyun enum MvClassType {
481*4882a593Smuzhiyun     MV_CLASS_0 = 0,   /* (0, 2]     integer pel */
482*4882a593Smuzhiyun     MV_CLASS_1 = 1,   /* (2, 4]     integer pel */
483*4882a593Smuzhiyun     MV_CLASS_2 = 2,   /* (4, 8]     integer pel */
484*4882a593Smuzhiyun     MV_CLASS_3 = 3,   /* (8, 16]    integer pel */
485*4882a593Smuzhiyun     MV_CLASS_4 = 4,   /* (16, 32]   integer pel */
486*4882a593Smuzhiyun     MV_CLASS_5 = 5,   /* (32, 64]   integer pel */
487*4882a593Smuzhiyun     MV_CLASS_6 = 6,   /* (64, 128]  integer pel */
488*4882a593Smuzhiyun     MV_CLASS_7 = 7,   /* (128, 256] integer pel */
489*4882a593Smuzhiyun     MV_CLASS_8 = 8,   /* (256, 512] integer pel */
490*4882a593Smuzhiyun     MV_CLASS_9 = 9,   /* (512, 1024] integer pel */
491*4882a593Smuzhiyun     MV_CLASS_10 = 10, /* (1024,2048] integer pel */
492*4882a593Smuzhiyun };
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun enum RefreshFrameContextModeAv1 {
495*4882a593Smuzhiyun     /**
496*4882a593Smuzhiyun      * AV1 Only, no refresh
497*4882a593Smuzhiyun      */
498*4882a593Smuzhiyun     AV1_REFRESH_FRAME_CONTEXT_NONE,
499*4882a593Smuzhiyun     /**
500*4882a593Smuzhiyun      * Update frame context to values resulting from backward probability
501*4882a593Smuzhiyun      * updates based on entropy/counts in the decoded frame
502*4882a593Smuzhiyun      */
503*4882a593Smuzhiyun     AV1_REFRESH_FRAME_CONTEXT_BACKWARD
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun // 75B
507*4882a593Smuzhiyun struct NmvContext {
508*4882a593Smuzhiyun     // Start at +27B offset
509*4882a593Smuzhiyun     RK_U8 joints[MV_JOINTS - 1];  // 3B
510*4882a593Smuzhiyun     RK_U8 sign[2];                // 2B
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun     // A+1
513*4882a593Smuzhiyun     RK_U8 class0[2][CLASS0_SIZE - 1];  // 2B
514*4882a593Smuzhiyun     RK_U8 fp[2][MV_FP_SIZE - 1];       // 6B
515*4882a593Smuzhiyun     RK_U8 class0_hp[2];                // 2B
516*4882a593Smuzhiyun     RK_U8 hp[2];                       // 2B
517*4882a593Smuzhiyun     RK_U8 classes[2][MV_CLASSES - 1];  // 20B
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun     // A+2
520*4882a593Smuzhiyun     RK_U8 class0_fp[2][CLASS0_SIZE][MV_FP_SIZE - 1];  // 12B
521*4882a593Smuzhiyun     RK_U8 bits[2][MV_OFFSET_BITS];                    // 20B
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun struct NmvContextCounts {
525*4882a593Smuzhiyun     // 8dw (u32) / DRAM word (u256)
526*4882a593Smuzhiyun     RK_U32 joints[MV_JOINTS];
527*4882a593Smuzhiyun     RK_U32 sign[2][2];
528*4882a593Smuzhiyun     RK_U32 classes[2][MV_CLASSES];
529*4882a593Smuzhiyun     RK_U32 class0[2][CLASS0_SIZE];
530*4882a593Smuzhiyun     RK_U32 bits[2][MV_OFFSET_BITS][2];
531*4882a593Smuzhiyun     RK_U32 class0_fp[2][CLASS0_SIZE][4];
532*4882a593Smuzhiyun     RK_U32 fp[2][4];
533*4882a593Smuzhiyun     RK_U32 class0_hp[2][2];
534*4882a593Smuzhiyun     RK_U32 hp[2][2];
535*4882a593Smuzhiyun };
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun typedef RK_U8 av1_prob;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun #define ICDF(x) (32768U - (x))
540*4882a593Smuzhiyun #define CDF_SIZE(x) ((x)-1)
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun #define AV1HWPAD(x, y) RK_U8 x[y]
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun struct NmvJointSign {
545*4882a593Smuzhiyun     RK_U8 joints[MV_JOINTS - 1];  // 3B
546*4882a593Smuzhiyun     RK_U8 sign[2];                // 2B
547*4882a593Smuzhiyun };
548*4882a593Smuzhiyun struct NmvMagnitude {
549*4882a593Smuzhiyun     RK_U8 class0[2][CLASS0_SIZE - 1];
550*4882a593Smuzhiyun     RK_U8 fp[2][MV_FP_SIZE - 1];
551*4882a593Smuzhiyun     RK_U8 class0_hp[2];
552*4882a593Smuzhiyun     RK_U8 hp[2];
553*4882a593Smuzhiyun     RK_U8 classes[2][MV_CLASSES - 1];
554*4882a593Smuzhiyun     RK_U8 class0_fp[2][CLASS0_SIZE][MV_FP_SIZE - 1];
555*4882a593Smuzhiyun     RK_U8 bits[2][MV_OFFSET_BITS];
556*4882a593Smuzhiyun };
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun struct RefMvNmvContext {
559*4882a593Smuzhiyun     // Starts at +4B offset (for mbskip)
560*4882a593Smuzhiyun     struct NmvJointSign joints_sign[NMV_CONTEXTS];  // 15B
561*4882a593Smuzhiyun     AV1HWPAD(pad1, 13);
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun     // A+1
564*4882a593Smuzhiyun     struct NmvMagnitude magnitude[NMV_CONTEXTS];
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun /* Adaptive entropy contexts, padding elements are added to have
568*4882a593Smuzhiyun  * 256 bit aligned tables for HW access.
569*4882a593Smuzhiyun  * Compile with TRACE_PROB_TABLES to print bases for each table. */
570*4882a593Smuzhiyun struct Av1AdaptiveEntropyProbs {
571*4882a593Smuzhiyun     // address A (56)
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun     // Address A+0
574*4882a593Smuzhiyun     RK_U8 inter_mode_prob[INTER_MODE_CONTEXTS][4];  // 7*4 = 28B
575*4882a593Smuzhiyun     RK_U8 intra_inter_prob[INTRA_INTER_CONTEXTS];   // 4B
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun     // Address A+1
578*4882a593Smuzhiyun     RK_U8 uv_mode_prob[MAX_INTRA_MODES]
579*4882a593Smuzhiyun     [MAX_INTRA_MODES_DRAM_ALIGNED];  // 10*16/32 = 5 addrs
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32)
582*4882a593Smuzhiyun     AV1HWPAD(pad1,
583*4882a593Smuzhiyun              ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32 == 0)
584*4882a593Smuzhiyun              ? 0
585*4882a593Smuzhiyun              : 32 - (MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32);
586*4882a593Smuzhiyun #endif
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun     // Address A+6
589*4882a593Smuzhiyun     RK_U8 tx8x8_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 3];    // 2*(4-3) = 2B
590*4882a593Smuzhiyun     RK_U8 tx16x16_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 2];  // 2*(4-2) = 4B
591*4882a593Smuzhiyun     RK_U8 tx32x32_prob[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 1];  // 2*(4-1) = 6B
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun     RK_U8 switchable_interp_prob[AV1_SWITCHABLE_FILTERS + 1]
594*4882a593Smuzhiyun     [AV1_SWITCHABLE_FILTERS - 1];  // 8B
595*4882a593Smuzhiyun     RK_U8 comp_inter_prob[COMP_INTER_CONTEXTS];                // 5B
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun     AV1HWPAD(pad6, 7);
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun     // Address A+7
600*4882a593Smuzhiyun     RK_U8 sb_ymode_prob[BLOCK_SIZE_GROUPS]
601*4882a593Smuzhiyun     [MAX_INTRA_MODES_DRAM_ALIGNED];  // 4*16/32 = 2 addrs
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun     // Address A+9
604*4882a593Smuzhiyun     RK_U8 partition_prob[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS]
605*4882a593Smuzhiyun     [PARTITION_TYPES];  // 2*16*4 = 4 addrs
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun     // Address A+13
608*4882a593Smuzhiyun     AV1HWPAD(pad13, 24);
609*4882a593Smuzhiyun     RK_U8 mbskip_probs[MBSKIP_CONTEXTS];  // 3B
610*4882a593Smuzhiyun     struct NmvContext nmvc;
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun     // Address A+16
613*4882a593Smuzhiyun     RK_U8 single_ref_prob[REF_CONTEXTS][2];          // 10B
614*4882a593Smuzhiyun     RK_U8 comp_ref_prob[REF_CONTEXTS];               // 5B
615*4882a593Smuzhiyun     RK_U8 mb_segment_tree_probs[MB_SEG_TREE_PROBS];  // 7B
616*4882a593Smuzhiyun     RK_U8 segment_pred_probs[PREDICTION_PROBS];      // 3B
617*4882a593Smuzhiyun     AV1HWPAD(pad16, 7);
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun     // Address A+17
620*4882a593Smuzhiyun     RK_U8 prob_coeffs[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
621*4882a593Smuzhiyun     [ENTROPY_NODES_PART1];  // 18 addrs
622*4882a593Smuzhiyun     RK_U8 prob_coeffs8x8[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
623*4882a593Smuzhiyun     [ENTROPY_NODES_PART1];
624*4882a593Smuzhiyun     RK_U8 prob_coeffs16x16[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
625*4882a593Smuzhiyun     [ENTROPY_NODES_PART1];
626*4882a593Smuzhiyun     RK_U8 prob_coeffs32x32[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
627*4882a593Smuzhiyun     [ENTROPY_NODES_PART1];
628*4882a593Smuzhiyun };
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun /* Entropy contexts */
631*4882a593Smuzhiyun struct Av1EntropyProbs {
632*4882a593Smuzhiyun     /* Default keyframe probs */
633*4882a593Smuzhiyun     /* Table formatted for 256b memory, probs 0to7 for all tables followed by
634*4882a593Smuzhiyun      * probs 8toN for all tables.
635*4882a593Smuzhiyun      * Compile with TRACE_PROB_TABLES to print bases for each table. */
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun     // In AOM code, this table is [M][M][M-1]; we pad to 16B so each entry is 1/2
638*4882a593Smuzhiyun     // DRAM word.
639*4882a593Smuzhiyun     RK_U8 kf_bmode_prob[MAX_INTRA_MODES][MAX_INTRA_MODES]
640*4882a593Smuzhiyun     [MAX_INTRA_MODES_DRAM_ALIGNED];
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32)
643*4882a593Smuzhiyun     AV1HWPAD(pad0, (((MAX_INTRA_MODES * MAX_INTRA_MODES *
644*4882a593Smuzhiyun                       MAX_INTRA_MODES_DRAM_ALIGNED) %
645*4882a593Smuzhiyun                      32) == 0)
646*4882a593Smuzhiyun              ? 0
647*4882a593Smuzhiyun              : 32 - ((MAX_INTRA_MODES * MAX_INTRA_MODES *
648*4882a593Smuzhiyun                       MAX_INTRA_MODES_DRAM_ALIGNED) %
649*4882a593Smuzhiyun                      32));
650*4882a593Smuzhiyun #endif
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun     // Address 50
653*4882a593Smuzhiyun     AV1HWPAD(unused_bytes, 4);  // 4B of padding to maintain the old alignments.
654*4882a593Smuzhiyun     RK_U8 ref_pred_probs[PREDICTION_PROBS];   // 3B
655*4882a593Smuzhiyun     RK_U8 ref_scores[MAX_REF_FRAMES];         // 4B
656*4882a593Smuzhiyun     RK_U8 prob_comppred[COMP_PRED_CONTEXTS];  // 2B
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun     AV1HWPAD(pad1, 19);
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun     // Address 51
661*4882a593Smuzhiyun     RK_U8 kf_uv_mode_prob[MAX_INTRA_MODES][MAX_INTRA_MODES_DRAM_ALIGNED];
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun #if ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32)
664*4882a593Smuzhiyun     AV1HWPAD(pad51,
665*4882a593Smuzhiyun              ((MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32 == 0)
666*4882a593Smuzhiyun              ? 0
667*4882a593Smuzhiyun              : 32 - (MAX_INTRA_MODES * MAX_INTRA_MODES_DRAM_ALIGNED) % 32);
668*4882a593Smuzhiyun #endif
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun     // Address 56
671*4882a593Smuzhiyun     struct Av1AdaptiveEntropyProbs a;  // Probs with backward adaptation
672*4882a593Smuzhiyun };
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun /* Counters for adaptive entropy contexts */
675*4882a593Smuzhiyun struct Av1EntropyCounts {
676*4882a593Smuzhiyun     RK_U32 inter_mode_counts[INTER_MODE_CONTEXTS][AV1_INTER_MODES - 1][2];
677*4882a593Smuzhiyun     RK_U32 sb_ymode_counts[BLOCK_SIZE_GROUPS][MAX_INTRA_MODES];
678*4882a593Smuzhiyun     RK_U32 uv_mode_counts[MAX_INTRA_MODES][MAX_INTRA_MODES];
679*4882a593Smuzhiyun     RK_U32 partition_counts[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
680*4882a593Smuzhiyun     RK_U32 switchable_interp_counts[AV1_SWITCHABLE_FILTERS + 1]
681*4882a593Smuzhiyun     [AV1_SWITCHABLE_FILTERS];
682*4882a593Smuzhiyun     RK_U32 intra_inter_count[INTRA_INTER_CONTEXTS][2];
683*4882a593Smuzhiyun     RK_U32 comp_inter_count[COMP_INTER_CONTEXTS][2];
684*4882a593Smuzhiyun     RK_U32 single_ref_count[REF_CONTEXTS][2][2];
685*4882a593Smuzhiyun     RK_U32 comp_ref_count[REF_CONTEXTS][2];
686*4882a593Smuzhiyun     RK_U32 tx32x32_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB];
687*4882a593Smuzhiyun     RK_U32 tx16x16_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 1];
688*4882a593Smuzhiyun     RK_U32 tx8x8_count[TX_SIZE_CONTEXTS][TX_SIZE_MAX_SB - 2];
689*4882a593Smuzhiyun     RK_U32 mbskip_count[MBSKIP_CONTEXTS][2];
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun     struct NmvContextCounts nmvcount;
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun     RK_U32 count_coeffs[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
694*4882a593Smuzhiyun     [UNCONSTRAINED_NODES + 1];
695*4882a593Smuzhiyun     RK_U32 count_coeffs8x8[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
696*4882a593Smuzhiyun     [UNCONSTRAINED_NODES + 1];
697*4882a593Smuzhiyun     RK_U32 count_coeffs16x16[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
698*4882a593Smuzhiyun     [UNCONSTRAINED_NODES + 1];
699*4882a593Smuzhiyun     RK_U32 count_coeffs32x32[BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
700*4882a593Smuzhiyun     [UNCONSTRAINED_NODES + 1];
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun     RK_U32 count_eobs[TX_SIZE_MAX_SB][BLOCK_TYPES][REF_TYPES][COEF_BANDS]
703*4882a593Smuzhiyun     [PREV_COEF_CONTEXTS];
704*4882a593Smuzhiyun };
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun struct CoeffHeadCDFModel {
707*4882a593Smuzhiyun     RK_U16 band0[3][5];
708*4882a593Smuzhiyun     RK_U16 bands[5][6][4];
709*4882a593Smuzhiyun };
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun struct CoeffTailCDFModel {
712*4882a593Smuzhiyun     RK_U16 band0[3][9];
713*4882a593Smuzhiyun     RK_U16 bands[5][6][9];
714*4882a593Smuzhiyun };
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun // 135
717*4882a593Smuzhiyun typedef struct CoeffHeadCDFModel coeff_head_cdf_model[BLOCK_TYPES][REF_TYPES];
718*4882a593Smuzhiyun // 297
719*4882a593Smuzhiyun typedef struct CoeffTailCDFModel coeff_tail_cdf_model[BLOCK_TYPES][REF_TYPES];
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun //#define PALETTE_BLOCK_SIZES (BLOCK_SIZE_SB64X64 - BLOCK_SIZE_SB8X8 + 1)
722*4882a593Smuzhiyun #define PALETTE_BLOCK_SIZES 7
723*4882a593Smuzhiyun #define PALETTE_SIZES 7
724*4882a593Smuzhiyun #define PALETTE_Y_MODE_CONTEXTS 3
725*4882a593Smuzhiyun #define PALETTE_UV_MODE_CONTEXTS 2
726*4882a593Smuzhiyun #define PALETTE_COLOR_INDEX_CONTEXTS 5
727*4882a593Smuzhiyun #define PALETTE_IDX_CONTEXTS 18
728*4882a593Smuzhiyun #define PALETTE_COLORS 8
729*4882a593Smuzhiyun #define KF_MODE_CONTEXTS 5
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun #define PLANE_TYPES 2
732*4882a593Smuzhiyun #define TX_SIZES 5
733*4882a593Smuzhiyun #define TXB_SKIP_CONTEXTS 13
734*4882a593Smuzhiyun #define DC_SIGN_CONTEXTS 3
735*4882a593Smuzhiyun #define SIG_COEF_CONTEXTS_EOB 4
736*4882a593Smuzhiyun #define SIG_COEF_CONTEXTS 42
737*4882a593Smuzhiyun #define COEFF_BASE_CONTEXTS 42
738*4882a593Smuzhiyun #define EOB_COEF_CONTEXTS 9
739*4882a593Smuzhiyun #define LEVEL_CONTEXTS 21
740*4882a593Smuzhiyun #define NUM_BASE_LEVELS 2
741*4882a593Smuzhiyun #define BR_CDF_SIZE 4
742*4882a593Smuzhiyun #define MOTION_MODES 3
743*4882a593Smuzhiyun #define DELTA_Q_PROBS 3
744*4882a593Smuzhiyun #define COMP_REF_TYPE_CONTEXTS 5
745*4882a593Smuzhiyun #define UNI_COMP_REF_CONTEXTS 3
746*4882a593Smuzhiyun #define UNIDIR_COMP_REFS 4
747*4882a593Smuzhiyun //#define FILTER_INTRA_MODES 5
748*4882a593Smuzhiyun #define SKIP_MODE_CONTEXTS 3
749*4882a593Smuzhiyun #define SKIP_CONTEXTS 3
750*4882a593Smuzhiyun #define COMP_INDEX_CONTEXTS 6
751*4882a593Smuzhiyun #define COMP_GROUP_IDX_CONTEXTS 7
752*4882a593Smuzhiyun #define MAX_TX_CATS 4
753*4882a593Smuzhiyun #define CFL_ALLOWED_TYPES 2
754*4882a593Smuzhiyun #define UV_INTRA_MODES 14
755*4882a593Smuzhiyun #define EXT_PARTITION_TYPES 10
756*4882a593Smuzhiyun #define AV1_PARTITION_CONTEXTS (5 * PARTITION_PLOFFSET)
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun #define RESTORE_SWITCHABLE_TYPES 3
759*4882a593Smuzhiyun #define DELTA_LF_PROBS 3
760*4882a593Smuzhiyun #define FRAME_LF_COUNT 4
761*4882a593Smuzhiyun #define MAX_SEGMENTS 8
762*4882a593Smuzhiyun #define TOKEN_CDF_Q_CTXS 4
763*4882a593Smuzhiyun #define SEG_TEMPORAL_PRED_CTXS 3
764*4882a593Smuzhiyun #define SPATIAL_PREDICTION_PROBS 3
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun typedef RK_U16 aom_cdf_prob;
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun typedef struct {
769*4882a593Smuzhiyun     RK_U16 joint_cdf[3];
770*4882a593Smuzhiyun     RK_U16 sign_cdf[2];
771*4882a593Smuzhiyun     RK_U16 clsss_cdf[2][10];
772*4882a593Smuzhiyun     RK_U16 clsss0_fp_cdf[2][2][3];
773*4882a593Smuzhiyun     RK_U16 fp_cdf[2][3];
774*4882a593Smuzhiyun     RK_U16 class0_hp_cdf[2];
775*4882a593Smuzhiyun     RK_U16 hp_cdf[2];
776*4882a593Smuzhiyun     RK_U16 class0_cdf[2];
777*4882a593Smuzhiyun     RK_U16 bits_cdf[2][10];
778*4882a593Smuzhiyun } MvCDFs;
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun typedef struct {
781*4882a593Smuzhiyun     RK_U16 partition_cdf[13][16];
782*4882a593Smuzhiyun     // 64
783*4882a593Smuzhiyun     RK_U16 kf_ymode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][AV1_INTRA_MODES - 1];
784*4882a593Smuzhiyun     RK_U16 segment_pred_cdf[PREDICTION_PROBS];
785*4882a593Smuzhiyun     RK_U16 spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS][MAX_MB_SEGMENTS - 1];
786*4882a593Smuzhiyun     RK_U16 mbskip_cdf[MBSKIP_CONTEXTS];
787*4882a593Smuzhiyun     RK_U16 delta_q_cdf[DELTA_Q_PROBS];
788*4882a593Smuzhiyun     RK_U16 delta_lf_multi_cdf[FRAME_LF_COUNT][DELTA_LF_PROBS];
789*4882a593Smuzhiyun     RK_U16 delta_lf_cdf[DELTA_LF_PROBS];
790*4882a593Smuzhiyun     RK_U16 skip_mode_cdf[SKIP_MODE_CONTEXTS];
791*4882a593Smuzhiyun     RK_U16 vartx_part_cdf[VARTX_PART_CONTEXTS][1];
792*4882a593Smuzhiyun     RK_U16 tx_size_cdf[MAX_TX_CATS][AV1_TX_SIZE_CONTEXTS][MAX_TX_DEPTH];
793*4882a593Smuzhiyun     RK_U16 if_ymode_cdf[BLOCK_SIZE_GROUPS][AV1_INTRA_MODES - 1];
794*4882a593Smuzhiyun     RK_U16 uv_mode_cdf[2][AV1_INTRA_MODES][AV1_INTRA_MODES - 1 + 1];
795*4882a593Smuzhiyun     RK_U16 intra_inter_cdf[INTRA_INTER_CONTEXTS];
796*4882a593Smuzhiyun     RK_U16 comp_inter_cdf[COMP_INTER_CONTEXTS];
797*4882a593Smuzhiyun     RK_U16 single_ref_cdf[AV1_REF_CONTEXTS][SINGLE_REFS - 1];
798*4882a593Smuzhiyun     RK_U16 comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][1];
799*4882a593Smuzhiyun     RK_U16 uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][1];
800*4882a593Smuzhiyun     RK_U16 comp_ref_cdf[AV1_REF_CONTEXTS][FWD_REFS - 1];
801*4882a593Smuzhiyun     RK_U16 comp_bwdref_cdf[AV1_REF_CONTEXTS][BWD_REFS - 1];
802*4882a593Smuzhiyun     RK_U16 newmv_cdf[NEWMV_MODE_CONTEXTS];
803*4882a593Smuzhiyun     RK_U16 zeromv_cdf[ZEROMV_MODE_CONTEXTS];
804*4882a593Smuzhiyun     RK_U16 refmv_cdf[REFMV_MODE_CONTEXTS];
805*4882a593Smuzhiyun     RK_U16 drl_cdf[DRL_MODE_CONTEXTS];
806*4882a593Smuzhiyun     RK_U16 interp_filter_cdf[SWITCHABLE_FILTER_CONTEXTS][AV1_SWITCHABLE_FILTERS - 1];
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun     MvCDFs mv_cdf;
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun     RK_U16 obmc_cdf[BLOCK_SIZE_TYPES];
811*4882a593Smuzhiyun     RK_U16 motion_mode_cdf[BLOCK_SIZE_TYPES][2];
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun     RK_U16 inter_compound_mode_cdf[AV1_INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES - 1];
814*4882a593Smuzhiyun     RK_U16 compound_type_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(COMPOUND_TYPES - 1)];
815*4882a593Smuzhiyun     RK_U16 interintra_cdf[BLOCK_SIZE_GROUPS];
816*4882a593Smuzhiyun     RK_U16 interintra_mode_cdf[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1];
817*4882a593Smuzhiyun     RK_U16 wedge_interintra_cdf[BLOCK_SIZE_TYPES];
818*4882a593Smuzhiyun     RK_U16 wedge_idx_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(16)];
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun     RK_U16 palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][1];
821*4882a593Smuzhiyun     RK_U16 palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][1];
822*4882a593Smuzhiyun     RK_U16 palette_y_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1];
823*4882a593Smuzhiyun     RK_U16 palette_uv_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1];
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun     RK_U16 cfl_sign_cdf[CFL_JOINT_SIGNS - 1];
826*4882a593Smuzhiyun     RK_U16 cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE - 1];
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun     RK_U16 intrabc_cdf[1];
829*4882a593Smuzhiyun     RK_U16 angle_delta_cdf[DIRECTIONAL_MODES][6];
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun     RK_U16 filter_intra_mode_cdf[FILTER_INTRA_MODES - 1];
832*4882a593Smuzhiyun     RK_U16 filter_intra_cdf[BLOCK_SIZES_ALL];
833*4882a593Smuzhiyun     RK_U16 comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)];
834*4882a593Smuzhiyun     RK_U16 compound_idx_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)];
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun     RK_U16 dummy0[14];
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun     // Palette index contexts; sizes 1/7, 2/6, 3/5 packed together
839*4882a593Smuzhiyun     RK_U16 palette_y_color_index_cdf[PALETTE_IDX_CONTEXTS][8];
840*4882a593Smuzhiyun     RK_U16 palette_uv_color_index_cdf[PALETTE_IDX_CONTEXTS][8];
841*4882a593Smuzhiyun     // RK_U16 dummy1[0];
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun     // Note: cdf space can be optimized (most sets have fewer than EXT_TX_TYPES
844*4882a593Smuzhiyun     // symbols)
845*4882a593Smuzhiyun     RK_U16 tx_type_intra0_cdf[EXTTX_SIZES][AV1_INTRA_MODES][8];
846*4882a593Smuzhiyun     RK_U16 tx_type_intra1_cdf[EXTTX_SIZES][AV1_INTRA_MODES][4];
847*4882a593Smuzhiyun     RK_U16 tx_type_inter_cdf[2][EXTTX_SIZES][EXT_TX_TYPES];
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun     aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
850*4882a593Smuzhiyun     aom_cdf_prob eob_extra_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][CDF_SIZE(2)];
851*4882a593Smuzhiyun     RK_U16 dummy_[5];
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf16[PLANE_TYPES][2][4];
854*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf32[PLANE_TYPES][2][8];
855*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf64[PLANE_TYPES][2][8];
856*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf128[PLANE_TYPES][2][8];
857*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf256[PLANE_TYPES][2][8];
858*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf512[PLANE_TYPES][2][16];
859*4882a593Smuzhiyun     aom_cdf_prob eob_flag_cdf1024[PLANE_TYPES][2][16];
860*4882a593Smuzhiyun     aom_cdf_prob coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB][CDF_SIZE(3)];
861*4882a593Smuzhiyun     aom_cdf_prob coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][CDF_SIZE(4) + 1];
862*4882a593Smuzhiyun     aom_cdf_prob dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)];
863*4882a593Smuzhiyun     RK_U16 dummy_2[2];
864*4882a593Smuzhiyun     aom_cdf_prob coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][CDF_SIZE(BR_CDF_SIZE) + 1];
865*4882a593Smuzhiyun     RK_U16 dummy2[16];
866*4882a593Smuzhiyun } AV1CDFs;
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun typedef struct {
869*4882a593Smuzhiyun     RK_U8 scaling_lut_y[256];
870*4882a593Smuzhiyun     RK_U8 scaling_lut_cb[256];
871*4882a593Smuzhiyun     RK_U8 scaling_lut_cr[256];
872*4882a593Smuzhiyun     RK_S16 cropped_luma_grain_block[4096];
873*4882a593Smuzhiyun     RK_S16 cropped_chroma_grain_block[1024 * 2];
874*4882a593Smuzhiyun } AV1FilmGrainMemory;
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun #endif  // __AV1COMMONDEC_H__
877