/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/*!
 ***************************************************************************
 * \file ih264d_cabac.c
 *
 * \brief
 *    This file contains Binary decoding routines.
 *
 * \date
 *    04/02/2003
 *
 * \author  NS
 ***************************************************************************
 */
#include <string.h>
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"
#include "ih264d_structs.h"
#include "ih264d_cabac.h"
#include "ih264d_bitstrm.h"
#include "ih264d_error_handler.h"
#include "ih264d_defs.h"
#include "ih264d_debug.h"
#include "ih264d_tables.h"
#include "ih264d_parse_cabac.h"
#include "ih264d_tables.h"



/*!
 **************************************************************************
 * \if Function name : ih264d_init_cabac_dec_envirnoment \endif
 *
 * \brief
 *    This function initializes CABAC decoding envirnoment. This function
 *    implements 9.3.3.2.3.1 of ISO/IEC14496-10.
 *
 * \return
 *    None
 *
 **************************************************************************
 */
WORD32 ih264d_init_cabac_dec_envirnoment(decoding_envirnoment_t * ps_cab_env,
                                       dec_bit_stream_t *ps_bitstrm)
{
    UWORD32 u4_code_int_val_ofst;

    ps_cab_env->u4_code_int_range = (HALF - 2) << 23;
    NEXTBITS(u4_code_int_val_ofst, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer,
             32);
    FLUSHBITS(ps_bitstrm->u4_ofst, 9)

    if(ps_bitstrm->u4_ofst > ps_bitstrm->u4_max_ofst)
        return ERROR_EOB_FLUSHBITS_T;

    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;

    /*brief description of the design adopted for CABAC*/
    /*according to the standard the u4_code_int_range needs to be initialized 0x 1FE(10 bits) and
     9 bits from the bit stream need to be read and into the u4_code_int_val_ofst.As and when the
     u4_code_int_range becomes less than 10 bits we need to renormalize and read from the bitstream*

     In the implemented design
     initially

     range_new = range <<23
     valOffset_new = valOffset << 23 + 23 bits(read from the bit stream)

     Thus we have read 23 more bits ahead of time.

     It can be mathematical proved that even with the modified range and u4_ofst the operations
     like comparison and subtraction needed for a bin decode are still valid(both in the regular case and the bypass case)

     As bins are decoded..we consume the bits that we have already read into the valOffset.The clz of Range
     gives us the number of bits we consumed of the 23 bits that we have read ahead of time.

     when the number bits we have consumed exceeds 23 ,we renormalize..and  we read from the bitstream again*/

RESET_BIN_COUNTS(ps_cab_env)

    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_init_cabac_contexts                                      */
/*                                                                           */
/*  Description   : This function initializes the cabac contexts             */
/*                  depending upon slice type and Init_Idc value.            */
/*  Inputs        : ps_dec, slice type                                       */
/*  Globals       : <Does it use any global variables?>                      */
/*  Outputs       :                                                          */
/*  Returns       : void                                                     */
/*                                                                           */
/*  Issues        : none                                                     */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         03 05 2005   100153)         Draft                                */
/*                                                                           */
/*****************************************************************************/

