/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/

/**
*******************************************************************************
* @file
*  ih264_common_tables.c
*
* @brief
*  Contains common global tables
*
* @author
*  ittiam
*
* @remarks
*  none
*
*******************************************************************************
*/

/*****************************************************************************/
/* File Includes                                                             */
/*****************************************************************************/

/* User Include Files */
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_defs.h"
#include "ih264_structs.h"
#include "ih264_common_tables.h"


/*****************************************************************************/
/* Global definitions                                                        */
/*****************************************************************************/

/**
******************************************************************************
* @brief  while encoding, basing on the input configuration parameters, the
*  the level of the bitstream is computed basing on the table below.
* input  : table_idx
* output : level_idc or cpb size
* @remarks Table A-1 - level table limits
******************************************************************************
*/
const level_tables_t gas_ih264_lvl_tbl[16] =
{
    { IH264_LEVEL_10,    1485,       99,         297,       64,         175,         64  },
    { IH264_LEVEL_1B,    1485,       99,         297,       128,        350,         64  },
    { IH264_LEVEL_11,    3000,       396,        675,       192,        500,         128 },
    { IH264_LEVEL_12,    6000,       396,        1782,      384,        1000,        128 },
    { IH264_LEVEL_13,    11880,      396,        1782,      768,        2000,        128 },
    { IH264_LEVEL_20,    11880,      396,        1782,      2000,       2000,        128 },
    { IH264_LEVEL_21,    19800,      792,        3564,      4000,       4000,        256 },
    { IH264_LEVEL_22,    20250,      1620,       6075,      4000,       4000,        256 },
    { IH264_LEVEL_30,    40500,      1620,       6075,      10000,      10000,       256 },
    { IH264_LEVEL_31,    108000,     3600,       13500,     14000,      14000,       512 },
    { IH264_LEVEL_32,    216000,     5120,       15360,     20000,      20000,       512 },
    { IH264_LEVEL_40,    245760,     8192,       24576,     20000,      25000,       512 },
    { IH264_LEVEL_41,    245760,     8192,       24576,     50000,      62500,       512 },
    { IH264_LEVEL_42,    522240,     8704,       26112,     50000,      62500,       512 },
    { IH264_LEVEL_50,    589824,     22080,      82800,     135000,     135000,      512 },
    { IH264_LEVEL_51,    983040,     36864,      138240,    240000,     240000,      512 },
};

/* Array containing supported levels */
const WORD32 gai4_ih264_levels[] =
{
    IH264_LEVEL_10,
    IH264_LEVEL_11,
    IH264_LEVEL_12,
    IH264_LEVEL_13,
    IH264_LEVEL_20,
    IH264_LEVEL_21,
    IH264_LEVEL_22,
    IH264_LEVEL_30,
    IH264_LEVEL_31,
    IH264_LEVEL_32,
    IH264_LEVEL_40,
    IH264_LEVEL_41,
    IH264_LEVEL_42,
    IH264_LEVEL_50,
    IH264_LEVEL_51,
};

/* Array giving size of max luma samples in a picture for a given level */
const WORD32 gai4_ih264_max_luma_pic_size[] =
{
    /* Level 1 */
    25344,
    /* Level 1.1 */
    101376,
    /* Level 1.2 */
    101376,
    /* Level 1.3 */
    101376,
    /* Level 2 */
    101376,
    /* Level 2.1 */
    202752,
    /* Level 2.2 */
    414720,
    /* Level 3 */
    414720,
    /* Level 3.1 */
    921600,
    /* Level 3.2 */
    1310720,
    /* Level 4 */
    2097152,
    /* Level 4.1 */
    2097152,
    /* Level 4.2 */
    2228224,
    /* Level 5 */
    5652480,
    /* Level 5.1 */
    9437184
};

