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