void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec)
{

    bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
    UWORD8 u1_qp_y = ps_dec->ps_cur_slice->u1_slice_qp;
    UWORD8 u1_cabac_init_Idc = 0;

    if(I_SLICE != u1_slice_type)
    {
        u1_cabac_init_Idc = ps_dec->ps_cur_slice->u1_cabac_init_idc;
    }

    {
        /* MAKING ps_dec->p_ctxt_inc_mb_map a scratch buffer */
        /* 0th entry of CtxtIncMbMap will be always be containing default values
         for CABAC context representing MB not available */
        ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1;
        UWORD8 *pu1_temp;
        WORD8 i;
        p_DefCtxt->u1_mb_type = CAB_SKIP;

        p_DefCtxt->u1_cbp = 0x0f;
        p_DefCtxt->u1_intra_chroma_pred_mode = 0;

        p_DefCtxt->u1_yuv_dc_csbp = 0x7;

        p_DefCtxt->u1_transform8x8_ctxt = 0;

        pu1_temp = (UWORD8*)p_DefCtxt->i1_ref_idx;
        for(i = 0; i < 4; i++, pu1_temp++)
            (*pu1_temp) = 0;
        pu1_temp = (UWORD8*)p_DefCtxt->u1_mv;
        for(i = 0; i < 16; i++, pu1_temp++)
            (*pu1_temp) = 0;
        ps_dec->ps_def_ctxt_mb_info = p_DefCtxt;
    }

    if(u1_slice_type == I_SLICE)
    {
        u1_cabac_init_Idc = 3;
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_I_SLICE;
    }
    else if(u1_slice_type == P_SLICE)
    {
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_P_SLICE;
        ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_P_SLICE;
        ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_P_SLICE;
    }
    else if(u1_slice_type == B_SLICE)
    {
        ps_dec->p_mb_type_t = p_cabac_ctxt_table_t + MB_TYPE_B_SLICE;
        ps_dec->p_mb_skip_flag_t = p_cabac_ctxt_table_t + MB_SKIP_FLAG_B_SLICE;
        ps_dec->p_sub_mb_type_t = p_cabac_ctxt_table_t + SUB_MB_TYPE_B_SLICE;
    }
    {
        bin_ctxt_model_t *p_cabac_ctxt_table_t_tmp = p_cabac_ctxt_table_t;
        if(ps_dec->ps_cur_slice->u1_field_pic_flag)
        {
            p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FLD;

        }
        else
        {
            p_cabac_ctxt_table_t_tmp += SIGNIFICANT_COEFF_FLAG_FRAME;
        }
        {
            bin_ctxt_model_t * * p_significant_coeff_flag_t =
                            ps_dec->p_significant_coeff_flag_t;
            p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_0_OFFSET;
            p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_1_OFFSET;
            p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_2_OFFSET;
            p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_3_OFFSET;
            p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_4_OFFSET;

            p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t_tmp
                            + SIG_COEFF_CTXT_CAT_5_OFFSET;

        }
    }

    memcpy(p_cabac_ctxt_table_t,
           gau1_ih264d_cabac_ctxt_init_table[u1_cabac_init_Idc][u1_qp_y],
           NUM_CABAC_CTXTS * sizeof(bin_ctxt_model_t));
}
/*!
 **************************************************************************
 * \if Function name : ih264d_decode_bin \endif
 *
 * \brief
 *    This function implements decoding process of a decision as defined
 *    in 9.3.3.2.2.
 *
 * \return
 *    Returns symbol decoded.
 *
 * \note
 *    It is specified in 9.3.3.2.3.2 that, one of the input to this function
 *    is CtxIdx. CtxIdx is used to identify state and MPS of that context
 *    (Refer Fig 9.11 - Flowchart for encoding a decision). To suffice that
 *    here we pass a pointer bin_ctxt_model_t which contains these values.
 *
 **************************************************************************
 */

UWORD32 ih264d_decode_bin(UWORD32 u4_ctx_inc,
                          bin_ctxt_model_t *ps_src_bin_ctxt,
                          dec_bit_stream_t *ps_bitstrm,
                          decoding_envirnoment_t *ps_cab_env)

