/******************************************************************************
 *
 * 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_parse_cavlc.c
 *
 * \brief
 *    This file contains UVLC related functions.
 *
 * \date
 *    20/11/2002
 *
 * \author  NS
 ***************************************************************************
 */

#include <string.h>
#include <stdio.h>

#include "ih264d_bitstrm.h"
#include "ih264d_parse_cavlc.h"
#include "ih264d_error_handler.h"
#include "ih264d_defs.h"
#include "ih264d_debug.h"
#include "ih264d_cabac.h"
#include "ih264d_structs.h"
#include "ih264d_tables.h"
#include "ih264d_tables.h"
#include "ih264d_mb_utils.h"

void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4,
                                      WORD16 *pi2_out_coeff_data,
                                      UWORD8 *pu1_inv_scan);

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_uev                                                  */
/*                                                                           */
/*  Description   : Reads the unsigned Exp Golomb codec syntax from the      */
/*                  ps_bitstrm as specified in section 9.1 of H264 standard      */
/*                  It also increases bitstream u4_ofst by the number of bits */
/*                  parsed for UEV decode operation                          */
/*                                                                           */
/*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
/*  Globals       : None                                                     */
/*  Processing    :                                                          */
/*  Outputs       : UEV decoded syntax element and incremented ps_bitstrm u4_ofst */
/*  Returns       : UEV decoded syntax element                               */
/*                                                                           */
/*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
/*                  for performamce. Caller might have to do error resilence */
/*                  check for bitstream overflow                             */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
UWORD32 ih264d_uev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
{
    UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    UWORD32 u4_word, u4_ldz;

    /***************************************************************/
    /* Find leading zeros in next 32 bits                          */
    /***************************************************************/
    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    u4_ldz = CLZ(u4_word);
    /* Flush the ps_bitstrm */
    u4_bitstream_offset += (u4_ldz + 1);
    /* Read the suffix from the ps_bitstrm */
    u4_word = 0;
    if(u4_ldz)
        GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
    *pu4_bitstrm_ofst = u4_bitstream_offset;
    return ((1 << u4_ldz) + u4_word - 1);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_sev                                                  */
/*                                                                           */
/*  Description   : Reads the signed Exp Golomb codec syntax from the ps_bitstrm */
/*                  as specified in section 9.1 of H264 standard.            */
/*                  It also increases bitstream u4_ofst by the number of bits */
/*                  parsed for SEV decode operation                          */
/*                                                                           */
/*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
/*  Globals       : None                                                     */
/*  Processing    :                                                          */
/*  Outputs       : SEV decoded syntax element and incremented ps_bitstrm u4_ofst */
/*  Returns       : SEV decoded syntax element                               */
/*                                                                           */
/*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
/*                  for performamce. Caller might have to do error resilence */
/*                  check for bitstream overflow                             */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_sev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
{
    UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    UWORD32 u4_word, u4_ldz, u4_abs_val;

    /***************************************************************/
    /* Find leading zeros in next 32 bits                          */
    /***************************************************************/
    NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    u4_ldz = CLZ(u4_word);

    /* Flush the ps_bitstrm */
    u4_bitstream_offset += (u4_ldz + 1);

    /* Read the suffix from the ps_bitstrm */
    u4_word = 0;
    if(u4_ldz)
        GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);

    *pu4_bitstrm_ofst = u4_bitstream_offset;
    u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;

    if(u4_word & 0x1)
        return (-(WORD32)u4_abs_val);
    else
        return (u4_abs_val);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : get_tev_range_1                                          */
/*                                                                           */
/*  Description   : Reads the TEV Exp Golomb codec syntax from the ps_bitstrm    */
/*                  as specified in section 9.1 of H264 standard. This will  */
/*                  called only when the input range is 1 for TEV decode.    */
/*                  If range is more than 1, then UEV decode is done         */
/*                                                                           */
/*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
/*  Globals       : None                                                     */
/*  Processing    :                                                          */
/*  Outputs       : TEV decoded syntax element and incremented ps_bitstrm u4_ofst */
/*  Returns       : TEV decoded syntax element                               */
/*                                                                           */
/*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
/*                  for performamce. Caller might have to do error resilence */
/*                  check for bitstream overflow                             */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
UWORD32 ih264d_tev_range1(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
{
    UWORD32 u4_code;
    GETBIT(u4_code, *pu4_bitstrm_ofst, pu4_bitstrm_buf);
    return (!u4_code);
}

/*!
 **************************************************************************
 * \if Function name : ih264d_uvlc \endif
 *
 * \brief
 *
 *    Reads the unsigned/signed/truncated integer Exp-Golomb-coded syntax element
 *    with the left bit first. The parsing process for this descriptor is specified
 *    in subclause 9.1.
 *
 * \param ps_bitstrm       : Pointer to Bitstream Structure .
 * \param u4_range           : Range value in case of Truncated Exp-Golomb-code
 * \param pi_bitstrm_ofst : Pointer to the local copy of Bitstream u4_ofst
 * \param u1_flag            : Flag indicating the case of UEV,SEV or TEV
 * \param u4_bitstrm_ofst : Local copy of Bitstream u4_ofst
 * \param pu4_bitstrm_buf : Pointer to the Bitstream buffer
 *
 * \return
 *    Returns Code Value.
 *
 **************************************************************************
 */

WORD32 ih264d_uvlc(dec_bit_stream_t *ps_bitstrm,
                   UWORD32 u4_range,
                   UWORD32 *pi_bitstrm_ofst,
                   UWORD8 u1_flag,
                   UWORD32 u4_bitstrm_ofst,
                   UWORD32 *pu4_bitstrm_buf)
{
    UWORD32 word, word2, cur_bit, cur_word, code_val, code_num, clz;

    SWITCHOFFTRACE;
    cur_bit = u4_bitstrm_ofst & 0x1F;
    cur_word = u4_bitstrm_ofst >> 5;
    word = pu4_bitstrm_buf[cur_word];
    word2 = pu4_bitstrm_buf[cur_word + 1];

    if(cur_bit != 0)
    {
        word <<= cur_bit;
        word2 >>= (32 - cur_bit);
        word |= word2;
    }

    if(u1_flag == TEV && u4_range == 1)
    {
        word >>= 31;
        word = 1 - word;
        (*pi_bitstrm_ofst)++;
        ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
        return (WORD32)word;
    }

    //finding clz
    {
        UWORD32 ui32_code, ui32_mask;

        ui32_code = word;
        ui32_mask = 0x80000000;
        clz = 0;

        /* DSP implements this with LMBD instruction */
        /* so there we don't need to break the loop */
        while(!(ui32_code & ui32_mask))
        {
            clz++;
            ui32_mask >>= 1;
            if(0 == ui32_mask)
                break;
        }
    }

    if(clz == 0)
    {
        *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
        ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
        return 0;
    }

    word <<= (clz + 1);
    word >>= (32 - clz);
    code_num = (1 << clz) + word - 1;
    *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
    ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;

    if(u1_flag == TEV || u1_flag == UEV)
        return (WORD32)code_num;

    code_val = (code_num + 1) >> 1;
    if(!(code_num & 0x01))
        return -((WORD32)code_val);
    return (WORD32)code_val;

}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_1                          */
/*                                                                           */
/*  Description   : This function does cavlc decoding of 4x4 block residual  */
/*                  coefficient when total coeff is equal to 1. The parsing  */
/*                  is done as defined in section 9.2.2 and 9.2.3 of the     */
/*                  H264 standard.                                           */
/*                                                                           */
/*  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)  */
/*         25 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_cavlc_4x4res_block_totalcoeff_1(UWORD32 u4_isdc,
                                           UWORD32 u4_total_coeff_trail_one,
                                           dec_bit_stream_t *ps_bitstrm)
{

    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    WORD32 i2_level;
    UWORD32 u4_tot_zero, u4_ldz, u4_scan_pos;

    tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    WORD16 *pi2_coeff_data;
    dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;

    ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    ps_tu_4x4->u2_sig_coeff_map = 0;
    pi2_coeff_data = &ps_tu_4x4->ai2_level[0];


    if(u4_trailing_ones)
    {
        UWORD32 u4_sign;
        /****************************************************************/
        /* Decode Trailing One as in section 9.2.2                      */
        /****************************************************************/
        GETBIT(u4_sign, u4_bitstream_offset, pu4_bitstrm_buf);
        i2_level = u4_sign ? -1 : 1;
    }
    else
    {
        /****************************************************************/
        /* Decoding Level based on prefix and suffix  as in 9.2.2       */
        /****************************************************************/
        UWORD32 u4_lev_suffix, u4_lev_suffix_size;
        WORD32 u2_lev_code, u2_abs_value;
        UWORD32 u4_lev_prefix;
        /***************************************************************/
        /* Find leading zeros in next 32 bits                          */
        /***************************************************************/
        FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                              pu4_bitstrm_buf);
        u2_lev_code = (2 + MIN(u4_lev_prefix, 15));

        if(14 == u4_lev_prefix)
            u4_lev_suffix_size = 4;
        else if(15 <= u4_lev_prefix)
        {
            u2_lev_code += 15;
            u4_lev_suffix_size = u4_lev_prefix - 3;
        }
        else
            u4_lev_suffix_size = 0;

        //HP_LEVEL_PREFIX
        if(16 <= u4_lev_prefix)
        {
            u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
        }
        if(u4_lev_suffix_size)
        {
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code += u4_lev_suffix;
        }

        u2_abs_value = (u2_lev_code + 2) >> 1;
        /*********************************************************/
        /* If Level code is odd, level is negative else positive */
        /*********************************************************/
        i2_level = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

    }

    /****************************************************************/
    /* Decoding total zeros as in section 9.2.3, table 9.7          */
    /****************************************************************/
    FIND_ONE_IN_STREAM_LEN(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf, 8);

    if(u4_ldz)
    {
        GETBIT(u4_tot_zero, u4_bitstream_offset, pu4_bitstrm_buf);
        u4_tot_zero = (u4_ldz << 1) - u4_tot_zero;
    }
    else
        u4_tot_zero = 0;

    /***********************************************************************/
    /* Inverse scan and store  residual coeff. Update the bitstream u4_ofst */
    /***********************************************************************/
    u4_scan_pos = u4_tot_zero + u4_isdc;
    if(u4_scan_pos > 15)
        return -1;

    SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    *pi2_coeff_data++ = i2_level;


    {
        WORD32 offset;
        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
        offset = ALIGN4(offset);
        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    }

    ps_bitstrm->u4_ofst = u4_bitstream_offset;
    return 0;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_2to10                      */