/* Max width and height allowed for a given level */
/* This is derived as SQRT(8 * gai4_ih264_max_luma_pic_size[]) */
const WORD32 gai4_ih264_max_wd_ht[] =
{
    /* Level 1 */
    451,
    /* Level 1.1 */
    901,
    /* Level 1.2 */
    901,
    /* Level 1.3 */
    901,
    /* Level 2 */
    901,
    /* Level 2.1 */
    1274,
    /* Level 2.2 */
    1822,
    /* Level 3 */
    1822,
    /* Level 3.1 */
    2716,
    /* Level 3.2 */
    3239,
    /* Level 4 */
    4096,
    /* Level 4.1 */
    4096,
    /* Level 4.2 */
    4223,
    /* Level 5 */
    6725,
    /* Level 5.1 */
    8689
};

/* Min width and height allowed for a given level */
/* This is derived as gai4_ih264_max_luma_pic_size[]/gai4_ih264_max_wd_ht[] */
const WORD32 gai4_ih264_min_wd_ht[] =
{
    /* Level 1 */
    57,
    /* Level 1.1 */
    113,
    /* Level 1.2 */
    113,
    /* Level 1.3 */
    113,
    /* Level 2 */
    113,
    /* Level 2.1 */
    160,
    /* Level 2.2 */
    228,
    /* Level 3 */
    228,
    /* Level 3.1 */
    340,
    /* Level 3.2 */
    405,
    /* Level 4 */
    512,
    /* Level 4.1 */
    512,
    /* Level 4.2 */
    528,
    /* Level 5 */
    841,
    /* Level 5.1 */
    1087

};

/* Table 7-11 Macroblock types for I slices */
intra_mbtype_info_t gas_ih264_i_mbtype_info[] =
{
    /* For first entry, if transform_size_8x8_flag is 1, mode will be MBPART_I8x8 */
    /* This has to be taken care while accessing the table */
    {0, MBPART_I4x4,   VERT_I16x16,     0,  0},
    {0, MBPART_I16x16, VERT_I16x16,     0,  0},
    {0, MBPART_I16x16, HORZ_I16x16,     0,  0},
    {0, MBPART_I16x16, DC_I16x16,       0,  0},
    {0, MBPART_I16x16, PLANE_I16x16,    0,  0},
    {0, MBPART_I16x16, VERT_I16x16,     1,  0},
    {0, MBPART_I16x16, HORZ_I16x16,     1,  0},
    {0, MBPART_I16x16, DC_I16x16,       1,  0},
    {0, MBPART_I16x16, PLANE_I16x16,    1,  0},
    {0, MBPART_I16x16, VERT_I16x16,     2,  0},
    {0, MBPART_I16x16, HORZ_I16x16,     2,  0},
    {0, MBPART_I16x16, DC_I16x16,       2,  0},
    {0, MBPART_I16x16, PLANE_I16x16,    2,  0},
    {0, MBPART_I16x16, VERT_I16x16,     0,  15},
    {0, MBPART_I16x16, HORZ_I16x16,     0,  15},
    {0, MBPART_I16x16, DC_I16x16,       0,  15},
    {0, MBPART_I16x16, PLANE_I16x16,    0,  15},
    {0, MBPART_I16x16, VERT_I16x16,     1,  15},
    {0, MBPART_I16x16, HORZ_I16x16,     1,  15},
    {0, MBPART_I16x16, DC_I16x16,       1,  15},
    {0, MBPART_I16x16, PLANE_I16x16,    1,  15},
    {0, MBPART_I16x16, VERT_I16x16,     2,  15},
    {0, MBPART_I16x16, HORZ_I16x16,     2,  15},
    {0, MBPART_I16x16, DC_I16x16,       2,  15},
    {0, MBPART_I16x16, PLANE_I16x16,    2,  15},
    {0, MBPART_IPCM,   VERT_I16x16,     0,  0}
};

