• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ******************************************************************************
21 * @file ihevcd_cabac.h
22 *
23 * @brief
24 *  This file contains decoder cabac engine related structures and
25 *  interface prototypes
26 *
27 * @author
28 *  Ittiam
29 ******************************************************************************
30 */
31 
32 #ifndef _IHEVCD_CABAC_H_
33 #define _IHEVCD_CABAC_H_
34 
35 #include "ihevc_typedefs.h"
36 /*****************************************************************************/
37 /* Constant Macros                                                           */
38 /*****************************************************************************/
39 /**
40 *******************************************************************************
41 @brief
42 *******************************************************************************
43  */
44 #define CABAC_BITS  9
45 
46 /**
47  * Following definitions control whether cabac functions are inlined as macros or
48  * are called as functions. Set these to 0 to debug cabac leaf level functions
49  * Note these macros assume FULLRANGE is 1.
50  */
51 #define CABAC_DECODE_BIN            1
52 #define CABAC_DECODE_BYPASS_BIN     1
53 #define CABAC_DECODE_BYPASS_BINS    1
54 
55 /*****************************************************************************/
56 /* Function Macros                                                           */
57 /*****************************************************************************/
58 #if CABAC_DECODE_BIN
59 #define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index)       \
60 {                                                                               \
61     UWORD32 u4_range = ps_cabac->u4_range;                                      \
62     UWORD32 u4_ofst = ps_cabac->u4_ofst;                                        \
63     UWORD32 u4_rlps;                                                            \
64     UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index];            \
65     WORD32 state_mps = *pu1_ctxt_model;                                         \
66     WORD32 clz;                                                                 \
67     UWORD32 u4_qnt_range;                                                       \
68                                                                                 \
69     /* Sanity checks */                                                         \
70     ASSERT(FULLRANGE == 1);                                                     \
71     ASSERT(u4_range >= 256);                                                    \
72     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));             \
73     ASSERT(state_mps < 128);                                                    \
74     clz = CLZ(u4_range);                                                        \
75     clz -= (32 - RANGE_NUMBITS);                                                \
76     u4_qnt_range = u4_range << clz;                                             \
77     u4_qnt_range = (u4_qnt_range >> (RANGE_SHIFT + 6)) & 0x3;                   \
78     /* Get the lps range from LUT based on quantized range and state */         \
79     u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][u4_qnt_range];              \
80     u4_rlps = u4_rlps << (RANGE_SHIFT - clz);                                   \
81     u4_range -= u4_rlps;                                                        \
82                                                                                 \
83     u4_bin = state_mps & 1;                                                     \
84                                                                                 \
85     if(u4_ofst >= u4_range)                                                     \
86     {                                                                           \
87         u4_bin = 1 - u4_bin;                                                    \
88         u4_ofst -= u4_range;                                                    \
89         u4_range = u4_rlps;                                                     \
90     }                                                                           \
91                                                                                 \
92     *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | u4_bin];         \
93                                                                                 \
94     /*****************************************************************/         \
95     /* Re-normalization; calculate bits generated based on range(R)  */         \
96     /*****************************************************************/         \
97     if(u4_range < (1 << 8))                                                     \
98     {                                                                           \
99         UWORD32 u4_bits;                                                        \
100         WORD32 numbits;                                                         \
101         numbits = CLZ(u4_range);                                                \
102         numbits -= (32 - RANGE_NUMBITS);                                        \
103         BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,         \
104                  ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits);    \
105                                                                                 \
106         u4_ofst <<= numbits;                                                    \
107         u4_ofst |= u4_bits;                                                     \
108         u4_range <<= numbits;                                                   \
109                                                                                 \
110     }                                                                           \
111     /* Update the cabac context */                                              \
112     ps_cabac->u4_range = u4_range;                                              \
113     ps_cabac->u4_ofst = u4_ofst;                                                \
114                                                                                 \
115 }
116 #else
117 #define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index)       \
118         u4_bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_index);
119 #endif
120 
121 #if CABAC_DECODE_BYPASS_BIN
122 #define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm)            \
123 {                                                                               \
124                                                                                 \
125     UWORD32 u4_range = ps_cabac->u4_range;                                      \
126     UWORD32 u4_ofst = ps_cabac->u4_ofst;                                        \
127     UWORD32 u4_bits;                                                            \
128                                                                                 \
129     /* Sanity checks */                                                         \
130     ASSERT(FULLRANGE == 1);                                                     \
131     ASSERT(u4_range >= 256);                                                    \
132                                                                                 \
133     BIT_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,              \
134             ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word);                  \
135                                                                                 \
136     u4_ofst <<= 1;                                                              \
137     u4_ofst |= u4_bits;                                                         \
138                                                                                 \
139     u4_bin = 0;                                                                 \
140     if(u4_ofst >= u4_range)                                                     \
141     {                                                                           \
142         u4_bin = 1;                                                             \
143         u4_ofst -= u4_range;                                                    \
144     }                                                                           \
145                                                                                 \
146     /* Update the cabac context */                                              \
147     ps_cabac->u4_ofst = u4_ofst;                                                \
148 }
149 #else
150 
151 #define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm)            \
152                 u4_bin = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
153 #endif
154 
155 #if CABAC_DECODE_BYPASS_BINS
156 #define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \
157 {                                                                               \
158     UWORD32 u4_range = ps_cabac->u4_range;                                      \
159     UWORD32 u4_ofst = ps_cabac->u4_ofst;                                        \
160     UWORD32 u4_bits;                                                            \
161     ASSERT(FULLRANGE == 1);                                                     \
162     ASSERT(u4_range >= 256);                                                    \
163     ASSERT(numbins > 0);                                                        \
164     {                                                                           \
165         WORD32 numbins_tmp = numbins;                                           \
166         /* Sanity checks */                                                     \
167         ASSERT(numbins < 17);                                                   \
168                                                                                 \
169         u4_bins = 0;                                                            \
170                                                                                 \
171         BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,         \
172                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbins); \
173         do                                                                      \
174         {                                                                       \
175             UWORD32 u4_bit;                                                     \
176             numbins_tmp--;                                                      \
177             u4_bit = (u4_bits >> numbins_tmp) & 1;                              \
178             u4_ofst <<= 1;                                                      \
179             u4_ofst |= u4_bit;                                                  \
180                                                                                 \
181             u4_bins <<= 1;                                                      \
182             if(u4_ofst >= u4_range)                                             \
183             {                                                                   \
184                 u4_bins += 1;                                                   \
185                 u4_ofst -= u4_range;                                            \
186             }                                                                   \
187         }while(numbins_tmp);                                                    \
188                                                                                 \
189         /* Update the cabac context */                                          \
190         ps_cabac->u4_ofst = u4_ofst;                                            \
191     }                                                                           \
192 }
193 
194 
195 #else
196 
197 #define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \
198       u4_bins = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, numbins);
199 
200 #endif
201 /*****************************************************************************/
202 /* Structures                                                                */
203 /*****************************************************************************/
204 
205 
206 
207 /*****************************************************************************/
208 /* Extern Function Declarations                                              */
209 /*****************************************************************************/
210 IHEVCD_ERROR_T    ihevcd_cabac_init
211 (
212                 cab_ctxt_t  *ps_cabac,
213                 bitstrm_t   *ps_bitstrm,
214                 WORD32      slice_qp,
215                 WORD32      cabac_init_idc,
216                 const UWORD8      *pu1_init_ctxt
217 );
218 
219 
220 
221 UWORD32    ihevcd_cabac_decode_bin
222 (
223                 cab_ctxt_t  *ps_cabac,
224                 bitstrm_t *ps_bitstrm,
225                 WORD32      ctxt_index
226 );
227 
228 UWORD32    ihevcd_cabac_decode_bypass_bin
229 (
230                 cab_ctxt_t  *ps_cabac,
231                 bitstrm_t *ps_bitstrm
232 );
233 
234 UWORD32    ihevcd_cabac_decode_terminate
235 (
236                 cab_ctxt_t  *ps_cabac,
237                 bitstrm_t *ps_bitstrm
238 );
239 
240 UWORD32    ihevcd_cabac_decode_bypass_bins
241 (
242                 cab_ctxt_t  *ps_cabac,
243                 bitstrm_t *ps_bitstrm,
244                 WORD32       num_bins
245 );
246 
247 UWORD32    ihevcd_cabac_decode_bins_tunary
248 (
249                 cab_ctxt_t  *ps_cabac,
250                 bitstrm_t *ps_bitstrm,
251                 WORD32       c_max,
252                 WORD32       ctxt_index,
253                 WORD32       ctxt_shift,
254                 WORD32       ctxt_inc_max
255 
256 );
257 
258 UWORD32    ihevcd_cabac_decode_bypass_bins_tunary
259 (
260                 cab_ctxt_t  *ps_cabac,
261                 bitstrm_t *ps_bitstrm,
262                 WORD32       c_max
263 
264 );
265 
266 UWORD32    ihevcd_cabac_decode_bypass_bins_egk
267 (
268                 cab_ctxt_t  *ps_cabac,
269                 bitstrm_t *ps_bitstrm,
270                 WORD32       k
271 );
272 
273 UWORD32    ihevcd_cabac_decode_bypass_bins_trunc_rice
274 (
275                 cab_ctxt_t  *ps_cabac,
276                 bitstrm_t *ps_bitstrm,
277                 WORD32       c_rice_param,
278                 WORD32       c_rice_max
279 );
280 
281 IHEVCD_ERROR_T  ihevcd_cabac_flush(cab_ctxt_t  *ps_cabac);
282 
283 IHEVCD_ERROR_T ihevcd_cabac_reset(cab_ctxt_t *ps_cabac,
284                                   bitstrm_t *ps_bitstrm);
285 
286 #endif /* _IHEVCD_CABAC_H_ */
287