{

    UWORD32 u4_qnt_int_range, u4_code_int_range, u4_code_int_val_ofst,
                    u4_int_range_lps;

    UWORD32 u4_symbol, u4_mps_state;

    bin_ctxt_model_t *ps_bin_ctxt;

    UWORD32 table_lookup;
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;
    UWORD32 u4_clz;

    ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_inc;

    u4_code_int_range = ps_cab_env->u4_code_int_range;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;

    u4_mps_state = (ps_bin_ctxt->u1_mps_state);
    u4_clz = CLZ(u4_code_int_range);

    u4_qnt_int_range = u4_code_int_range << u4_clz;
    u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3;

    table_lookup = pu4_table[(u4_mps_state << 2) + u4_qnt_int_range];
    u4_int_range_lps = table_lookup & 0xff;

    u4_int_range_lps = u4_int_range_lps << (23 - u4_clz);
    u4_code_int_range = u4_code_int_range - u4_int_range_lps;

    u4_symbol = ((u4_mps_state >> 6) & 0x1);

    u4_mps_state = (table_lookup >> 8) & 0x7F;

    CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol,
                 u4_int_range_lps, u4_mps_state, table_lookup)

    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
    {
        UWORD32 *pu4_buffer, u4_offset;

        pu4_buffer = ps_bitstrm->pu4_buffer;
        u4_offset = ps_bitstrm->u4_ofst;

        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                            pu4_buffer)

        ps_bitstrm->u4_ofst = u4_offset;
    }

    INC_BIN_COUNT(ps_cab_env)

    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
    ps_cab_env->u4_code_int_range = u4_code_int_range;
    ps_bin_ctxt->u1_mps_state = u4_mps_state;

    return (u4_symbol);
}

/*!
 **************************************************************************
 * \if Function name : ih264d_decode_terminate \endif
 *
 * \brief
 *    This function implements decoding process of a termination as defined
 *    9.3.3.2.2.3 of ISO/IEC14496-10.
 *
 * \return
 *    Returns symbol decoded.
 *
 * \note
 *    This routine is called while decoding "end_of_skice_flag" and of the
 *    bin indicating PCM mode in MBType.
 *
 **************************************************************************
 */
UWORD8 ih264d_decode_terminate(decoding_envirnoment_t * ps_cab_env,
                               dec_bit_stream_t * ps_stream)
{
    UWORD32 u4_symbol;
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;
    UWORD32 u4_clz;

    u4_code_int_range = ps_cab_env->u4_code_int_range;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;

    u4_clz = CLZ(u4_code_int_range);
    u4_code_int_range -= (2 << (23 - u4_clz));

    if(u4_code_int_val_ofst >= u4_code_int_range)
    {
        /* S=1 */
        u4_symbol = 1;

        {

            /*the u4_ofst needs to be updated before termination*/
            ps_stream->u4_ofst += u4_clz;

        }

    }
    else
    {
        /* S=0 */
        u4_symbol = 0;

        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8)
        {
            UWORD32 *pu4_buffer, u4_offset;

            pu4_buffer = ps_stream->pu4_buffer;
            u4_offset = ps_stream->u4_ofst;

            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                                pu4_buffer)
            ps_stream->u4_ofst = u4_offset;
        }
    }

    ps_cab_env->u4_code_int_range = u4_code_int_range;
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;

    INC_BIN_COUNT(ps_cab_env)

    return (u4_symbol);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_decode_bins_tunary                                */
/*                                                                           */
/*  Description   : This function decodes bins in the case of TUNARY         */
/*                  binarization technique.valid_length is assumed  equal to 3 */
/*                  and u1_max_bins <= 4 in this functon.                                              */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        :                                                          */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         20 11 2008   SH          Draft                                   */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_decode_bins_tunary(UWORD8 u1_max_bins,
                                  UWORD32 u4_ctx_inc,
                                  bin_ctxt_model_t *ps_src_bin_ctxt,
                                  dec_bit_stream_t *ps_bitstrm,
                                  decoding_envirnoment_t *ps_cab_env)