/* Table 7-13 Macroblock types for P slices */
inter_mbtype_info_t gas_ih264_p_mbtype_info[] =
{
    {1, MBPART_L0,  MBPART_NA,  16, 16},
    {2, MBPART_L0,  MBPART_L0,  16, 8},
    {2, MBPART_L0,  MBPART_L0,  8,  16},
    {4, MBPART_NA,  MBPART_NA,  8,  8},
    {4, MBPART_NA,  MBPART_NA,  8,  8},
};

/* Table 7-14 Macroblock types for B slices */
inter_mbtype_info_t gas_ih264_b_mbtype_info[] =
{
    {0, MBPART_DIRECT,  MBPART_NA,  8,  8,  },
    {1, MBPART_L0,      MBPART_NA,  16, 16, },
    {1, MBPART_L1,      MBPART_NA,  16, 16, },
    {1, MBPART_BI,      MBPART_NA,  16, 16, },
    {2, MBPART_L0,      MBPART_L0,  16, 8,  },
    {2, MBPART_L0,      MBPART_L0,  8,  16, },
    {2, MBPART_L1,      MBPART_L1,  16, 8,  },
    {2, MBPART_L1,      MBPART_L1,  8,  16, },
    {2, MBPART_L0,      MBPART_L1,  16, 8,  },
    {2, MBPART_L0,      MBPART_L1,  8,  16, },
    {2, MBPART_L1,      MBPART_L0,  16, 8,  },
    {2, MBPART_L1,      MBPART_L0,  8,  16, },
    {2, MBPART_L0,      MBPART_BI,  16, 8,  },
    {2, MBPART_L0,      MBPART_BI,  8,  16, },
    {2, MBPART_L1,      MBPART_BI,  16, 8,  },
    {2, MBPART_L1,      MBPART_BI,  8,  16, },
    {2, MBPART_BI,      MBPART_L0,  16, 8,  },
    {2, MBPART_BI,      MBPART_L0,  8,  16, },
    {2, MBPART_BI,      MBPART_L1,  16, 8,  },
    {2, MBPART_BI,      MBPART_L1,  8,  16, },
    {2, MBPART_BI,      MBPART_BI,  16, 8,  },
    {2, MBPART_BI,      MBPART_BI,  8,  16, },
    {4, MBPART_NA,      MBPART_NA,  8,  8,  },
};

/* Table 7-17 - Sub-macroblock types in P macroblocks */
submbtype_info_t gas_ih264_p_submbtype_info[] =
{
   {1, MBPART_L0, 8,  8},
   {2, MBPART_L0, 8,  4},
   {2, MBPART_L0, 4,  8},
   {4, MBPART_L0, 4,  4},
};

/* Table 7-18 - Sub-macroblock types in B macroblocks */
submbtype_info_t gas_ih264_b_submbtype_info[] =
{
    {4, MBPART_DIRECT,  4,  4},
    {1, MBPART_L0,      8,  8},
    {1, MBPART_L1,      8,  8},
    {1, MBPART_BI,      8,  8},
    {2, MBPART_L0,      8,  4},
    {2, MBPART_L0,      4,  8},
    {2, MBPART_L1,      8,  4},
    {2, MBPART_L1,      4,  8},
    {2, MBPART_BI,      8,  4},
    {2, MBPART_BI,      4,  8},
    {4, MBPART_L0,      4,  4},
    {4, MBPART_L1,      4,  4},
    {4, MBPART_BI,      4,  4},
};

const UWORD8 gau1_ih264_inv_scan_prog4x4[] =
{
    0,   1,  4,  8,
    5,   2,  3,  6,
    9,  12, 13, 10,
    7,  11, 14, 15
};

const UWORD8 gau1_ih264_inv_scan_int4x4[] =
{
     0, 4,  1,  8,
    12, 5,  9,  13,
     2, 6, 10,  14,
     3, 7, 11,  15
};

