1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | |
3 | #ifndef _ROCKCHIP_AV1_ENTROPYMODE_H_ |
4 | #define _ROCKCHIP_AV1_ENTROPYMODE_H_ |
5 | |
6 | #include <linux/types.h> |
7 | |
8 | struct hantro_ctx; |
9 | |
10 | #define AV1_INTER_MODE_CONTEXTS 15 |
11 | #define AV1_INTRA_MODES 13 |
12 | #define AV1_REF_CONTEXTS 3 |
13 | #define AV1_SWITCHABLE_FILTERS 3 /* number of switchable filters */ |
14 | #define AV1_TX_SIZE_CONTEXTS 3 |
15 | #define BLOCK_SIZE_GROUPS 4 |
16 | #define BR_CDF_SIZE 4 |
17 | #define BWD_REFS 3 |
18 | #define CFL_ALLOWED_TYPES 2 |
19 | #define CFL_ALPHA_CONTEXTS 6 |
20 | #define CFL_ALPHABET_SIZE 16 |
21 | #define CFL_JOINT_SIGNS 8 |
22 | #define CDF_SIZE(x) ((x) - 1) |
23 | #define COMP_GROUP_IDX_CONTEXTS 7 |
24 | #define COMP_INDEX_CONTEXTS 6 |
25 | #define COMP_INTER_CONTEXTS 5 |
26 | #define COMP_REF_TYPE_CONTEXTS 5 |
27 | #define COMPOUND_TYPES 3 |
28 | #define DC_SIGN_CONTEXTS 3 |
29 | #define DELTA_LF_PROBS 3 |
30 | #define DELTA_Q_PROBS 3 |
31 | #define DIRECTIONAL_MODES 8 |
32 | #define DRL_MODE_CONTEXTS 3 |
33 | #define EOB_COEF_CONTEXTS 9 |
34 | #define EXT_TX_SIZES 3 |
35 | #define EXT_TX_TYPES 16 |
36 | #define EXTTX_SIZES 4 |
37 | #define FRAME_LF_COUNT 4 |
38 | #define FWD_REFS 4 |
39 | #define GLOBALMV_MODE_CONTEXTS 2 |
40 | #define ICDF(x) (32768U - (x)) |
41 | #define INTER_COMPOUND_MODES 8 |
42 | #define INTERINTRA_MODES 4 |
43 | #define INTRA_INTER_CONTEXTS 4 |
44 | #define KF_MODE_CONTEXTS 5 |
45 | #define LEVEL_CONTEXTS 21 |
46 | #define MAX_ANGLE_DELTA 3 |
47 | #define MAX_MB_SEGMENTS 8 |
48 | #define MAX_SEGMENTS 8 |
49 | #define MAX_TX_CATS 4 |
50 | #define MAX_TX_DEPTH 2 |
51 | #define MBSKIP_CONTEXTS 3 |
52 | #define MOTION_MODES 3 |
53 | #define MOTION_MODE_CONTEXTS 10 |
54 | #define NEWMV_MODE_CONTEXTS 6 |
55 | #define NUM_BASE_LEVELS 2 |
56 | #define NUM_REF_FRAMES 8 |
57 | #define PALETTE_BLOCK_SIZES 7 |
58 | #define PALETTE_IDX_CONTEXTS 18 |
59 | #define PALETTE_SIZES 7 |
60 | #define PALETTE_UV_MODE_CONTEXTS 2 |
61 | #define PALETTE_Y_MODE_CONTEXTS 3 |
62 | #define PARTITION_PLOFFSET 4 |
63 | #define NUM_PARTITION_CONTEXTS (4 * PARTITION_PLOFFSET) |
64 | #define PLANE_TYPES 2 |
65 | #define PREDICTION_PROBS 3 |
66 | #define REF_CONTEXTS 5 |
67 | #define REFMV_MODE_CONTEXTS 9 |
68 | #define SEG_TEMPORAL_PRED_CTXS 3 |
69 | #define SIG_COEF_CONTEXTS 42 |
70 | #define SIG_COEF_CONTEXTS_EOB 4 |
71 | #define SINGLE_REFS 7 |
72 | #define SKIP_CONTEXTS 3 |
73 | #define SKIP_MODE_CONTEXTS 3 |
74 | #define SPATIAL_PREDICTION_PROBS 3 |
75 | #define SWITCHABLE_FILTER_CONTEXTS ((AV1_SWITCHABLE_FILTERS + 1) * 4) |
76 | #define TOKEN_CDF_Q_CTXS 4 |
77 | #define TX_SIZES 5 |
78 | #define TX_SIZE_CONTEXTS 2 |
79 | #define TX_TYPES 4 |
80 | #define TXB_SKIP_CONTEXTS 13 |
81 | #define TXFM_PARTITION_CONTEXTS 22 |
82 | #define UNI_COMP_REF_CONTEXTS 3 |
83 | #define UNIDIR_COMP_REFS 4 |
84 | #define UV_INTRA_MODES 14 |
85 | #define VARTX_PART_CONTEXTS 22 |
86 | #define ZEROMV_MODE_CONTEXTS 2 |
87 | |
88 | enum blocksizetype { |
89 | BLOCK_SIZE_AB4X4, |
90 | BLOCK_SIZE_SB4X8, |
91 | BLOCK_SIZE_SB8X4, |
92 | BLOCK_SIZE_SB8X8, |
93 | BLOCK_SIZE_SB8X16, |
94 | BLOCK_SIZE_SB16X8, |
95 | BLOCK_SIZE_MB16X16, |
96 | BLOCK_SIZE_SB16X32, |
97 | BLOCK_SIZE_SB32X16, |
98 | BLOCK_SIZE_SB32X32, |
99 | BLOCK_SIZE_SB32X64, |
100 | BLOCK_SIZE_SB64X32, |
101 | BLOCK_SIZE_SB64X64, |
102 | BLOCK_SIZE_SB64X128, |
103 | BLOCK_SIZE_SB128X64, |
104 | BLOCK_SIZE_SB128X128, |
105 | BLOCK_SIZE_SB4X16, |
106 | BLOCK_SIZE_SB16X4, |
107 | BLOCK_SIZE_SB8X32, |
108 | BLOCK_SIZE_SB32X8, |
109 | BLOCK_SIZE_SB16X64, |
110 | BLOCK_SIZE_SB64X16, |
111 | BLOCK_SIZE_TYPES, |
112 | BLOCK_SIZES_ALL = BLOCK_SIZE_TYPES |
113 | }; |
114 | |
115 | enum filterintramodetype { |
116 | FILTER_DC_PRED, |
117 | FILTER_V_PRED, |
118 | FILTER_H_PRED, |
119 | FILTER_D153_PRED, |
120 | FILTER_PAETH_PRED, |
121 | FILTER_INTRA_MODES, |
122 | FILTER_INTRA_UNUSED = 7 |
123 | }; |
124 | |
125 | enum frametype { |
126 | KEY_FRAME = 0, |
127 | INTER_FRAME = 1, |
128 | NUM_FRAME_TYPES, |
129 | }; |
130 | |
131 | enum txsize { |
132 | TX_4X4 = 0, |
133 | TX_8X8 = 1, |
134 | TX_16X16 = 2, |
135 | TX_32X32 = 3, |
136 | TX_SIZE_MAX_SB, |
137 | }; |
138 | |
139 | enum { SIMPLE_TRANSLATION, OBMC_CAUSAL, MOTION_MODE_COUNT }; |
140 | |
141 | enum mb_prediction_mode { |
142 | DC_PRED, /* average of above and left pixels */ |
143 | V_PRED, /* vertical prediction */ |
144 | H_PRED, /* horizontal prediction */ |
145 | D45_PRED, /* Directional 45 deg prediction [anti-clockwise from 0 deg hor] */ |
146 | D135_PRED, /* Directional 135 deg prediction [anti-clockwise from 0 deg hor] */ |
147 | D117_PRED, /* Directional 112 deg prediction [anti-clockwise from 0 deg hor] */ |
148 | D153_PRED, /* Directional 157 deg prediction [anti-clockwise from 0 deg hor] */ |
149 | D27_PRED, /* Directional 22 deg prediction [anti-clockwise from 0 deg hor] */ |
150 | D63_PRED, /* Directional 67 deg prediction [anti-clockwise from 0 deg hor] */ |
151 | SMOOTH_PRED, |
152 | TM_PRED_AV1 = SMOOTH_PRED, |
153 | SMOOTH_V_PRED, // Vertical interpolation |
154 | SMOOTH_H_PRED, // Horizontal interpolation |
155 | TM_PRED, /* Truemotion prediction */ |
156 | PAETH_PRED = TM_PRED, |
157 | NEARESTMV, |
158 | NEARMV, |
159 | ZEROMV, |
160 | NEWMV, |
161 | NEAREST_NEARESTMV, |
162 | NEAR_NEARMV, |
163 | NEAREST_NEWMV, |
164 | NEW_NEARESTMV, |
165 | NEAR_NEWMV, |
166 | NEW_NEARMV, |
167 | ZERO_ZEROMV, |
168 | NEW_NEWMV, |
169 | SPLITMV, |
170 | MB_MODE_COUNT |
171 | }; |
172 | |
173 | enum partitiontype { |
174 | PARTITION_NONE, |
175 | PARTITION_HORZ, |
176 | PARTITION_VERT, |
177 | PARTITION_SPLIT, |
178 | PARTITION_TYPES |
179 | }; |
180 | |
181 | struct mvcdfs { |
182 | u16 joint_cdf[3]; |
183 | u16 sign_cdf[2]; |
184 | u16 clsss_cdf[2][10]; |
185 | u16 clsss0_fp_cdf[2][2][3]; |
186 | u16 fp_cdf[2][3]; |
187 | u16 class0_hp_cdf[2]; |
188 | u16 hp_cdf[2]; |
189 | u16 class0_cdf[2]; |
190 | u16 bits_cdf[2][10]; |
191 | }; |
192 | |
193 | struct av1cdfs { |
194 | u16 partition_cdf[13][16]; |
195 | u16 kf_ymode_cdf[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][AV1_INTRA_MODES - 1]; |
196 | u16 segment_pred_cdf[PREDICTION_PROBS]; |
197 | u16 spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS][MAX_MB_SEGMENTS - 1]; |
198 | u16 mbskip_cdf[MBSKIP_CONTEXTS]; |
199 | u16 delta_q_cdf[DELTA_Q_PROBS]; |
200 | u16 delta_lf_multi_cdf[FRAME_LF_COUNT][DELTA_LF_PROBS]; |
201 | u16 delta_lf_cdf[DELTA_LF_PROBS]; |
202 | u16 skip_mode_cdf[SKIP_MODE_CONTEXTS]; |
203 | u16 vartx_part_cdf[VARTX_PART_CONTEXTS][1]; |
204 | u16 tx_size_cdf[MAX_TX_CATS][AV1_TX_SIZE_CONTEXTS][MAX_TX_DEPTH]; |
205 | u16 if_ymode_cdf[BLOCK_SIZE_GROUPS][AV1_INTRA_MODES - 1]; |
206 | u16 uv_mode_cdf[2][AV1_INTRA_MODES][AV1_INTRA_MODES - 1 + 1]; |
207 | u16 intra_inter_cdf[INTRA_INTER_CONTEXTS]; |
208 | u16 comp_inter_cdf[COMP_INTER_CONTEXTS]; |
209 | u16 single_ref_cdf[AV1_REF_CONTEXTS][SINGLE_REFS - 1]; |
210 | u16 comp_ref_type_cdf[COMP_REF_TYPE_CONTEXTS][1]; |
211 | u16 uni_comp_ref_cdf[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][1]; |
212 | u16 comp_ref_cdf[AV1_REF_CONTEXTS][FWD_REFS - 1]; |
213 | u16 comp_bwdref_cdf[AV1_REF_CONTEXTS][BWD_REFS - 1]; |
214 | u16 newmv_cdf[NEWMV_MODE_CONTEXTS]; |
215 | u16 zeromv_cdf[ZEROMV_MODE_CONTEXTS]; |
216 | u16 refmv_cdf[REFMV_MODE_CONTEXTS]; |
217 | u16 drl_cdf[DRL_MODE_CONTEXTS]; |
218 | u16 interp_filter_cdf[SWITCHABLE_FILTER_CONTEXTS][AV1_SWITCHABLE_FILTERS - 1]; |
219 | struct mvcdfs mv_cdf; |
220 | u16 obmc_cdf[BLOCK_SIZE_TYPES]; |
221 | u16 motion_mode_cdf[BLOCK_SIZE_TYPES][2]; |
222 | u16 inter_compound_mode_cdf[AV1_INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES - 1]; |
223 | u16 compound_type_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(COMPOUND_TYPES - 1)]; |
224 | u16 interintra_cdf[BLOCK_SIZE_GROUPS]; |
225 | u16 interintra_mode_cdf[BLOCK_SIZE_GROUPS][INTERINTRA_MODES - 1]; |
226 | u16 wedge_interintra_cdf[BLOCK_SIZE_TYPES]; |
227 | u16 wedge_idx_cdf[BLOCK_SIZE_TYPES][CDF_SIZE(16)]; |
228 | u16 palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][1]; |
229 | u16 palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][1]; |
230 | u16 palette_y_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1]; |
231 | u16 palette_uv_size_cdf[PALETTE_BLOCK_SIZES][PALETTE_SIZES - 1]; |
232 | u16 cfl_sign_cdf[CFL_JOINT_SIGNS - 1]; |
233 | u16 cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE - 1]; |
234 | u16 intrabc_cdf[1]; |
235 | u16 angle_delta_cdf[DIRECTIONAL_MODES][6]; |
236 | u16 filter_intra_mode_cdf[FILTER_INTRA_MODES - 1]; |
237 | u16 filter_intra_cdf[BLOCK_SIZES_ALL]; |
238 | u16 comp_group_idx_cdf[COMP_GROUP_IDX_CONTEXTS][CDF_SIZE(2)]; |
239 | u16 compound_idx_cdf[COMP_INDEX_CONTEXTS][CDF_SIZE(2)]; |
240 | u16 dummy0[14]; |
241 | // Palette index contexts; sizes 1/7, 2/6, 3/5 packed together |
242 | u16 palette_y_color_index_cdf[PALETTE_IDX_CONTEXTS][8]; |
243 | u16 palette_uv_color_index_cdf[PALETTE_IDX_CONTEXTS][8]; |
244 | u16 tx_type_intra0_cdf[EXTTX_SIZES][AV1_INTRA_MODES][8]; |
245 | u16 tx_type_intra1_cdf[EXTTX_SIZES][AV1_INTRA_MODES][4]; |
246 | u16 tx_type_inter_cdf[2][EXTTX_SIZES][EXT_TX_TYPES]; |
247 | u16 txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)]; |
248 | u16 [TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][CDF_SIZE(2)]; |
249 | u16 dummy1[5]; |
250 | u16 eob_flag_cdf16[PLANE_TYPES][2][4]; |
251 | u16 eob_flag_cdf32[PLANE_TYPES][2][8]; |
252 | u16 eob_flag_cdf64[PLANE_TYPES][2][8]; |
253 | u16 eob_flag_cdf128[PLANE_TYPES][2][8]; |
254 | u16 eob_flag_cdf256[PLANE_TYPES][2][8]; |
255 | u16 eob_flag_cdf512[PLANE_TYPES][2][16]; |
256 | u16 eob_flag_cdf1024[PLANE_TYPES][2][16]; |
257 | u16 coeff_base_eob_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS_EOB][CDF_SIZE(3)]; |
258 | u16 coeff_base_cdf[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS][CDF_SIZE(4) + 1]; |
259 | u16 dc_sign_cdf[PLANE_TYPES][DC_SIGN_CONTEXTS][CDF_SIZE(2)]; |
260 | u16 dummy2[2]; |
261 | u16 coeff_br_cdf[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][CDF_SIZE(BR_CDF_SIZE) + 1]; |
262 | u16 dummy3[16]; |
263 | }; |
264 | |
265 | void rockchip_av1_store_cdfs(struct hantro_ctx *ctx, |
266 | u32 refresh_frame_flags); |
267 | void rockchip_av1_get_cdfs(struct hantro_ctx *ctx, u32 ref_idx); |
268 | void rockchip_av1_set_default_cdfs(struct av1cdfs *cdfs, |
269 | struct mvcdfs *cdfs_ndvc); |
270 | void rockchip_av1_default_coeff_probs(u32 base_qindex, void *ptr); |
271 | |
272 | #endif /* _ROCKCHIP_AV1_ENTROPYMODE_H_ */ |
273 | |