/*                                                                           */
/*  Description   : This function does cavlc decoding of 4x4 block residual  */
/*                  coefficient when total coeffs are between two and ten    */
/*                  inclusive. Parsing is done as defined in section 9.2.2   */
/*                  and 9.2.3 the H264 standard.                             */
/*                                                                           */
/*  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)  */
/*         25 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/

WORD32 ih264d_cavlc_4x4res_block_totalcoeff_2to10(UWORD32 u4_isdc,
                                               UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
                                               dec_bit_stream_t *ps_bitstrm)
{
    UWORD32 u4_total_zeroes;
    WORD32 i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
    // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
    // since u4_trailing_ones can at the max be 3. This will be required when
    // u4_total_coeff is less than u4_trailing_ones
    WORD16 ai2_level_arr[19];
    WORD16 *i2_level_arr = &ai2_level_arr[3];

    tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    WORD16 *pi2_coeff_data;
    dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;

    ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    ps_tu_4x4->u2_sig_coeff_map = 0;
    pi2_coeff_data = &ps_tu_4x4->ai2_level[0];

    i = u4_total_coeff - 1;

    if(u4_trailing_ones)
    {
        /*********************************************************************/
        /* Decode Trailing Ones                                              */
        /* read the sign of T1's and put them in level array                 */
        /*********************************************************************/
        UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
        WORD16 (*ppi2_trlone_lkup)[3] =
                        (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
        WORD16 *pi2_trlone_lkup;

        GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);

        pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];

        while(u4_cnt--)
            i2_level_arr[i--] = *pi2_trlone_lkup++;
    }

    /****************************************************************/
    /* Decoding Levels Begins                                       */
    /****************************************************************/
    if(i >= 0)
    {
        /****************************************************************/
        /* First level is decoded outside the loop as it has lot of     */
        /* special cases.                                               */
        /****************************************************************/
        UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
        WORD32 u2_lev_code, u2_abs_value;
        UWORD32 u4_lev_prefix;

        /***************************************************************/
        /* u4_suffix_len = 0,  Find leading zeros in next 32 bits      */
        /***************************************************************/
        FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                              pu4_bitstrm_buf);

        /*********************************************************/
        /* Special decoding case when trailing ones are 3        */
        /*********************************************************/
        u2_lev_code = MIN(15, u4_lev_prefix);

        u2_lev_code += (3 == u4_trailing_ones) ? 0 : 2;

        if(14 == u4_lev_prefix)
            u4_lev_suffix_size = 4;
        else if(15 <= u4_lev_prefix)
        {
            u2_lev_code += 15;
            u4_lev_suffix_size = u4_lev_prefix - 3;
        }
        else
            u4_lev_suffix_size = 0;

        //HP_LEVEL_PREFIX
        if(16 <= u4_lev_prefix)
        {
            u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
        }
        if(u4_lev_suffix_size)
        {
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code += u4_lev_suffix;
        }

        u2_abs_value = (u2_lev_code + 2) >> 1;
        /*********************************************************/
        /* If Level code is odd, level is negative else positive */
        /*********************************************************/
        i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

        u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;

        /*********************************************************/
        /* Now loop over the remaining levels                    */
        /*********************************************************/
        while(i >= 0)
        {

            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                                  pu4_bitstrm_buf);

            u4_lev_suffix_size =
                            (15 <= u4_lev_prefix) ?
                                            (u4_lev_prefix - 3) : u4_suffix_len;

            /*********************************************************/
            /* Compute level code using prefix and suffix            */
            /*********************************************************/
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
                            + u4_lev_suffix;

            //HP_LEVEL_PREFIX
            if(16 <= u4_lev_prefix)
            {
                u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
            }
            u2_abs_value = (u2_lev_code + 2) >> 1;

            /*********************************************************/
            /* If Level code is odd, level is negative else positive */
            /*********************************************************/
            i2_level_arr[i--] =
                            (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

            /*********************************************************/
            /* Increment suffix length if required                   */
            /*********************************************************/
            u4_suffix_len +=
                            (u4_suffix_len < 6) ?
                                            (u2_abs_value
                                                            > (3
                                                                            << (u4_suffix_len
                                                                                            - 1))) :
                                            0;
        }

        /****************************************************************/
        /* Decoding Levels Ends                                         */
        /****************************************************************/
    }

    /****************************************************************/
    /* Decoding total zeros as in section 9.2.3, table 9.7          */
    /****************************************************************/
    {
        UWORD32 u4_index;
        const UWORD8 (*ppu1_total_zero_lkup)[64] =
                        (const UWORD8 (*)[64])gau1_ih264d_table_total_zero_2to10;

        NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 6);
        u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 2][u4_index];

        FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
        u4_total_zeroes &= 0xf;
    }

    /**************************************************************/
    /* Decode the runs and form the coefficient buffer            */
    /**************************************************************/
    {
        const UWORD8 *pu1_table_runbefore;
        UWORD32 u4_run;
        WORD32 k;
        UWORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
        WORD32 u4_zeroes_left = u4_total_zeroes;
        k = u4_total_coeff - 1;

        /**************************************************************/
        /* Decoding Runs Begin for zeros left > 6                     */
        /**************************************************************/
        while((u4_zeroes_left > 6) && k)
        {
            UWORD32 u4_code;

            NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);

            if(u4_code != 0)
            {
                FLUSHBITS(u4_bitstream_offset, 3);
                u4_run = (7 - u4_code);
            }
            else
            {

                FIND_ONE_IN_STREAM_LEN(u4_code, u4_bitstream_offset,
                                       pu4_bitstrm_buf, 11);
                u4_run = (4 + u4_code);
            }

            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[k--];
            u4_zeroes_left -= u4_run;
            u4_scan_pos -= (u4_run + 1);
        }

        /**************************************************************/
        /* Decoding Runs for 0 < zeros left <=6                       */
        /**************************************************************/
        pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
        while((u4_zeroes_left > 0) && k)
        {
            UWORD32 u4_code;
            NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);

            u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
            u4_run = u4_code >> 2;

            FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));

            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[k--];
            u4_zeroes_left -= u4_run;
            u4_scan_pos -= (u4_run + 1);
        }
        /**************************************************************/
        /* Decoding Runs End                                          */
        /**************************************************************/

        /**************************************************************/
        /* Copy the remaining coefficients                            */
        /**************************************************************/
        if(u4_zeroes_left < 0)
            return -1;
        while(k >= 0)
        {

            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[k--];
            u4_scan_pos--;
        }
    }

    {
        WORD32 offset;
        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
        offset = ALIGN4(offset);
        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    }

    ps_bitstrm->u4_ofst = u4_bitstream_offset;
    return 0;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_11to16                     */