/* Inverse scan tables for individual 4x4 blocks of 8x8 transform coeffs of CAVLC */
/* progressive */
const UWORD8 gau1_ih264_inv_scan_prog8x8_cavlc[64] =
{
     0,  9, 17, 18, 12, 40, 27,  7,
    35, 57, 29, 30, 58, 38, 53, 47,
     1,  2, 24, 11, 19, 48, 20, 14,
    42, 50, 22, 37, 59, 31, 60, 55,
     8,  3, 32,  4, 26, 41, 13, 21,
    49, 43, 15, 44, 52, 39, 61, 62,
    16, 10, 25,  5, 33, 34,  6, 28,
    56, 36, 23, 51, 45, 46, 54, 63
};
/* interlace */
const UWORD8 gau1_ih264_inv_scan_int8x8_cavlc[64] =
{
     0,  9,  2, 56, 18, 26, 34, 27,
    35, 28, 36, 29, 45,  7, 54, 39,
     8, 24, 25, 33, 41, 11, 42, 12,
    43, 13, 44, 14, 53, 15, 62, 47,
    16, 32, 40, 10, 49,  4, 50,  5,
    51,  6, 52, 22, 61, 38, 23, 55,
     1, 17, 48,  3, 57, 19, 58, 20,
    59, 21, 60, 37, 30, 46, 31, 63
};

/*Inverse scan tables for individual 8x8 blocks of 8x8 transform coeffs of CABAC */
/* progressive */
const UWORD8 gau1_ih264_inv_scan_prog8x8_cabac[64] =
{
     0,  1,  8, 16,  9, 2,   3, 10,
    17, 24, 32, 25, 18, 11,  4,  5,
    12, 19, 26, 33, 40, 48, 41, 34,
    27, 20, 13,  6,  7, 14, 21, 28,
    35, 42, 49, 56, 57, 50, 43, 36,
    29, 22, 15, 23, 30, 37, 44, 51,
    58, 59, 52, 45, 38, 31, 39, 46,
    53, 60, 61, 54, 47, 55, 62, 63
};
/* interlace */
const UWORD8 gau1_ih264_inv_scan_int8x8_cabac[64] =
{
     0,  8, 16,  1,  9, 24, 32, 17,
     2, 25, 40, 48, 56, 33, 10, 3,
    18, 41, 49, 57, 26, 11,  4, 19,
    34, 42, 50, 58, 27, 12,  5, 20,
    35, 43, 51, 59, 28, 13,  6, 21,
    36, 44, 52, 60, 29, 14, 22, 37,
    45, 53, 61, 30,  7, 15, 38, 46,
    54, 62, 23, 31, 39, 47, 55, 63
};

const UWORD8 *const gpau1_ih264_inv_scan8x8[] =
{
     gau1_ih264_inv_scan_prog8x8_cavlc,
     gau1_ih264_inv_scan_int8x8_cavlc,
     gau1_ih264_inv_scan_prog8x8_cabac,
     gau1_ih264_inv_scan_int8x8_cabac
};

const UWORD8 *const gpau1_ih264_inv_scan4x4[] =
{
     gau1_ih264_inv_scan_prog4x4,
     gau1_ih264_inv_scan_int4x4,
};

const UWORD8 gau1_ih264_8x8_subblk_idx[] =
{
      0,    1,   4,  5,
      2,    3,   6,  7,
      8,    9,  12, 13,
     10,   11,  14, 15
};

/* Table 8-15 Chroma QP offset table */
const UWORD8 gau1_ih264_chroma_qp[] =
{
      0,  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, 29, 29, 30,
     31, 32, 32, 33, 34, 34, 35, 35,
     36, 36, 37, 37, 37, 38, 38, 38,
     39, 39, 39, 39
};