{
    UWORD32 u4_value;
    UWORD32 u4_symbol;
    UWORD8 u4_ctx_Inc;
    bin_ctxt_model_t *ps_bin_ctxt;
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;

    u4_value = 0;

    /*u1_max_bins has to be less than or equal to 4, u1_max_bins <= 4 for  this function*/

    /*here the valid length is assumed to be equal to 3 ,so the calling function is expected
     to duplicate CtxInc if valid lenth is 2 and cmaxbin is greater than2*/
    u4_code_int_range = ps_cab_env->u4_code_int_range;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;

    do
    {
        u4_ctx_Inc = u4_ctx_inc & 0xF;
        u4_ctx_inc = u4_ctx_inc >> 4;

        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;

        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
                             pu4_table, ps_bitstrm, u4_symbol)

        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);

        u4_value++;
    }
    while((u4_value < u1_max_bins) & (u4_symbol));

    u4_value = u4_value - 1 + u4_symbol;

    ps_cab_env->u4_code_int_range = u4_code_int_range;
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;

    return (u4_value);

}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_decode_bins                                */
/*                                                                           */
/*  Description   : This function decodes bins in the case of MSB_FIRST_FLC  */
/*                  binarization technique.valid_length is always equal max_bins */
/*                  for MSB_FIRST_FLC. assumes  u1_max_bins <= 4               */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         20 11 2008   SH          Draft                                   */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_decode_bins(UWORD8 u1_max_bins,
                           UWORD32 u4_ctx_inc,
                           bin_ctxt_model_t *ps_src_bin_ctxt,
                           dec_bit_stream_t *ps_bitstrm,
                           decoding_envirnoment_t *ps_cab_env)

{
    UWORD32 u4_value;
    UWORD32 u4_symbol, i;
    UWORD32 u4_ctxt_inc;
    bin_ctxt_model_t *ps_bin_ctxt;
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;

    i = 0;

    u4_value = 0;

    /*u1_max_bins has to be less than or equal to 4, u1_max_bins <= 4 for  this fucntion*/
    u4_code_int_range = ps_cab_env->u4_code_int_range;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;

    do
    {
        u4_ctxt_inc = u4_ctx_inc & 0xf;
        u4_ctx_inc = u4_ctx_inc >> 4;

        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctxt_inc;

        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
                             pu4_table, ps_bitstrm, u4_symbol)

        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);

        u4_value = (u4_value << 1) | (u4_symbol);

        i++;
    }
    while(i < u1_max_bins);

    ps_cab_env->u4_code_int_range = u4_code_int_range;
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;

    return (u4_value);

}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_decode_bins_unary                                */
/*                                                                           */
/*  Description   : This function decodes bins in the case of UNARY         */
/*                  binarization technique.here the valid length is taken to 5*/
/*                  and cmax is always greater than 9                       */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         20 11 2008   SH          Draft                                   */
/*                                                                           */
/*****************************************************************************/
UWORD32 ih264d_decode_bins_unary(UWORD8 u1_max_bins,
                                 UWORD32 u4_ctx_inc,
                                 bin_ctxt_model_t *ps_src_bin_ctxt,
                                 dec_bit_stream_t *ps_bitstrm,
                                 decoding_envirnoment_t *ps_cab_env)
{
    UWORD32 u4_value;
    UWORD32 u4_symbol;
    bin_ctxt_model_t *ps_bin_ctxt;
    UWORD32 u4_ctx_Inc;
    UWORD32 u4_code_int_range, u4_code_int_val_ofst;
    const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table;

    /* in this function the valid length for u4_ctx_inc is always taken to be,so if the
     the valid length is lessthan 5 the caller need to duplicate accordingly*/

    /*u1_max_bins is always greater or equal to 9 we have the check for u1_max_bins only after the 2 loop*/
    u4_value = 0;
    u4_code_int_range = ps_cab_env->u4_code_int_range;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;

    do
    {
        u4_ctx_Inc = u4_ctx_inc & 0xf;
        u4_ctx_inc = u4_ctx_inc >> 4;

        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;

        DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
                             pu4_table, ps_bitstrm, u4_symbol)

        INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);

        u4_value++;

    }
    while(u4_symbol && u4_value < 4);

    if(u4_symbol && (u4_value < u1_max_bins))
    {

        u4_ctx_Inc = u4_ctx_inc & 0xf;

        ps_bin_ctxt = ps_src_bin_ctxt + u4_ctx_Inc;

        do
        {

            DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, u4_code_int_val_ofst,
                                 pu4_table, ps_bitstrm, u4_symbol)

            INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env);

            u4_value++;

        }
        while(u4_symbol && (u4_value < u1_max_bins));

    }

    ps_cab_env->u4_code_int_range = u4_code_int_range;
    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;

    u4_value = u4_value - 1 + u4_symbol;

    return (u4_value);

}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_decode_bypass_bins_unary                                     */
/*                                                                           */
/*  Description   : This function is used in the case of UNARY coding       */
/*                                                                           */
/*                                                                           */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 10 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_decode_bypass_bins_unary(decoding_envirnoment_t *ps_cab_env,
                                        dec_bit_stream_t *ps_bitstrm)
{
    UWORD32 u4_value;
    UWORD32 u4_bin;
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;

    UWORD32 u1_max_bins;

    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
    u4_code_int_range = ps_cab_env->u4_code_int_range;

    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
    {
        UWORD32 *pu4_buffer, u4_offset;

        pu4_buffer = ps_bitstrm->pu4_buffer;
        u4_offset = ps_bitstrm->u4_ofst;

        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                            pu4_buffer)
        ps_bitstrm->u4_ofst = u4_offset;
    }

    /*as it is called only form mvd*/
    u1_max_bins = 32;
    u4_value = 0;

    do
    {
        u4_value++;

        u4_code_int_range = u4_code_int_range >> 1;
        if(u4_code_int_val_ofst >= u4_code_int_range)
        {
            /* S=1 */
            u4_bin = 1;
            u4_code_int_val_ofst -= u4_code_int_range;
        }
        else
        {
            /* S=0 */
            u4_bin = 0;
        }

        INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);

        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
        {
            UWORD32 *pu4_buffer, u4_offset;

            pu4_buffer = ps_bitstrm->pu4_buffer;
            u4_offset = ps_bitstrm->u4_ofst;

            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                                pu4_buffer)

            ps_bitstrm->u4_ofst = u4_offset;
        }

    }
    while(u4_bin && (u4_value < u1_max_bins));

    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
    ps_cab_env->u4_code_int_range = u4_code_int_range;
    u4_value = (u4_value - 1 + u4_bin);