/*                                                                           */
/*  Description   : This function does cavlc decoding of 4x4 block residual  */
/*                  coefficient when total coeffs are greater than ten.      */
/*                  Parsing is done as defined in section 9.2.2 and 9.2.3 of */
/*                  the H264 standard.                                       */
/*                                                                           */
/*  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)  */
/*         25 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/

WORD32 ih264d_cavlc_4x4res_block_totalcoeff_11to16(UWORD32 u4_isdc,
                                                UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
                                                dec_bit_stream_t *ps_bitstrm )
{
    UWORD32 u4_total_zeroes;
    WORD32 i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
    // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
    // since u4_trailing_ones can at the max be 3. This will be required when
    // u4_total_coeff is less than u4_trailing_ones
    WORD16 ai2_level_arr[19];//
    WORD16 *i2_level_arr = &ai2_level_arr[3];

    tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    WORD16 *pi2_coeff_data;
    dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;

    ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    ps_tu_4x4->u2_sig_coeff_map = 0;
    pi2_coeff_data = &ps_tu_4x4->ai2_level[0];

    i = u4_total_coeff - 1;
    if(u4_trailing_ones)
    {
        /*********************************************************************/
        /* Decode Trailing Ones                                              */
        /* read the sign of T1's and put them in level array                 */
        /*********************************************************************/
        UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
        WORD16 (*ppi2_trlone_lkup)[3] =
                        (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
        WORD16 *pi2_trlone_lkup;

        GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);

        pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];

        while(u4_cnt--)
            i2_level_arr[i--] = *pi2_trlone_lkup++;
    }

    /****************************************************************/
    /* Decoding Levels Begins                                       */
    /****************************************************************/
    if(i >= 0)
    {
        /****************************************************************/
        /* First level is decoded outside the loop as it has lot of     */
        /* special cases.                                               */
        /****************************************************************/
        UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
        UWORD16 u2_lev_code, u2_abs_value;
        UWORD32 u4_lev_prefix;

        if(u4_trailing_ones < 3)
        {
            /*********************************************************/
            /* u4_suffix_len = 1                                     */
            /*********************************************************/
            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                                  pu4_bitstrm_buf);

            u4_lev_suffix_size =
                            (15 <= u4_lev_prefix) ? (u4_lev_prefix - 3) : 1;

            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code = 2 + (MIN(u4_lev_prefix,15) << 1) + u4_lev_suffix;

            //HP_LEVEL_PREFIX
            if(16 <= u4_lev_prefix)
            {
                u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
            }
        }
        else
        {
            /*********************************************************/
            /*u4_suffix_len = 0                                      */
            /*********************************************************/
            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                                  pu4_bitstrm_buf);

            /*********************************************************/
            /* Special decoding case when trailing ones are 3        */
            /*********************************************************/
            u2_lev_code = MIN(15, u4_lev_prefix);

            u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);

            if(14 == u4_lev_prefix)
                u4_lev_suffix_size = 4;
            else if(15 <= u4_lev_prefix)
            {
                u2_lev_code += 15;
                u4_lev_suffix_size = (u4_lev_prefix - 3);
            }
            else
                u4_lev_suffix_size = 0;

            //HP_LEVEL_PREFIX
            if(16 <= u4_lev_prefix)
            {
                u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
            }
            if(u4_lev_suffix_size)
            {
                GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                        u4_lev_suffix_size);
                u2_lev_code += u4_lev_suffix;
            }
        }

        u2_abs_value = (u2_lev_code + 2) >> 1;
        /*********************************************************/
        /* If Level code is odd, level is negative else positive */
        /*********************************************************/
        i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

        u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;

        /*********************************************************/
        /* Now loop over the remaining levels                    */
        /*********************************************************/
        while(i >= 0)
        {

            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                                  pu4_bitstrm_buf);

            u4_lev_suffix_size =
                            (15 <= u4_lev_prefix) ?
                                            (u4_lev_prefix - 3) : u4_suffix_len;

            /*********************************************************/
            /* Compute level code using prefix and suffix            */
            /*********************************************************/
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
                            + u4_lev_suffix;

            //HP_LEVEL_PREFIX
            if(16 <= u4_lev_prefix)
            {
                u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
            }
            u2_abs_value = (u2_lev_code + 2) >> 1;

            /*********************************************************/
            /* If Level code is odd, level is negative else positive */
            /*********************************************************/
            i2_level_arr[i--] =
                            (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

            /*********************************************************/
            /* Increment suffix length if required                   */
            /*********************************************************/
            u4_suffix_len +=
                            (u4_suffix_len < 6) ?
                                            (u2_abs_value
                                                            > (3
                                                                            << (u4_suffix_len
                                                                                            - 1))) :
                                            0;
        }

        /****************************************************************/
        /* Decoding Levels Ends                                         */
        /****************************************************************/
    }

    if(u4_total_coeff < (16 - u4_isdc))
    {
        UWORD32 u4_index;
        const UWORD8 (*ppu1_total_zero_lkup)[16] =
                        (const UWORD8 (*)[16])gau1_ih264d_table_total_zero_11to15;

        NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 4);
        u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 11][u4_index];

        FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
        u4_total_zeroes &= 0xf;
    }
    else
        u4_total_zeroes = 0;

    /**************************************************************/
    /* Decode the runs and form the coefficient buffer            */
    /**************************************************************/
    {
        const UWORD8 *pu1_table_runbefore;
        UWORD32 u4_run;
        WORD32 k;
        UWORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
        WORD32 u4_zeroes_left = u4_total_zeroes;
        k = u4_total_coeff - 1;

        /**************************************************************/
        /* Decoding Runs for 0 < zeros left <=6                       */
        /**************************************************************/
        pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
        while((u4_zeroes_left > 0) && k)
        {
            UWORD32 u4_code;
            NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);

            u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
            u4_run = u4_code >> 2;

            FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[k--];
            u4_zeroes_left -= u4_run;
            u4_scan_pos -= (u4_run + 1);
        }
        /**************************************************************/
        /* Decoding Runs End                                          */
        /**************************************************************/

        /**************************************************************/
        /* Copy the remaining coefficients                            */
        /**************************************************************/
        if(u4_zeroes_left < 0)
            return -1;
        while(k >= 0)
        {
            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[k--];
            u4_scan_pos--;
        }
    }

    {
        WORD32 offset;
        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
        offset = ALIGN4(offset);
        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    }

    ps_bitstrm->u4_ofst = u4_bitstream_offset;
    return 0;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_rest_of_residual_cav_chroma_dc_block              */