/**
******************************************************************************
* @brief  look up table to compute neigbour availability of 4x4 blocks
* input  : subblk idx, mb neighbor availability
* output : sub blk neighbor availability
* @remarks
******************************************************************************
*/
const UWORD8 gau1_ih264_4x4_ngbr_avbl[16][16] =
{
    {  0x0, 0x1, 0xc, 0x7, 0x1, 0x1, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x1, 0x1, 0xf, 0x7, 0x1, 0x1, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x2, 0x1, 0xc, 0x7, 0x1, 0x1, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x3, 0x1, 0xf, 0x7, 0x1, 0x1, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },

    {  0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xd, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xe, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },

    {  0x0, 0x1, 0xc, 0x7, 0x1, 0x9, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x1, 0x1, 0xf, 0x7, 0x1, 0x9, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x2, 0x1, 0xc, 0x7, 0x1, 0x9, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0x3, 0x1, 0xf, 0x7, 0x1, 0x9, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },

    {  0xc, 0xf, 0xc, 0x7, 0xf, 0xf, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xd, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xe, 0xf, 0xc, 0x7, 0xf, 0xf, 0xf, 0x7, 0xc, 0xf, 0xc, 0x7, 0xf, 0x7, 0xf, 0x7 },
    {  0xf, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0xf, 0xf, 0x7, 0xf, 0x7, 0xf, 0x7 },
};


/**
******************************************************************************
* @brief  look up table to compute neigbour availability of 8x8 blocks
* input  : subblk idx, mb neighbor availability
* output : sub blk neighbor availability
* @remarks
******************************************************************************
*/
const UWORD8 gau1_ih264_8x8_ngbr_avbl[16][4] =
{
    {  0x0, 0x1, 0xc, 0x7 },
    {  0x1, 0x1, 0xf, 0x7 },
    {  0x2, 0x1, 0xc, 0x7 },
    {  0x3, 0x1, 0xf, 0x7 },

    {  0xc, 0x7, 0xc, 0x7 },
    {  0xd, 0x7, 0xf, 0x7 },
    {  0xe, 0x7, 0xc, 0x7 },
    {  0xf, 0x7, 0xf, 0x7 },

    {  0x0, 0x9, 0xc, 0x7 },
    {  0x1, 0x9, 0xf, 0x7 },
    {  0x2, 0x9, 0xc, 0x7 },
    {  0x3, 0x9, 0xf, 0x7 },

    {  0xc, 0xf, 0xc, 0x7 },
    {  0xd, 0xf, 0xf, 0x7 },
    {  0xe, 0xf, 0xc, 0x7 },
    {  0xf, 0xf, 0xf, 0x7 },
};

/* Table 7-3 Default intra 4x4 scaling list */
const UWORD16 gau2_ih264_default_intra4x4_scaling_list[] =
{
     6, 13, 13, 20,
    20, 20, 28, 28,
    28, 28, 32, 32,
    32, 37, 37, 42
};

/* Table 7-3 Default inter 4x4 scaling list */
const UWORD16 gau2_ih264_default_inter4x4_scaling_list[] =
{
    10, 14, 14, 20,
    20, 20, 24, 24,
    24, 24, 27, 27,
    27, 30, 30, 34
};

/* Inverse scanned output of gau2_ih264_default_intra4x4_scaling_list */
const UWORD16 gau2_ih264_default_intra4x4_weight_scale[] =
{
     6, 13, 20, 28,
    13, 20, 28, 32,
    20, 28, 32, 37,
    28, 32, 37, 42
};

/* Inverse scanned output of gau2_ih264_default_inter4x4_scaling_list */
const UWORD16 gau2_ih264_default_inter4x4_weight_scale[] =
{
     10, 14, 20, 24,
     14, 20, 24, 27,
     20, 24, 27, 30,
     24, 27, 30, 34
};

/* Table 7-4 Default intra 8x8 scaling list */
const UWORD16 gau2_ih264_default_intra8x8_scaling_list[] =
{
     6, 10, 10, 13, 11, 13, 16, 16,
    16, 16, 18, 18, 18, 18, 18, 23,
    23, 23, 23, 23, 23, 25, 25, 25,
    25, 25, 25, 25, 27, 27, 27, 27,
    27, 27, 27, 27, 29, 29, 29, 29,
    29, 29, 29, 31, 31, 31, 31, 31,
    31, 33, 33, 33, 33, 33, 36, 36,
    36, 36, 38, 38, 38, 40, 40, 42
};

