1 /******************************************************************************
2  *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22 ******************************************************************************
23 *
24 * @file ihevce_global_tables.c
25 *
26 * @brief
27 *    This file contains definitions of global tables used by the encoder
28 *
29 * @author
30 *    Ittiam
31 *
32 ******************************************************************************
33 */
34 
35 /*****************************************************************************/
36 /* File Includes                                                             */
37 /*****************************************************************************/
38 /* System include files */
39 #include <stdio.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <assert.h>
43 #include <stdarg.h>
44 #include <math.h>
45 
46 /* User include files */
47 #include "ihevc_typedefs.h"
48 #include "itt_video_api.h"
49 #include "ihevce_api.h"
50 
51 #include "rc_cntrl_param.h"
52 #include "rc_frame_info_collector.h"
53 #include "rc_look_ahead_params.h"
54 
55 #include "ihevc_defs.h"
56 #include "ihevc_structs.h"
57 #include "ihevc_platform_macros.h"
58 #include "ihevc_deblk.h"
59 #include "ihevc_itrans_recon.h"
60 #include "ihevc_chroma_itrans_recon.h"
61 #include "ihevc_chroma_intra_pred.h"
62 #include "ihevc_intra_pred.h"
63 #include "ihevc_inter_pred.h"
64 #include "ihevc_mem_fns.h"
65 #include "ihevc_padding.h"
66 #include "ihevc_weighted_pred.h"
67 #include "ihevc_sao.h"
68 #include "ihevc_resi_trans.h"
69 #include "ihevc_quant_iquant_ssd.h"
70 #include "ihevc_cabac_tables.h"
71 
72 #include "ihevce_defs.h"
73 #include "ihevce_lap_enc_structs.h"
74 #include "ihevce_multi_thrd_structs.h"
75 #include "ihevce_multi_thrd_funcs.h"
76 #include "ihevce_me_common_defs.h"
77 #include "ihevce_had_satd.h"
78 #include "ihevce_error_codes.h"
79 #include "ihevce_bitstream.h"
80 #include "ihevce_cabac.h"
81 #include "ihevce_rdoq_macros.h"
82 #include "ihevce_function_selector.h"
83 #include "ihevce_enc_structs.h"
84 #include "ihevce_cmn_utils_instr_set_router.h"
85 #include "hme_datatype.h"
86 #include "hme_common_defs.h"
87 #include "hme_common_utils.h"
88 #include "hme_interface.h"
89 #include "hme_defs.h"
90 #include "ihevce_me_instr_set_router.h"
91 #include "hme_err_compute.h"
92 #include "hme_globals.h"
93 #include "ihevce_entropy_structs.h"
94 #include "ihevce_enc_loop_structs.h"
95 #include "ihevce_enc_loop_utils.h"
96 #include "ihevce_enc_loop_pass.h"
97 #include "ihevce_global_tables.h"
98 
99 /*****************************************************************************/
100 /* Globals                                                                   */
101 /*****************************************************************************/
102 const level_data_t g_as_level_data[TOTAL_NUM_LEVELS] = {
103     /* LEVEL1 */
104     { LEVEL1, 552960, 36864, { 128, 0 }, { 350, 0 }, 2, 16, 1, 1 },
105 
106     /* LEVEL2 */
107     { LEVEL2, 3686400, 122880, { 1500, 0 }, { 1500, 0 }, 2, 16, 1, 1 },
108 
109     /* LEVEL2_1 */
110     { LEVEL2_1, 7372800, 245760, { 3000, 0 }, { 3000, 0 }, 2, 20, 1, 1 },
111 
112     /* LEVEL3 */
113     { LEVEL3, 16588800, 552960, { 6000, 0 }, { 6000, 0 }, 2, 30, 2, 2 },
114 
115     /* LEVEL3_1 */
116     { LEVEL3_1, 33177600, 983040, { 10000, 0 }, { 10000, 0 }, 2, 40, 3, 3 },
117 
118     /* LEVEL4 */
119     { LEVEL4, 66846720, 2228224, { 12000, 30000 }, { 12000, 30000 }, 4, 75, 5, 5 },
120 
121     /* LEVEL4_1 */
122     { LEVEL4_1, 133693440, 2228224, { 20000, 50000 }, { 20000, 50000 }, 4, 75, 5, 5 },
123 
124     /* LEVEL5 */
125     { LEVEL5, 267386880, 8912896, { 25000, 100000 }, { 25000, 100000 }, 6, 200, 11, 10 },
126 
127     /* LEVEL5_1 */
128     { LEVEL5_1, 534773760, 8912896, { 40000, 160000 }, { 40000, 160000 }, 8, 200, 11, 10 },
129 
130     /* LEVEL5_2 */
131     { LEVEL5_2, 1069547520, 8912896, { 60000, 240000 }, { 60000, 240000 }, 8, 200, 11, 10 },
132 
133     /* LEVEL6 */
134     { LEVEL6, 1069547520, 35651584, { 60000, 240000 }, { 60000, 240000 }, 8, 600, 22, 20 },
135 
136     /* LEVEL6_1 */
137     { LEVEL6_1, 2139095040, 35651584, { 120000, 480000 }, { 120000, 480000 }, 8, 600, 22, 20 },
138 
139     /* LEVEL6_2 */
140     { LEVEL6_2, 4278190080, 35651584, { 240000, 800000 }, { 240000, 800000 }, 6, 600, 22, 20 },
141 
142 };
143 
144 /** \brief Default flat Scaling matrix for 4x4 transform */
145 const WORD16 gi2_flat_scale_mat_4x4[] = { 16, 16, 16, 16, 16, 16, 16, 16,
146                                           16, 16, 16, 16, 16, 16, 16, 16 };
147 
148 /** \brief Default flat Scaling matrix for 8x8 transform */
149 const WORD16 gi2_flat_scale_mat_8x8[] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
150                                           16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
151                                           16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
152                                           16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
153                                           16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 };
154 
155 /** \brief Default flat Scaling matrix for 16x16 transform */
156 const WORD16 gi2_flat_scale_mat_16x16[] = {
157     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
158     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
159     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
160     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
161     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
162     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
163     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
164     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
165     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
166     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
167     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
168 };
169 
170 /** \brief Default flat ReScaling matrix for 4x4 transform */
171 const WORD16 gi2_flat_rescale_mat_4x4[] = { 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
172                                             2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048 };
173 
174 /** \brief Default flat ReScaling matrix for 8x8 transform */
175 const WORD16 gi2_flat_rescale_mat_8x8[] = {
176     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
177     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
178     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
179     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048
180 };
181 
182 /** \brief Default flat ReScaling matrix for 16x16 transform */
183 const WORD16 gi2_flat_rescale_mat_16x16[] = {
184     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
185     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
186     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
187     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
188     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
189     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
190     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
191     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
192     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
193     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
194     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
195     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
196     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
197     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
198     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
199     2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048
200 };
201 
202 /**
203 * @brief Give the scanning order of csb in a 32x32 TU
204 * based on first idx. 0 - upright_diagonal, 1 - horizontal, 2 - vertical scan
205 */
206 const UWORD8 g_u1_scan_table_8x8[3][64] = {
207     /* diag up right scan */
208     { 0,  8,  1,  16, 9,  2,  24, 17, 10, 3,  32, 25, 18, 11, 4,  40, 33, 26, 19, 12, 5,  48,
209       41, 34, 27, 20, 13, 6,  56, 49, 42, 35, 28, 21, 14, 7,  57, 50, 43, 36, 29, 22, 15, 58,
210       51, 44, 37, 30, 23, 59, 52, 45, 38, 31, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63 },
211 
212     /* horizontal scan */
213     { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
214       22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
215       44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 },
216 
217     /* vertical scan */
218     { 0,  8,  16, 24, 32, 40, 48, 56, 1,  9,  17, 25, 33, 41, 49, 57, 2,  10, 18, 26, 34, 42,
219       50, 58, 3,  11, 19, 27, 35, 43, 51, 59, 4,  12, 20, 28, 36, 44, 52, 60, 5,  13, 21, 29,
220       37, 45, 53, 61, 6,  14, 22, 30, 38, 46, 54, 62, 7,  15, 23, 31, 39, 47, 55, 63 }
221 };
222 
223 /**
224 * @brief Give the scanning order of csb in a 16x16 TU  or 4x4 csb
225 * based on first idx. 0 - upright_diagonal, 1 - horizontal, 2 - vertical scan
226 */
227 const UWORD8 g_u1_scan_table_4x4[3][16] = {
228     /* diag up right scan */
229     { 0, 4, 1, 8, 5, 2, 12, 9, 6, 3, 13, 10, 7, 14, 11, 15 },
230 
231     /* horizontal scan */
232     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
233 
234     /* vertical scan */
235     { 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15 }
236 };
237 
238 /**
239 * @brief Give the scanning order of csb in a 8x8 TU
240 * based on first idx. 0 - upright_diagonal, 1 - horizontal, 2 - vertical scan
241 */
242 const UWORD8 g_u1_scan_table_2x2[3][4] = {
243     /* diag up right scan */
244     { 0, 2, 1, 3 },
245 
246     /* horizontal scan */
247     { 0, 1, 2, 3 },
248 
249     /* vertical scan */
250     { 0, 2, 1, 3 }
251 };
252 
253 /**
254 * @brief Give the scanning order of csb in a 4x4 TU
255 * scan idx. doesn't matter as it's 0 for all cases
256 */
257 const UWORD8 g_u1_scan_table_1x1[1] = { 0 };
258 
259 /**
260 ******************************************************************************
261 *  @brief For a given frac pt, fracx, fracy, this module figures out the
262 *  corresponding fpel/hpel buffers along with x and y offsets if any. The
263 *  grid used is shown as follows:
264 *    A j E k B
265 *    l m n o p
266 *    F q G r H
267 *    s t u v w
268 *    C x I y D
269 *
270 *  In this grid capital letters are fpel/hpel bufs.
271 ******************************************************************************
272 */
273 qpel_input_buf_cfg_t gas_qpel_inp_buf_cfg[4][4] = {
274     {
275         /* 0, 0 pt: both buf id would be fxfy = 0 */
276         { 0, 0, 0, 0, 0, 0 },
277         /* 1, 0 pt: pt j; avg of A and E */
278         { 0, 0, 0, 1, 0, 0 },
279         /* 2, 0 pt: pt E, buf id 0 and 1 would be hxfy = 1 */
280         { 1, 0, 0, 1, 0, 0 },
281         /* 3, 0 pt: pt k, avg of E and B */
282         { 1, 0, 0, 0, 1, 0 },
283     },
284     {
285         /* 0, 1 pt: pt l: avg of A and F */
286         { 0, 0, 0, 2, 0, 0 },
287         /* 1, 1 pt: pt m : avg of E and F */
288         { 1, 0, 0, 2, 0, 0 },
289         /* 2, 2 pt: pt n: avg of E and G */
290         { 1, 0, 0, 3, 0, 0 },
291         /* 3, 2 pt : pt o: avg of E and H */
292         { 1, 0, 0, 2, 1, 0 },
293     },
294     {
295         /* 0, 2 pt: pt F; both buf id would be fxhy = 2 */
296         { 2, 0, 0, 2, 0, 0 },
297         /* 1, 2 pt: pt q; avg of F and G */
298         { 2, 0, 0, 3, 0, 0 },
299         /* 2, 2 pt: pt G: both buf id would be hxhy = 3 */
300         { 3, 0, 0, 3, 0, 0 },
301         /* 2, 3 pt: pt r: avg of G and H */
302         { 3, 0, 0, 2, 1, 0 },
303     },
304     {
305         /* 0, 3 pt: pt s; avg of F and C */
306         { 2, 0, 0, 0, 0, 1 },
307         /* 1, 3 ot: pt t; avg of F and I */
308         { 2, 0, 0, 1, 0, 1 },
309         /* 2, 3 pt: pt u, avg of G and I */
310         { 3, 0, 0, 1, 0, 1 },
311         /* 3, 3 pt; pt v, avg of H and I */
312         { 2, 1, 0, 1, 0, 1 },
313     }
314 };
315 
316 /**
317 * @brief is partition vertical
318 */
319 const WORD8 gai1_is_part_vertical[TOT_NUM_PARTS] = { 0, 1, 1, 0, 0, 0, 0, 0, 0,
320                                                      1, 1, 1, 1, 0, 0, 0, 0 };
321 
322 /**
323 * @brief partition dimensions
324 */
325 const WORD8 gai1_part_wd_and_ht[TOT_NUM_PARTS][2] = { { 16, 16 }, { 16, 8 }, { 16, 8 },  { 8, 16 },
326                                                       { 8, 16 },  { 8, 8 },  { 8, 8 },   { 8, 8 },
327                                                       { 8, 8 },   { 16, 4 }, { 16, 12 }, { 16, 12 },
328                                                       { 16, 4 },  { 4, 16 }, { 12, 16 }, { 12, 16 },
329                                                       { 4, 16 } };
330 
331 /**
332 ******************************************************************************
333 *  @brief bits to code given ref id assuming more than 2 ref ids active
334 ******************************************************************************
335 */
336 UWORD8 gau1_ref_bits[16] = { 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 9 };
337 
338 /**
339 * @brief raster to zscan lookup table
340 */
341 const UWORD8 gau1_ctb_raster_to_zscan[256] = {
342     0,   1,   4,   5,   16,  17,  20,  21,  64,  65,  68,  69,  80,  81,  84,  85,  2,   3,   6,
343     7,   18,  19,  22,  23,  66,  67,  70,  71,  82,  83,  86,  87,  8,   9,   12,  13,  24,  25,
344     28,  29,  72,  73,  76,  77,  88,  89,  92,  93,  10,  11,  14,  15,  26,  27,  30,  31,  74,
345     75,  78,  79,  90,  91,  94,  95,  32,  33,  36,  37,  48,  49,  52,  53,  96,  97,  100, 101,
346     112, 113, 116, 117, 34,  35,  38,  39,  50,  51,  54,  55,  98,  99,  102, 103, 114, 115, 118,
347     119, 40,  41,  44,  45,  56,  57,  60,  61,  104, 105, 108, 109, 120, 121, 124, 125, 42,  43,
348     46,  47,  58,  59,  62,  63,  106, 107, 110, 111, 122, 123, 126, 127, 128, 129, 132, 133, 144,
349     145, 148, 149, 192, 193, 196, 197, 208, 209, 212, 213, 130, 131, 134, 135, 146, 147, 150, 151,
350     194, 195, 198, 199, 210, 211, 214, 215, 136, 137, 140, 141, 152, 153, 156, 157, 200, 201, 204,
351     205, 216, 217, 220, 221, 138, 139, 142, 143, 154, 155, 158, 159, 202, 203, 206, 207, 218, 219,
352     222, 223, 160, 161, 164, 165, 176, 177, 180, 181, 224, 225, 228, 229, 240, 241, 244, 245, 162,
353     163, 166, 167, 178, 179, 182, 183, 226, 227, 230, 231, 242, 243, 246, 247, 168, 169, 172, 173,
354     184, 185, 188, 189, 232, 233, 236, 237, 248, 249, 252, 253, 170, 171, 174, 175, 186, 187, 190,
355     191, 234, 235, 238, 239, 250, 251, 254, 255
356 };
357 
358 /**
359 * @brief <Fill me>
360 */
361 UWORD32 gau4_frame_qstep_multiplier[54] = { 16, 16, 16, 15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 12,
362                                             12, 11, 11, 10, 10, 9,  9,  8,  8,  8,  7,  7,  7,  6,
363                                             6,  5,  5,  5,  4,  4,  3,  3,  3,  2,  2,  2,  1,  1,
364                                             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 };
365 
366 /**
367 ******************************************************************************
368 * @brief  Look up table for choosing the appropriate function for
369 *         Intra prediction
370 *
371 * @remarks Same look up table enums are used for luma & chroma but each
372 *          have seperate functions implemented
373 ******************************************************************************
374 */
375 WORD32 g_i4_ip_funcs[MAX_NUM_IP_MODES] = {
376     IP_FUNC_MODE_0, /* Mode 0 */
377     IP_FUNC_MODE_1, /* Mode 1 */
378     IP_FUNC_MODE_2, /* Mode 2 */
379     IP_FUNC_MODE_3TO9, /* Mode 3 */
380     IP_FUNC_MODE_3TO9, /* Mode 4 */
381     IP_FUNC_MODE_3TO9, /* Mode 5 */
382     IP_FUNC_MODE_3TO9, /* Mode 6 */
383     IP_FUNC_MODE_3TO9, /* Mode 7 */
384     IP_FUNC_MODE_3TO9, /* Mode 8 */
385     IP_FUNC_MODE_3TO9, /* Mode 9 */
386     IP_FUNC_MODE_10, /* Mode 10 */
387     IP_FUNC_MODE_11TO17, /* Mode 11 */
388     IP_FUNC_MODE_11TO17, /* Mode 12 */
389     IP_FUNC_MODE_11TO17, /* Mode 13 */
390     IP_FUNC_MODE_11TO17, /* Mode 14 */
391     IP_FUNC_MODE_11TO17, /* Mode 15 */
392     IP_FUNC_MODE_11TO17, /* Mode 16 */
393     IP_FUNC_MODE_11TO17, /* Mode 17 */
394     IP_FUNC_MODE_18_34, /* Mode 18 */
395     IP_FUNC_MODE_19TO25, /* Mode 19 */
396     IP_FUNC_MODE_19TO25, /* Mode 20 */
397     IP_FUNC_MODE_19TO25, /* Mode 21 */
398     IP_FUNC_MODE_19TO25, /* Mode 22 */
399     IP_FUNC_MODE_19TO25, /* Mode 23 */
400     IP_FUNC_MODE_19TO25, /* Mode 24 */
401     IP_FUNC_MODE_19TO25, /* Mode 25 */
402     IP_FUNC_MODE_26, /* Mode 26 */
403     IP_FUNC_MODE_27TO33, /* Mode 27 */
404     IP_FUNC_MODE_27TO33, /* Mode 26 */
405     IP_FUNC_MODE_27TO33, /* Mode 29 */
406     IP_FUNC_MODE_27TO33, /* Mode 30 */
407     IP_FUNC_MODE_27TO33, /* Mode 31 */
408     IP_FUNC_MODE_27TO33, /* Mode 32 */
409     IP_FUNC_MODE_27TO33, /* Mode 33 */
410     IP_FUNC_MODE_18_34, /* Mode 34 */
411 };
412 
413 /**
414 ******************************************************************************
415 * @brief  Look up table for calculating the TU size for all the TUs in a CU
416 *         if CU part mode is one of SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N
417 *
418 *         i ranging (0 to 3)
419 *         tu_size[i] = cu_size >> gau1_inter_tu_shft_amt[i];
420 *
421 * @remarks For non AMP cases only TU size = CU/2 is used
422 *          and number of TU partitions in these CU will be 4
423 ******************************************************************************
424 */
425 UWORD8 gau1_inter_tu_shft_amt[4] = {
426     /* SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N cases */
427     1,
428     1,
429     1,
430     1
431 };
432 
433 /**
434 ******************************************************************************
435 * @brief  Look up table for calculating the TU size for all the TUs in a CU
436 *         if CU part mode is one of SIZE_2NxnU, SIZE_2NxnD, SIZE_nLx2N
437 *         SIZE_nRx2N (AMP motion partition cases)
438 *
439 *         part_mode = {SIZE_2NxnU,SIZE_2NxnD,SIZE_nLx2N,SIZE_nRx2N}
440 *         i ranging (0 to 9)
441 *         tu_size[i] = cu_size >> gau1_inter_tu_shft_amt_amp[part_mode-4][i];
442 *
443 * @remarks For AMP cases a mixture of TU size = CU/2 & CU/4 is used
444 *          based on motion partition orientation, number of TU partitions
445 *          in these CU will be 10
446 ******************************************************************************
447 */
448 UWORD8 gau1_inter_tu_shft_amt_amp[4][10] = {
449     /* SIZE_2NxnU case */
450     { 2, 2, 2, 2, 2, 2, 2, 2, 1, 1 },
451 
452     /* SIZE_2NxnD case */
453     { 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 },
454 
455     /* SIZE_nLx2N case */
456     { 2, 2, 2, 2, 1, 2, 2, 2, 2, 1 },
457 
458     /* SIZE_nRx2N case */
459     { 1, 2, 2, 2, 2, 1, 2, 2, 2, 2 }
460 };
461 
462 /**
463 ******************************************************************************
464 * @brief  Look up table for calculating the TU position in horizontal
465 *         for all the TUs in a CU, if CU part mode is one of
466 *         SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N
467 *
468 *         i ranging (0 to 3)
469 *         tu_posx[i](in pixels in cu) =
470 *                 ((cusize >> 2) * gau1_inter_tu_posx_scl_amt[i]);
471 ******************************************************************************
472 */
473 UWORD8 gau1_inter_tu_posx_scl_amt[4] = {
474     /* SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N cases */
475     0,
476     2,
477     0,
478     2
479 };
480 
481 /**
482 ******************************************************************************
483 * @brief  Look up table for calculating the TU position in horizontal
484 *         for all the TUs in a CU, if CU part mode is one of
485 *         SIZE_2NxnU, SIZE_2NxnD, SIZE_nLx2N,SIZE_nRx2N (AMP motion partition cases)
486 *
487 *         part_mode = {SIZE_2NxnU,SIZE_2NxnD,SIZE_nLx2N,SIZE_nRx2N}
488 *         i ranging (0 to 9)
489 *         tu_posx[i](in pixels in cu) =
490 *              ((cusize >> 2) * gau1_inter_tu_posx_scl_amt_amp[part_mode-4][i]);
491 ******************************************************************************
492 */
493 UWORD8 gau1_inter_tu_posx_scl_amt_amp[4][10] = {
494     /* SIZE_2NxnU case */
495     { 0, 1, 0, 1, 2, 3, 2, 3, 0, 2 },
496 
497     /* SIZE_2NxnD case */
498     { 0, 2, 0, 1, 0, 1, 2, 3, 2, 3 },
499 
500     /* SIZE_nLx2N case */
501     { 0, 1, 0, 1, 2, 0, 1, 0, 1, 2 },
502 
503     /* SIZE_nRx2N case */
504     { 0, 2, 3, 2, 3, 0, 2, 3, 2, 3 }
505 };
506 
507 /**
508 ******************************************************************************
509 * @brief  Look up table for calculating the TU position in vertical
510 *         for all the TUs in a CU, if CU part mode is one of
511 *         SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N
512 *
513 *         i ranging (0 to 3)
514 *         tu_posy[i](in pixels in cu) =
515 *                 ((cusize >> 2) * gau1_inter_tu_posy_scl_amt[i]);
516 ******************************************************************************
517 */
518 UWORD8 gau1_inter_tu_posy_scl_amt[4] = {
519     /* SIZE_2Nx2N, SIZE_2NxN, SIZE_Nx2N cases */
520     0,
521     0,
522     2,
523     2
524 };
525 
526 /**
527 ******************************************************************************
528 * @brief  Look up table for calculating the TU position in vertical
529 *         for all the TUs in a CU, if CU part mode is one of
530 *         SIZE_2NxnU, SIZE_2NxnD, SIZE_nLx2N,SIZE_nRx2N (AMP motion partition cases)
531 *
532 *         part_mode = {SIZE_2NxnU,SIZE_2NxnD,SIZE_nLx2N,SIZE_nRx2N}
533 *         i ranging (0 to 9)
534 *         tu_posy[i](in pixels in cu) =
535 *              ((cusize >> 2) * gau1_inter_tu_posy_scl_amt_amp[part_mode-4][i]);
536 ******************************************************************************
537 */
538 UWORD8 gau1_inter_tu_posy_scl_amt_amp[4][10] = {
539     /* SIZE_2NxnU case */
540     { 0, 0, 1, 1, 0, 0, 1, 1, 2, 2 },
541 
542     /* SIZE_2NxnD case */
543     { 0, 0, 2, 2, 3, 3, 2, 2, 3, 3 },
544 
545     /* SIZE_nLx2N case */
546     { 0, 0, 1, 1, 0, 2, 2, 3, 3, 2 },
547 
548     /* SIZE_nRx2N case */
549     { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3 }
550 };
551 
552 /**
553 * @brief transform shift. Initialized in ihevce_enc_loop_init()
554 */
555 WORD32 ga_trans_shift[5];
556 
557 /**
558 * @brief chroma 422 intra angle mapping
559 */
560 const UWORD8 gau1_chroma422_intra_angle_mapping[36] = {
561     0,  1,  2,  2,  2,  2,  3,  5,  7,  8,  10, 12, 13, 15, 17, 18, 19, 20,
562     21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, DM_CHROMA_IDX
563 };
564 
565 // clang-format off
566 /**
567 ******************************************************************************
568 * @breif  LUT for returning the fractional bits(Q12) to encode a bin based on
569 *         probability state and the encoded bin (MPS / LPS). The fractional
570 *         bits are computed as -log2(probabililty of symbol)
571 *
572 *         Probabilites of the cabac states (0-63) are explained in section C
573 *         of ieee paper by Detlev Marpe et al (VOL. 13, NO. 7, JULY 2003)
574 *          alpha = (0.01875/0.5) ^ (1/63), p0 = 0.5 and p63 = 0.01875
575 *
576 *         Note that HEVC and AVC use the same cabac tables
577 *
578 * input   : curpState[bits7-1]  | (curMPS ^ encoded bin)[bit0]
579 *
580 * output  : fractionnal bits to encode the bin
581 *
582 ******************************************************************************
583 */
584 UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2]   =
585 {
586     /* bits for mps */          /* bits for lps */
587     ROUND_Q12(1.000000000),     ROUND_Q12(1.000000000),
588     ROUND_Q12(0.928535439),     ROUND_Q12(1.075189930),
589     ROUND_Q12(0.863825936),     ROUND_Q12(1.150379860),
590     ROUND_Q12(0.804976479),     ROUND_Q12(1.225569790),
591     ROUND_Q12(0.751252392),     ROUND_Q12(1.300759720),
592     ROUND_Q12(0.702043265),     ROUND_Q12(1.375949650),
593     ROUND_Q12(0.656836490),     ROUND_Q12(1.451139580),
594     ROUND_Q12(0.615197499),     ROUND_Q12(1.526329510),
595     ROUND_Q12(0.576754745),     ROUND_Q12(1.601519441),
596     ROUND_Q12(0.541188141),     ROUND_Q12(1.676709371),
597     ROUND_Q12(0.508220033),     ROUND_Q12(1.751899301),
598     ROUND_Q12(0.477608072),     ROUND_Q12(1.827089231),
599     ROUND_Q12(0.449139524),     ROUND_Q12(1.902279161),
600     ROUND_Q12(0.422626680),     ROUND_Q12(1.977469091),
601     ROUND_Q12(0.397903130),     ROUND_Q12(2.052659021),
602     ROUND_Q12(0.374820697),     ROUND_Q12(2.127848951),
603     ROUND_Q12(0.353246914),     ROUND_Q12(2.203038881),
604     ROUND_Q12(0.333062915),     ROUND_Q12(2.278228811),
605     ROUND_Q12(0.314161674),     ROUND_Q12(2.353418741),
606     ROUND_Q12(0.296446520),     ROUND_Q12(2.428608671),
607     ROUND_Q12(0.279829872),     ROUND_Q12(2.503798601),
608     ROUND_Q12(0.264232174),     ROUND_Q12(2.578988531),
609     ROUND_Q12(0.249580966),     ROUND_Q12(2.654178461),
610     ROUND_Q12(0.235810099),     ROUND_Q12(2.729368392),
611     ROUND_Q12(0.222859049),     ROUND_Q12(2.804558322),
612     ROUND_Q12(0.210672321),     ROUND_Q12(2.879748252),
613     ROUND_Q12(0.199198934),     ROUND_Q12(2.954938182),
614     ROUND_Q12(0.188391967),     ROUND_Q12(3.030128112),
615     ROUND_Q12(0.178208162),     ROUND_Q12(3.105318042),
616     ROUND_Q12(0.168607572),     ROUND_Q12(3.180507972),
617     ROUND_Q12(0.159553254),     ROUND_Q12(3.255697902),
618     ROUND_Q12(0.151010993),     ROUND_Q12(3.330887832),
619     ROUND_Q12(0.142949058),     ROUND_Q12(3.406077762),
620     ROUND_Q12(0.135337985),     ROUND_Q12(3.481267692),
621     ROUND_Q12(0.128150381),     ROUND_Q12(3.556457622),
622     ROUND_Q12(0.121360753),     ROUND_Q12(3.631647552),
623     ROUND_Q12(0.114945349),     ROUND_Q12(3.706837482),
624     ROUND_Q12(0.108882016),     ROUND_Q12(3.782027412),
625     ROUND_Q12(0.103150076),     ROUND_Q12(3.857217343),
626     ROUND_Q12(0.097730208),     ROUND_Q12(3.932407273),
627     ROUND_Q12(0.092604344),     ROUND_Q12(4.007597203),
628     ROUND_Q12(0.087755577),     ROUND_Q12(4.082787133),
629     ROUND_Q12(0.083168071),     ROUND_Q12(4.157977063),
630     ROUND_Q12(0.078826986),     ROUND_Q12(4.233166993),
631     ROUND_Q12(0.074718402),     ROUND_Q12(4.308356923),
632     ROUND_Q12(0.070829259),     ROUND_Q12(4.383546853),
633     ROUND_Q12(0.067147292),     ROUND_Q12(4.458736783),
634     ROUND_Q12(0.063660977),     ROUND_Q12(4.533926713),
635     ROUND_Q12(0.060359483),     ROUND_Q12(4.609116643),
636     ROUND_Q12(0.057232622),     ROUND_Q12(4.684306573),
637     ROUND_Q12(0.054270808),     ROUND_Q12(4.759496503),
638     ROUND_Q12(0.051465018),     ROUND_Q12(4.834686433),
639     ROUND_Q12(0.048806753),     ROUND_Q12(4.909876363),
640     ROUND_Q12(0.046288005),     ROUND_Q12(4.985066294),
641     ROUND_Q12(0.043901228),     ROUND_Q12(5.060256224),
642     ROUND_Q12(0.041639305),     ROUND_Q12(5.135446154),
643     ROUND_Q12(0.039495525),     ROUND_Q12(5.210636084),
644     ROUND_Q12(0.037463555),     ROUND_Q12(5.285826014),
645     ROUND_Q12(0.035537418),     ROUND_Q12(5.361015944),
646     ROUND_Q12(0.033711472),     ROUND_Q12(5.436205874),
647     ROUND_Q12(0.031980387),     ROUND_Q12(5.511395804),
648     ROUND_Q12(0.030339132),     ROUND_Q12(5.586585734),
649     ROUND_Q12(0.028782950),     ROUND_Q12(5.661775664),
650     ROUND_Q12(0.027307346),     ROUND_Q12(5.736965594)
651 };
652 // clang-format on
653 
654 /**
655 * @brief <Fill Me>
656 */
657 WORD32 gai4_subBlock2csbfId_map4x4TU[1];
658 WORD32 gai4_subBlock2csbfId_map8x8TU[4];
659 WORD32 gai4_subBlock2csbfId_map16x16TU[16];
660 WORD32 gai4_subBlock2csbfId_map32x32TU[64];
661 
662 /**
663 * @brief the neighbor flags for a general ctb (ctb inside the frame; not any corners).
664 * The table gau4_nbr_flags_8x8_4x4blks generated for 16x16 4x4 blocks(ctb_size = 64).
665 * But the same table holds good for other 4x4 blocks 2d arrays(eg 8x8 4x4 blks,4x4 4x4blks).
666 * But the flags must be accessed with stride of 16 since the table has been generated for
667 * ctb_size = 64. For odd 4x4 2d arrays(eg 3x3 4x4 blks) the flags needs modification.
668 * The flags also need modification for corner ctbs.
669 */
670 const UWORD32 gau4_nbr_flags_8x8_4x4blks[64] = {
671     0x11188, 0x11180, 0x11188, 0x11180, 0x11188, 0x11180, 0x11188, 0x11180, 0x11188, 0x10180,
672     0x11180, 0x10180, 0x11188, 0x10180, 0x11180, 0x10180, 0x11188, 0x11180, 0x11188, 0x10180,
673     0x11188, 0x11180, 0x11188, 0x10180, 0x11188, 0x10180, 0x11180, 0x10180, 0x11180, 0x10180,
674     0x11180, 0x10180, 0x11188, 0x11180, 0x11188, 0x11180, 0x11188, 0x11180, 0x11188, 0x10180,
675     0x11188, 0x10180, 0x11180, 0x10180, 0x11188, 0x10180, 0x11180, 0x10180, 0x11188, 0x11180,
676     0x11188, 0x10180, 0x11188, 0x11180, 0x11188, 0x10180, 0x11180, 0x10180, 0x11180, 0x10180,
677     0x11180, 0x10180, 0x11180, 0x10180
678 };
679 
680 const float gad_look_up_activity[TOT_QP_MOD_OFFSET] = { 0.314980262f, 0.353553391f, 0.396850263f,
681                                                         0.445449359f, 0.5f,         0.561231024f,
682                                                         0.629960525f, 0.707106781f, 0.793700526f,
683                                                         0.890898718f, 1.0f,         1.122462048f,
684                                                         1.25992105f,  1.414213562f };
685