/*                                                                           */
/*  Description   : This function does the Cavlc parsing of the bitstream    */
/*                  for chroma dc coefficients                               */
/*  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)  */
/*         15 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
void ih264d_rest_of_residual_cav_chroma_dc_block(UWORD32 u4_total_coeff_trail_one,
                                                 dec_bit_stream_t *ps_bitstrm)
{
    UWORD32 u4_total_zeroes;
    WORD16 i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
    // To avoid error check at 4x4 level, allocating for 3 extra levels(4+3)
    // since u4_trailing_ones can at the max be 3. This will be required when
    // u4_total_coeff is less than u4_trailing_ones
    WORD16 ai2_level_arr[7];//
    WORD16 *i2_level_arr = &ai2_level_arr[3];

    tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    WORD16 *pi2_coeff_data;
    dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;

    ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    ps_tu_4x4->u2_sig_coeff_map = 0;
    pi2_coeff_data = &ps_tu_4x4->ai2_level[0];

    i = u4_total_coeff - 1;
    if(u4_trailing_ones)
    {
        /*********************************************************************/
        /* Decode Trailing Ones                                              */
        /* read the sign of T1's and put them in level array                 */
        /*********************************************************************/
        UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
        WORD16 (*ppi2_trlone_lkup)[3] =
                        (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
        WORD16 *pi2_trlone_lkup;

        GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);

        pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];

        while(u4_cnt--)
            i2_level_arr[i--] = *pi2_trlone_lkup++;
    }

    /****************************************************************/
    /* Decoding Levels Begins                                       */
    /****************************************************************/
    if(i >= 0)
    {
        /****************************************************************/
        /* First level is decoded outside the loop as it has lot of     */
        /* special cases.                                               */
        /****************************************************************/
        UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
        UWORD16 u2_lev_code, u2_abs_value;
        UWORD32 u4_lev_prefix;

        /***************************************************************/
        /* u4_suffix_len = 0,  Find leading zeros in next 32 bits      */
        /***************************************************************/
        FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                              pu4_bitstrm_buf);

        /*********************************************************/
        /* Special decoding case when trailing ones are 3        */
        /*********************************************************/
        u2_lev_code = MIN(15, u4_lev_prefix);

        u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);

        if(14 == u4_lev_prefix)
            u4_lev_suffix_size = 4;
        else if(15 <= u4_lev_prefix)
        {
            u2_lev_code += 15;
            u4_lev_suffix_size = u4_lev_prefix - 3;
        }
        else
            u4_lev_suffix_size = 0;

        //HP_LEVEL_PREFIX
        if(16 <= u4_lev_prefix)
        {
            u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
        }
        if(u4_lev_suffix_size)
        {
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code += u4_lev_suffix;
        }

        u2_abs_value = (u2_lev_code + 2) >> 1;
        /*********************************************************/
        /* If Level code is odd, level is negative else positive */
        /*********************************************************/
        i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

        u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;

        /*********************************************************/
        /* Now loop over the remaining levels                    */
        /*********************************************************/
        while(i >= 0)
        {

            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
                                  pu4_bitstrm_buf);

            u4_lev_suffix_size =
                            (15 <= u4_lev_prefix) ?
                                            (u4_lev_prefix - 3) : u4_suffix_len;

            /*********************************************************/
            /* Compute level code using prefix and suffix            */
            /*********************************************************/
            GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
                    u4_lev_suffix_size);
            u2_lev_code = (MIN(u4_lev_prefix,15) << u4_suffix_len)
                            + u4_lev_suffix;

            //HP_LEVEL_PREFIX
            if(16 <= u4_lev_prefix)
            {
                u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
            }
            u2_abs_value = (u2_lev_code + 2) >> 1;

            /*********************************************************/
            /* If Level code is odd, level is negative else positive */
            /*********************************************************/
            i2_level_arr[i--] =
                            (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;

            /*********************************************************/
            /* Increment suffix length if required                   */
            /*********************************************************/
            u4_suffix_len += (u2_abs_value > (3 << (u4_suffix_len - 1)));
        }

        /****************************************************************/
        /* Decoding Levels Ends                                         */
        /****************************************************************/
    }

    if(u4_total_coeff < 4)
    {
        UWORD32 u4_max_ldz = (4 - u4_total_coeff);
        FIND_ONE_IN_STREAM_LEN(u4_total_zeroes, u4_bitstream_offset,
                               pu4_bitstrm_buf, u4_max_ldz);
    }
    else
        u4_total_zeroes = 0;

    /**************************************************************/
    /* Decode the runs and form the coefficient buffer            */
    /**************************************************************/
    {
        const UWORD8 *pu1_table_runbefore;
        UWORD32 u4_run;
        UWORD32 u4_scan_pos = (u4_total_coeff + u4_total_zeroes - 1);
        UWORD32 u4_zeroes_left = u4_total_zeroes;
        i = u4_total_coeff - 1;

        /**************************************************************/
        /* Decoding Runs for 0 < zeros left <=6                       */
        /**************************************************************/
        pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
        while(u4_zeroes_left && i)
        {
            UWORD32 u4_code;
            NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);

            u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
            u4_run = u4_code >> 2;

            FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[i--];
            u4_zeroes_left -= u4_run;
            u4_scan_pos -= (u4_run + 1);
        }
        /**************************************************************/
        /* Decoding Runs End                                          */
        /**************************************************************/

        /**************************************************************/
        /* Copy the remaining coefficients                            */
        /**************************************************************/
        while(i >= 0)
        {
            SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
            *pi2_coeff_data++ = i2_level_arr[i--];
            u4_scan_pos--;
        }
    }

    {
        WORD32 offset;
        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
        offset = ALIGN4(offset);
        ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    }

    ps_bitstrm->u4_ofst = u4_bitstream_offset;
}

/*!
 **************************************************************************
 * \if Function name : CavlcParsingInvScanInvQuant \endif
 *
 * \brief
 *    This function do cavlc parsing of coefficient tokens for any block
 *    type except chromDc and depending
 *    on whenther any coefficients to be parsed calls module
 *    RestOfResidualBlockCavlc.
 *
 * \return
 *    Returns total number of non-zero coefficients.
 *
 **************************************************************************
 */

WORD32 ih264d_cavlc_parse4x4coeff_n0to7(WORD16 *pi2_coeff_block,
                                        UWORD32 u4_isdc, /* is it a DC block */
                                        WORD32 u4_n,
                                        dec_struct_t *ps_dec,
                                        UWORD32 *pu4_total_coeff)
{
    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_code, u4_index, u4_ldz;
    const UWORD16 *pu2_code = (const UWORD16*)gau2_ih264d_code_gx;
    const UWORD16 *pu2_offset_num_vlc =
                    (const UWORD16 *)gau2_ih264d_offset_num_vlc_tab;
    UWORD32 u4_offset_num_vlc = pu2_offset_num_vlc[u4_n];


    UNUSED(pi2_coeff_block);
    *pu4_total_coeff = 0;
    FIND_ONE_IN_STREAM_32(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf);
    NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 3);
    u4_index += (u4_ldz << 3);
    u4_index += u4_offset_num_vlc;

    u4_index = MIN(u4_index, 303);
    u4_code = pu2_code[u4_index];

    FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
    ps_bitstrm->u4_ofst = u4_bitstream_offset;
    *pu4_total_coeff = (u4_code >> 4);

    if(*pu4_total_coeff)
    {
        UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;
        const UWORD8 *pu1_offset =
                        (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
        WORD32 ret;
        u4_trailing_ones = ((u4_code >> 2) & 0x03);
        u4_offset = pu1_offset[*pu4_total_coeff - 1];
        u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;

        ret = ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
                                                       u4_total_coeff_tone,
                                                       ps_bitstrm);
        if(ret != 0)
            return ERROR_CAVLC_NUM_COEFF_T;
    }

    return OK;
}