/* Table 7-4 Default inter 8x8 scaling list */
const UWORD16 gau2_ih264_default_inter8x8_scaling_list[] =
{
    9,  13, 13, 15, 13, 15, 17, 17,
    17, 17, 19, 19, 19, 19, 19, 21,
    21, 21, 21, 21, 21, 22, 22, 22,
    22, 22, 22, 22, 24, 24, 24, 24,
    24, 24, 24, 24, 25, 25, 25, 25,
    25, 25, 25, 27, 27, 27, 27, 27,
    27, 28, 28, 28, 28, 28, 30, 30,
    30, 30, 32, 32, 32, 33, 33, 35
};

/* Inverse scanned output of gau2_ih264_default_intra8x8_scaling_list */
const UWORD16 gau2_ih264_default_intra8x8_weight_scale[] =
{
     6, 10, 13, 16, 18, 23, 25, 27,
    10, 11, 16, 18, 23, 25, 27, 29,
    13, 16, 18, 23, 25, 27, 29, 31,
    16, 18, 23, 25, 27, 29, 31, 33,
    18, 23, 25, 27, 29, 31, 33, 36,
    23, 25, 27, 29, 31, 33, 36, 38,
    25, 27, 29, 31, 33, 36, 38, 40,
    27, 29, 31, 33, 36, 38, 40, 42
};

/* Inverse scanned output of gau2_ih264_default_inter8x8_scaling_list */
const UWORD16 gau2_ih264_default_inter8x8_weight_scale[] =
{
     9, 13, 15, 17, 19, 21, 22, 24,
    13, 13, 17, 19, 21, 22, 24, 25,
    15, 17, 19, 21, 22, 24, 25, 27,
    17, 19, 21, 22, 24, 25, 27, 28,
    19, 21, 22, 24, 25, 27, 28, 30,
    21, 22, 24, 25, 27, 28, 30, 32,
    22, 24, 25, 27, 28, 30, 32, 33,
    24, 25, 27, 28, 30, 32, 33, 35
};
/* Eq 7-8 Flat scaling matrix for 4x4 */
const UWORD16 gau2_ih264_flat_4x4_weight_scale[] =
{
    16, 16, 16, 16,
    16, 16, 16, 16,
    16, 16, 16, 16,
    16, 16, 16, 16
};

/* Eq 7-9 Flat scaling matrix for 8x8 */
const UWORD16 gau2_ih264_flat_8x8_weight_scale[] =
{
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16
};

/**
******************************************************************************
* @brief  Scale Table for inverse quantizing 4x4 subblock. To inverse quantize
* a given 4x4 quantized block, the coefficient at index location (i,j) is scaled
* by one of the constants in this table and right shift the result by abs (4 -
* floor(qp/6)), here qp is the quantization parameter used to quantize the mb.
*
* input   : 16 * qp%6, index location (i,j)
* output  : scale constant.
*
* @remarks 16 constants for each index position of the subblock and 6 for each
* qp%6 in the range 0-5 inclusive.
******************************************************************************
*/
const UWORD16 gau2_ih264_iquant_scale_matrix_4x4[96] =
{
      10,  13,  10,  13,
      13,  16,  13,  16,
      10,  13,  10,  13,
      13,  16,  13,  16,

      11,  14,  11,  14,
      14,  18,  14,  18,
      11,  14,  11,  14,
      14,  18,  14,  18,

      13,  16,  13,  16,
      16,  20,  16,  20,
      13,  16,  13,  16,
      16,  20,  16,  20,

      14,  18,  14,  18,
      18,  23,  18,  23,
      14,  18,  14,  18,
      18,  23,  18,  23,

      16,  20,  16,  20,
      20,  25,  20,  25,
      16,  20,  16,  20,
      20,  25,  20,  25,

      18,  23,  18,  23,
      23,  29,  23,  29,
      18,  23,  18,  23,
      23,  29,  23,  29,

};

