Home | History | Annotate | Download | only in common
      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  */
     79 const 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[]) */
    110 const 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[] */
    142 const 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 */
    178 const 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 
    182 const 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 
    186 const 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 
    189 const WORD8 idx_neg_vals_3_9[7] =
    190     { 26, 21, 17, 13, 9, 5, 2 };
    191 
    192 const 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 
    197 const 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 };
    205 const 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 
    209 const 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 */
    222 const 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  */
    231 const 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  */
    271 const 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  */
    299 const 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 
    322 const 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  */
    362 const 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  */
    390 const 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  */
    412 const 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 
    428 const 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)
    447 const 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, 10 and 12 bit)
    457 const WORD8 gai1_ihevc_chroma_qp_scale[82]=  //EXTENDED for 12 bit
    458 {
    459   -24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,
    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 */
    469 const 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
    477 const 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 */
    483 const 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 */
    487 const 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 */
    492 const 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 */
    502 const 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 
    512 const 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 
    514 const 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 
    520 const 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.
    528 Each unit indicates number of 1s the index at which it is persent
    529 */
    530 const 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