WORD32 ih264d_cavlc_parse4x4coeff_n8(WORD16 *pi2_coeff_block,
                                     UWORD32 u4_isdc, /* is it a DC block */
                                     WORD32 u4_n,
                                     dec_struct_t *ps_dec,
                                     UWORD32 *pu4_total_coeff)
{

    dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    UWORD32 u4_code;
    UNUSED(u4_n);
    UNUSED(pi2_coeff_block);
    GETBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 6);
    ps_bitstrm->u4_ofst = u4_bitstream_offset;
    *pu4_total_coeff = 0;

    if(u4_code != 3)
    {
        UWORD8 *pu1_offset = (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
        UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;

        *pu4_total_coeff = (u4_code >> 2) + 1;
        u4_trailing_ones = u4_code & 0x03;
        u4_offset = pu1_offset[*pu4_total_coeff - 1];
        u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;

        ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
                                                 u4_total_coeff_tone,
                                                 ps_bitstrm);
    }

    return OK;
}

/*!
 **************************************************************************
 * \if Function name : ih264d_cavlc_parse_chroma_dc \endif
 *
 * \brief
 *    This function do cavlc parsing of coefficient tokens chromDc block
 *    and depending  on whenther any coefficients to be parsed calls module
 *    ih264d_rest_of_residual_cav_chroma_dc_block.
 *
 * \return
 *    Returns total number of non-zero coefficients.
 *
 **************************************************************************
 */

