1 /******************************************************************************
2  *
3  * Copyright (C) 2015 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 * @file ih264_cabac_tables.h
24 *
25 * @brief
26 *  This file contains enumerations, macros and extern declarations of H264
27 *  cabac tables
28 *
29 * @author
30 *  Ittiam
31 *
32 * @remarks
33 *  none
34 ******************************************************************************
35 */
36 
37 #ifndef IH264_CABAC_TABLES_H_
38 #define IH264_CABAC_TABLES_H_
39 
40 /*****************************************************************************/
41 /* Constant Macros                                                           */
42 /*****************************************************************************/
43 
44 /**
45 ******************************************************************************
46  *  @brief  maximum range of cabac_init_idc (0-2) + 1 for ISLICE
47 ******************************************************************************
48  */
49 #define NUM_CAB_INIT_IDC_PLUS_ONE 4
50 
51 /**
52 ******************************************************************************
53  *  @brief  max range of qps in H264 (0-51)
54 ******************************************************************************
55  */
56 #define QP_RANGE        52
57 
58 /**
59 ******************************************************************************
60  *  @brief  max range of cabac contexts in H264 (0-459)
61 ******************************************************************************
62  */
63 #define NUM_CABAC_CTXTS 460
64 
65 
66 /** Macros for Cabac checks */
67 /** MbType */
68 /** |x|x|I_PCM|SKIP|
69  |S|Inter/Intra|P/B|NON-BD16x16/BD16x16,I16x16/I4x4| */
70 #define CAB_INTRA         0x00 /* 0000 00xx */
71 #define CAB_INTER         0x04 /* 0000 01xx */
72 #define CAB_I4x4          0x00 /* 0000 00x0 */
73 #define CAB_I16x16        0x01 /* 0000 00x1 */
74 #define CAB_BD16x16       0x04 /* 0000 0100 */
75 #define CAB_NON_BD16x16   0x05 /* 0000 0101 */
76 #define CAB_P             0x07 /* 0000 0111 */
77 #define CAB_SI4x4         0x08 /* 0000 10x0 */
78 #define CAB_SI16x16       0x09 /* 0000 10x1 */
79 #define CAB_SKIP_MASK     0x10 /* 0001 0000 */
80 #define CAB_SKIP          0x10 /* 0001 0000 */
81 #define CAB_P_SKIP        0x16 /* 0001 x11x */
82 #define CAB_B_SKIP        0x14 /* 0001 x100 */
83 #define CAB_BD16x16_MASK  0x07 /* 0000 0111 */
84 #define CAB_INTRA_MASK    0x04 /* 0000 0100 */
85 #define CAB_I_PCM         0x20 /* 001x xxxx */
86 
87 /**
88 ******************************************************************************
89  *  @enum  ctxBlockCat
90 
91 ******************************************************************************
92 */
93 typedef enum
94 {
95     LUMA_DC_CTXCAT   = 0,
96     LUMA_AC_CTXCAT   = 1,
97     LUMA_4X4_CTXCAT  = 2,
98     CHROMA_DC_CTXCAT = 3,
99     CHROMA_AC_CTXCAT = 4,
100     LUMA_8X8_CTXCAT  = 5,
101     NUM_CTX_CAT      = 6
102 } CTX_BLOCK_CAT;
103 
104 
105 /**
106 ******************************************************************************
107  *  @enum ctxIdxOffset
108 
109 ******************************************************************************
110 */
111 typedef enum
112 {
113     MB_TYPE_SI_SLICE = 0,
114     MB_TYPE_I_SLICE = 3,
115     MB_SKIP_FLAG_P_SLICE = 11,
116     MB_TYPE_P_SLICE = 14,
117     SUB_MB_TYPE_P_SLICE = 21,
118     MB_SKIP_FLAG_B_SLICE = 24,
119     MB_TYPE_B_SLICE = 27,
120     SUB_MB_TYPE_B_SLICE = 36,
121     MVD_X = 40,
122     MVD_Y = 47,
123     REF_IDX = 54,
124     MB_QP_DELTA = 60,
125     INTRA_CHROMA_PRED_MODE = 64,
126     PREV_INTRA4X4_PRED_MODE_FLAG = 68,
127     REM_INTRA4X4_PRED_MODE = 69,
128     MB_FIELD_DECODING_FLAG = 70,
129     CBP_LUMA = 73,
130     CBP_CHROMA = 77,
131     CBF = 85,
132     SIGNIFICANT_COEFF_FLAG_FRAME = 105,
133     SIGNIFICANT_COEFF_FLAG_FLD = 277,
134     LAST_SIGNIFICANT_COEFF_FLAG_FRAME = 166,
135     LAST_SIGNIFICANT_COEFF_FLAG_FLD = 338,
136     COEFF_ABS_LEVEL_MINUS1 = 227,
137 
138     /* High profile related Syntax element CABAC offsets */
139     TRANSFORM_SIZE_8X8_FLAG = 399,
140     SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 402,
141     LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 417,
142     COEFF_ABS_LEVEL_MINUS1_8X8 = 426,
143     SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 436,
144     LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 451
145 
146 } cabac_table_num_t;
147 
148 
149 /**
150 ******************************************************************************
151  *  @enum  ctxIdxOffset
152 
153 ******************************************************************************
154 */
155 typedef enum
156 {
157     SIG_COEFF_CTXT_CAT_0_OFFSET = 0,
158     SIG_COEFF_CTXT_CAT_1_OFFSET = 15,
159     SIG_COEFF_CTXT_CAT_2_OFFSET = 29,
160     SIG_COEFF_CTXT_CAT_3_OFFSET = 44,
161     SIG_COEFF_CTXT_CAT_4_OFFSET = 47,
162     SIG_COEFF_CTXT_CAT_5_OFFSET = 0,
163     COEFF_ABS_LEVEL_CAT_0_OFFSET = 0,
164     COEFF_ABS_LEVEL_CAT_1_OFFSET = 10,
165     COEFF_ABS_LEVEL_CAT_2_OFFSET = 20,
166     COEFF_ABS_LEVEL_CAT_3_OFFSET = 30,
167     COEFF_ABS_LEVEL_CAT_4_OFFSET = 39,
168     COEFF_ABS_LEVEL_CAT_5_OFFSET = 0
169 } cabac_blk_cat_offset_t;
170 
171 
172 
173 
174 /*****************************************************************************/
175 /* Extern global declarations                                                */
176 /*****************************************************************************/
177 
178 
179 /* CABAC Table declaration*/
180 extern const UWORD32 gau4_ih264_cabac_table[128][4];
181 
182 
183 /*****************************************************************************/
184 /* Cabac tables for context initialization depending upon type of Slice,     */
185 /* cabac init Idc value and Qp.                                              */
186 /*****************************************************************************/
187 extern const UWORD8 gau1_ih264_cabac_ctxt_init_table[NUM_CAB_INIT_IDC_PLUS_ONE][QP_RANGE][NUM_CABAC_CTXTS];
188 
189 
190 #endif /* IH264_CABAC_TABLES_H_ */
191