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