void ih264d_cavlc_parse_chroma_dc(dec_mb_info_t *ps_cur_mb_info,
                                  WORD16 *pi2_coeff_block,
                                  dec_bit_stream_t *ps_bitstrm,
                                  UWORD32 u4_scale_u,
                                  UWORD32 u4_scale_v,
                                  WORD32 i4_mb_inter_inc)
{
    UWORD32 u4_total_coeff, u4_trailing_ones, u4_total_coeff_tone, u4_code;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    const UWORD8 *pu1_cav_chromdc = (const UWORD8*)gau1_ih264d_cav_chromdc_vld;
    UNUSED(i4_mb_inter_inc);
    /******************************************************************/
    /*  Chroma DC Block for U component                               */
    /******************************************************************/
    NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);

    u4_code = pu1_cav_chromdc[u4_code];

    FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
    ps_bitstrm->u4_ofst = u4_bitstream_offset;

    u4_total_coeff = (u4_code >> 5);

    if(u4_total_coeff)
    {
        WORD32 i_z0, i_z1, i_z2, i_z3;
        tu_sblk4x4_coeff_data_t *ps_tu_4x4;
        dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
        WORD16 ai2_dc_coef[4];
        UWORD8 pu1_inv_scan[4] =
                        { 0, 1, 2, 3 };
        WORD16 *pi2_coeff_data =
                                    (WORD16 *)ps_dec->pv_parse_tu_coeff_data;

        ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;

        u4_trailing_ones = ((u4_code >> 3) & 0x3);
        u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
        ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
                                                    ps_bitstrm);

        ai2_dc_coef[0] = 0;
        ai2_dc_coef[1] = 0;
        ai2_dc_coef[2] = 0;
        ai2_dc_coef[3] = 0;

        ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
                                         ai2_dc_coef,
                                         pu1_inv_scan);
        /*-------------------------------------------------------------------*/
        /* Inverse 2x2 transform and scaling  of chroma DC                   */
        /*-------------------------------------------------------------------*/
        i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
        i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
        i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
        i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);

        /*-----------------------------------------------------------*/
        /* Scaling and storing the values back                       */
        /*-----------------------------------------------------------*/
        *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale_u) >> 5;
        *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale_u) >> 5;
        *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale_u) >> 5;
        *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale_u) >> 5;

        ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;

        SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1);
    }

    /******************************************************************/
    /*  Chroma DC Block for V component                               */
    /******************************************************************/
    pi2_coeff_block += 64;
    u4_bitstream_offset = ps_bitstrm->u4_ofst;

    NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);

    u4_code = pu1_cav_chromdc[u4_code];

    FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
    ps_bitstrm->u4_ofst = u4_bitstream_offset;

    u4_total_coeff = (u4_code >> 5);

    if(u4_total_coeff)
    {
        WORD32 i_z0, i_z1, i_z2, i_z3;
        tu_sblk4x4_coeff_data_t *ps_tu_4x4;
        dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
        WORD16 ai2_dc_coef[4];
        UWORD8 pu1_inv_scan[4] =
                        { 0, 1, 2, 3 };
        WORD16 *pi2_coeff_data =
                                    (WORD16 *)ps_dec->pv_parse_tu_coeff_data;

        ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;

        u4_trailing_ones = ((u4_code >> 3) & 0x3);
        u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
        ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
                                                    ps_bitstrm);

        ai2_dc_coef[0] = 0;
        ai2_dc_coef[1] = 0;
        ai2_dc_coef[2] = 0;
        ai2_dc_coef[3] = 0;

        ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
                                         ai2_dc_coef,
                                         pu1_inv_scan);

        /*-------------------------------------------------------------------*/
        /* Inverse 2x2 transform and scaling  of chroma DC                   */
        /*-------------------------------------------------------------------*/
        i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
        i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
        i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
        i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);

        /*-----------------------------------------------------------*/
        /* Scaling and storing the values back                       */
        /*-----------------------------------------------------------*/
        *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale_v) >> 5;
        *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale_v) >> 5;
        *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale_v) >> 5;
        *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale_v) >> 5;

        ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;

        SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2);
    }
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_parse_pmb_ref_index_cavlc_range1                         */
/*                                                                           */
/*  Description   : This function does the Cavlc  TEV range =1 parsing of    */
/*                  reference index  for a P MB. Range is 1 when             */
/*                  num_ref_idx_active_minus1 is 0                           */
/*                                                                           */
/*  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)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
void ih264d_parse_pmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB      */
                                             dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
                                             WORD8 *pi1_ref_idx, /* pointer to reference index array */
                                             UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1    */
                                             )
{
    UWORD32 u4_i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
    UNUSED(u4_num_ref_idx_active_minus1);
    for(u4_i = 0; u4_i < u4_num_part; u4_i++)
    {
        UWORD32 u4_ref_idx;
        u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);

        /* Storing Reference Idx Information */
        pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
    }
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_parse_pmb_ref_index_cavlc                                */
/*                                                                           */
/*  Description   : This function does the Cavlc  TEV range > 1 parsing of   */
/*                  reference index  for a P MB.                             */
/*                  Range > 1 when num_ref_idx_active_minus1 > 0             */
/*                                                                           */
/*  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)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/

WORD32 ih264d_parse_pmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB      */
                                      dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
                                      WORD8 *pi1_ref_idx, /* pointer to reference index array */
                                      UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1  */
                                      )
{
    UWORD32 u4_i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;

    for(u4_i = 0; u4_i < u4_num_part; u4_i++)
    {
        UWORD32 u4_ref_idx;
//Inlined ih264d_uev
        UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
        UWORD32 u4_word, u4_ldz;

        /***************************************************************/
        /* Find leading zeros in next 32 bits                          */
        /***************************************************************/
        NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
        u4_ldz = CLZ(u4_word);
        /* Flush the ps_bitstrm */
        u4_bitstream_offset += (u4_ldz + 1);
        /* Read the suffix from the ps_bitstrm */
        u4_word = 0;
        if(u4_ldz)
            GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
        *pu4_bitstream_off = u4_bitstream_offset;
        u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
//Inlined ih264d_uev

        if(u4_ref_idx > u4_num_ref_idx_active_minus1)
            return ERROR_REF_IDX;

        /* Storing Reference Idx Information */
        pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
    }
    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_parse_bmb_ref_index_cavlc_range1                         */
/*                                                                           */
/*  Description   : This function does the Cavlc  TEV range =1 parsing of    */
/*                  reference index  for a B MB. Range is 1 when             */
/*                  num_ref_idx_active_minus1 is 0                           */
/*                                                                           */
/*  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)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
void ih264d_parse_bmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB      */
                                             dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
                                             WORD8 *pi1_ref_idx, /* pointer to reference index array */
                                             UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1    */
                                             )
{
    UWORD32 u4_i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
    UNUSED(u4_num_ref_idx_active_minus1);
    for(u4_i = 0; u4_i < u4_num_part; u4_i++)
    {
        if(pi1_ref_idx[u4_i] > -1)
        {
            UWORD32 u4_ref_idx;

            u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);

            /* Storing Reference Idx Information */
            pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
        }
    }
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_parse_bmb_ref_index_cavlc                                */
/*                                                                           */
/*  Description   : This function does the Cavlc  TEV range > 1 parsing of   */
/*                  reference index  for a B MB.                             */
/*                  Range > 1 when num_ref_idx_active_minus1 > 0             */
/*                                                                           */
/*  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)  */
/*         19 09 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_parse_bmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB      */
                                      dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
                                      WORD8 *pi1_ref_idx, /* pointer to reference index array */
                                      UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1  */
                                      )
{
    UWORD32 u4_i;
    UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;

    for(u4_i = 0; u4_i < u4_num_part; u4_i++)
    {
        if(pi1_ref_idx[u4_i] > -1)
        {
            UWORD32 u4_ref_idx;
//inlining ih264d_uev
            UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
            UWORD32 u4_word, u4_ldz;

            /***************************************************************/
            /* Find leading zeros in next 32 bits                          */
            /***************************************************************/
            NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
            u4_ldz = CLZ(u4_word);
            /* Flush the ps_bitstrm */
            u4_bitstream_offset += (u4_ldz + 1);
            /* Read the suffix from the ps_bitstrm */
            u4_word = 0;
            if(u4_ldz)
                GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
            *pu4_bitstream_off = u4_bitstream_offset;
            u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
//inlining ih264d_uev
            if(u4_ref_idx > u4_num_ref_idx_active_minus1)
                return ERROR_REF_IDX;

            /* Storing Reference Idx Information */
            pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
        }
    }
    return OK;
}
/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_parse_8x8block_both_available                      */
/*                                                                           */
/*  Description   : This function does the residual parsing of 4 subblocks   */
/*                  in a 8x8 block when both top and left are available      */
/*                                                                           */
/*  Inputs        : pi2_coeff_block : pointer to residual block where        */
/*                  decoded and inverse scan coefficients are updated        */
/*                                                                           */
/*                  u4_sub_block_strd : indicates the number of sublocks    */
/*                  in a row. It is 4 for luma and 2 for chroma.             */
/*                                                                           */
/*                  u4_isdc : required to indicate 4x4 parse modules if the  */
/*                  current  Mb is I_16x16/chroma DC coded.                  */
/*                                                                           */
/*                  ps_dec : pointer to Decstruct (decoder context)          */
/*                                                                           */
/*                  pu1_top_nnz : top nnz pointer                            */
/*                                                                           */
/*                  pu1_left_nnz : left nnz pointer                          */
/*                                                                           */
/*  Globals       : No                                                       */
/*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
/*                  are updated on the fly. csbp is set in accordance to     */
/*                  decoded numcoeff for the subblock index in raster order  */
/*                                                                           */
/*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
/*                                                                           */
/*  Returns       : Returns the coded sub block pattern csbp for the block   */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         09 10 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_cavlc_parse_8x8block_both_available(WORD16 *pi2_coeff_block,
                                                  UWORD32 u4_sub_block_strd,
                                                  UWORD32 u4_isdc,
                                                  dec_struct_t * ps_dec,
                                                  UWORD8 *pu1_top_nnz,
                                                  UWORD8 *pu1_left_nnz,
                                                  UWORD8 u1_tran_form8x8,
                                                  UWORD8 u1_mb_field_decodingflag,
                                                  UWORD32 *pu4_csbp)
{
    UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
    UWORD32 u4_top0, u4_top1;
    UWORD32 *pu4_dummy;
    WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
                                      UWORD32 u4_isdc,
                                      WORD32 u4_n,
                                      struct _DecStruct *ps_dec,
                                      UWORD32 *pu4_dummy) =
                                      ps_dec->pf_cavlc_parse4x4coeff;
    UWORD32 u4_idx = 0;
    UWORD8 *puc_temp;
    WORD32 ret;

    *pu4_csbp = 0;
    /* need to change the inverse scan matrices here */
    puc_temp = ps_dec->pu1_inv_scan;

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 0                    */
    /*------------------------------------------------------*/
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
        }
    }
    u4_n = (pu1_top_nnz[0] + pu1_left_nnz[0] + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top0 = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 1                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 2                    */
    /*------------------------------------------------------*/
    u4_idx += (u4_sub_block_strd - 1);
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
        }
    }
    else
    {
        pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
    }
    u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 3                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    ps_dec->pu1_inv_scan = puc_temp;

    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_parse_8x8block_left_available                      */
/*                                                                           */
/*  Description   : This function does the residual parsing of 4 subblocks   */
/*                  in a 8x8 block when only left is available for block     */
/*                                                                           */
/*  Inputs        : pi2_coeff_block : pointer to residual block where        */
/*                  decoded and inverse scan coefficients are updated        */
/*                                                                           */
/*                  u4_sub_block_strd : indicates the number of sublocks    */
/*                  in a row. It is 4 for luma and 2 for chroma.             */
/*                                                                           */
/*                  u4_isdc : required to indicate 4x4 parse modules if the  */
/*                  current  Mb is I_16x16/chroma DC coded.                  */
/*                                                                           */
/*                  ps_dec : pointer to Decstruct (decoder context)          */
/*                                                                           */
/*                  pu1_top_nnz : top nnz pointer                            */
/*                                                                           */
/*                  pu1_left_nnz : left nnz pointer                          */
/*                                                                           */
/*  Globals       : No                                                       */
/*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
/*                  are updated on the fly. csbp is set in accordance to     */
/*                  decoded numcoeff for the subblock index in raster order  */
/*                                                                           */
/*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
/*                                                                           */
/*  Returns       : Returns the coded sub block pattern csbp for the block   */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         09 10 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_cavlc_parse_8x8block_left_available(WORD16 *pi2_coeff_block,
                                                  UWORD32 u4_sub_block_strd,
                                                  UWORD32 u4_isdc,
                                                  dec_struct_t * ps_dec,
                                                  UWORD8 *pu1_top_nnz,
                                                  UWORD8 *pu1_left_nnz,
                                                  UWORD8 u1_tran_form8x8,
                                                  UWORD8 u1_mb_field_decodingflag,
                                                  UWORD32 *pu4_csbp)
{
    UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
    UWORD32 u4_top0, u4_top1;
    UWORD32 *pu4_dummy;
    WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
                                      UWORD32 u4_isdc,
                                      WORD32 u4_n,
                                      struct _DecStruct *ps_dec,
                                      UWORD32 *pu4_dummy) =
                                      ps_dec->pf_cavlc_parse4x4coeff;
    UWORD32 u4_idx = 0;
    UWORD8 *puc_temp;
    WORD32 ret;

    *pu4_csbp = 0;
    puc_temp = ps_dec->pu1_inv_scan;

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 0                    */
    /*------------------------------------------------------*/
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
        }
    }
    u4_n = pu1_left_nnz[0];
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top0 = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 1                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = u4_num_coeff;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 2                    */
    /*------------------------------------------------------*/
    u4_idx += (u4_sub_block_strd - 1);
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
        }
    }
    else
    {
        pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
    }
    u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 3                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    ps_dec->pu1_inv_scan = puc_temp;

    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_parse_8x8block_top_available                       */
