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