/******************************************************************************
 *
 * 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_cabac_tables.h
*
* @brief
*  This file contains enumerations, macros and extern declarations of H264
*  cabac tables
*
* @author
*  Ittiam
*
* @remarks
*  none
******************************************************************************
*/

#ifndef IH264_CABAC_TABLES_H_
#define IH264_CABAC_TABLES_H_

/*****************************************************************************/
/* Constant Macros                                                           */
/*****************************************************************************/

/**
******************************************************************************
 *  @brief  maximum range of cabac_init_idc (0-2) + 1 for ISLICE
******************************************************************************
 */
#define NUM_CAB_INIT_IDC_PLUS_ONE 4

/**
******************************************************************************
 *  @brief  max range of qps in H264 (0-51)
******************************************************************************
 */
#define QP_RANGE        52

/**
******************************************************************************
 *  @brief  max range of cabac contexts in H264 (0-459)
******************************************************************************
 */
#define NUM_CABAC_CTXTS 460


/** Macros for Cabac checks */
/** MbType */
/** |x|x|I_PCM|SKIP|
 |S|Inter/Intra|P/B|NON-BD16x16/BD16x16,I16x16/I4x4| */
#define CAB_INTRA         0x00 /* 0000 00xx */
#define CAB_INTER         0x04 /* 0000 01xx */
#define CAB_I4x4          0x00 /* 0000 00x0 */
#define CAB_I16x16        0x01 /* 0000 00x1 */
#define CAB_BD16x16       0x04 /* 0000 0100 */
#define CAB_NON_BD16x16   0x05 /* 0000 0101 */
#define CAB_P             0x07 /* 0000 0111 */
#define CAB_SI4x4         0x08 /* 0000 10x0 */
#define CAB_SI16x16       0x09 /* 0000 10x1 */
#define CAB_SKIP_MASK     0x10 /* 0001 0000 */
#define CAB_SKIP          0x10 /* 0001 0000 */
#define CAB_P_SKIP        0x16 /* 0001 x11x */
#define CAB_B_SKIP        0x14 /* 0001 x100 */
#define CAB_BD16x16_MASK  0x07 /* 0000 0111 */
#define CAB_INTRA_MASK    0x04 /* 0000 0100 */
#define CAB_I_PCM         0x20 /* 001x xxxx */

/**
******************************************************************************
 *  @enum  ctxBlockCat

******************************************************************************
*/
typedef enum
{
    LUMA_DC_CTXCAT   = 0,
    LUMA_AC_CTXCAT   = 1,
    LUMA_4X4_CTXCAT  = 2,
    CHROMA_DC_CTXCAT = 3,
    CHROMA_AC_CTXCAT = 4,
    LUMA_8X8_CTXCAT  = 5,
    NUM_CTX_CAT      = 6
} CTX_BLOCK_CAT;


/**
******************************************************************************
 *  @enum ctxIdxOffset

******************************************************************************
*/
typedef enum
{
    MB_TYPE_SI_SLICE = 0,
    MB_TYPE_I_SLICE = 3,
    MB_SKIP_FLAG_P_SLICE = 11,
    MB_TYPE_P_SLICE = 14,
    SUB_MB_TYPE_P_SLICE = 21,
    MB_SKIP_FLAG_B_SLICE = 24,
    MB_TYPE_B_SLICE = 27,
    SUB_MB_TYPE_B_SLICE = 36,
    MVD_X = 40,
    MVD_Y = 47,
    REF_IDX = 54,
    MB_QP_DELTA = 60,
    INTRA_CHROMA_PRED_MODE = 64,
    PREV_INTRA4X4_PRED_MODE_FLAG = 68,
    REM_INTRA4X4_PRED_MODE = 69,
    MB_FIELD_DECODING_FLAG = 70,
    CBP_LUMA = 73,
    CBP_CHROMA = 77,
    CBF = 85,
    SIGNIFICANT_COEFF_FLAG_FRAME = 105,
    SIGNIFICANT_COEFF_FLAG_FLD = 277,
    LAST_SIGNIFICANT_COEFF_FLAG_FRAME = 166,
    LAST_SIGNIFICANT_COEFF_FLAG_FLD = 338,
    COEFF_ABS_LEVEL_MINUS1 = 227,

    /* High profile related Syntax element CABAC offsets */
    TRANSFORM_SIZE_8X8_FLAG = 399,
    SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 402,
    LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 417,
    COEFF_ABS_LEVEL_MINUS1_8X8 = 426,
    SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 436,
    LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 451

} cabac_table_num_t;


/**
******************************************************************************
 *  @enum  ctxIdxOffset

******************************************************************************
*/
typedef enum
{
    SIG_COEFF_CTXT_CAT_0_OFFSET = 0,
    SIG_COEFF_CTXT_CAT_1_OFFSET = 15,
    SIG_COEFF_CTXT_CAT_2_OFFSET = 29,
    SIG_COEFF_CTXT_CAT_3_OFFSET = 44,
    SIG_COEFF_CTXT_CAT_4_OFFSET = 47,
    SIG_COEFF_CTXT_CAT_5_OFFSET = 0,
    COEFF_ABS_LEVEL_CAT_0_OFFSET = 0,
    COEFF_ABS_LEVEL_CAT_1_OFFSET = 10,
    COEFF_ABS_LEVEL_CAT_2_OFFSET = 20,
    COEFF_ABS_LEVEL_CAT_3_OFFSET = 30,
    COEFF_ABS_LEVEL_CAT_4_OFFSET = 39,
    COEFF_ABS_LEVEL_CAT_5_OFFSET = 0
} cabac_blk_cat_offset_t;




/*****************************************************************************/
/* Extern global declarations                                                */
/*****************************************************************************/


/* CABAC Table declaration*/
extern const UWORD32 gau4_ih264_cabac_table[128][4];


/*****************************************************************************/
/* Cabac tables for context initialization depending upon type of Slice,     */
/* cabac init Idc value and Qp.                                              */
/*****************************************************************************/
extern const UWORD8 gau1_ih264_cabac_ctxt_init_table[NUM_CAB_INIT_IDC_PLUS_ONE][QP_RANGE][NUM_CABAC_CTXTS];


#endif /* IH264_CABAC_TABLES_H_ */