/*                                                                           */
/*  Description   : This function does the residual parsing of 4 subblocks   */
/*                  in a 8x8 block when only top is available for block      */
/*                                                                           */
/*  Inputs        : pi2_coeff_block : pointer to residual block where        */
/*                  decoded and inverse scan coefficients are updated        */
/*                                                                           */
/*                  u4_sub_block_strd : indicates the number of sublocks    */
/*                  in a row. It is 4 for luma and 2 for chroma.             */
/*                                                                           */
/*                  u4_isdc : required to indicate 4x4 parse modules if the  */
/*                  current  Mb is I_16x16/chroma DC coded.                  */
/*                                                                           */
/*                  ps_dec : pointer to Decstruct (decoder context)          */
/*                                                                           */
/*                  pu1_top_nnz : top nnz pointer                            */
/*                                                                           */
/*                  pu1_left_nnz : left nnz pointer                          */
/*                                                                           */
/*  Globals       : No                                                       */
/*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
/*                  are updated on the fly. csbp is set in accordance to     */
/*                  decoded numcoeff for the subblock index in raster order  */
/*                                                                           */
/*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
/*                                                                           */
/*  Returns       : Returns the coded sub block pattern csbp for the block   */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         09 10 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_cavlc_parse_8x8block_top_available(WORD16 *pi2_coeff_block,
                                                 UWORD32 u4_sub_block_strd,
                                                 UWORD32 u4_isdc,
                                                 dec_struct_t * ps_dec,
                                                 UWORD8 *pu1_top_nnz,
                                                 UWORD8 *pu1_left_nnz,
                                                 UWORD8 u1_tran_form8x8,
                                                 UWORD8 u1_mb_field_decodingflag,
                                                 UWORD32 *pu4_csbp)
{
    UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
    UWORD32 u4_top0, u4_top1;
    UWORD32 *pu4_dummy;
    WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
                                      UWORD32 u4_isdc,
                                      WORD32 u4_n,
                                      struct _DecStruct *ps_dec,
                                      UWORD32 *pu4_dummy) =
                                      ps_dec->pf_cavlc_parse4x4coeff;
    UWORD32 u4_idx = 0;
    UWORD8 *puc_temp;
    WORD32 ret;

    *pu4_csbp = 0;
    puc_temp = ps_dec->pu1_inv_scan;

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 0                    */
    /*------------------------------------------------------*/
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
        }
    }
    u4_n = pu1_top_nnz[0];
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top0 = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 1                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 2                    */
    /*------------------------------------------------------*/
    u4_idx += (u4_sub_block_strd - 1);
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
        }
    }
    else
    {
        pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
    }
    u4_n = u4_top0;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 3                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    ps_dec->pu1_inv_scan = puc_temp;

    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_cavlc_parse_8x8block_none_available                      */
/*                                                                           */
/*  Description   : This function does the residual parsing of 4 subblocks   */
/*                  in a 8x8 block when none of the neigbours are available  */
/*                                                                           */
/*  Inputs        : pi2_coeff_block : pointer to residual block where        */
/*                  decoded and inverse scan coefficients are updated        */
/*                                                                           */
/*                  u4_sub_block_strd : indicates the number of sublocks    */
/*                  in a row. It is 4 for luma and 2 for chroma.             */
/*                                                                           */
/*                  u4_isdc : required to indicate 4x4 parse modules if the  */
/*                  current  Mb is I_16x16/chroma DC coded.                  */
/*                                                                           */
/*                  ps_dec : pointer to Decstruct (decoder context)          */
/*                                                                           */
/*                  pu1_top_nnz : top nnz pointer                            */
/*                                                                           */
/*                  pu1_left_nnz : left nnz pointer                          */
/*                                                                           */
/*  Globals       : No                                                       */
/*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
/*                  are updated on the fly. csbp is set in accordance to     */
/*                  decoded numcoeff for the subblock index in raster order  */
/*                                                                           */
/*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
/*                                                                           */
/*  Returns       : Returns the coded sub block pattern csbp for the block   */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         09 10 2008   Jay          Draft                                   */
/*                                                                           */
/*****************************************************************************/
WORD32 ih264d_cavlc_parse_8x8block_none_available(WORD16 *pi2_coeff_block,
                                                  UWORD32 u4_sub_block_strd,
                                                  UWORD32 u4_isdc,
                                                  dec_struct_t * ps_dec,
                                                  UWORD8 *pu1_top_nnz,
                                                  UWORD8 *pu1_left_nnz,
                                                  UWORD8 u1_tran_form8x8,
                                                  UWORD8 u1_mb_field_decodingflag,
                                                  UWORD32 *pu4_csbp)
{
    UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
    UWORD32 u4_top0, u4_top1;
    UWORD32 *pu4_dummy;
    WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
                                      UWORD32 u4_isdc,
                                      WORD32 u4_n,
                                      struct _DecStruct *ps_dec,
                                      UWORD32 *pu4_dummy) =
                                      ps_dec->pf_cavlc_parse4x4coeff;
    UWORD32 u4_idx = 0;
    UWORD8 *puc_temp;
    WORD32 ret;

    *pu4_csbp = 0;
    puc_temp = ps_dec->pu1_inv_scan;

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 0                    */
    /*------------------------------------------------------*/
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
        }
    }
    ret = pf_cavlc_parse4x4coeff[0](pi2_coeff_block, u4_isdc, 0,
                                    ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top0 = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 1                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = u4_num_coeff;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 2                    */
    /*------------------------------------------------------*/
    u4_idx += (u4_sub_block_strd - 1);
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
        }
    }
    else
    {
        pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
    }
    u4_n = u4_top0;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[0] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    /*------------------------------------------------------*/
    /* Residual 4x4 decoding: SubBlock 3                    */
    /*------------------------------------------------------*/
    u4_idx++;
    if(u1_tran_form8x8)
    {
        if(!u1_mb_field_decodingflag)
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
        }
        else
        {
            ps_dec->pu1_inv_scan =
                            (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
        }
    }
    else
    {
        pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
    }
    u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
    ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
                                             u4_n, ps_dec, &u4_num_coeff);
    if(ret != OK)
        return ret;

    pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
    u4_subblock_coded = (u4_num_coeff != 0);
    INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);

    ps_dec->pu1_inv_scan = puc_temp;

    return OK;
}

/*!
 **************************************************************************
 * \if Function name : ih264d_parse_residual4x4_cavlc \endif
 *
 * \brief
 *    This function parses CAVLC syntax of a Luma and Chroma AC Residuals.
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */

WORD32 ih264d_parse_residual4x4_cavlc(dec_struct_t * ps_dec,
                                      dec_mb_info_t *ps_cur_mb_info,
                                      UWORD8 u1_offset)
{
    UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp;
    UWORD16 ui16_csbp = 0;
    UWORD32 u4_nbr_avl;
    WORD16 *pi2_residual_buf;

    UWORD8 u1_is_top_mb_avail;
    UWORD8 u1_is_left_mb_avail;

    UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
    UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y;
    WORD16 *pi2_coeff_block = NULL;
    UWORD32 *pu4_dummy;
    WORD32 ret;

    WORD32 (**pf_cavlc_parse_8x8block)(WORD16 *pi2_coeff_block,
                                       UWORD32 u4_sub_block_strd,
                                       UWORD32 u4_isdc,
                                       struct _DecStruct *ps_dec,
                                       UWORD8 *pu1_top_nnz,
                                       UWORD8 *pu1_left_nnz,
                                       UWORD8 u1_tran_form8x8,
                                       UWORD8 u1_mb_field_decodingflag,
                                       UWORD32 *pu4_dummy) = ps_dec->pf_cavlc_parse_8x8block;


    {
        UWORD8 uc_temp = ps_dec->u1_mb_ngbr_availablity;
        u1_is_top_mb_avail = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
        u1_is_left_mb_avail = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
        u4_nbr_avl = (u1_is_top_mb_avail << 1) | u1_is_left_mb_avail;
    }

    ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
    ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
    ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
    ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
    ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
    ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;

    if(u1_cbp & 0xf)
    {
        pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
        pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[1];
        pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[2];
        pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[3];

        /*******************************************************************/
        /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
        /*******************************************************************/
        if(!(u1_cbp & 0x1))
        {
            *(UWORD16 *)(pu1_top_nnz) = 0;
            *(UWORD16 *)(pu1_left_nnz) = 0;

        }
        else
        {
            UWORD32 u4_temp;
            ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
                        pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
                        pu1_left_nnz, ps_cur_mb_info->u1_tran_form8x8,
                        ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
            if(ret != OK)
                return ret;
            ui16_csbp = u4_temp;
        }

        /*******************************************************************/
        /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
        /*******************************************************************/
        if(ps_cur_mb_info->u1_tran_form8x8)
        {
            pi2_coeff_block += 64;
        }
        else
        {
            pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
        }

        if(!(u1_cbp & 0x2))
        {
            *(UWORD16 *)(pu1_top_nnz + 2) = 0;
            *(UWORD16 *)(pu1_left_nnz) = 0;
        }
        else
        {
            UWORD32 u4_temp = (u4_nbr_avl | 0x1);
            ret = pf_cavlc_parse_8x8block[u4_temp](
                        pi2_coeff_block, 4, u1_offset, ps_dec,
                        (pu1_top_nnz + 2), pu1_left_nnz,
                        ps_cur_mb_info->u1_tran_form8x8,
                        ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
            if(ret != OK)
                return ret;
            ui16_csbp |= (u4_temp << 2);
        }

        /*******************************************************************/
        /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
        /*******************************************************************/
        if(ps_cur_mb_info->u1_tran_form8x8)
        {
            pi2_coeff_block += 64;
        }
        else
        {
            pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK);
        }

        if(!(u1_cbp & 0x4))
        {
            *(UWORD16 *)(pu1_top_nnz) = 0;
            *(UWORD16 *)(pu1_left_nnz + 2) = 0;
        }
        else
        {
            UWORD32 u4_temp = (u4_nbr_avl | 0x2);
            ret = pf_cavlc_parse_8x8block[u4_temp](
                        pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
                        (pu1_left_nnz + 2), ps_cur_mb_info->u1_tran_form8x8,
                        ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
            if(ret != OK)
                return ret;
            ui16_csbp |= (u4_temp << 8);
        }

        /*******************************************************************/
        /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
        /*******************************************************************/
        if(ps_cur_mb_info->u1_tran_form8x8)
        {
            pi2_coeff_block += 64;
        }
        else
        {
            pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
        }

        if(!(u1_cbp & 0x8))
        {
            *(UWORD16 *)(pu1_top_nnz + 2) = 0;
            *(UWORD16 *)(pu1_left_nnz + 2) = 0;
        }
        else
        {
            UWORD32 u4_temp;
            ret = pf_cavlc_parse_8x8block[0x3](
                        pi2_coeff_block, 4, u1_offset, ps_dec,
                        (pu1_top_nnz + 2), (pu1_left_nnz + 2),
                        ps_cur_mb_info->u1_tran_form8x8,
                        ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
            if(ret != OK)
                return ret;
            ui16_csbp |= (u4_temp << 10);
        }
    }
    else
    {
        *(UWORD32 *)(pu1_top_nnz) = 0;
        *(UWORD32 *)(pu1_left_nnz) = 0;
    }

    ps_cur_mb_info->u2_luma_csbp = ui16_csbp;
    ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp;

    {
        UWORD16 u2_chroma_csbp = 0;
        ps_cur_mb_info->u2_chroma_csbp = 0;
        pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
        pu1_left_nnz = ps_dec->pu1_left_nnz_uv;

        u1_cbp >>= 4;
        /*--------------------------------------------------------------------*/
        /* if Chroma Component not present OR no ac values present            */
        /* Set the values of N to zero                                        */
        /*--------------------------------------------------------------------*/
        if(u1_cbp == CBPC_ALLZERO || u1_cbp == CBPC_ACZERO)
        {
            *(UWORD32 *)(pu1_top_nnz) = 0;
            *(UWORD32 *)(pu1_left_nnz) = 0;
        }

        if(u1_cbp == CBPC_ALLZERO)
        {
            return (0);
        }
        /*--------------------------------------------------------------------*/
        /* Decode Chroma DC values                                            */
        /*--------------------------------------------------------------------*/
        {
            WORD32 u4_scale_u;
            WORD32 u4_scale_v;
            WORD32 i4_mb_inter_inc;
            u4_scale_u = ps_dec->pu2_quant_scale_u[0] << ps_dec->u1_qp_u_div6;
            u4_scale_v = ps_dec->pu2_quant_scale_v[0] << ps_dec->u1_qp_v_div6;
            i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB)
                            || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB)))
                            * 3;

            if(ps_dec->s_high_profile.u1_scaling_present)
            {
                u4_scale_u *=
                                ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
                                                + 1][0];
                u4_scale_v *=
                                ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
                                                + 2][0];

            }
            else
            {
                u4_scale_u <<= 4;
                u4_scale_v <<= 4;
            }

            ih264d_cavlc_parse_chroma_dc(ps_cur_mb_info,pi2_coeff_block, ps_dec->ps_bitstrm,
                                         u4_scale_u, u4_scale_v,
                                         i4_mb_inter_inc);
        }

        if(u1_cbp == CBPC_ACZERO)
            return (0);

        pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[0];
        pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[1];
        pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[2];
        pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[3];
        /*--------------------------------------------------------------------*/
        /* Decode Chroma AC values                                            */
        /*--------------------------------------------------------------------*/
        {
            UWORD32 u4_temp;
            /*****************************************************************/
            /* U Block  residual decoding, check cbp and proceed (subblock=0)*/
            /*****************************************************************/
            ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
                        pi2_coeff_block, 2, 1, ps_dec, pu1_top_nnz,
                        pu1_left_nnz, 0, 0, &u4_temp);
            if(ret != OK)
                return ret;
            u2_chroma_csbp = u4_temp;

            pi2_coeff_block += MB_CHROM_SIZE;
            /*****************************************************************/
            /* V Block  residual decoding, check cbp and proceed (subblock=1)*/
            /*****************************************************************/
            ret = pf_cavlc_parse_8x8block[u4_nbr_avl](pi2_coeff_block, 2, 1,
                                                      ps_dec,
                                                      (pu1_top_nnz + 2),
                                                      (pu1_left_nnz + 2), 0,
                                                      0, &u4_temp);
            if(ret != OK)
                return ret;
            u2_chroma_csbp |= (u4_temp << 4);
        }

        ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp;
    }
    return OK;
}
