xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_cabac.c (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  * @file ihevcd_cabac.c
21*c83a76b0SSuyog Pawar  *
22*c83a76b0SSuyog Pawar  * @brief
23*c83a76b0SSuyog Pawar  *    This file contains function definitions related to CABAC parsing
24*c83a76b0SSuyog Pawar  *
25*c83a76b0SSuyog Pawar  * @author
26*c83a76b0SSuyog Pawar  *    Ittiam
27*c83a76b0SSuyog Pawar  *
28*c83a76b0SSuyog Pawar  *
29*c83a76b0SSuyog Pawar  * List of Functions
30*c83a76b0SSuyog Pawar  *
31*c83a76b0SSuyog Pawar  *   ihevcd_cabac_init()
32*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bin()
33*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bypass_bin()
34*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bypass_bins_tunary()
35*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_terminate()
36*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bin_tunary()
37*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bypass_bins()
38*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_bypass_bins_egk()
39*c83a76b0SSuyog Pawar  *   ihevcd_cabac_decode_trunc_rice()
40*c83a76b0SSuyog Pawar  *   ihevcd_cabac_flush()
41*c83a76b0SSuyog Pawar  *
42*c83a76b0SSuyog Pawar  ******************************************************************************
43*c83a76b0SSuyog Pawar  */
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar /*****************************************************************************/
46*c83a76b0SSuyog Pawar /* File Includes                                                             */
47*c83a76b0SSuyog Pawar /*****************************************************************************/
48*c83a76b0SSuyog Pawar #include <stdio.h>
49*c83a76b0SSuyog Pawar #include <stddef.h>
50*c83a76b0SSuyog Pawar #include <assert.h>
51*c83a76b0SSuyog Pawar #include <stdlib.h>
52*c83a76b0SSuyog Pawar #include <string.h>
53*c83a76b0SSuyog Pawar 
54*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
55*c83a76b0SSuyog Pawar #include "iv.h"
56*c83a76b0SSuyog Pawar #include "ivd.h"
57*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
58*c83a76b0SSuyog Pawar 
59*c83a76b0SSuyog Pawar 
60*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
61*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
62*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
63*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
64*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
65*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
67*c83a76b0SSuyog Pawar 
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
72*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
73*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
74*c83a76b0SSuyog Pawar #include "ihevcd_cabac.h"
75*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
76*c83a76b0SSuyog Pawar 
77*c83a76b0SSuyog Pawar #ifdef TRACE
78*c83a76b0SSuyog Pawar extern trace_t g_trace;
79*c83a76b0SSuyog Pawar #endif
80*c83a76b0SSuyog Pawar #if DEBUG_CABAC_RANGE_OFST
81*c83a76b0SSuyog Pawar #if FULLRANGE
82*c83a76b0SSuyog Pawar #define DEBUG_RANGE_OFST(str, m_range, m_ofst )  \
83*c83a76b0SSuyog Pawar {\
84*c83a76b0SSuyog Pawar     UWORD32 m_clz, m_range_shift, m_ofst_shift;                           \
85*c83a76b0SSuyog Pawar     m_clz = CLZ(m_range);                                                \
86*c83a76b0SSuyog Pawar     m_clz -= (32 - RANGE_NUMBITS);                                      \
87*c83a76b0SSuyog Pawar     m_range_shift = m_range << m_clz;                                    \
88*c83a76b0SSuyog Pawar     m_range_shift = m_range_shift >> RANGE_SHIFT;                                 \
89*c83a76b0SSuyog Pawar     m_ofst_shift = m_ofst << m_clz;                                    \
90*c83a76b0SSuyog Pawar     m_ofst_shift = m_ofst_shift >> RANGE_SHIFT;                                 \
91*c83a76b0SSuyog Pawar     fprintf( g_trace.fp, "%-40s R: %3d O: %3d\n", str, m_range_shift, m_ofst_shift); \
92*c83a76b0SSuyog Pawar }
93*c83a76b0SSuyog Pawar 
94*c83a76b0SSuyog Pawar #else
95*c83a76b0SSuyog Pawar #define DEBUG_RANGE_OFST(str,  m_range, m_ofst) \
96*c83a76b0SSuyog Pawar     fprintf( g_trace.fp, "%-40s R: %3d O: %3d\n", str, m_range, m_ofst);
97*c83a76b0SSuyog Pawar #endif
98*c83a76b0SSuyog Pawar #else
99*c83a76b0SSuyog Pawar #define DEBUG_RANGE_OFST(str, m_range, m_ofst )
100*c83a76b0SSuyog Pawar #endif
101*c83a76b0SSuyog Pawar /*****************************************************************************/
102*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
103*c83a76b0SSuyog Pawar /*****************************************************************************/
104*c83a76b0SSuyog Pawar 
105*c83a76b0SSuyog Pawar /**
106*c83a76b0SSuyog Pawar  ******************************************************************************
107*c83a76b0SSuyog Pawar  *
108*c83a76b0SSuyog Pawar  *  @brief Initializes the decoder cabac engine
109*c83a76b0SSuyog Pawar  *
110*c83a76b0SSuyog Pawar  *  @par   Description
111*c83a76b0SSuyog Pawar  *  This routine needs to be called at start of slice/frame decode
112*c83a76b0SSuyog Pawar  *
113*c83a76b0SSuyog Pawar  *  @param[in,out]   ps_cabac_ctxt
114*c83a76b0SSuyog Pawar  *  pointer to cabac context (handle)
115*c83a76b0SSuyog Pawar  *
116*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
117*c83a76b0SSuyog Pawar  *  pointer to bitstream context (handle)
118*c83a76b0SSuyog Pawar  *
119*c83a76b0SSuyog Pawar  *  @param[in]   qp
120*c83a76b0SSuyog Pawar  *  current slice Qp
121*c83a76b0SSuyog Pawar  *
122*c83a76b0SSuyog Pawar  *  @param[in]   cabac_init_idc
123*c83a76b0SSuyog Pawar  *  current slice init idc (range  [0 - 2])
124*c83a76b0SSuyog Pawar  *
125*c83a76b0SSuyog Pawar  *  @param[in]   pu1_init_ctxt
126*c83a76b0SSuyog Pawar  *  Init cabac context to be used (range  [0 - 2])
127*c83a76b0SSuyog Pawar  *
128*c83a76b0SSuyog Pawar  *  @return      success or failure error code
129*c83a76b0SSuyog Pawar  *
130*c83a76b0SSuyog Pawar  ******************************************************************************
131*c83a76b0SSuyog Pawar  */
ihevcd_cabac_init(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 qp,WORD32 cabac_init_idc,const UWORD8 * pu1_init_ctxt)132*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_cabac_init(cab_ctxt_t *ps_cabac,
133*c83a76b0SSuyog Pawar                                  bitstrm_t *ps_bitstrm,
134*c83a76b0SSuyog Pawar                                  WORD32 qp,
135*c83a76b0SSuyog Pawar                                  WORD32 cabac_init_idc,
136*c83a76b0SSuyog Pawar                                  const UWORD8 *pu1_init_ctxt)
137*c83a76b0SSuyog Pawar {
138*c83a76b0SSuyog Pawar     /* Sanity checks */
139*c83a76b0SSuyog Pawar     ASSERT(ps_cabac != NULL);
140*c83a76b0SSuyog Pawar     ASSERT(ps_bitstrm != NULL);
141*c83a76b0SSuyog Pawar     ASSERT((qp >= 0) && (qp < 52));
142*c83a76b0SSuyog Pawar     ASSERT((cabac_init_idc >= 0) && (cabac_init_idc < 3));
143*c83a76b0SSuyog Pawar     UNUSED(qp);
144*c83a76b0SSuyog Pawar     UNUSED(cabac_init_idc);
145*c83a76b0SSuyog Pawar     /* CABAC engine uses 32 bit range instead of 9 bits as specified by
146*c83a76b0SSuyog Pawar      * the spec. This is done to reduce number of renormalizations
147*c83a76b0SSuyog Pawar      */
148*c83a76b0SSuyog Pawar     /* cabac engine initialization */
149*c83a76b0SSuyog Pawar #if FULLRANGE
150*c83a76b0SSuyog Pawar     ps_cabac->u4_range = (UWORD32)510 << RANGE_SHIFT;
151*c83a76b0SSuyog Pawar     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
152*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, (9 + RANGE_SHIFT));
153*c83a76b0SSuyog Pawar 
154*c83a76b0SSuyog Pawar #else
155*c83a76b0SSuyog Pawar     ps_cabac->u4_range = (UWORD32)510;
156*c83a76b0SSuyog Pawar     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
157*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, 9);
158*c83a76b0SSuyog Pawar 
159*c83a76b0SSuyog Pawar #endif
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar     /* cabac context initialization based on init idc and slice qp */
162*c83a76b0SSuyog Pawar     memcpy(ps_cabac->au1_ctxt_models,
163*c83a76b0SSuyog Pawar            pu1_init_ctxt,
164*c83a76b0SSuyog Pawar            IHEVC_CAB_CTXT_END);
165*c83a76b0SSuyog Pawar     DEBUG_RANGE_OFST("init", ps_cabac->u4_range, ps_cabac->u4_ofst);
166*c83a76b0SSuyog Pawar 
167*c83a76b0SSuyog Pawar     /*
168*c83a76b0SSuyog Pawar      * If the offset is greater than or equal to range, return fail.
169*c83a76b0SSuyog Pawar      */
170*c83a76b0SSuyog Pawar     if(ps_cabac->u4_ofst >= ps_cabac->u4_range)
171*c83a76b0SSuyog Pawar     {
172*c83a76b0SSuyog Pawar         return ((IHEVCD_ERROR_T)IHEVCD_FAIL);
173*c83a76b0SSuyog Pawar     }
174*c83a76b0SSuyog Pawar 
175*c83a76b0SSuyog Pawar     return ((IHEVCD_ERROR_T)IHEVCD_SUCCESS);
176*c83a76b0SSuyog Pawar }
177*c83a76b0SSuyog Pawar 
ihevcd_cabac_reset(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm)178*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_cabac_reset(cab_ctxt_t *ps_cabac,
179*c83a76b0SSuyog Pawar                                   bitstrm_t *ps_bitstrm)
180*c83a76b0SSuyog Pawar {
181*c83a76b0SSuyog Pawar     /* Sanity checks */
182*c83a76b0SSuyog Pawar     ASSERT(ps_cabac != NULL);
183*c83a76b0SSuyog Pawar     ASSERT(ps_bitstrm != NULL);
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar     /* CABAC engine uses 32 bit range instead of 9 bits as specified by
186*c83a76b0SSuyog Pawar      * the spec. This is done to reduce number of renormalizations
187*c83a76b0SSuyog Pawar      */
188*c83a76b0SSuyog Pawar     /* cabac engine initialization */
189*c83a76b0SSuyog Pawar #if FULLRANGE
190*c83a76b0SSuyog Pawar     ps_cabac->u4_range = (UWORD32)510 << RANGE_SHIFT;
191*c83a76b0SSuyog Pawar     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
192*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, (9 + RANGE_SHIFT));
193*c83a76b0SSuyog Pawar 
194*c83a76b0SSuyog Pawar #else
195*c83a76b0SSuyog Pawar     ps_cabac->u4_range = (UWORD32)510;
196*c83a76b0SSuyog Pawar     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
197*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, 9);
198*c83a76b0SSuyog Pawar 
199*c83a76b0SSuyog Pawar #endif
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar     return ((IHEVCD_ERROR_T)IHEVCD_SUCCESS);
202*c83a76b0SSuyog Pawar }
203*c83a76b0SSuyog Pawar 
204*c83a76b0SSuyog Pawar /**
205*c83a76b0SSuyog Pawar  ******************************************************************************
206*c83a76b0SSuyog Pawar  *
207*c83a76b0SSuyog Pawar  *  @brief Decodes a bin based on probablilty and mps packed context model
208*c83a76b0SSuyog Pawar  *
209*c83a76b0SSuyog Pawar  *  @par   Description
210*c83a76b0SSuyog Pawar  *  Decodes a bin as per Section : 9.3.3.2.1 and calls renormalization if required
211*c83a76b0SSuyog Pawar  *  as per section 9.3.3.2.2
212*c83a76b0SSuyog Pawar  *  1. Apart from decoding bin, context model is updated as per state transition
213*c83a76b0SSuyog Pawar  *  2. Range and Low renormalization is done based on bin and original state
214*c83a76b0SSuyog Pawar  *  3. After renorm bistream is updated (if required)
215*c83a76b0SSuyog Pawar  *
216*c83a76b0SSuyog Pawar  *  @param[in,out]   ps_cabac
217*c83a76b0SSuyog Pawar  *  pointer to cabac context (handle)
218*c83a76b0SSuyog Pawar  *
219*c83a76b0SSuyog Pawar  *  @param[in]   ctxt_index
220*c83a76b0SSuyog Pawar  *  index of cabac context model containing pState[bits6-1] | MPS[bit0]
221*c83a76b0SSuyog Pawar  *
222*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
223*c83a76b0SSuyog Pawar  *  Bitstream context
224*c83a76b0SSuyog Pawar  *
225*c83a76b0SSuyog Pawar  *  @return      bin(boolean) to be decoded
226*c83a76b0SSuyog Pawar  *
227*c83a76b0SSuyog Pawar  ******************************************************************************
228*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bin(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 ctxt_index)229*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bin(cab_ctxt_t *ps_cabac,
230*c83a76b0SSuyog Pawar                                 bitstrm_t *ps_bitstrm,
231*c83a76b0SSuyog Pawar                                 WORD32 ctxt_index
232*c83a76b0SSuyog Pawar 
233*c83a76b0SSuyog Pawar                                )
234*c83a76b0SSuyog Pawar {
235*c83a76b0SSuyog Pawar     UWORD32 u4_range = ps_cabac->u4_range;
236*c83a76b0SSuyog Pawar     UWORD32 u4_ofst = ps_cabac->u4_ofst;
237*c83a76b0SSuyog Pawar     UWORD32 u4_rlps;
238*c83a76b0SSuyog Pawar     UWORD32 u4_bin;
239*c83a76b0SSuyog Pawar     UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index];
240*c83a76b0SSuyog Pawar     WORD32 state_mps = *pu1_ctxt_model;
241*c83a76b0SSuyog Pawar #if FULLRANGE
242*c83a76b0SSuyog Pawar     WORD32 clz;
243*c83a76b0SSuyog Pawar #endif
244*c83a76b0SSuyog Pawar     UWORD32 u4_qnt_range;
245*c83a76b0SSuyog Pawar 
246*c83a76b0SSuyog Pawar     /* Sanity checks */
247*c83a76b0SSuyog Pawar     ASSERT(u4_range >= 256);
248*c83a76b0SSuyog Pawar     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
249*c83a76b0SSuyog Pawar     ASSERT(state_mps < 128);
250*c83a76b0SSuyog Pawar #if FULLRANGE
251*c83a76b0SSuyog Pawar     clz = CLZ(u4_range);
252*c83a76b0SSuyog Pawar     clz -= (32 - RANGE_NUMBITS);
253*c83a76b0SSuyog Pawar     u4_qnt_range = u4_range << clz;
254*c83a76b0SSuyog Pawar     u4_qnt_range = (u4_qnt_range >> (RANGE_SHIFT + 6)) & 0x3;
255*c83a76b0SSuyog Pawar #else
256*c83a76b0SSuyog Pawar     u4_qnt_range = (u4_range >> 6) & 0x3;
257*c83a76b0SSuyog Pawar #endif
258*c83a76b0SSuyog Pawar     /* Get the lps range from LUT based on quantized range and state */
259*c83a76b0SSuyog Pawar     u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][u4_qnt_range];
260*c83a76b0SSuyog Pawar #if FULLRANGE
261*c83a76b0SSuyog Pawar     u4_rlps = u4_rlps << (RANGE_SHIFT - clz);
262*c83a76b0SSuyog Pawar #endif
263*c83a76b0SSuyog Pawar     u4_range -= u4_rlps;
264*c83a76b0SSuyog Pawar 
265*c83a76b0SSuyog Pawar     u4_bin = state_mps & 1;
266*c83a76b0SSuyog Pawar 
267*c83a76b0SSuyog Pawar     if(u4_ofst >= u4_range)
268*c83a76b0SSuyog Pawar     {
269*c83a76b0SSuyog Pawar         u4_bin = 1 - u4_bin;
270*c83a76b0SSuyog Pawar         u4_ofst -= u4_range;
271*c83a76b0SSuyog Pawar         u4_range = u4_rlps;
272*c83a76b0SSuyog Pawar     }
273*c83a76b0SSuyog Pawar 
274*c83a76b0SSuyog Pawar     *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | u4_bin];
275*c83a76b0SSuyog Pawar 
276*c83a76b0SSuyog Pawar     /*****************************************************************/
277*c83a76b0SSuyog Pawar     /* Re-normalization; calculate bits generated based on range(R)  */
278*c83a76b0SSuyog Pawar     /*****************************************************************/
279*c83a76b0SSuyog Pawar     if(u4_range < (1 << 8))
280*c83a76b0SSuyog Pawar     {
281*c83a76b0SSuyog Pawar         UWORD32 u4_bits;
282*c83a76b0SSuyog Pawar         WORD32 numbits;
283*c83a76b0SSuyog Pawar         numbits = CLZ(u4_range);
284*c83a76b0SSuyog Pawar         numbits -= (32 - RANGE_NUMBITS);
285*c83a76b0SSuyog Pawar #if !FULLRANGE
286*c83a76b0SSuyog Pawar         numbits -= RANGE_SHIFT;
287*c83a76b0SSuyog Pawar #endif
288*c83a76b0SSuyog Pawar         BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
289*c83a76b0SSuyog Pawar                  ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits);
290*c83a76b0SSuyog Pawar 
291*c83a76b0SSuyog Pawar         u4_ofst <<= numbits;
292*c83a76b0SSuyog Pawar         u4_ofst |= u4_bits;
293*c83a76b0SSuyog Pawar         u4_range <<= numbits;
294*c83a76b0SSuyog Pawar 
295*c83a76b0SSuyog Pawar     }
296*c83a76b0SSuyog Pawar     /* Update the cabac context */
297*c83a76b0SSuyog Pawar     ps_cabac->u4_range = u4_range;
298*c83a76b0SSuyog Pawar     ps_cabac->u4_ofst = u4_ofst;
299*c83a76b0SSuyog Pawar     DEBUG_RANGE_OFST("bin", ps_cabac->u4_range, ps_cabac->u4_ofst);
300*c83a76b0SSuyog Pawar 
301*c83a76b0SSuyog Pawar     return (u4_bin);
302*c83a76b0SSuyog Pawar 
303*c83a76b0SSuyog Pawar 
304*c83a76b0SSuyog Pawar }
305*c83a76b0SSuyog Pawar 
306*c83a76b0SSuyog Pawar /**
307*c83a76b0SSuyog Pawar  ******************************************************************************
308*c83a76b0SSuyog Pawar  *
309*c83a76b0SSuyog Pawar  *  @brief Decodes a bypass bin (equi-probable 0 / 1)
310*c83a76b0SSuyog Pawar  *
311*c83a76b0SSuyog Pawar  *  @par   Description
312*c83a76b0SSuyog Pawar  *  Decodes a bypss bin as per Section : 9.3.3.2.3
313*c83a76b0SSuyog Pawar  *
314*c83a76b0SSuyog Pawar  *  @param[in,out]  ps_cabac
315*c83a76b0SSuyog Pawar  *  pointer to cabac context (handle)
316*c83a76b0SSuyog Pawar  *
317*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
318*c83a76b0SSuyog Pawar  *  Bitstream context
319*c83a76b0SSuyog Pawar  *
320*c83a76b0SSuyog Pawar  *  @return      Decoded bypass bin
321*c83a76b0SSuyog Pawar  *
322*c83a76b0SSuyog Pawar  ******************************************************************************
323*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bypass_bin(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm)324*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bin(cab_ctxt_t *ps_cabac,
325*c83a76b0SSuyog Pawar                                        bitstrm_t *ps_bitstrm)
326*c83a76b0SSuyog Pawar {
327*c83a76b0SSuyog Pawar 
328*c83a76b0SSuyog Pawar     UWORD32 u4_bin;
329*c83a76b0SSuyog Pawar     UWORD32 u4_range = ps_cabac->u4_range;
330*c83a76b0SSuyog Pawar     UWORD32 u4_ofst = ps_cabac->u4_ofst;
331*c83a76b0SSuyog Pawar     UWORD32 u4_bits;
332*c83a76b0SSuyog Pawar 
333*c83a76b0SSuyog Pawar     /* Sanity checks */
334*c83a76b0SSuyog Pawar     ASSERT(u4_range >= 256);
335*c83a76b0SSuyog Pawar 
336*c83a76b0SSuyog Pawar     BIT_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
337*c83a76b0SSuyog Pawar             ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word);
338*c83a76b0SSuyog Pawar 
339*c83a76b0SSuyog Pawar     u4_ofst <<= 1;
340*c83a76b0SSuyog Pawar     u4_ofst |= u4_bits;
341*c83a76b0SSuyog Pawar 
342*c83a76b0SSuyog Pawar     u4_bin = 0;
343*c83a76b0SSuyog Pawar     if(u4_ofst >= u4_range)
344*c83a76b0SSuyog Pawar     {
345*c83a76b0SSuyog Pawar         u4_bin = 1;
346*c83a76b0SSuyog Pawar         u4_ofst -= u4_range;
347*c83a76b0SSuyog Pawar     }
348*c83a76b0SSuyog Pawar 
349*c83a76b0SSuyog Pawar     /* Update the cabac context */
350*c83a76b0SSuyog Pawar     ps_cabac->u4_ofst = u4_ofst;
351*c83a76b0SSuyog Pawar     DEBUG_RANGE_OFST("bypass end", ps_cabac->u4_range, ps_cabac->u4_ofst);
352*c83a76b0SSuyog Pawar     return (u4_bin);
353*c83a76b0SSuyog Pawar }
354*c83a76b0SSuyog Pawar 
355*c83a76b0SSuyog Pawar /**
356*c83a76b0SSuyog Pawar  ******************************************************************************
357*c83a76b0SSuyog Pawar  *
358*c83a76b0SSuyog Pawar  *  @brief Decodes a terminate bin (1:terminate 0:do not terminate)
359*c83a76b0SSuyog Pawar  *
360*c83a76b0SSuyog Pawar  *  @par   Description
361*c83a76b0SSuyog Pawar  *  Decodes a terminate bin to be called for end_of_slice_flag and pcm_flag
362*c83a76b0SSuyog Pawar  *  as per Section : 9.3.3.2.4
363*c83a76b0SSuyog Pawar  *
364*c83a76b0SSuyog Pawar  *  @param[in,out]  ps_cabac
365*c83a76b0SSuyog Pawar  *  pointer to cabac context (handle)
366*c83a76b0SSuyog Pawar  *
367*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
368*c83a76b0SSuyog Pawar  *  Bitstream context
369*c83a76b0SSuyog Pawar  *
370*c83a76b0SSuyog Pawar  *  @return    Decoded Bin to indicate whether to terminate or not
371*c83a76b0SSuyog Pawar  *
372*c83a76b0SSuyog Pawar  ******************************************************************************
373*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_terminate(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm)374*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_terminate(cab_ctxt_t *ps_cabac,
375*c83a76b0SSuyog Pawar                                       bitstrm_t *ps_bitstrm)
376*c83a76b0SSuyog Pawar {
377*c83a76b0SSuyog Pawar     UWORD32 u4_range = ps_cabac->u4_range;
378*c83a76b0SSuyog Pawar     UWORD32 u4_ofst = ps_cabac->u4_ofst;
379*c83a76b0SSuyog Pawar     UWORD32 u4_bin;
380*c83a76b0SSuyog Pawar #if FULLRANGE
381*c83a76b0SSuyog Pawar     WORD32 clz;
382*c83a76b0SSuyog Pawar #endif
383*c83a76b0SSuyog Pawar     /* Sanity checks */
384*c83a76b0SSuyog Pawar     ASSERT(u4_range >= 256);
385*c83a76b0SSuyog Pawar #if FULLRANGE
386*c83a76b0SSuyog Pawar     clz = CLZ(u4_range);
387*c83a76b0SSuyog Pawar     clz -= (32 - RANGE_NUMBITS);
388*c83a76b0SSuyog Pawar     u4_range -= 2 << (RANGE_SHIFT - clz);
389*c83a76b0SSuyog Pawar #else
390*c83a76b0SSuyog Pawar     u4_range -= 2;
391*c83a76b0SSuyog Pawar #endif
392*c83a76b0SSuyog Pawar 
393*c83a76b0SSuyog Pawar     if(u4_ofst >= u4_range)
394*c83a76b0SSuyog Pawar     {
395*c83a76b0SSuyog Pawar         u4_bin = 1;
396*c83a76b0SSuyog Pawar 
397*c83a76b0SSuyog Pawar #if FULLRANGE
398*c83a76b0SSuyog Pawar         /* In case of FULLRANGE extra bits read earlier need to pushed back to the bitstream */
399*c83a76b0SSuyog Pawar         {
400*c83a76b0SSuyog Pawar             WORD32 clz;
401*c83a76b0SSuyog Pawar             WORD32 numbits;
402*c83a76b0SSuyog Pawar             clz = CLZ(ps_cabac->u4_range);
403*c83a76b0SSuyog Pawar 
404*c83a76b0SSuyog Pawar             numbits = (32 - clz);
405*c83a76b0SSuyog Pawar             numbits -= 9;
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar             ihevcd_bits_seek(ps_bitstrm, -numbits);
408*c83a76b0SSuyog Pawar         }
409*c83a76b0SSuyog Pawar #endif
410*c83a76b0SSuyog Pawar 
411*c83a76b0SSuyog Pawar     }
412*c83a76b0SSuyog Pawar     else
413*c83a76b0SSuyog Pawar     {
414*c83a76b0SSuyog Pawar         u4_bin = 0;
415*c83a76b0SSuyog Pawar     }
416*c83a76b0SSuyog Pawar     if(0 == u4_bin)
417*c83a76b0SSuyog Pawar     {
418*c83a76b0SSuyog Pawar         UWORD32 u4_bits;
419*c83a76b0SSuyog Pawar         WORD32 numbits;
420*c83a76b0SSuyog Pawar         numbits = CLZ(u4_range);
421*c83a76b0SSuyog Pawar         numbits -= (32 - RANGE_NUMBITS);
422*c83a76b0SSuyog Pawar #if !FULLRANGE
423*c83a76b0SSuyog Pawar         numbits -= RANGE_SHIFT;
424*c83a76b0SSuyog Pawar #endif
425*c83a76b0SSuyog Pawar         /* Renormalize if required */
426*c83a76b0SSuyog Pawar         if(numbits)
427*c83a76b0SSuyog Pawar         {
428*c83a76b0SSuyog Pawar             BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
429*c83a76b0SSuyog Pawar                      ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits);
430*c83a76b0SSuyog Pawar 
431*c83a76b0SSuyog Pawar             u4_ofst <<= numbits;
432*c83a76b0SSuyog Pawar             u4_ofst |= u4_bits;
433*c83a76b0SSuyog Pawar             u4_range <<= numbits;
434*c83a76b0SSuyog Pawar         }
435*c83a76b0SSuyog Pawar     }
436*c83a76b0SSuyog Pawar     /* bits to be inserted in the bitstream */
437*c83a76b0SSuyog Pawar     ps_cabac->u4_range = u4_range;
438*c83a76b0SSuyog Pawar     ps_cabac->u4_ofst = u4_ofst;
439*c83a76b0SSuyog Pawar     DEBUG_RANGE_OFST("term", ps_cabac->u4_range, ps_cabac->u4_ofst);
440*c83a76b0SSuyog Pawar 
441*c83a76b0SSuyog Pawar     return (u4_bin);
442*c83a76b0SSuyog Pawar }
443*c83a76b0SSuyog Pawar 
444*c83a76b0SSuyog Pawar /**
445*c83a76b0SSuyog Pawar  ******************************************************************************
446*c83a76b0SSuyog Pawar  *
447*c83a76b0SSuyog Pawar  *  @brief Decodes a bypass bin (equi-probable 0 / 1)
448*c83a76b0SSuyog Pawar  *
449*c83a76b0SSuyog Pawar  *  @par   Description
450*c83a76b0SSuyog Pawar  *  Decodes a bypss bin as per Section : 9.3.3.2.3
451*c83a76b0SSuyog Pawar  *
452*c83a76b0SSuyog Pawar  *  @param[in,out]  ps_cabac
453*c83a76b0SSuyog Pawar  *  pointer to cabac context (handle)
454*c83a76b0SSuyog Pawar  *
455*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
456*c83a76b0SSuyog Pawar  *  Bitstream context
457*c83a76b0SSuyog Pawar  *
458*c83a76b0SSuyog Pawar  *  @param[in]   numbins
459*c83a76b0SSuyog Pawar  *  Number of bins to decoded
460*c83a76b0SSuyog Pawar  *
461*c83a76b0SSuyog Pawar  *  @return      Decoded bypass bin
462*c83a76b0SSuyog Pawar  *
463*c83a76b0SSuyog Pawar  *  @remarks     Tested only for numbins less than 17
464*c83a76b0SSuyog Pawar  *
465*c83a76b0SSuyog Pawar  ******************************************************************************
466*c83a76b0SSuyog Pawar  */
467*c83a76b0SSuyog Pawar 
ihevcd_cabac_decode_bypass_bins(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 numbins)468*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins(cab_ctxt_t *ps_cabac,
469*c83a76b0SSuyog Pawar                                         bitstrm_t *ps_bitstrm,
470*c83a76b0SSuyog Pawar                                         WORD32 numbins)
471*c83a76b0SSuyog Pawar {
472*c83a76b0SSuyog Pawar     UWORD32 u4_bins;
473*c83a76b0SSuyog Pawar 
474*c83a76b0SSuyog Pawar 
475*c83a76b0SSuyog Pawar     UWORD32 u4_range = ps_cabac->u4_range;
476*c83a76b0SSuyog Pawar     UWORD32 u4_ofst = ps_cabac->u4_ofst;
477*c83a76b0SSuyog Pawar     UWORD32 u4_bits;
478*c83a76b0SSuyog Pawar     ASSERT(u4_range >= 256);
479*c83a76b0SSuyog Pawar     ASSERT(numbins > 0);
480*c83a76b0SSuyog Pawar 
481*c83a76b0SSuyog Pawar     /* Sanity checks */
482*c83a76b0SSuyog Pawar     ASSERT(numbins < 17);
483*c83a76b0SSuyog Pawar 
484*c83a76b0SSuyog Pawar     u4_bins = 0;
485*c83a76b0SSuyog Pawar 
486*c83a76b0SSuyog Pawar     BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
487*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbins);
488*c83a76b0SSuyog Pawar 
489*c83a76b0SSuyog Pawar     do
490*c83a76b0SSuyog Pawar     {
491*c83a76b0SSuyog Pawar         UWORD32 u4_bit;
492*c83a76b0SSuyog Pawar         numbins--;
493*c83a76b0SSuyog Pawar         u4_bit = (u4_bits >> numbins) & 1;
494*c83a76b0SSuyog Pawar         u4_ofst <<= 1;
495*c83a76b0SSuyog Pawar         u4_ofst |= u4_bit;
496*c83a76b0SSuyog Pawar 
497*c83a76b0SSuyog Pawar         u4_bins <<= 1;
498*c83a76b0SSuyog Pawar         if(u4_ofst >= u4_range)
499*c83a76b0SSuyog Pawar         {
500*c83a76b0SSuyog Pawar             u4_bins += 1;
501*c83a76b0SSuyog Pawar             u4_ofst -= u4_range;
502*c83a76b0SSuyog Pawar         }
503*c83a76b0SSuyog Pawar     }while(numbins);
504*c83a76b0SSuyog Pawar 
505*c83a76b0SSuyog Pawar     /* Update the cabac context */
506*c83a76b0SSuyog Pawar     ps_cabac->u4_ofst = u4_ofst;
507*c83a76b0SSuyog Pawar     DEBUG_RANGE_OFST("bypass", ps_cabac->u4_range, ps_cabac->u4_ofst);
508*c83a76b0SSuyog Pawar     return (u4_bins);
509*c83a76b0SSuyog Pawar }
510*c83a76b0SSuyog Pawar 
511*c83a76b0SSuyog Pawar /**
512*c83a76b0SSuyog Pawar  ******************************************************************************
513*c83a76b0SSuyog Pawar  *
514*c83a76b0SSuyog Pawar  *  @brief Decodes a truncated unary symbol associated with context model(s)
515*c83a76b0SSuyog Pawar  *
516*c83a76b0SSuyog Pawar  *  @par   Description
517*c83a76b0SSuyog Pawar  *  Decodes symbols coded with TUnary binarization as per sec 9.3.2.2
518*c83a76b0SSuyog Pawar  *  This is used for computing symbols like qp_delta,
519*c83a76b0SSuyog Pawar  *  last_sig_coeff_prefix_x, last_sig_coeff_prefix_y.
520*c83a76b0SSuyog Pawar  *
521*c83a76b0SSuyog Pawar  *  The context models associated with each bin is computed as :
522*c83a76b0SSuyog Pawar  *   current bin context = "base context idx" + (bin_idx >> shift)
523*c83a76b0SSuyog Pawar  *  where
524*c83a76b0SSuyog Pawar  *   1. "base context idx" is the base index for the syntax element
525*c83a76b0SSuyog Pawar  *   2. "bin_idx" is the current bin index of the unary code
526*c83a76b0SSuyog Pawar  *   3. "shift" is the shift factor associated with this syntax element
527*c83a76b0SSuyog Pawar  *
528*c83a76b0SSuyog Pawar  *  @param[in,out] ps_cabac
529*c83a76b0SSuyog Pawar  *   pointer to cabac context (handle)
530*c83a76b0SSuyog Pawar  *
531*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
532*c83a76b0SSuyog Pawar  *  Bitstream context
533*c83a76b0SSuyog Pawar  *
534*c83a76b0SSuyog Pawar  *  @param[in]   c_max
535*c83a76b0SSuyog Pawar  *   maximum value of sym (required for tunary binarization)
536*c83a76b0SSuyog Pawar  *
537*c83a76b0SSuyog Pawar  *  @param[in]   ctxt_index
538*c83a76b0SSuyog Pawar  *   base context model index for this syntax element
539*c83a76b0SSuyog Pawar  *
540*c83a76b0SSuyog Pawar  *  @param[in]   ctxt_shift
541*c83a76b0SSuyog Pawar  *   shift factor for context increments associated with this syntax element
542*c83a76b0SSuyog Pawar  *
543*c83a76b0SSuyog Pawar  *  @param[in]   ctxt_inc_max
544*c83a76b0SSuyog Pawar  *   max value of context increment beyond which all bins will use same ctxt
545*c83a76b0SSuyog Pawar  *
546*c83a76b0SSuyog Pawar  *  @return     syntax element decoded
547*c83a76b0SSuyog Pawar  *
548*c83a76b0SSuyog Pawar  ******************************************************************************
549*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bins_tunary(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 c_max,WORD32 ctxt_index,WORD32 ctxt_shift,WORD32 ctxt_inc_max)550*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bins_tunary(cab_ctxt_t *ps_cabac,
551*c83a76b0SSuyog Pawar                                         bitstrm_t *ps_bitstrm,
552*c83a76b0SSuyog Pawar                                         WORD32 c_max,
553*c83a76b0SSuyog Pawar                                         WORD32 ctxt_index,
554*c83a76b0SSuyog Pawar                                         WORD32 ctxt_shift,
555*c83a76b0SSuyog Pawar                                         WORD32 ctxt_inc_max)
556*c83a76b0SSuyog Pawar {
557*c83a76b0SSuyog Pawar     UWORD32 u4_sym;
558*c83a76b0SSuyog Pawar     WORD32 bin;
559*c83a76b0SSuyog Pawar 
560*c83a76b0SSuyog Pawar     /* Sanity checks */
561*c83a76b0SSuyog Pawar     ASSERT(c_max > 0);
562*c83a76b0SSuyog Pawar     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
563*c83a76b0SSuyog Pawar     ASSERT((ctxt_index + (c_max >> ctxt_shift)) < IHEVC_CAB_CTXT_END);
564*c83a76b0SSuyog Pawar 
565*c83a76b0SSuyog Pawar     u4_sym = 0;
566*c83a76b0SSuyog Pawar     do
567*c83a76b0SSuyog Pawar     {
568*c83a76b0SSuyog Pawar         WORD32 bin_index;
569*c83a76b0SSuyog Pawar         bin_index = ctxt_index + MIN((u4_sym >> ctxt_shift), (UWORD32)ctxt_inc_max);
570*c83a76b0SSuyog Pawar         IHEVCD_CABAC_DECODE_BIN(bin, ps_cabac, ps_bitstrm,  bin_index);
571*c83a76b0SSuyog Pawar         u4_sym++;
572*c83a76b0SSuyog Pawar     }while(((WORD32)u4_sym < c_max) && bin);
573*c83a76b0SSuyog Pawar 
574*c83a76b0SSuyog Pawar     u4_sym = u4_sym - 1 + bin;
575*c83a76b0SSuyog Pawar 
576*c83a76b0SSuyog Pawar     return (u4_sym);
577*c83a76b0SSuyog Pawar }
578*c83a76b0SSuyog Pawar 
579*c83a76b0SSuyog Pawar /**
580*c83a76b0SSuyog Pawar  ******************************************************************************
581*c83a76b0SSuyog Pawar  *
582*c83a76b0SSuyog Pawar  *  @brief Decodes a syntax element as truncated unary bypass bins
583*c83a76b0SSuyog Pawar  *
584*c83a76b0SSuyog Pawar  *  @par   Description
585*c83a76b0SSuyog Pawar  *  Decodes symbols coded with TUnary binarization as per sec 9.3.2.2
586*c83a76b0SSuyog Pawar  *  These symbols are coded as bypass bins
587*c83a76b0SSuyog Pawar  *   This is used for computing symbols like merge_idx,
588*c83a76b0SSuyog Pawar  *  mpm_idx etc
589*c83a76b0SSuyog Pawar  *
590*c83a76b0SSuyog Pawar  *  @param[in,out]ps_cabac
591*c83a76b0SSuyog Pawar  *   pointer to cabac context (handle)
592*c83a76b0SSuyog Pawar  *
593*c83a76b0SSuyog Pawar  *  @param[in]   ps_bitstrm
594*c83a76b0SSuyog Pawar  *  Bitstream context
595*c83a76b0SSuyog Pawar  *
596*c83a76b0SSuyog Pawar  *  @param[in]   c_max
597*c83a76b0SSuyog Pawar  *   maximum value of sym (required for tunary binarization)
598*c83a76b0SSuyog Pawar  *
599*c83a76b0SSuyog Pawar  *  @return      syntax element decoded
600*c83a76b0SSuyog Pawar  *
601*c83a76b0SSuyog Pawar  ******************************************************************************
602*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bypass_bins_tunary(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 c_max)603*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_tunary(cab_ctxt_t *ps_cabac,
604*c83a76b0SSuyog Pawar                                                bitstrm_t *ps_bitstrm,
605*c83a76b0SSuyog Pawar                                                WORD32 c_max)
606*c83a76b0SSuyog Pawar {
607*c83a76b0SSuyog Pawar 
608*c83a76b0SSuyog Pawar     UWORD32 u4_sym;
609*c83a76b0SSuyog Pawar     WORD32 bin;
610*c83a76b0SSuyog Pawar     UWORD32 u4_ofst = ps_cabac->u4_ofst;
611*c83a76b0SSuyog Pawar     UWORD32 u4_range = ps_cabac->u4_range;
612*c83a76b0SSuyog Pawar     UWORD32 u4_bits;
613*c83a76b0SSuyog Pawar     /* Sanity checks */
614*c83a76b0SSuyog Pawar     ASSERT(c_max > 0);
615*c83a76b0SSuyog Pawar     ASSERT(u4_range >= 256);
616*c83a76b0SSuyog Pawar     u4_sym = 0;
617*c83a76b0SSuyog Pawar     BITS_NXT(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
618*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, (UWORD32)c_max);
619*c83a76b0SSuyog Pawar     u4_bits <<= (32 - c_max);
620*c83a76b0SSuyog Pawar     do
621*c83a76b0SSuyog Pawar     {
622*c83a76b0SSuyog Pawar         u4_ofst <<= 1;
623*c83a76b0SSuyog Pawar         u4_ofst |= (u4_bits >> 31);
624*c83a76b0SSuyog Pawar         u4_bits <<= 1;
625*c83a76b0SSuyog Pawar 
626*c83a76b0SSuyog Pawar         bin = 0;
627*c83a76b0SSuyog Pawar         if(u4_ofst >= u4_range)
628*c83a76b0SSuyog Pawar         {
629*c83a76b0SSuyog Pawar             bin = 1;
630*c83a76b0SSuyog Pawar             u4_ofst -= u4_range;
631*c83a76b0SSuyog Pawar         }
632*c83a76b0SSuyog Pawar         u4_sym++;
633*c83a76b0SSuyog Pawar     }while(((WORD32)u4_sym < c_max) && bin);
634*c83a76b0SSuyog Pawar     BITS_FLUSH(ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
635*c83a76b0SSuyog Pawar                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, u4_sym);
636*c83a76b0SSuyog Pawar 
637*c83a76b0SSuyog Pawar     u4_sym = u4_sym - 1 + bin;
638*c83a76b0SSuyog Pawar     /* Update the cabac context */
639*c83a76b0SSuyog Pawar     ps_cabac->u4_ofst = u4_ofst;
640*c83a76b0SSuyog Pawar 
641*c83a76b0SSuyog Pawar     return (u4_sym);
642*c83a76b0SSuyog Pawar }
643*c83a76b0SSuyog Pawar 
644*c83a76b0SSuyog Pawar /**
645*c83a76b0SSuyog Pawar  ******************************************************************************
646*c83a76b0SSuyog Pawar  *
647*c83a76b0SSuyog Pawar  *  @brief Decodes a syntax element as kth order Exp-Golomb code (EGK)
648*c83a76b0SSuyog Pawar  *
649*c83a76b0SSuyog Pawar  *  @par   Description
650*c83a76b0SSuyog Pawar  *  Decodes a syntax element binarized as kth order Exp-Golomb code (EGK)
651*c83a76b0SSuyog Pawar  *  Elements are coded as bypass bins
652*c83a76b0SSuyog Pawar  *
653*c83a76b0SSuyog Pawar  *  @param[in,out] ps_cabac
654*c83a76b0SSuyog Pawar  *   pointer to cabac context (handle)
655*c83a76b0SSuyog Pawar  *
656*c83a76b0SSuyog Pawar  *  @param[in]   u4_sym
657*c83a76b0SSuyog Pawar  *   syntax element to be coded as EGK
658*c83a76b0SSuyog Pawar  *
659*c83a76b0SSuyog Pawar  *  @param[in]   k
660*c83a76b0SSuyog Pawar  *   order of EGk
661*c83a76b0SSuyog Pawar  *
662*c83a76b0SSuyog Pawar  *  @return      success or failure error code
663*c83a76b0SSuyog Pawar  *
664*c83a76b0SSuyog Pawar  ******************************************************************************
665*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bypass_bins_egk(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 k)666*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_egk(cab_ctxt_t *ps_cabac,
667*c83a76b0SSuyog Pawar                                             bitstrm_t *ps_bitstrm,
668*c83a76b0SSuyog Pawar                                             WORD32 k)
669*c83a76b0SSuyog Pawar {
670*c83a76b0SSuyog Pawar 
671*c83a76b0SSuyog Pawar     UWORD32 u4_sym;
672*c83a76b0SSuyog Pawar     WORD32 numones;
673*c83a76b0SSuyog Pawar     WORD32 bin;
674*c83a76b0SSuyog Pawar 
675*c83a76b0SSuyog Pawar     /* Sanity checks */
676*c83a76b0SSuyog Pawar     ASSERT((k >= 0));
677*c83a76b0SSuyog Pawar 
678*c83a76b0SSuyog Pawar     numones = k;
679*c83a76b0SSuyog Pawar     bin = 1;
680*c83a76b0SSuyog Pawar     u4_sym = 0;
681*c83a76b0SSuyog Pawar     while(bin && (numones <= 16))
682*c83a76b0SSuyog Pawar     {
683*c83a76b0SSuyog Pawar         IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
684*c83a76b0SSuyog Pawar         u4_sym += bin << numones++;
685*c83a76b0SSuyog Pawar     }
686*c83a76b0SSuyog Pawar 
687*c83a76b0SSuyog Pawar     numones -= 1;
688*c83a76b0SSuyog Pawar 
689*c83a76b0SSuyog Pawar     if(numones)
690*c83a76b0SSuyog Pawar     {
691*c83a76b0SSuyog Pawar         UWORD32 u4_suffix;
692*c83a76b0SSuyog Pawar 
693*c83a76b0SSuyog Pawar         IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, numones);
694*c83a76b0SSuyog Pawar         u4_sym += u4_suffix;
695*c83a76b0SSuyog Pawar     }
696*c83a76b0SSuyog Pawar     return (u4_sym);
697*c83a76b0SSuyog Pawar }
698*c83a76b0SSuyog Pawar 
699*c83a76b0SSuyog Pawar /**
700*c83a76b0SSuyog Pawar  ******************************************************************************
701*c83a76b0SSuyog Pawar  *
702*c83a76b0SSuyog Pawar  *  @brief Decodes a syntax element as truncated rice code (TR)
703*c83a76b0SSuyog Pawar  *
704*c83a76b0SSuyog Pawar  *  @par   Description
705*c83a76b0SSuyog Pawar  *  Decodes a syntax element as truncated rice code (TR)
706*c83a76b0SSuyog Pawar  *  Elements are coded as bypass bins
707*c83a76b0SSuyog Pawar  *  This function ise used for coeff_abs_level_remaining coding when
708*c83a76b0SSuyog Pawar  *  level is less than c_rice_max
709*c83a76b0SSuyog Pawar  *
710*c83a76b0SSuyog Pawar  *  @param[in,out] ps_cabac
711*c83a76b0SSuyog Pawar  *   pointer to cabac context (handle)
712*c83a76b0SSuyog Pawar  *
713*c83a76b0SSuyog Pawar  *  @param[in]   u4_sym
714*c83a76b0SSuyog Pawar  *   syntax element to be coded as truncated rice code
715*c83a76b0SSuyog Pawar  *
716*c83a76b0SSuyog Pawar  *  @param[in]   c_rice_param
717*c83a76b0SSuyog Pawar  *    shift factor for truncated unary prefix coding of (u4_sym >> c_rice_param)
718*c83a76b0SSuyog Pawar  *
719*c83a76b0SSuyog Pawar  *  @param[in]   c_rice_max
720*c83a76b0SSuyog Pawar  *    max symbol val below which a suffix is coded as (u4_sym%(1<<c_rice_param))
721*c83a76b0SSuyog Pawar  *    This is currently (4 << c_rice_param) for coeff_abs_level_remaining
722*c83a76b0SSuyog Pawar  *
723*c83a76b0SSuyog Pawar  *  @return      success or failure error code
724*c83a76b0SSuyog Pawar  *
725*c83a76b0SSuyog Pawar  ******************************************************************************
726*c83a76b0SSuyog Pawar  */
ihevcd_cabac_decode_bypass_bins_trunc_rice(cab_ctxt_t * ps_cabac,bitstrm_t * ps_bitstrm,WORD32 c_rice_param,WORD32 c_rice_max)727*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_trunc_rice(cab_ctxt_t *ps_cabac,
728*c83a76b0SSuyog Pawar                                                    bitstrm_t *ps_bitstrm,
729*c83a76b0SSuyog Pawar                                                    WORD32 c_rice_param,
730*c83a76b0SSuyog Pawar                                                    WORD32 c_rice_max)
731*c83a76b0SSuyog Pawar {
732*c83a76b0SSuyog Pawar     UWORD32 u4_sym;
733*c83a76b0SSuyog Pawar     WORD32 bin;
734*c83a76b0SSuyog Pawar     WORD32 c_max;
735*c83a76b0SSuyog Pawar     UWORD32 u4_suffix;
736*c83a76b0SSuyog Pawar     /* Sanity checks */
737*c83a76b0SSuyog Pawar     ASSERT((c_rice_param >= 0));
738*c83a76b0SSuyog Pawar 
739*c83a76b0SSuyog Pawar 
740*c83a76b0SSuyog Pawar     /* Decode prefix coded as TUnary */
741*c83a76b0SSuyog Pawar     c_max = c_rice_max >> c_rice_param;
742*c83a76b0SSuyog Pawar     u4_sym = 0;
743*c83a76b0SSuyog Pawar     do
744*c83a76b0SSuyog Pawar     {
745*c83a76b0SSuyog Pawar         IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
746*c83a76b0SSuyog Pawar         u4_sym++;
747*c83a76b0SSuyog Pawar 
748*c83a76b0SSuyog Pawar     }while(((WORD32)u4_sym < c_max) && bin);
749*c83a76b0SSuyog Pawar     u4_sym = u4_sym - 1 + bin;
750*c83a76b0SSuyog Pawar 
751*c83a76b0SSuyog Pawar     /* If suffix is present, then decode c_rice_param number of bins */
752*c83a76b0SSuyog Pawar     if(c_rice_param)
753*c83a76b0SSuyog Pawar     {
754*c83a76b0SSuyog Pawar         IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, c_rice_param);
755*c83a76b0SSuyog Pawar 
756*c83a76b0SSuyog Pawar         u4_sym = (u4_sym << c_rice_param) | u4_suffix;
757*c83a76b0SSuyog Pawar     }
758*c83a76b0SSuyog Pawar     return (u4_sym);
759*c83a76b0SSuyog Pawar }
760