return (u4_value);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_decode_bypass_bins                                     */
/*                                                                           */
/*  Description   : This function is used in the case of FLC coding       */
/*                                                                           */
/*                                                                           */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 10 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_decode_bypass_bins(decoding_envirnoment_t *ps_cab_env,
                                  UWORD8 u1_max_bins,
                                  dec_bit_stream_t *ps_bitstrm)
{
    UWORD32 u4_bins;
    UWORD32 u4_bin;
    UWORD32 u4_code_int_val_ofst, u4_code_int_range;

    u4_bins = 0;
    u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst;
    u4_code_int_range = ps_cab_env->u4_code_int_range;

    if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
    {
        UWORD32 *pu4_buffer, u4_offset;

        pu4_buffer = ps_bitstrm->pu4_buffer;
        u4_offset = ps_bitstrm->u4_ofst;

        RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                            pu4_buffer)
        ps_bitstrm->u4_ofst = u4_offset;
    }

    do
    {

        u4_code_int_range = u4_code_int_range >> 1;

        if(u4_code_int_val_ofst >= u4_code_int_range)
        {
            /* S=1 */
            u4_bin = 1;
            u4_code_int_val_ofst -= u4_code_int_range;
        }
        else
        {
            /* S=0 */
            u4_bin = 0;
        }

        INC_BIN_COUNT(ps_cab_env);INC_BYPASS_BINS(ps_cab_env);

        u4_bins = ((u4_bins << 1) | u4_bin);
        u1_max_bins--;

        if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9)
        {
            UWORD32 *pu4_buffer, u4_offset;

            pu4_buffer = ps_bitstrm->pu4_buffer;
            u4_offset = ps_bitstrm->u4_ofst;

            RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset,
                                pu4_buffer)
            ps_bitstrm->u4_ofst = u4_offset;
        }

    }
    while(u1_max_bins);

    ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst;
    ps_cab_env->u4_code_int_range = u4_code_int_range;

    return (u4_bins);
}

