1/******************************************************************************
2*
3* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
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/**
19*******************************************************************************
20* @file
21*  ihevc_common_tables.c
22*
23* @brief
24*  Contains common global tables
25*
26* @author
27*  Harish M
28*
29* @par List of Tables:
30* gai4_ihevc_max_luma_pic_size
31* gai4_ihevc_max_wd_ht
32* gai4_ihevc_min_wd_ht
33* gai4_ihevc_ang_table
34* col_for_intra_luma
35* col_for_intra_chroma
36* idx_neg_vals_3_9
37* idx_neg_idx_3_9
38* idx_neg_idx_chroma_3_9
39* idx_neg_idx_11_17
40* idx_neg_idx_chroma_11_17
41* gai4_ihevc_inv_ang_table
42* gau1_ihevc_invscan8x8
43* gau1_ihevc_invscan4x4
44* gau1_ihevc_invscan2x2
45* gau1_ihevc_scan8x8
46* gau1_ihevc_scan4x4
47* gau1_ihevc_scan2x2
48* *gapv_ihevc_scan
49* *gapv_ihevc_invscan
50* gau1_ihevc_chroma_qp_scale
51* gai1_ihevc_chroma_qp_scale
52* gau1_ihevc_planar_factor
53* gau1_ihevc_planar_factor_1
54* gai4_ihevc_ang_table_chroma
55* gai4_ihevc_inv_ang_table_chroma
56* gau1_ihevc_planar_factor_chroma
57* gau1_intra_pred_ref_filter
58* gi1_table_edge_idx
59* gu1_table_band_idx
60* gu2_table_band_idx
61*
62* @remarks
63*  None
64*
65*******************************************************************************
66*/
67
68#include "ihevc_typedefs.h"
69#include "ihevc_platform_macros.h"
70#include "ihevc_common_tables.h"
71
72/*****************************************************************************/
73/* Level specific tables                                                     */
74/*****************************************************************************/
75
76/**
77 * Array giving size of max luma samples in a picture for a given level
78 */
79const WORD32 gai4_ihevc_max_luma_pic_size[] =
80{
81    /* Level 1 */
82    36864,
83    /* Level 2 */
84    122880,
85    /* Level 2.1 */
86    245760,
87    /* Level 3 */
88    552960,
89    /* Level 3.1 */
90    983040,
91    /* Level 4 */
92    2228224,
93    /* Level 4.1 */
94    2228224,
95    /* Level 5 */
96    8912896,
97    /* Level 5.1 */
98    8912896,
99    /* Level 5.2 */
100    8912896,
101    /* Level 6 */
102    33423360,
103    /* Level 6.1 */
104    33423360,
105    /* Level 6.2 */
106    33423360
107};
108/** Max width and height allowed for a given level */
109/** This is derived as SQRT(8 * gai4_ihevc_max_luma_pic_size[]) */
110const WORD32 gai4_ihevc_max_wd_ht[] =
111{
112    /* Level 1 */
113    543,
114    /* Level 2 */
115    991,
116    /* Level 2.1 */
117    1402,
118    /* Level 3 */
119    2103,
120    /* Level 3.1 */
121    2804,
122    /* Level 4 */
123    4222,
124    /* Level 4.1 */
125    4222,
126    /* Level 5 */
127    8444,
128    /* Level 5.1 */
129    8444,
130    /* Level 5.2 */
131    8444,
132    /* Level 6 */
133    16888,
134    /* Level 6.1 */
135    16888,
136    /* Level 6.2 */
137    16888
138};
139
140/** Min width and height allowed for a given level */
141/** This is derived as gai4_ihevc_max_luma_pic_size[]/gai4_ihevc_max_wd_ht[] */
142const WORD32 gai4_ihevc_min_wd_ht[] =
143{
144    /* Level 1 */
145    67,
146    /* Level 2 */
147    123,
148    /* Level 2.1 */
149    175,
150    /* Level 3 */
151    262,
152    /* Level 3.1 */
153    350,
154    /* Level 4 */
155    527,
156    /* Level 4.1 */
157    527,
158    /* Level 5 */
159    1055,
160    /* Level 5.1 */
161    1055,
162    /* Level 5.2 */
163    1055,
164    /* Level 6 */
165    2111,
166    /* Level 6.1 */
167    2111,
168    /* Level 6.2 */
169    2111
170};
171/*****************************************************************************/
172/* Intra prediction tables                                                   */
173/*****************************************************************************/
174/**
175 * Intra pred angles
176 */
177/* g_ang_table = tan(actual angle) in Q5 format for all 33 modes */
178const WORD32 gai4_ihevc_ang_table[35] =
179    { 0, 0, 32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9, -13, -17, -21, -26, -32,
180                    -26, -21, -17, -13, -9, -5, -2, 0, 2, 5, 9, 13, 17, 21, 26, 32 };
181
182const WORD8 col_for_intra_luma[32] =
183    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
184                    29, 30, 31, 32 };
185
186const WORD8 col_for_intra_chroma[32] =
187    { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16 };
188
189const WORD8 idx_neg_vals_3_9[7] =
190    { 26, 21, 17, 13, 9, 5, 2 };
191
192const WORD32 idx_neg_idx_3_9[28] =
193    { 6, 13, 19, 26, 5, 10, 15, 21, 4, 8, 12, 17, 3, 6, 9, 13, 2, 4, 6, 9,
194                    1, 2, 3, 5, 0, 0, 1, 2 };
195
196
197const WORD32 idx_neg_idx_chroma_3_9[28] =
198  { 3, 6, 9, 13,
199    2, 5, 7, 10,
200    2, 4, 6, 8,
201    1, 3, 4, 6,
202    1, 2, 3, 4,
203    0, 1, 1, 2,
204    0, 0, 0, 1 };
205const WORD32 idx_neg_idx_11_17[28] =
206    { -1, -1, -2, -2, -2, -3, -4, -5, -3, -5, -7, -9, -4, -7, -10, -13, -5, -9, -13, -17, -6, -11,
207                    -16, -21, -7, -13, -20, -26 };
208
209const WORD32 idx_neg_idx_chroma_11_17[28] =
210  { -1, -1, -1, -1,
211    -1, -2, -2, -3,
212    -2, -3, -4, -5,
213    -2, -4, -5, -7,
214    -3, -5, -7, -9,
215    -3, -6, -8, -11,
216    -4, -7, -10, -13 };
217
218/**
219 * Intra pred inverse angles
220 */
221/* g_invAngTable = Inverse angle in Q5 format, required for negative angles */
222const WORD32 gai4_ihevc_inv_ang_table[14] =
223    { 4096, 1638, 910, 630, 482, 390, 315, 315, 390, 482, 630, 910, 1638, 4096 };
224
225/*****************************************************************************/
226/* Scan matrices                                                             */
227/*****************************************************************************/
228/**
229 * Inverse Scan matrix for 8x8 Section 6.5.3
230 */
231const UWORD8  gau1_ihevc_invscan8x8[][64] =
232{
233    /* Upright diagonal */
234    {
235        0,  8,  1,  16, 9,  2,  24, 17,
236        10, 3,  32, 25, 18, 11, 4,  40,
237        33, 26, 19, 12, 5,  48, 41, 34,
238        27, 20, 13, 6,  56, 49, 42, 35,
239        28, 21, 14, 7,  57, 50, 43, 36,
240        29, 22, 15, 58, 51, 44, 37, 30,
241        23, 59, 52, 45, 38, 31, 60, 53,
242        46, 39, 61, 54, 47, 62, 55, 63
243    },
244    /* Horizontal */
245    {
246        0,  1,  2,  3,  4,  5,  6,  7,
247        8,  9,  10, 11, 12, 13, 14, 15,
248        16, 17, 18, 19, 20, 21, 22, 23,
249        24, 25, 26, 27, 28, 29, 30, 31,
250        32, 33, 34, 35, 36, 37, 38, 39,
251        40, 41, 42, 43, 44, 45, 46, 47,
252        48, 49, 50, 51, 52, 53, 54, 55,
253        56, 57, 58, 59, 60, 61, 62, 63
254    },
255    /* Vertical */
256    {
257        0,  8,  16, 24, 32, 40, 48, 56,
258        1,  9,  17, 25, 33, 41, 49, 57,
259        2,  10, 18, 26, 34, 42, 50, 58,
260        3,  11, 19, 27, 35, 43, 51, 59,
261        4,  12, 20, 28, 36, 44, 52, 60,
262        5,  13, 21, 29, 37, 45, 53, 61,
263        6,  14, 22, 30, 38, 46, 54, 62,
264        7,  15, 23, 31, 39, 47, 55, 63
265    }
266};
267
268/**
269 * Inverse Scan matrix for 4x4 Section 6.5.3
270 */
271const UWORD8  gau1_ihevc_invscan4x4[][16] =
272{
273    /* Upright diagonal */
274    {
275        0, 4,  1,  8,
276        5, 2,  12, 9,
277        6, 3,  13, 10,
278        7, 14, 11, 15
279    },
280    /* Horizontal */
281    {
282        0,  1,  2,  3,
283        4,  5,  6,  7,
284        8,  9,  10, 11,
285        12, 13, 14, 15
286    },
287    /* Vertical */
288    {
289        0,  4,  8,  12,
290        1,  5,  9,  13,
291        2,  6,  10, 14,
292        3,  7,  11, 15
293    }
294};
295
296/**
297 * Inverse Scan matrix for 4x4 Section 6.5.3
298 */
299const UWORD8  gau1_ihevc_invscan2x2[][4] =
300{
301    /* Upright diagonal */
302    {
303        0,  2,
304        1,  3
305    },
306    /* Horizontal */
307    {
308        0,  1,
309        2,  3
310    },
311    /* Vertical */
312    {
313        0,  2,
314        1,  3,
315    }
316};
317
318/**
319 * Scan matrix for 8x8 Section 6.5.3
320 */
321
322const UWORD8  gau1_ihevc_scan8x8[][64] =
323{
324    /* Upright diagonal */
325    {
326        0,  2,  5,  9,  14, 20, 27, 35,
327        1,  4,  8,  13, 19, 26, 34, 42,
328        3,  7,  12, 18, 25, 33, 41, 48,
329        6,  11, 17, 24, 32, 40, 47, 53,
330        10, 16, 23, 31, 39, 46, 52, 57,
331        15, 22, 30, 38, 45, 51, 56, 60,
332        21, 29, 37, 44, 50, 55, 59, 62,
333        28, 36, 43, 49, 54, 58, 61, 63
334    },
335    /* Horizontal */
336    {
337        0,  1,  2,  3,  4,  5,  6,  7,
338        8,  9,  10, 11, 12, 13, 14, 15,
339        16, 17, 18, 19, 20, 21, 22, 23,
340        24, 25, 26, 27, 28, 29, 30, 31,
341        32, 33, 34, 35, 36, 37, 38, 39,
342        40, 41, 42, 43, 44, 45, 46, 47,
343        48, 49, 50, 51, 52, 53, 54, 55,
344        56, 57, 58, 59, 60, 61, 62, 63
345    },
346    /* Vertical */
347    {
348        0,  8,  16, 24, 32, 40, 48, 56,
349        1,  9,  17, 25, 33, 41, 49, 57,
350        2,  10, 18, 26, 34, 42, 50, 58,
351        3,  11, 19, 27, 35, 43, 51, 59,
352        4,  12, 20, 28, 36, 44, 52, 60,
353        5,  13, 21, 29, 37, 45, 53, 61,
354        6,  14, 22, 30, 38, 46, 54, 62,
355        7,  15, 23, 31, 39, 47, 55, 63
356    }
357};
358
359/**
360 * Scan matrix for 4x4 Section 6.5.3
361 */
362const UWORD8  gau1_ihevc_scan4x4[][16] =
363{
364    /* Upright diagonal */
365    {
366        0,  2,  5,  9,
367        1,  4,  8,  12,
368        3,  7,  11, 14,
369        6,  10, 13, 15
370    },
371    /* Horizontal */
372    {
373        0,  1,  2,  3,
374        4,  5,  6,  7,
375        8,  9,  10, 11,
376        12, 13, 14, 15
377    },
378    /* Vertical */
379    {
380        0,  4,  8,  12,
381        1,  5,  9,  13,
382        2,  6,  10, 14,
383        3,  7,  11, 15
384    }
385};
386
387/**
388 * Scan matrix for 4x4 Section 6.5.3
389 */
390const UWORD8  gau1_ihevc_scan2x2[][4] =
391{
392    /* Upright diagonal */
393    {
394        0,  2,
395        1,  3
396    },
397    /* Horizontal */
398    {
399        0,  1,
400        2,  3
401    },
402    /* Vertical */
403    {
404        0,  2,
405        1,  3,
406    }
407};
408
409/**
410 * Table containing all the scan matrices
411 */
412const void *gapv_ihevc_scan[] =
413{
414    gau1_ihevc_scan2x2[0],
415    gau1_ihevc_scan4x4[0],
416    gau1_ihevc_scan8x8[0],
417
418    gau1_ihevc_scan2x2[1],
419    gau1_ihevc_scan4x4[1],
420    gau1_ihevc_scan8x8[1],
421
422    gau1_ihevc_scan2x2[2],
423    gau1_ihevc_scan4x4[2],
424    gau1_ihevc_scan8x8[2],
425
426};
427
428const void *gapv_ihevc_invscan[] =
429{
430    gau1_ihevc_invscan2x2[0],
431    gau1_ihevc_invscan4x4[0],
432    gau1_ihevc_invscan8x8[0],
433
434    gau1_ihevc_invscan2x2[1],
435    gau1_ihevc_invscan4x4[1],
436    gau1_ihevc_invscan8x8[1],
437
438    gau1_ihevc_invscan2x2[2],
439    gau1_ihevc_invscan4x4[2],
440    gau1_ihevc_invscan8x8[2],
441};
442/**
443 * Table for luma to chroma qp conversion
444 */
445
446// FOR MAIN branch encoder ( 8 bit)
447const UWORD8 gau1_ihevc_chroma_qp_scale[58] =
448{
449
450     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
451    17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32,
452    33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44,
453    45, 46, 47, 48, 49, 50, 51
454};
455
456// FOR HBD branch encoder ( 8 and 10 bit)
457const WORD8 gai1_ihevc_chroma_qp_scale[70] =  //EXTENDED for 10 bit
458{
459
460    -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1,
461    0,   1,   2,   3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16,
462    17,  18,  19,  20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32,
463    33,  33,  34,  34, 35, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44,
464    45,  46,  47,  48, 49, 50, 51
465};
466
467
468/** constant planar factor values table */
469const UWORD8 gau1_ihevc_planar_factor[65] = {    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
470    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
471    21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
472    31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
473    41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
474    51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
475    61, 62, 63, 64 };
476//AX CHANGES
477const UWORD8 gau1_ihevc_planar_factor_1[32] = {    1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9,
478    17, 17, 17, 17, 17, 17, 17, 17, 25, 25, 25, 25, 25, 25,
479    25, 25 };
480//AX CHANGES
481
482/** g_ang_table = tan(actual angle) in Q5 format for all 33 modes */
483const WORD32 gai4_ihevc_ang_table_chroma[35] = { 0, 0, 32, 26, 21, 17, 13, 9, 5, 2, 0, -2,  -5, -9,
484    -13, -17, -21, -26, -32, -26, -21, -17, -13, -9, -5,
485    -2, 0, 2, 5, 9, 13, 17, 21, 26, 32 };
486/** g_invAngTable = Inverse angle in Q5 format, required for negative angles */
487const WORD32 gai4_ihevc_inv_ang_table_chroma[14] = { 4096, 1638, 910, 630, 482, 390, 315,
488    315, 390, 482, 630, 910, 1638, 4096 };
489
490
491/** constant planar factor values table */
492const UWORD8 gau1_ihevc_planar_factor_chroma[33] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
493    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
494    21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
495    31, 32  };
496
497
498
499/** Filter flag values for intra pred referenece filtering - intra pred mode is the index
500*   flag for nt = 4 is the Bit 0, nt = 8 is Bit 1, nt = 16 is Bit 2, nt = 32 is Bit 3
501*/
502const UWORD8 gau1_intra_pred_ref_filter[] =
503{
504    14,  0, 14, 12, 12, 12, 12,
505    12, 12,  8,  0,  8, 12, 12,
506    12, 12, 12, 12, 14, 12, 12,
507    12, 12, 12, 12,  8,  0,  8,
508    12, 12, 12, 12, 12, 12, 14
509};
510
511
512const WORD8 gi1_table_edge_idx[8] = { 1, 2, 0, 3, 4, 0, 0, 0 }; /* First 5 values are valid. Last 3 dummy values are added to help SIMD load*/
513
514const UWORD8 gu1_table_band_idx[32] = {  0,  1,  2,  3,  4,  5,  6,  7,
515                                         8,  9, 10, 11, 12, 13, 14, 15,
516                                        16, 17, 18, 19, 20, 21, 22, 23,
517                                        24, 25, 26, 27, 28, 29, 30, 31
518};
519
520const UWORD16 gu2_table_band_idx[32] = {  0,  1,  2,  3,  4,  5,  6,  7,
521                                         8,  9, 10, 11, 12, 13, 14, 15,
522                                        16, 17, 18, 19, 20, 21, 22, 23,
523                                        24, 25, 26, 27, 28, 29, 30, 31
524};
525
526#ifdef ENABLE_SSE4_1_INTR
527/*Used as a lookup table to have popcnt instruction working for SSE4.1 platform.
528Each unit indicates number of 1s the index at which it is persent
529*/
530const WORD8   gi1_popcnt_byte_table[] =
531{
532    0,  1,  1,  2,  1,  2,  2,  3,  1,  2,  2,  3,  2,  3,  3,  4,
533    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,
534    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,
535    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
536    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,
537    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
538    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
539    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,
540    1,  2,  2,  3,  2,  3,  3,  4,  2,  3,  3,  4,  3,  4,  4,  5,
541    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
542    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
543    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,
544    2,  3,  3,  4,  3,  4,  4,  5,  3,  4,  4,  5,  4,  5,  5,  6,
545    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,
546    3,  4,  4,  5,  4,  5,  5,  6,  4,  5,  5,  6,  5,  6,  6,  7,
547    4,  5,  5,  6,  5,  6,  6,  7,  5,  6,  6,  7,  6,  7,  7,  8
548};
549#endif
550