/**
******************************************************************************
* @brief  Scale Table for inverse quantizing 8x8 subblock. To inverse quantize
* a given 8x8 quantized block, the coefficient at index location (i,j) is scaled
* by one of the constants in this table and right shift the result by abs (4 -
* floor(qp/6)), here qp is the quantization parameter used to quantize the mb.
*
* input   : qp%6, index location (i,j)
* output  : scale constant.
*
* @remarks 64 constants for each index position of the subblock and 6 for each
* qp%6 in the range 0-5 inclusive.
******************************************************************************
*/
const UWORD16 gau2_ih264_iquant_scale_matrix_8x8 [384] =
{
      20,  19,  25,  19,  20,  19,  25,  19,
      19,  18,  24,  18,  19,  18,  24,  18,
      25,  24,  32,  24,  25,  24,  32,  24,
      19,  18,  24,  18,  19,  18,  24,  18,
      20,  19,  25,  19,  20,  19,  25,  19,
      19,  18,  24,  18,  19,  18,  24,  18,
      25,  24,  32,  24,  25,  24,  32,  24,
      19,  18,  24,  18,  19,  18,  24,  18,

      22,  21,  28,  21,  22,  21,  28,  21,
      21,  19,  26,  19,  21,  19,  26,  19,
      28,  26,  35,  26,  28,  26,  35,  26,
      21,  19,  26,  19,  21,  19,  26,  19,
      22,  21,  28,  21,  22,  21,  28,  21,
      21,  19,  26,  19,  21,  19,  26,  19,
      28,  26,  35,  26,  28,  26,  35,  26,
      21,  19,  26,  19,  21,  19,  26,  19,

      26,  24,  33,  24,  26,  24,  33,  24,
      24,  23,  31,  23,  24,  23,  31,  23,
      33,  31,  42,  31,  33,  31,  42,  31,
      24,  23,  31,  23,  24,  23,  31,  23,
      26,  24,  33,  24,  26,  24,  33,  24,
      24,  23,  31,  23,  24,  23,  31,  23,
      33,  31,  42,  31,  33,  31,  42,  31,
      24,  23,  31,  23,  24,  23,  31,  23,

      28,  26,  35,  26,  28,  26,  35,  26,
      26,  25,  33,  25,  26,  25,  33,  25,
      35,  33,  45,  33,  35,  33,  45,  33,
      26,  25,  33,  25,  26,  25,  33,  25,
      28,  26,  35,  26,  28,  26,  35,  26,
      26,  25,  33,  25,  26,  25,  33,  25,
      35,  33,  45,  33,  35,  33,  45,  33,
      26,  25,  33,  25,  26,  25,  33,  25,

      32,  30,  40,  30,  32,  30,  40,  30,
      30,  28,  38,  28,  30,  28,  38,  28,
      40,  38,  51,  38,  40,  38,  51,  38,
      30,  28,  38,  28,  30,  28,  38,  28,
      32,  30,  40,  30,  32,  30,  40,  30,
      30,  28,  38,  28,  30,  28,  38,  28,
      40,  38,  51,  38,  40,  38,  51,  38,
      30,  28,  38,  28,  30,  28,  38,  28,

      36,  34,  46,  34,  36,  34,  46,  34,
      34,  32,  43,  32,  34,  32,  43,  32,
      46,  43,  58,  43,  46,  43,  58,  43,
      34,  32,  43,  32,  34,  32,  43,  32,
      36,  34,  46,  34,  36,  34,  46,  34,
      34,  32,  43,  32,  34,  32,  43,  32,
      46,  43,  58,  43,  46,  43,  58,  43,
      34,  32,  43,  32,  34,  32,  43,  32,

};
