Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2 *
      3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
      4 *
      5 * Licensed under the Apache License, Version 2.0 (the "License");
      6 * you may not use this file except in compliance with the License.
      7 * You may obtain a copy of the License at:
      8 *
      9 * http://www.apache.org/licenses/LICENSE-2.0
     10 *
     11 * Unless required by applicable law or agreed to in writing, software
     12 * distributed under the License is distributed on an "AS IS" BASIS,
     13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 * See the License for the specific language governing permissions and
     15 * limitations under the License.
     16 *
     17 ******************************************************************************/
     18 /**
     19  ******************************************************************************
     20  * @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
     78 extern 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  */
    132 IHEVCD_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 
    167     /*
    168      * If the offset is greater than or equal to range, return fail.
    169      */
    170     if(ps_cabac->u4_ofst >= ps_cabac->u4_range)
    171     {
    172         return ((IHEVCD_ERROR_T)IHEVCD_FAIL);
    173     }
    174 
    175     return ((IHEVCD_ERROR_T)IHEVCD_SUCCESS);
    176 }
    177 
    178 IHEVCD_ERROR_T ihevcd_cabac_reset(cab_ctxt_t *ps_cabac,
    179                                   bitstrm_t *ps_bitstrm)
    180 {
    181     /* Sanity checks */
    182     ASSERT(ps_cabac != NULL);
    183     ASSERT(ps_bitstrm != NULL);
    184 
    185     /* CABAC engine uses 32 bit range instead of 9 bits as specified by
    186      * the spec. This is done to reduce number of renormalizations
    187      */
    188     /* cabac engine initialization */
    189 #if FULLRANGE
    190     ps_cabac->u4_range = (UWORD32)510 << RANGE_SHIFT;
    191     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    192                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, (9 + RANGE_SHIFT));
    193 
    194 #else
    195     ps_cabac->u4_range = (UWORD32)510;
    196     BITS_GET(ps_cabac->u4_ofst, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    197                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, 9);
    198 
    199 #endif
    200 
    201     return ((IHEVCD_ERROR_T)IHEVCD_SUCCESS);
    202 }
    203 
    204 /**
    205  ******************************************************************************
    206  *
    207  *  @brief Decodes a bin based on probablilty and mps packed context model
    208  *
    209  *  @par   Description
    210  *  Decodes a bin as per Section : 9.3.3.2.1 and calls renormalization if required
    211  *  as per section 9.3.3.2.2
    212  *  1. Apart from decoding bin, context model is updated as per state transition
    213  *  2. Range and Low renormalization is done based on bin and original state
    214  *  3. After renorm bistream is updated (if required)
    215  *
    216  *  @param[in,out]   ps_cabac
    217  *  pointer to cabac context (handle)
    218  *
    219  *  @param[in]   ctxt_index
    220  *  index of cabac context model containing pState[bits6-1] | MPS[bit0]
    221  *
    222  *  @param[in]   ps_bitstrm
    223  *  Bitstream context
    224  *
    225  *  @return      bin(boolean) to be decoded
    226  *
    227  ******************************************************************************
    228  */
    229 UWORD32 ihevcd_cabac_decode_bin(cab_ctxt_t *ps_cabac,
    230                                 bitstrm_t *ps_bitstrm,
    231                                 WORD32 ctxt_index
    232 
    233                                )
    234 {
    235     UWORD32 u4_range = ps_cabac->u4_range;
    236     UWORD32 u4_ofst = ps_cabac->u4_ofst;
    237     UWORD32 u4_rlps;
    238     UWORD32 u4_bin;
    239     UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index];
    240     WORD32 state_mps = *pu1_ctxt_model;
    241 #if FULLRANGE
    242     WORD32 clz;
    243 #endif
    244     UWORD32 u4_qnt_range;
    245 
    246     /* Sanity checks */
    247     ASSERT(u4_range >= 256);
    248     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
    249     ASSERT(state_mps < 128);
    250 #if FULLRANGE
    251     clz = CLZ(u4_range);
    252     clz -= (32 - RANGE_NUMBITS);
    253     u4_qnt_range = u4_range << clz;
    254     u4_qnt_range = (u4_qnt_range >> (RANGE_SHIFT + 6)) & 0x3;
    255 #else
    256     u4_qnt_range = (u4_range >> 6) & 0x3;
    257 #endif
    258     /* Get the lps range from LUT based on quantized range and state */
    259     u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][u4_qnt_range];
    260 #if FULLRANGE
    261     u4_rlps = u4_rlps << (RANGE_SHIFT - clz);
    262 #endif
    263     u4_range -= u4_rlps;
    264 
    265     u4_bin = state_mps & 1;
    266 
    267     if(u4_ofst >= u4_range)
    268     {
    269         u4_bin = 1 - u4_bin;
    270         u4_ofst -= u4_range;
    271         u4_range = u4_rlps;
    272     }
    273 
    274     *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | u4_bin];
    275 
    276     /*****************************************************************/
    277     /* Re-normalization; calculate bits generated based on range(R)  */
    278     /*****************************************************************/
    279     if(u4_range < (1 << 8))
    280     {
    281         UWORD32 u4_bits;
    282         WORD32 numbits;
    283         numbits = CLZ(u4_range);
    284         numbits -= (32 - RANGE_NUMBITS);
    285 #if !FULLRANGE
    286         numbits -= RANGE_SHIFT;
    287 #endif
    288         BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    289                  ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits);
    290 
    291         u4_ofst <<= numbits;
    292         u4_ofst |= u4_bits;
    293         u4_range <<= numbits;
    294 
    295     }
    296     /* Update the cabac context */
    297     ps_cabac->u4_range = u4_range;
    298     ps_cabac->u4_ofst = u4_ofst;
    299     DEBUG_RANGE_OFST("bin", ps_cabac->u4_range, ps_cabac->u4_ofst);
    300 
    301     return (u4_bin);
    302 
    303 
    304 }
    305 
    306 /**
    307  ******************************************************************************
    308  *
    309  *  @brief Decodes a bypass bin (equi-probable 0 / 1)
    310  *
    311  *  @par   Description
    312  *  Decodes a bypss bin as per Section : 9.3.3.2.3
    313  *
    314  *  @param[in,out]  ps_cabac
    315  *  pointer to cabac context (handle)
    316  *
    317  *  @param[in]   ps_bitstrm
    318  *  Bitstream context
    319  *
    320  *  @return      Decoded bypass bin
    321  *
    322  ******************************************************************************
    323  */
    324 UWORD32 ihevcd_cabac_decode_bypass_bin(cab_ctxt_t *ps_cabac,
    325                                        bitstrm_t *ps_bitstrm)
    326 {
    327 
    328     UWORD32 u4_bin;
    329     UWORD32 u4_range = ps_cabac->u4_range;
    330     UWORD32 u4_ofst = ps_cabac->u4_ofst;
    331     UWORD32 u4_bits;
    332 
    333     /* Sanity checks */
    334     ASSERT(u4_range >= 256);
    335 
    336     BIT_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    337             ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word);
    338 
    339     u4_ofst <<= 1;
    340     u4_ofst |= u4_bits;
    341 
    342     u4_bin = 0;
    343     if(u4_ofst >= u4_range)
    344     {
    345         u4_bin = 1;
    346         u4_ofst -= u4_range;
    347     }
    348 
    349     /* Update the cabac context */
    350     ps_cabac->u4_ofst = u4_ofst;
    351     DEBUG_RANGE_OFST("bypass end", ps_cabac->u4_range, ps_cabac->u4_ofst);
    352     return (u4_bin);
    353 }
    354 
    355 /**
    356  ******************************************************************************
    357  *
    358  *  @brief Decodes a terminate bin (1:terminate 0:do not terminate)
    359  *
    360  *  @par   Description
    361  *  Decodes a terminate bin to be called for end_of_slice_flag and pcm_flag
    362  *  as per Section : 9.3.3.2.4
    363  *
    364  *  @param[in,out]  ps_cabac
    365  *  pointer to cabac context (handle)
    366  *
    367  *  @param[in]   ps_bitstrm
    368  *  Bitstream context
    369  *
    370  *  @return    Decoded Bin to indicate whether to terminate or not
    371  *
    372  ******************************************************************************
    373  */
    374 UWORD32 ihevcd_cabac_decode_terminate(cab_ctxt_t *ps_cabac,
    375                                       bitstrm_t *ps_bitstrm)
    376 {
    377     UWORD32 u4_range = ps_cabac->u4_range;
    378     UWORD32 u4_ofst = ps_cabac->u4_ofst;
    379     UWORD32 u4_bin;
    380 #if FULLRANGE
    381     WORD32 clz;
    382 #endif
    383     /* Sanity checks */
    384     ASSERT(u4_range >= 256);
    385 #if FULLRANGE
    386     clz = CLZ(u4_range);
    387     clz -= (32 - RANGE_NUMBITS);
    388     u4_range -= 2 << (RANGE_SHIFT - clz);
    389 #else
    390     u4_range -= 2;
    391 #endif
    392 
    393     if(u4_ofst >= u4_range)
    394     {
    395         u4_bin = 1;
    396 
    397 #if FULLRANGE
    398         /* In case of FULLRANGE extra bits read earlier need to pushed back to the bitstream */
    399         {
    400             WORD32 clz;
    401             WORD32 numbits;
    402             clz = CLZ(ps_cabac->u4_range);
    403 
    404             numbits = (32 - clz);
    405             numbits -= 9;
    406 
    407             ihevcd_bits_seek(ps_bitstrm, -numbits);
    408         }
    409 #endif
    410 
    411     }
    412     else
    413     {
    414         u4_bin = 0;
    415     }
    416     if(0 == u4_bin)
    417     {
    418         UWORD32 u4_bits;
    419         WORD32 numbits;
    420         numbits = CLZ(u4_range);
    421         numbits -= (32 - RANGE_NUMBITS);
    422 #if !FULLRANGE
    423         numbits -= RANGE_SHIFT;
    424 #endif
    425         /* Renormalize if required */
    426         if(numbits)
    427         {
    428             BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    429                      ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits);
    430 
    431             u4_ofst <<= numbits;
    432             u4_ofst |= u4_bits;
    433             u4_range <<= numbits;
    434         }
    435     }
    436     /* bits to be inserted in the bitstream */
    437     ps_cabac->u4_range = u4_range;
    438     ps_cabac->u4_ofst = u4_ofst;
    439     DEBUG_RANGE_OFST("term", ps_cabac->u4_range, ps_cabac->u4_ofst);
    440 
    441     return (u4_bin);
    442 }
    443 
    444 /**
    445  ******************************************************************************
    446  *
    447  *  @brief Decodes a bypass bin (equi-probable 0 / 1)
    448  *
    449  *  @par   Description
    450  *  Decodes a bypss bin as per Section : 9.3.3.2.3
    451  *
    452  *  @param[in,out]  ps_cabac
    453  *  pointer to cabac context (handle)
    454  *
    455  *  @param[in]   ps_bitstrm
    456  *  Bitstream context
    457  *
    458  *  @param[in]   numbins
    459  *  Number of bins to decoded
    460  *
    461  *  @return      Decoded bypass bin
    462  *
    463  *  @remarks     Tested only for numbins less than 17
    464  *
    465  ******************************************************************************
    466  */
    467 
    468 UWORD32 ihevcd_cabac_decode_bypass_bins(cab_ctxt_t *ps_cabac,
    469                                         bitstrm_t *ps_bitstrm,
    470                                         WORD32 numbins)
    471 {
    472     UWORD32 u4_bins;
    473 
    474 
    475     UWORD32 u4_range = ps_cabac->u4_range;
    476     UWORD32 u4_ofst = ps_cabac->u4_ofst;
    477     UWORD32 u4_bits;
    478     ASSERT(u4_range >= 256);
    479     ASSERT(numbins > 0);
    480 
    481     /* Sanity checks */
    482     ASSERT(numbins < 17);
    483 
    484     u4_bins = 0;
    485 
    486     BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    487                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbins);
    488 
    489     do
    490     {
    491         UWORD32 u4_bit;
    492         numbins--;
    493         u4_bit = (u4_bits >> numbins) & 1;
    494         u4_ofst <<= 1;
    495         u4_ofst |= u4_bit;
    496 
    497         u4_bins <<= 1;
    498         if(u4_ofst >= u4_range)
    499         {
    500             u4_bins += 1;
    501             u4_ofst -= u4_range;
    502         }
    503     }while(numbins);
    504 
    505     /* Update the cabac context */
    506     ps_cabac->u4_ofst = u4_ofst;
    507     DEBUG_RANGE_OFST("bypass", ps_cabac->u4_range, ps_cabac->u4_ofst);
    508     return (u4_bins);
    509 }
    510 
    511 /**
    512  ******************************************************************************
    513  *
    514  *  @brief Decodes a truncated unary symbol associated with context model(s)
    515  *
    516  *  @par   Description
    517  *  Decodes symbols coded with TUnary binarization as per sec 9.3.2.2
    518  *  This is used for computing symbols like qp_delta,
    519  *  last_sig_coeff_prefix_x, last_sig_coeff_prefix_y.
    520  *
    521  *  The context models associated with each bin is computed as :
    522  *   current bin context = "base context idx" + (bin_idx >> shift)
    523  *  where
    524  *   1. "base context idx" is the base index for the syntax element
    525  *   2. "bin_idx" is the current bin index of the unary code
    526  *   3. "shift" is the shift factor associated with this syntax element
    527  *
    528  *  @param[in,out] ps_cabac
    529  *   pointer to cabac context (handle)
    530  *
    531  *  @param[in]   ps_bitstrm
    532  *  Bitstream context
    533  *
    534  *  @param[in]   c_max
    535  *   maximum value of sym (required for tunary binarization)
    536  *
    537  *  @param[in]   ctxt_index
    538  *   base context model index for this syntax element
    539  *
    540  *  @param[in]   ctxt_shift
    541  *   shift factor for context increments associated with this syntax element
    542  *
    543  *  @param[in]   ctxt_inc_max
    544  *   max value of context increment beyond which all bins will use same ctxt
    545  *
    546  *  @return     syntax element decoded
    547  *
    548  ******************************************************************************
    549  */
    550 UWORD32 ihevcd_cabac_decode_bins_tunary(cab_ctxt_t *ps_cabac,
    551                                         bitstrm_t *ps_bitstrm,
    552                                         WORD32 c_max,
    553                                         WORD32 ctxt_index,
    554                                         WORD32 ctxt_shift,
    555                                         WORD32 ctxt_inc_max)
    556 {
    557     UWORD32 u4_sym;
    558     WORD32 bin;
    559 
    560     /* Sanity checks */
    561     ASSERT(c_max > 0);
    562     ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END));
    563     ASSERT((ctxt_index + (c_max >> ctxt_shift)) < IHEVC_CAB_CTXT_END);
    564 
    565     u4_sym = 0;
    566     do
    567     {
    568         WORD32 bin_index;
    569         bin_index = ctxt_index + MIN((u4_sym >> ctxt_shift), (UWORD32)ctxt_inc_max);
    570         IHEVCD_CABAC_DECODE_BIN(bin, ps_cabac, ps_bitstrm,  bin_index);
    571         u4_sym++;
    572     }while(((WORD32)u4_sym < c_max) && bin);
    573 
    574     u4_sym = u4_sym - 1 + bin;
    575 
    576     return (u4_sym);
    577 }
    578 
    579 /**
    580  ******************************************************************************
    581  *
    582  *  @brief Decodes a syntax element as truncated unary bypass bins
    583  *
    584  *  @par   Description
    585  *  Decodes symbols coded with TUnary binarization as per sec 9.3.2.2
    586  *  These symbols are coded as bypass bins
    587  *   This is used for computing symbols like merge_idx,
    588  *  mpm_idx etc
    589  *
    590  *  @param[in,out]ps_cabac
    591  *   pointer to cabac context (handle)
    592  *
    593  *  @param[in]   ps_bitstrm
    594  *  Bitstream context
    595  *
    596  *  @param[in]   c_max
    597  *   maximum value of sym (required for tunary binarization)
    598  *
    599  *  @return      syntax element decoded
    600  *
    601  ******************************************************************************
    602  */
    603 UWORD32 ihevcd_cabac_decode_bypass_bins_tunary(cab_ctxt_t *ps_cabac,
    604                                                bitstrm_t *ps_bitstrm,
    605                                                WORD32 c_max)
    606 {
    607 
    608     UWORD32 u4_sym;
    609     WORD32 bin;
    610     UWORD32 u4_ofst = ps_cabac->u4_ofst;
    611     UWORD32 u4_range = ps_cabac->u4_range;
    612     UWORD32 u4_bits;
    613     /* Sanity checks */
    614     ASSERT(c_max > 0);
    615     ASSERT(u4_range >= 256);
    616     u4_sym = 0;
    617     BITS_NXT(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    618                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, (UWORD32)c_max);
    619     u4_bits <<= (32 - c_max);
    620     do
    621     {
    622         u4_ofst <<= 1;
    623         u4_ofst |= (u4_bits >> 31);
    624         u4_bits <<= 1;
    625 
    626         bin = 0;
    627         if(u4_ofst >= u4_range)
    628         {
    629             bin = 1;
    630             u4_ofst -= u4_range;
    631         }
    632         u4_sym++;
    633     }while(((WORD32)u4_sym < c_max) && bin);
    634     BITS_FLUSH(ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst,
    635                     ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, u4_sym);
    636 
    637     u4_sym = u4_sym - 1 + bin;
    638     /* Update the cabac context */
    639     ps_cabac->u4_ofst = u4_ofst;
    640 
    641     return (u4_sym);
    642 }
    643 
    644 /**
    645  ******************************************************************************
    646  *
    647  *  @brief Decodes a syntax element as kth order Exp-Golomb code (EGK)
    648  *
    649  *  @par   Description
    650  *  Decodes a syntax element binarized as kth order Exp-Golomb code (EGK)
    651  *  Elements are coded as bypass bins
    652  *
    653  *  @param[in,out] ps_cabac
    654  *   pointer to cabac context (handle)
    655  *
    656  *  @param[in]   u4_sym
    657  *   syntax element to be coded as EGK
    658  *
    659  *  @param[in]   k
    660  *   order of EGk
    661  *
    662  *  @return      success or failure error code
    663  *
    664  ******************************************************************************
    665  */
    666 UWORD32 ihevcd_cabac_decode_bypass_bins_egk(cab_ctxt_t *ps_cabac,
    667                                             bitstrm_t *ps_bitstrm,
    668                                             WORD32 k)
    669 {
    670 
    671     UWORD32 u4_sym;
    672     WORD32 numones;
    673     WORD32 bin;
    674 
    675     /* Sanity checks */
    676     ASSERT((k >= 0));
    677 
    678     numones = k;
    679     bin = 1;
    680     u4_sym = 0;
    681     while(bin && (numones <= 16))
    682     {
    683         IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
    684         u4_sym += bin << numones++;
    685     }
    686 
    687     numones -= 1;
    688 
    689     if(numones)
    690     {
    691         UWORD32 u4_suffix;
    692 
    693         IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, numones);
    694         u4_sym += u4_suffix;
    695     }
    696     return (u4_sym);
    697 }
    698 
    699 /**
    700  ******************************************************************************
    701  *
    702  *  @brief Decodes a syntax element as truncated rice code (TR)
    703  *
    704  *  @par   Description
    705  *  Decodes a syntax element as truncated rice code (TR)
    706  *  Elements are coded as bypass bins
    707  *  This function ise used for coeff_abs_level_remaining coding when
    708  *  level is less than c_rice_max
    709  *
    710  *  @param[in,out] ps_cabac
    711  *   pointer to cabac context (handle)
    712  *
    713  *  @param[in]   u4_sym
    714  *   syntax element to be coded as truncated rice code
    715  *
    716  *  @param[in]   c_rice_param
    717  *    shift factor for truncated unary prefix coding of (u4_sym >> c_rice_param)
    718  *
    719  *  @param[in]   c_rice_max
    720  *    max symbol val below which a suffix is coded as (u4_sym%(1<<c_rice_param))
    721  *    This is currently (4 << c_rice_param) for coeff_abs_level_remaining
    722  *
    723  *  @return      success or failure error code
    724  *
    725  ******************************************************************************
    726  */
    727 UWORD32 ihevcd_cabac_decode_bypass_bins_trunc_rice(cab_ctxt_t *ps_cabac,
    728                                                    bitstrm_t *ps_bitstrm,
    729                                                    WORD32 c_rice_param,
    730                                                    WORD32 c_rice_max)
    731 {
    732     UWORD32 u4_sym;
    733     WORD32 bin;
    734     WORD32 c_max;
    735     UWORD32 u4_suffix;
    736     /* Sanity checks */
    737     ASSERT((c_rice_param >= 0));
    738 
    739 
    740     /* Decode prefix coded as TUnary */
    741     c_max = c_rice_max >> c_rice_param;
    742     u4_sym = 0;
    743     do
    744     {
    745         IHEVCD_CABAC_DECODE_BYPASS_BIN(bin, ps_cabac, ps_bitstrm);
    746         u4_sym++;
    747 
    748     }while(((WORD32)u4_sym < c_max) && bin);
    749     u4_sym = u4_sym - 1 + bin;
    750 
    751     /* If suffix is present, then decode c_rice_param number of bins */
    752     if(c_rice_param)
    753     {
    754         IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_suffix, ps_cabac, ps_bitstrm, c_rice_param);
    755 
    756         u4_sym = (u4_sym << c_rice_param) | u4_suffix;
    757     }
    758     return (u4_sym);
    759 }
    760