/******************************************************************************
 *
 * 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_process_intra_mb.c
 *
 * \brief
 *    Contains routines that decode a I slice type
 *
 * Detailed_description
 *
 * \date
 *    07/07/2003
 *
 * \author  NS
 **************************************************************************
 */

#include <string.h>
#include "ih264d_bitstrm.h"
#include "ih264d_defs.h"
#include "ih264d_debug.h"
#include "ih264d_tables.h"
#include "ih264d_structs.h"
#include "ih264d_defs.h"
#include "ih264d_parse_cavlc.h"
#include "ih264d_mb_utils.h"
#include "ih264d_parse_slice.h"
#include "ih264d_process_intra_mb.h"
#include "ih264d_error_handler.h"
#include "ih264d_quant_scaling.h"
#include "ih264d_tables.h"

/*!
 **************************************************************************
 * \if Function name : ih264d_itrans_recon_luma_dc \endif
 *
 * \brief
 *    This function does InvTransform, scaling and reconstruction of Luma DC.
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_itrans_recon_luma_dc(dec_struct_t *ps_dec,
                                 WORD16* pi2_src,
                                 WORD16* pi2_coeff_block,
                                 const UWORD16 *pu2_weigh_mat)
{
    WORD32 i;
    WORD16 pi2_out[16];
    WORD32 pi4_tmp[16];
    WORD16 *pi2_out_ptr = &pi2_out[0];
    PROFILE_DISABLE_IQ_IT_RECON_RETURN()
    ps_dec->pf_ihadamard_scaling_4x4(pi2_src, pi2_out,
                                     ps_dec->pu2_quant_scale_y, pu2_weigh_mat,
                                     ps_dec->u1_qp_y_div6, pi4_tmp);
    for(i = 0; i < 4; i++)
    {
        pi2_coeff_block[0] = pi2_out_ptr[0];
        pi2_coeff_block[4 * 16] = pi2_out_ptr[4];
        pi2_coeff_block[8 * 16] = pi2_out_ptr[8];
        pi2_coeff_block[12 * 16] = pi2_out_ptr[12];

        pi2_out_ptr++; /* Point to next column */
        pi2_coeff_block += 16;
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_read_intra_pred_modes \endif
 *
 * \brief
 *    Reads the intra pred mode related values of I4x4 MB from bitstream.
 *
 *    This function will read the prev intra pred mode flags and
 *    stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag
 *    indicates that most probable mode is not intra pred mode, then
 *    the rem_intra4x4_pred_mode is read and stored in
 *    pu1_rem_intra4x4_pred_mode array.
 *
 *
 * \return
 *    0 on success and Error code otherwise
 *
 **************************************************************************
 */
WORD32 ih264d_read_intra_pred_modes(dec_struct_t * ps_dec,
                                    UWORD8 * pu1_prev_intra4x4_pred_mode_flag,
                                    UWORD8 * pu1_rem_intra4x4_pred_mode,
                                    UWORD32 u4_trans_form8x8)
{
    WORD32 i4x4_luma_blk_idx = 0, i8x8_luma_blk_idx = 0;

    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;

    if(!u4_trans_form8x8)
    {
        for(i4x4_luma_blk_idx = 0; i4x4_luma_blk_idx < 16; ++i4x4_luma_blk_idx)
        {
            UWORD32 u4_temp;
            SWITCHOFFTRACE;

            GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
            *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
            if(!(*pu1_prev_intra4x4_pred_mode_flag))
            {
                GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);

                *(pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
            }

            pu1_prev_intra4x4_pred_mode_flag++;
            pu1_rem_intra4x4_pred_mode++;
        }
    }
    else
    {
        /**********************************************************************/
        /* prev_intra4x4_pred_modes to be interpreted as                      */
        /* prev_intra8x8_pred_modes in case of transform 8x8                  */
        /**********************************************************************/
        for(i8x8_luma_blk_idx = 0; i8x8_luma_blk_idx < 4; i8x8_luma_blk_idx++)
        {
            UWORD32 u4_temp;
            GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
            *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
            if(!(*pu1_prev_intra4x4_pred_mode_flag))
            {
                GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);

                (*pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
            }
            pu1_prev_intra4x4_pred_mode_flag++;
            pu1_rem_intra4x4_pred_mode++;
        }
    }
    return (0);
}
WORD32 ih264d_unpack_coeff4x4_4x4blk(dec_struct_t * ps_dec,
                                   WORD16 *pi2_out_coeff_data,
                                   UWORD8 *pu1_inv_scan)
{
    tu_sblk4x4_coeff_data_t *ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
    UWORD16 u2_sig_coeff_map = ps_tu_4x4->u2_sig_coeff_map;
    WORD32 idx = 0;
    WORD16 *pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
    WORD32 dc_only_flag = 0;
    WORD32 num_coeff = 0;

    PROFILE_DISABLE_UNPACK_LUMA()
    while(u2_sig_coeff_map)
    {
        idx = CLZ(u2_sig_coeff_map);

        idx = 31 - idx;
        RESET_BIT(u2_sig_coeff_map,idx);

        idx = pu1_inv_scan[idx];
        pi2_out_coeff_data[idx] = *pi2_coeff_data++;
        num_coeff++;
    }

    if((num_coeff == 1) && (idx == 0))
    {
        dc_only_flag = 1;
    }

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

    return dc_only_flag;
}

UWORD32 ih264d_unpack_coeff4x4_8x8blk(dec_struct_t * ps_dec,
                                   dec_mb_info_t * ps_cur_mb_info,
                                   UWORD16 ui2_luma_csbp,
                                   WORD16 *pi2_out_coeff_data)
{
    UWORD8 *pu1_inv_scan;
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
    UWORD32 u4_luma_dc_only_csbp = 0;
    WORD32 dc_only_flag = 0;

    PROFILE_DISABLE_UNPACK_LUMA()
    if(u1_field_coding_flag || u1_mb_field_decoding_flag)
    {
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
    }
    else
    {
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
    }

    // sub 0
    if(ui2_luma_csbp & 0x1)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);

        INSERT_BIT(u4_luma_dc_only_csbp, 0, dc_only_flag);
    }

    pi2_out_coeff_data += 16;
    // sub 1
    if(ui2_luma_csbp & 0x2)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
        INSERT_BIT(u4_luma_dc_only_csbp, 1, dc_only_flag);
    }

    pi2_out_coeff_data += 16 + 32;
    // sub 2
    if(ui2_luma_csbp & 0x10)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
        INSERT_BIT(u4_luma_dc_only_csbp, 4, dc_only_flag);
    }

    pi2_out_coeff_data += 16;
    // sub 3
    if(ui2_luma_csbp & 0x20)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
        INSERT_BIT(u4_luma_dc_only_csbp, 5, dc_only_flag);
    }
    return u4_luma_dc_only_csbp;
}
WORD32 ih264d_unpack_coeff8x8_8x8blk_cavlc(dec_struct_t * ps_dec,
                                            dec_mb_info_t * ps_cur_mb_info,
                                            UWORD16 ui2_luma_csbp,
                                            WORD16 *pi2_out_coeff_data)
{
    UWORD8 *pu1_inv_scan;
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
    WORD32 dc_only_flag = 0;

    PROFILE_DISABLE_UNPACK_LUMA()
    if(ui2_luma_csbp & 0x33)
    {
        memset(pi2_out_coeff_data,0,64*sizeof(WORD16));
    }

    if(!u1_mb_field_decoding_flag)
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
    }
    else
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
    }
    // sub 0
    if(ui2_luma_csbp & 0x1)
    {
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }

    if(!u1_mb_field_decoding_flag)
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
    }
    else
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
    }
    // sub 1
    if(ui2_luma_csbp & 0x2)
    {
        dc_only_flag = 0;
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }

    if(!u1_mb_field_decoding_flag)
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
    }
    else
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
    }
    // sub 2
    if(ui2_luma_csbp & 0x10)
    {
        dc_only_flag = 0;
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }

    if(!u1_mb_field_decoding_flag)
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
    }
    else
    {
        pu1_inv_scan =
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
    }
    // sub 3
    if(ui2_luma_csbp & 0x20)
    {
        dc_only_flag = 0;
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }
    return dc_only_flag;
}
void ih264d_unpack_coeff4x4_8x8blk_chroma(dec_struct_t * ps_dec,
                                          dec_mb_info_t * ps_cur_mb_info,
                                          UWORD16 ui2_chroma_csbp,
                                          WORD16 *pi2_out_coeff_data)
{
    UWORD8 *pu1_inv_scan;
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;

    PROFILE_DISABLE_UNPACK_CHROMA()
    if(u1_field_coding_flag || u1_mb_field_decoding_flag)
    {
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
    }
    else
    {
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
    }

    if(ui2_chroma_csbp & 0x1)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }
    pi2_out_coeff_data += 16;
    if(ui2_chroma_csbp & 0x2)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }

    pi2_out_coeff_data += 16;
    if(ui2_chroma_csbp & 0x4)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }

    pi2_out_coeff_data += 16;
    if(ui2_chroma_csbp & 0x8)
    {
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
                                      pi2_out_coeff_data,
                                      pu1_inv_scan);
    }
}
UWORD32 ih264d_unpack_luma_coeff4x4_mb(dec_struct_t * ps_dec,
                                    dec_mb_info_t * ps_cur_mb_info,
                                    UWORD8 intra_flag)
{
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
    UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
    UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
    WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;

    PROFILE_DISABLE_UNPACK_LUMA()
    if(!ps_cur_mb_info->u1_tran_form8x8)
    {
        UWORD32 u4_luma_dc_only_csbp = 0;
        UWORD32 u4_temp = 0;
        WORD16* pi2_dc_val = NULL;
        /*
         * Reserve the pointer to dc vals. The dc vals will be copied
         * after unpacking of ac vals since memset to 0 inside.
         */
        if(intra_flag && (u1_mb_type != I_4x4_MB))
        {
            if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0))
            {
                pi2_dc_val = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;

                ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val + 16);
            }
        }

        if(ui2_luma_csbp)
        {
            pi2_coeff_data = ps_dec->pi2_coeff_data;
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);
            u4_luma_dc_only_csbp = u4_temp;

            pi2_coeff_data += 32;

            ui2_luma_csbp = ui2_luma_csbp >> 2;
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);

            u4_luma_dc_only_csbp |= (u4_temp << 2);

            pi2_coeff_data += 32 + 64;

            ui2_luma_csbp = ui2_luma_csbp >> 6;
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);

            u4_luma_dc_only_csbp |= (u4_temp << 8);

            pi2_coeff_data += 32;

            ui2_luma_csbp = ui2_luma_csbp >> 2;
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);
            u4_luma_dc_only_csbp |= (u4_temp << 10);
        }

        if(pi2_dc_val != NULL)
        {
            WORD32 i;
            pi2_coeff_data = ps_dec->pi2_coeff_data;
            for(i = 0; i < 4; i++)
            {
                pi2_coeff_data[0] = pi2_dc_val[0];
                pi2_coeff_data[4 * 16] = pi2_dc_val[4];
                pi2_coeff_data[8 * 16] = pi2_dc_val[8];
                pi2_coeff_data[12 * 16] = pi2_dc_val[12];

                pi2_dc_val++; /* Point to next column */
                pi2_coeff_data += 16;
            }
            u4_luma_dc_only_csbp = ps_cur_mb_info->u2_luma_csbp ^ 0xFFFF;
        }
        return u4_luma_dc_only_csbp;
    }
    else
    {
        UWORD32 u4_luma_dc_only_cbp = 0;
        WORD32 dc_only_flag;
        if(ui2_luma_csbp)
        {
            pi2_coeff_data = ps_dec->pi2_coeff_data;
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);
            INSERT_BIT(u4_luma_dc_only_cbp, 0, dc_only_flag);

            pi2_coeff_data += 64;

            ui2_luma_csbp = ui2_luma_csbp >> 2;
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);

            INSERT_BIT(u4_luma_dc_only_cbp, 1, dc_only_flag);

            pi2_coeff_data += 64;

            ui2_luma_csbp = ui2_luma_csbp >> 6;
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);

            INSERT_BIT(u4_luma_dc_only_cbp, 2, dc_only_flag);

            pi2_coeff_data += 64;
            ui2_luma_csbp = ui2_luma_csbp >> 2;
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
                                          ps_cur_mb_info,
                                          ui2_luma_csbp,
                                          pi2_coeff_data);
            INSERT_BIT(u4_luma_dc_only_cbp, 3, dc_only_flag);
        }
        return u4_luma_dc_only_cbp;
    }

}

void ih264d_unpack_chroma_coeff4x4_mb(dec_struct_t * ps_dec,
                                      dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
    UWORD16 ui2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
    UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
    WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;
    WORD32 i;
    WORD16 *pi2_dc_val_u = NULL;
    WORD16 *pi2_dc_val_v = NULL;

    PROFILE_DISABLE_UNPACK_CHROMA()
    if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_ALLZERO)
        return;

    /*
     * Reserve the pointers to dc vals. The dc vals will be copied
     * after unpacking of ac vals since memset to 0 inside.
     */
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1))
    {
        pi2_dc_val_u = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;

        ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_u + 4);
    }
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2))
    {
        pi2_dc_val_v = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;

        ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_v + 4);
    }

    if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_NONZERO)
    {
        pi2_coeff_data = ps_dec->pi2_coeff_data;
        ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
                                             ps_cur_mb_info,
                                             ui2_chroma_csbp,
                                             pi2_coeff_data);

        pi2_coeff_data += 64;
        ui2_chroma_csbp = ui2_chroma_csbp >> 4;
        ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
                                             ps_cur_mb_info,
                                             ui2_chroma_csbp,
                                             pi2_coeff_data);

    }

    pi2_coeff_data = ps_dec->pi2_coeff_data;
    if(pi2_dc_val_u != NULL)
    {
        pi2_coeff_data[0] = *pi2_dc_val_u++;
        pi2_coeff_data[1 * 16] = *pi2_dc_val_u++;
        pi2_coeff_data[2 * 16] = *pi2_dc_val_u++;
        pi2_coeff_data[3 * 16] = *pi2_dc_val_u++;
    }
    else
    {
        pi2_coeff_data[0] = 0;
        pi2_coeff_data[1 * 16] = 0;
        pi2_coeff_data[2 * 16] = 0;
        pi2_coeff_data[3 * 16] = 0;
    }
    pi2_coeff_data += 64;
    if(pi2_dc_val_v != NULL)
    {
        pi2_coeff_data[0] = *pi2_dc_val_v++;
        pi2_coeff_data[1 * 16] = *pi2_dc_val_v++;
        pi2_coeff_data[2 * 16] = *pi2_dc_val_v++;
        pi2_coeff_data[3 * 16] = *pi2_dc_val_v++;
    }
    else
    {
        pi2_coeff_data[0] = 0;
        pi2_coeff_data[1 * 16] = 0;
        pi2_coeff_data[2 * 16] = 0;
        pi2_coeff_data[3 * 16] = 0;
    }
}
UWORD32 ih264d_unpack_luma_coeff8x8_mb(dec_struct_t * ps_dec,
                                    dec_mb_info_t * ps_cur_mb_info)
{
    WORD32 blk_8x8_cnt;
    WORD16 *pi2_out_coeff_data = ps_dec->pi2_coeff_data;
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
    UWORD8 *pu1_inv_scan;
    UWORD32 u4_luma_dc_only_cbp = 0;

    PROFILE_DISABLE_UNPACK_LUMA()
    if(!u1_field_coding_flag)
    {
        /*******************************************************************/
        /* initializing inverse scan  matrices                             */
        /*******************************************************************/
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_prog8x8_cabac;
    }
    else
    {
        /*******************************************************************/
        /* initializing inverse scan  matrices                             */
        /*******************************************************************/
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_int8x8_cabac;
    }

    for(blk_8x8_cnt = 0; blk_8x8_cnt < 4; blk_8x8_cnt++)
    {
        if(CHECKBIT(ps_cur_mb_info->u1_cbp, blk_8x8_cnt))
        {
            tu_blk8x8_coeff_data_t *ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
            UWORD32 u4_sig_coeff_map;
            WORD32 idx = 0;
            WORD16 *pi2_coeff_data = &ps_tu_8x8->ai2_level[0];
            WORD32 num_coeff = 0;

            /* memset 64 coefficient to zero */
            memset(pi2_out_coeff_data,0,64*sizeof(WORD16));

            u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[1];

            while(u4_sig_coeff_map)
            {
                idx = CLZ(u4_sig_coeff_map);

                idx = 31 - idx;
                RESET_BIT(u4_sig_coeff_map,idx);

                idx = pu1_inv_scan[idx + 32];
                pi2_out_coeff_data[idx] = *pi2_coeff_data++;
                num_coeff++;
            }

            u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[0];
            while(u4_sig_coeff_map)
            {
                idx = CLZ(u4_sig_coeff_map);

                idx = 31 - idx;
                RESET_BIT(u4_sig_coeff_map,idx);

                idx = pu1_inv_scan[idx];
                pi2_out_coeff_data[idx] = *pi2_coeff_data++;
                num_coeff++;
            }

            if((num_coeff == 1) && (idx == 0))
            {
                SET_BIT(u4_luma_dc_only_cbp,blk_8x8_cnt);
            }


            {
                WORD32 offset;
                offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8;
                offset = ALIGN4(offset);
                ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + offset);
            }
        }
        pi2_out_coeff_data += 64;
    }

    return u4_luma_dc_only_cbp;
}
/*!
 **************************************************************************
 * \if Function name : ih264d_process_intra_mb \endif
 *
 * \brief
 *    This function decodes an I MB. Intraprediction is carried out followed
 *    by InvTramsform. Both IntraPrediction and Reconstrucion are carried out
 *    row buffer itself.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
WORD32 ih264d_process_intra_mb(dec_struct_t * ps_dec,
                               dec_mb_info_t * ps_cur_mb_info,
                               UWORD8 u1_mb_num)
{
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
    UWORD8 uc_temp = ps_cur_mb_info->u1_mb_ngbr_availablity;
    UWORD8 u1_top_available = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
    UWORD8 u1_left_available = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
    UWORD8 u1_use_top_right_mb = BOOLEAN(uc_temp & TOP_RIGHT_MB_AVAILABLE_MASK);
    UWORD8 u1_use_top_left_mb = BOOLEAN(uc_temp & TOP_LEFT_MB_AVAILABLE_MASK);
    UWORD8 uc_useTopMB = u1_top_available;
    UWORD16 u2_use_left_mb = u1_left_available;
    UWORD16 u2_use_left_mb_pack;
    UWORD8 *pu1_luma_pred_buffer;
    /* CHANGED CODE */
    UWORD8 *pu1_luma_rec_buffer;
    UWORD8 *puc_top;

    mb_neigbour_params_t *ps_left_mb;
    mb_neigbour_params_t *ps_top_mb;
    mb_neigbour_params_t *ps_top_right_mb;
    mb_neigbour_params_t *ps_curmb;

    UWORD16 u2_mbx = ps_cur_mb_info->u2_mbx;
    UWORD32 ui_pred_width, ui_rec_width;
    WORD16 *pi2_y_coeff;
    UWORD8 u1_mbaff, u1_topmb, u1_mb_field_decoding_flag;
    UWORD32 u4_num_pmbair;
    UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
    UWORD8 *pu1_yleft, *pu1_ytop_left;
    /* Chroma variables*/
    UWORD8 *pu1_top_u;
    UWORD8 *pu1_uleft;
    UWORD8 *pu1_u_top_left;
    /* CHANGED CODE */
    UWORD8 *pu1_mb_cb_rei1_buffer, *pu1_mb_cr_rei1_buffer;
    UWORD32 u4_recwidth_cr;
    /* CHANGED CODE */
    tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
    UWORD32 u4_luma_dc_only_csbp = 0;
    UWORD32 u4_luma_dc_only_cbp = 0;

    UWORD8 *pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;                 //Pointer to keep track of intra4x4_pred_mode data in pv_proc_tu_coeff_data buffer
    u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    u1_topmb = ps_cur_mb_info->u1_topmb;
    u4_num_pmbair = (u1_mb_num >> u1_mbaff);


    /*--------------------------------------------------------------------*/
    /* Find the current MB's mb params                                    */
    /*--------------------------------------------------------------------*/
    u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;

    ps_curmb = ps_cur_mb_info->ps_curmb;
    ps_top_mb = ps_cur_mb_info->ps_top_mb;
    ps_left_mb = ps_cur_mb_info->ps_left_mb;
    ps_top_right_mb = ps_cur_mb_info->ps_top_right_mb;

    /*--------------------------------------------------------------------*/
    /* Check whether neighbouring MB is Inter MB and                      */
    /* constrained intra pred is 1.                                       */
    /*--------------------------------------------------------------------*/
    u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;

    if(ps_dec->ps_cur_pps->u1_constrained_intra_pred_flag)
    {
        UWORD8 u1_left = (UWORD8)u2_use_left_mb;

        uc_useTopMB = uc_useTopMB
                        && ((ps_top_mb->u1_mb_type != P_MB)
                                        && (ps_top_mb->u1_mb_type != B_MB));
        u2_use_left_mb = u2_use_left_mb
                        && ((ps_left_mb->u1_mb_type != P_MB)
                                        && (ps_left_mb->u1_mb_type != B_MB));

        u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;
        if(u1_mbaff)
        {
            if(u1_mb_field_decoding_flag ^ ps_left_mb->u1_mb_fld)
            {
                u1_left = u1_left
                                && (((ps_left_mb + 1)->u1_mb_type != P_MB)
                                                && ((ps_left_mb + 1)->u1_mb_type
                                                                != B_MB));
                u2_use_left_mb = u2_use_left_mb && u1_left;
                if(u1_mb_field_decoding_flag)
                    u2_use_left_mb_pack = (u1_left << 8)
                                    + (u2_use_left_mb_pack & 0xff);
                else
                    u2_use_left_mb_pack = (u2_use_left_mb << 8)
                                    + (u2_use_left_mb);
            }
        }
        u1_use_top_right_mb =
                        u1_use_top_right_mb
                                        && ((ps_top_right_mb->u1_mb_type != P_MB)
                                                        && (ps_top_right_mb->u1_mb_type
                                                                        != B_MB));

        u1_use_top_left_mb =
                        u1_use_top_left_mb
                                        && ((ps_cur_mb_info->u1_topleft_mbtype != P_MB)
                                                        && (ps_cur_mb_info->u1_topleft_mbtype
                                                                        != B_MB));
    }

    /*********************Common pointer calculations *************************/
    /* CHANGED CODE */
    pu1_luma_pred_buffer = ps_dec->pu1_y;
    pu1_luma_rec_buffer = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
    pu1_mb_cb_rei1_buffer = ps_frame_buf->pu1_dest_u
                    + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
    pu1_mb_cr_rei1_buffer = ps_frame_buf->pu1_dest_v + (u4_num_pmbair << 3);
    ui_pred_width = MB_SIZE;
    ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
    u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
    /************* Current and top luma pointer *****************/

    if(u1_mbaff)
    {
        if(u1_topmb == 0)
        {
            pu1_luma_rec_buffer += (
                            u1_mb_field_decoding_flag ?
                                            (ui_rec_width >> 1) :
                                            (ui_rec_width << 4));
            pu1_mb_cb_rei1_buffer += (
                            u1_mb_field_decoding_flag ?
                                            (u4_recwidth_cr >> 1) :
                                            (u4_recwidth_cr << 3));
            pu1_mb_cr_rei1_buffer += (
                            u1_mb_field_decoding_flag ?
                                            (u4_recwidth_cr >> 1) :
                                            (u4_recwidth_cr << 3));
        }
    }

    /* CHANGED CODE */
    if(ps_dec->u4_use_intrapred_line_copy == 1)
    {
        puc_top = ps_dec->pu1_prev_y_intra_pred_line + (ps_cur_mb_info->u2_mbx << 4);
        pu1_top_u = ps_dec->pu1_prev_u_intra_pred_line
                        + (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR;
    }
    else
    {
        puc_top = pu1_luma_rec_buffer - ui_rec_width;
        pu1_top_u = pu1_mb_cb_rei1_buffer - u4_recwidth_cr;
    }
    /* CHANGED CODE */

    /************* Left pointer *****************/
    pu1_yleft = pu1_luma_rec_buffer - 1;
    pu1_uleft = pu1_mb_cb_rei1_buffer - 1 * YUV420SP_FACTOR;

    /**************Top Left pointer calculation**********/
    pu1_ytop_left = puc_top - 1;
    pu1_u_top_left = pu1_top_u - 1 * YUV420SP_FACTOR;

    /* CHANGED CODE */
    PROFILE_DISABLE_INTRA_PRED()
    {
        pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;
        if(u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 0)
        {
            ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 32);

        }
        else if (u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 1)
        {
            ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 8);
        }
    }
    if(!ps_cur_mb_info->u1_tran_form8x8)
    {
        u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
                                       ps_cur_mb_info,
                                       1);
    }
    else
    {
        if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
        {
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
                                           ps_cur_mb_info,
                                           1);
        }
        else
        {
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec,
                                           ps_cur_mb_info);
        }
    }

    pi2_y_coeff = ps_dec->pi2_coeff_data;

    if(u1_mb_type != I_4x4_MB)
    {
        UWORD8 u1_intrapred_mode = MB_TYPE_TO_INTRA_16x16_MODE(u1_mb_type);
        /*--------------------------------------------------------------------*/
        /* 16x16 IntraPrediction                                              */
        /*--------------------------------------------------------------------*/
        {
            UWORD8 u1_packed_modes = (u1_top_available << 1)
                            + u1_left_available;
            UWORD8 u1_err_code =
                            (u1_intrapred_mode & 1) ?
                                            u1_intrapred_mode :
                                            (u1_intrapred_mode ^ 2);

            if((u1_err_code & u1_packed_modes) ^ u1_err_code)
            {
                u1_intrapred_mode = 0;
                ps_dec->i4_error_code = ERROR_INTRAPRED;
            }
        }
        {
            UWORD8 au1_ngbr_pels[33];
            /* Get neighbour pixels */
            /* left pels */
            if(u2_use_left_mb)
            {
                WORD32 i;
                for(i = 0; i < 16; i++)
                    au1_ngbr_pels[16 - 1 - i] = pu1_yleft[i * ui_rec_width];
            }
            else
            {
                memset(au1_ngbr_pels, 0, 16);
            }

            /* top left pels */
            au1_ngbr_pels[16] = *pu1_ytop_left;

            /* top pels */
            if(uc_useTopMB)
            {
                memcpy(au1_ngbr_pels + 16 + 1, puc_top, 16);
            }
            else
            {
                memset(au1_ngbr_pels + 16 + 1, 0, 16);
            }
            PROFILE_DISABLE_INTRA_PRED()
            ps_dec->apf_intra_pred_luma_16x16[u1_intrapred_mode](
                            au1_ngbr_pels, pu1_luma_rec_buffer, 1, ui_rec_width,
                            ((uc_useTopMB << 2) | u2_use_left_mb));
        }
        {
            UWORD32 i;
            WORD16 ai2_tmp[16];
            for(i = 0; i < 16; i++)
            {
                WORD16 *pi2_level = pi2_y_coeff + (i << 4);
                UWORD8 *pu1_pred_sblk = pu1_luma_rec_buffer
                                + ((i & 0x3) * BLK_SIZE)
                                + (i >> 2) * (ui_rec_width << 2);
                PROFILE_DISABLE_IQ_IT_RECON()
                {
                    if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_4x4(
                                        pi2_level,
                                        pu1_pred_sblk,
                                        pu1_pred_sblk,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
                                        pi2_level);
                    }
                    else if((CHECKBIT(u4_luma_dc_only_csbp, i)) && pi2_level[0] != 0)
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
                                        pi2_level,
                                        pu1_pred_sblk,
                                        pu1_pred_sblk,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
                                        pi2_level);
                    }
                }
            }
        }
    }
    else if(!ps_cur_mb_info->u1_tran_form8x8)
    {
        UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
        UWORD8 u1_sub_blk_x, u1_sub_blk_y, u1_sub_mb_num;
        WORD8 i1_top_pred_mode;
        WORD8 i1_left_pred_mode;
        UWORD8 *pu1_top, *pu1_left, *pu1_top_left, *pu1_top_right;
        WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
        UWORD16 ui2_left_pred_buf_width = 0xffff;
        WORD8 i1_intra_pred;
        UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
        UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 16;
        WORD16 *pi2_y_coeff1;
        UWORD8 u1_cur_sub_block;
        UWORD16 ui2_top_rt_mask;

        /*--------------------------------------------------------------------*/
        /* 4x4 IntraPrediction                                                */
        /*--------------------------------------------------------------------*/
        /* Calculation of Top Right subblock mask                             */
        /*                                                                    */
        /* (a) Set it to default mask                                         */
        /*     [It has 0 for sublocks which will never have top-right sub block] */
        /*                                                                    */
        /* (b) If top MB is not available                                     */
        /*      Clear the bits of the first row sub blocks                    */
        /*                                                                    */
        /* (c) Set/Clear bit for top-right sublock of MB                      */
        /*      [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
        /*--------------------------------------------------------------------*/

        pu1_top = puc_top;

        ui2_top_rt_mask = (u1_use_top_right_mb << 3) | (0x5750);
        if(uc_useTopMB)
            ui2_top_rt_mask |= 0x7;

        /*Top Related initialisations*/


        pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
        pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
        /*--------------------------------------
         if(u1_mbaff)
         {

         pi1_cur_pred_mode += (u2_mbx << 2);
         pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
         pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
         }*/

        if(u1_top_available)
        {
            if(ps_top_mb->u1_mb_type == I_4x4_MB)
                *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
            else
                *(WORD32*)pi1_cur_pred_mode =
                                (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
        }
        else
            *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
        /* CHANGED CODE */

        /* CHANGED CODE */

        /*Left Related initialisations*/
        pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;
        if(!u1_mbaff)
        {

            if(u1_left_available)
            {

                if(ps_left_mb->u1_mb_type != I_4x4_MB)
                    *(WORD32*)pi1_left_pred_mode =
                                    (u2_use_left_mb_pack) ?
                                    DC_DC_DC_DC :
                                                            NOT_VALID;

            }
            else
            {

                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
            }

        }
        else
        {
            UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;
            UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;

            if(u1_curMbfld ^ u1_leftMbfld)
            {

                if(u1_topmb
                                | ((u1_topmb == 0)
                                                && ((ps_curmb - 1)->u1_mb_type
                                                                != I_4x4_MB)))
                {
                    if(u1_left_available)
                    {
                        if(ps_left_mb->u1_mb_type != I_4x4_MB)
                        {
                            if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
                                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
                            else
                                *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
                        }
                    }
                    else
                        *(WORD32*)pi1_left_pred_mode = NOT_VALID;

                    if(u1_curMbfld)
                    {
                        if(u1_left_available)
                        {
                            if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
                            {
                                if(u2_use_left_mb_pack >> 8)
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
                                                    DC_DC_DC_DC;
                                else
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
                                                    NOT_VALID;
                            }
                        }
                        else
                            *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
                        *(WORD32*)(pi1_left_pred_mode + 4) =
                                        *(WORD32*)pi1_left_pred_mode;
                    }
                    else
                    {

                        pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
                        pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
                        pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
                    }
                }
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
            }
            else
            {

                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
                if(u1_left_available)
                {

                    if(ps_left_mb->u1_mb_type != I_4x4_MB)
                        *(WORD32*)pi1_left_pred_mode =
                                        (u2_use_left_mb_pack) ?
                                        DC_DC_DC_DC :
                                                                NOT_VALID;
                }
                else
                    *(WORD32*)pi1_left_pred_mode = NOT_VALID;
            }
        }
        /* One time pointer initialisations*/
        pi2_y_coeff1 = pi2_y_coeff;
        pu1_top_left = pu1_ytop_left;

        /* Scan the sub-blocks in Raster Scan Order */
        for(u1_sub_mb_num = 0; u1_sub_mb_num < 16; u1_sub_mb_num++)
        {
            UWORD8 au1_ngbr_pels[13];

            u1_sub_blk_x = u1_sub_mb_num & 0x3;
            u1_sub_blk_y = u1_sub_mb_num >> 2;
            i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x];
            i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y];
            u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u1_sub_mb_num));

            /*********** left subblock availability**********/
            if(u1_sub_blk_x)
                u1_is_left_sub_block = 1;
            else
                u1_is_left_sub_block =
                                (u1_sub_blk_y < 2) ?
                                                (CHECKBIT(u2_use_left_mb_pack,
                                                          0)) :
                                                (u2_use_left_mb_pack >> 8);

            /* CHANGED CODE */
            if(u1_sub_blk_y)
                u1_is_top_sub_block = 1;

            /* CHANGED CODE */
            /***************** Top *********************/
            if(ps_dec->u4_use_intrapred_line_copy == 1)
            {

                if(u1_sub_blk_y)
                    pu1_top = pu1_luma_rec_buffer - ui_rec_width;
                else
                    pu1_top = puc_top + (u1_sub_blk_x << 2);
            }
            else
            {
                pu1_top = pu1_luma_rec_buffer - ui_rec_width;
            }
            /***************** Top Right *********************/
            pu1_top_right = pu1_top + 4;
            /***************** Top Left *********************/
            pu1_top_left = pu1_top - 1;
            /***************** Left *********************/
            pu1_left = pu1_luma_rec_buffer - 1;
            /* CHANGED CODE */

            /*---------------------------------------------------------------*/
            /* Calculation of Intra prediction mode                          */
            /*---------------------------------------------------------------*/
            i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
                            DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
            {
                UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
                                + u1_is_left_sub_block;
                UWORD8 *pu1_intra_err_codes =
                                (UWORD8 *)gau1_ih264d_intra_pred_err_code;
                UWORD8 uc_b2b0 = ((u1_sub_mb_num & 4) >> 1) | (u1_sub_mb_num & 1);
                UWORD8 uc_b3b1 = ((u1_sub_mb_num & 8) >> 2)
                                | ((u1_sub_mb_num & 2) >> 1);

                u1_cur_sub_block = (uc_b3b1 << 2) + uc_b2b0;
                PROFILE_DISABLE_INTRA_PRED()
                if(!pu1_prev_intra4x4_pred_mode_flag[u1_cur_sub_block])
                {
                    i1_intra_pred =
                                    pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
                                                    + (pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
                                                                    >= i1_intra_pred);
                }
                {
                    UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];

                    if((u1_err_code & u1_packed_modes) ^ u1_err_code)
                     {
                        i1_intra_pred = 0;
                        ps_dec->i4_error_code = ERROR_INTRAPRED;
                     }

                }
            }
            {
                /* Get neighbour pixels */
                /* left pels */
                if(u1_is_left_sub_block)
                {
                    WORD32 i;
                    for(i = 0; i < 4; i++)
                        au1_ngbr_pels[4 - 1 - i] = pu1_left[i * ui_rec_width];
                }
                else
                {
                    memset(au1_ngbr_pels, 0, 4);
                }

                /* top left pels */
                au1_ngbr_pels[4] = *pu1_top_left;

                /* top pels */
                if(u1_is_top_sub_block)
                {
                    memcpy(au1_ngbr_pels + 4 + 1, pu1_top, 4);
                }
                else
                {
                    memset(au1_ngbr_pels + 4 + 1, 0, 4);
                }

                /* top right pels */
                if(u1_use_top_right_mb)
                {
                    memcpy(au1_ngbr_pels + 4 * 2 + 1, pu1_top_right, 4);
                }
                else if(u1_is_top_sub_block)
                {
                    memset(au1_ngbr_pels + 4 * 2 + 1, au1_ngbr_pels[4 * 2], 4);
                }
            }
            PROFILE_DISABLE_INTRA_PRED()
            ps_dec->apf_intra_pred_luma_4x4[i1_intra_pred](
                            au1_ngbr_pels, pu1_luma_rec_buffer, 1,
                            ui_rec_width,
                            ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));

            /* CHANGED CODE */
            if(CHECKBIT(ui2_luma_csbp, u1_sub_mb_num))
            {
                WORD16 ai2_tmp[16];
                PROFILE_DISABLE_IQ_IT_RECON()
                {
                    if(CHECKBIT(u4_luma_dc_only_csbp, u1_sub_mb_num))
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
                                        pi2_y_coeff1,
                                        pu1_luma_rec_buffer,
                                        pu1_luma_rec_buffer,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
                                        NULL);
                    }
                    else
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_4x4(
                                        pi2_y_coeff1,
                                        pu1_luma_rec_buffer,
                                        pu1_luma_rec_buffer,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
                                        NULL);
                    }
                }

            }

            /*---------------------------------------------------------------*/
            /* Update sub block number                                       */
            /*---------------------------------------------------------------*/
            pi2_y_coeff1 += 16;
            pu1_luma_rec_buffer +=
                            (u1_sub_blk_x == 3) ? (ui_rec_width << 2) - 12 : 4;
            pu1_luma_pred_buffer +=
                            (u1_sub_blk_x == 3) ? (ui_pred_width << 2) - 12 : 4;
            /* CHANGED CODE */
            pi1_cur_pred_mode[u1_sub_blk_x] = i1_intra_pred;
            pi1_left_pred_mode[u1_sub_blk_y] = i1_intra_pred;
        }
    }
    else if((u1_mb_type == I_4x4_MB) && (ps_cur_mb_info->u1_tran_form8x8 == 1))
    {
        UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
        UWORD8 u1_sub_blk_x, u1_sub_blk_y, u1_sub_mb_num;
        WORD8 i1_top_pred_mode;
        WORD8 i1_left_pred_mode;
        UWORD8 *pu1_top, *pu1_left, *pu1_top_left;
        WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
        UWORD16 ui2_left_pred_buf_width = 0xffff;
        WORD8 i1_intra_pred;
        UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
        UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 4;
        WORD16 *pi2_y_coeff1;
        UWORD16 ui2_top_rt_mask;
        UWORD32 u4_4x4_left_offset = 0;

        /*--------------------------------------------------------------------*/
        /* 8x8 IntraPrediction                                                */
        /*--------------------------------------------------------------------*/
        /* Calculation of Top Right subblock mask                             */
        /*                                                                    */
        /* (a) Set it to default mask                                         */
        /*  [It has 0 for sublocks which will never have top-right sub block] */
        /*                                                                    */
        /* (b) If top MB is not available                                     */
        /*      Clear the bits of the first row sub blocks                    */
        /*                                                                    */
        /* (c) Set/Clear bit for top-right sublock of MB                      */
        /*  [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
        /*                                                                    */
        /* ui2_top_rt_mask: marks availibility of top right(neighbour)         */
        /* in the 8x8 Block ordering                                          */
        /*                                                                    */
        /*      tr0   tr1                                                     */
        /*   0    1   tr3                                                     */
        /*   2    3                                                           */
        /*                                                                    */
        /*  Top rights for 0 is in top MB                                     */
        /*  top right of 1 will be in top right MB                            */
        /*  top right of 3 in right MB and hence not available                */
        /*  This corresponds to ui2_top_rt_mask  having default value 0x4      */
        /*--------------------------------------------------------------------*/

        ui2_top_rt_mask = (u1_use_top_right_mb << 1) | (0x4);

        if(uc_useTopMB)
        {
            ui2_top_rt_mask |= 0x1;
        }

        /* Top Related initialisations */
        pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
        pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
        /*
         if(u1_mbaff)
         {
         pi1_cur_pred_mode += (u2_mbx << 2);
         pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
         pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
         }
         */
        if(u1_top_available)
        {
            if(ps_top_mb->u1_mb_type == I_4x4_MB)
            {
                *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
            }
            else
            {
                *(WORD32*)pi1_cur_pred_mode =
                                (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
            }
        }
        else
        {
            *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
        }

        pu1_top = puc_top - 8;

        /*Left Related initialisations*/
        pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;

        if(!u1_mbaff)
        {
            if(u1_left_available)
            {
                if(ps_left_mb->u1_mb_type != I_4x4_MB)
                {
                    *(WORD32*)pi1_left_pred_mode =
                                    (u2_use_left_mb_pack) ?
                                    DC_DC_DC_DC :
                                                            NOT_VALID;
                }
            }
            else
            {
                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
            }
        }
        else
        {
            UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;

            UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;

            if((!u1_curMbfld) && (u1_leftMbfld))
            {
                u4_4x4_left_offset = 1;
            }

            if(u1_curMbfld ^ u1_leftMbfld)
            {

                if(u1_topmb
                                | ((u1_topmb == 0)
                                                && ((ps_curmb - 1)->u1_mb_type
                                                                != I_4x4_MB)))

                {
                    if(u1_left_available)
                    {
                        if(ps_left_mb->u1_mb_type != I_4x4_MB)
                        {
                            if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
                            {
                                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
                            }
                            else
                            {
                                *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
                            }
                        }
                    }
                    else
                    {
                        *(WORD32*)pi1_left_pred_mode = NOT_VALID;
                    }

                    if(u1_curMbfld)
                    {
                        if(u1_left_available)
                        {
                            if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
                            {
                                if(u2_use_left_mb_pack >> 8)
                                {
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
                                                    DC_DC_DC_DC;
                                }
                                else
                                {
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
                                                    NOT_VALID;
                                }
                            }
                        }
                        else
                        {
                            *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
                        }

                        pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
                        *(WORD32*)(pi1_left_pred_mode + 4) =
                                        *(WORD32*)pi1_left_pred_mode;
                    }
                    else
                    {
                        pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
                        pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
                        pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
                    }
                }
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
            }
            else
            {
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;

                if(u1_left_available)
                {
                    if(ps_left_mb->u1_mb_type != I_4x4_MB)
                    {
                        *(WORD32*)pi1_left_pred_mode =
                                        (u2_use_left_mb_pack) ?
                                        DC_DC_DC_DC :
                                                                NOT_VALID;
                    }
                }
                else
                {
                    *(WORD32*)pi1_left_pred_mode = NOT_VALID;
                }
            }
        }

        /* One time pointer initialisations*/
        pi2_y_coeff1 = pi2_y_coeff;

        if(u1_use_top_left_mb)
        {
            pu1_top_left = pu1_ytop_left;
        }
        else
        {
            pu1_top_left = NULL;
        }

        /* Scan the sub-blocks in Raster Scan Order */
        for(u1_sub_mb_num = 0; u1_sub_mb_num < 4; u1_sub_mb_num++)
        {
            u1_sub_blk_x = (u1_sub_mb_num & 0x1);
            u1_sub_blk_y = (u1_sub_mb_num >> 1);
            i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x << 1];
            i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y << 1];

            if(2 == u1_sub_mb_num)
            {
                i1_left_pred_mode = pi1_left_pred_mode[(u1_sub_blk_y << 1)
                                + u4_4x4_left_offset];
            }

            u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u1_sub_mb_num));

            /*********** left subblock availability**********/
            if(u1_sub_blk_x)
            {
                u1_is_left_sub_block = 1;
            }
            else
            {
                u1_is_left_sub_block =
                                (u1_sub_blk_y < 1) ?
                                                (CHECKBIT(u2_use_left_mb_pack,
                                                          0)) :
                                                (u2_use_left_mb_pack >> 8);
            }

            /***************** Top *********************/
            if(u1_sub_blk_y)
            {
                u1_is_top_sub_block = 1;
                // sushant
                pu1_top = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - ui_rec_width;
            }
            else
            {
                pu1_top += 8;
            }

            /***************** Left *********************/
            if((u1_sub_blk_x) | (u4_num_pmbair != 0))
            {
                // sushant
                pu1_left = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - 1;
                ui2_left_pred_buf_width = ui_rec_width;
            }
            else
            {
                pu1_left = pu1_yleft;
                pu1_yleft += (ui_rec_width << 3);
                ui2_left_pred_buf_width = ui_rec_width;
            }

            /***************** Top Left *********************/
            if(u1_sub_mb_num)
            {
                pu1_top_left = (u1_sub_blk_x) ?
                                pu1_top - 1 : pu1_left - ui_rec_width;

                if((u1_sub_blk_x && (!u1_is_top_sub_block))
                                || ((!u1_sub_blk_x) && (!u1_is_left_sub_block)))
                {
                    pu1_top_left = NULL;
                }
            }

            /*---------------------------------------------------------------*/
            /* Calculation of Intra prediction mode                          */
            /*---------------------------------------------------------------*/
            i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
                            DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
            {
                UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
                                + u1_is_left_sub_block;
                UWORD8 *pu1_intra_err_codes =
                                (UWORD8 *)gau1_ih264d_intra_pred_err_code;

                /********************************************************************/
                /* Same intra4x4_pred_mode array is filled with intra4x4_pred_mode  */
                /* for a MB with 8x8 intrapredicition                               */
                /********************************************************************/
                PROFILE_DISABLE_INTRA_PRED()
                if(!pu1_prev_intra4x4_pred_mode_flag[u1_sub_mb_num])
                {
                    i1_intra_pred = pu1_rem_intra4x4_pred_mode[u1_sub_mb_num]
                                    + (pu1_rem_intra4x4_pred_mode[u1_sub_mb_num]
                                                    >= i1_intra_pred);
                }
                {
                    UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];

                    if((u1_err_code & u1_packed_modes) ^ u1_err_code)
                    {
                        i1_intra_pred = 0;
                        ps_dec->i4_error_code = ERROR_INTRAPRED;
                    }
                }
            }

            {
                UWORD8 au1_ngbr_pels[25];
                WORD32 ngbr_avail;
                ngbr_avail = u1_is_left_sub_block << 0;
                ngbr_avail |= u1_is_top_sub_block << 2;

                if(pu1_top_left)
                    ngbr_avail |= 1 << 1;

                ngbr_avail |= u1_use_top_right_mb << 3;
                PROFILE_DISABLE_INTRA_PRED()
                {
                    ps_dec->pf_intra_pred_ref_filtering(pu1_left, pu1_top_left,
                                                        pu1_top, au1_ngbr_pels,
                                                        ui2_left_pred_buf_width,
                                                        ngbr_avail);

                    ps_dec->apf_intra_pred_luma_8x8[i1_intra_pred](
                                    au1_ngbr_pels, pu1_luma_rec_buffer, 1,
                                    ui_rec_width,
                                    ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));
                }
            }

            /* Inverse Transform and Reconstruction */
            if(CHECKBIT(ps_cur_mb_info->u1_cbp, u1_sub_mb_num))
            {
                WORD16 *pi2_scale_matrix_ptr;
                WORD16 ai2_tmp[64];

                pi2_scale_matrix_ptr =
                                ps_dec->s_high_profile.i2_scalinglist8x8[0];
                PROFILE_DISABLE_IQ_IT_RECON()
                {
                    if(CHECKBIT(u4_luma_dc_only_cbp, u1_sub_mb_num))
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_8x8_dc(
                                        pi2_y_coeff1,
                                        pu1_luma_rec_buffer,
                                        pu1_luma_rec_buffer,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)pi2_scale_matrix_ptr,
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
                                        NULL);
                    }
                    else
                    {
                        ps_dec->pf_iquant_itrans_recon_luma_8x8(
                                        pi2_y_coeff1,
                                        pu1_luma_rec_buffer,
                                        pu1_luma_rec_buffer,
                                        ui_rec_width,
                                        ui_rec_width,
                                        gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
                                        (UWORD16 *)pi2_scale_matrix_ptr,
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
                                        NULL);
                    }
                }

            }

            /*---------------------------------------------------------------*/
            /* Update sub block number                                       */
            /*---------------------------------------------------------------*/
            pi2_y_coeff1 += 64;

            pu1_luma_rec_buffer +=
                            (u1_sub_blk_x == 1) ?
                                            (ui_rec_width << 3) - (8 * 1) : 8;

            /*---------------------------------------------------------------*/
            /* Pred mode filled in terms of 4x4 block so replicated in 2     */
            /* locations.                                                    */
            /*---------------------------------------------------------------*/
            pi1_cur_pred_mode[u1_sub_blk_x << 1] = i1_intra_pred;
            pi1_cur_pred_mode[(u1_sub_blk_x << 1) + 1] = i1_intra_pred;
            pi1_left_pred_mode[u1_sub_blk_y << 1] = i1_intra_pred;
            pi1_left_pred_mode[(u1_sub_blk_y << 1) + 1] = i1_intra_pred;
        }
    }
    /* Decode Chroma Block */
    ih264d_unpack_chroma_coeff4x4_mb(ps_dec,
                                     ps_cur_mb_info);
    /*--------------------------------------------------------------------*/
    /* Chroma Blocks decoding                                             */
    /*--------------------------------------------------------------------*/
    {
        UWORD8 u1_intra_chrom_pred_mode;
        UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);

        /*--------------------------------------------------------------------*/
        /* Perform Chroma intra prediction                                    */
        /*--------------------------------------------------------------------*/

        u1_intra_chrom_pred_mode = CHROMA_TO_LUMA_INTRA_MODE(
                        ps_cur_mb_info->u1_chroma_pred_mode);

        {
            UWORD8 u1_packed_modes = (u1_top_available << 1)
                            + u1_left_available;
            UWORD8 u1_err_code =
                            (u1_intra_chrom_pred_mode & 1) ?
                                            u1_intra_chrom_pred_mode :
                                            (u1_intra_chrom_pred_mode ^ 2);
            if((u1_err_code & u1_packed_modes) ^ u1_err_code)
            {
                u1_intra_chrom_pred_mode = 0;
                ps_dec->i4_error_code = ERROR_INTRAPRED;
            }
        }

        /* CHANGED CODE */
        if(u1_chroma_cbp != CBPC_ALLZERO)
        {
            UWORD16 u2_chroma_csbp =
                            (u1_chroma_cbp == CBPC_ACZERO) ?
                                            0 : ps_cur_mb_info->u2_chroma_csbp;
            UWORD32 u4_scale_u;
            UWORD32 u4_scale_v;

            {
                UWORD16 au2_ngbr_pels[33];
                UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
                UWORD16 *pu2_left_uv;
                UWORD16 *pu2_topleft_uv;
                WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
                WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;

                pu2_left_uv = (UWORD16 *)pu1_uleft;
                pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
                /* Get neighbour pixels */
                /* left pels */
                if(u2_use_left_mb_pack)
                {
                    WORD32 i;
                    if(use_left1)
                    {
                        for(i = 0; i < 4; i++)
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
                    }
                    else
                    {
                        memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
                    }

                    if(use_left2)
                    {
                        for(i = 4; i < 8; i++)
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
                    }
                    else
                    {
                        memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
                    }
                }
                else
                {
                    memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
                }

                /* top left pels */
                au2_ngbr_pels[8] = *pu2_topleft_uv;

                /* top pels */
                if(uc_useTopMB)
                {
                    memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
                           8 * sizeof(UWORD16));
                }
                else
                {
                    memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
                }

                PROFILE_DISABLE_INTRA_PRED()
                ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
                                pu1_ngbr_pels,
                                pu1_mb_cb_rei1_buffer,
                                1,
                                u4_recwidth_cr,
                                ((uc_useTopMB << 2) | (use_left2 << 4)
                                                | use_left1));
            }
            u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
            u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
            pi2_y_coeff = ps_dec->pi2_coeff_data;

            {
                UWORD32 i;
                WORD16 ai2_tmp[16];
                for(i = 0; i < 4; i++)
                {
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
                    UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer
                                    + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
                                    + (i >> 1) * (u4_recwidth_cr << 2);
                    PROFILE_DISABLE_IQ_IT_RECON()
                    {
                        if(CHECKBIT(u2_chroma_csbp, i))
                        {
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4(
                                            pi2_level,
                                            pu1_pred_sblk,
                                            pu1_pred_sblk,
                                            u4_recwidth_cr,
                                            u4_recwidth_cr,
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
                                            u4_scale_u, ai2_tmp, pi2_level);
                        }
                        else if(pi2_level[0] != 0)
                        {
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
                                            pi2_level,
                                            pu1_pred_sblk,
                                            pu1_pred_sblk,
                                            u4_recwidth_cr,
                                            u4_recwidth_cr,
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
                                            u4_scale_u, ai2_tmp, pi2_level);
                        }
                    }

                }
            }

            pi2_y_coeff += MB_CHROM_SIZE;
            u2_chroma_csbp = u2_chroma_csbp >> 4;
            {
                UWORD32 i;
                WORD16 ai2_tmp[16];
                for(i = 0; i < 4; i++)
                {
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
                    UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer + 1
                                    + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
                                    + (i >> 1) * (u4_recwidth_cr << 2);
                    PROFILE_DISABLE_IQ_IT_RECON()
                    {
                        if(CHECKBIT(u2_chroma_csbp, i))
                        {
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4(
                                            pi2_level,
                                            pu1_pred_sblk,
                                            pu1_pred_sblk,
                                            u4_recwidth_cr,
                                            u4_recwidth_cr,
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
                                            u4_scale_v, ai2_tmp, pi2_level);
                        }
                        else if(pi2_level[0] != 0)
                        {
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
                                            pi2_level,
                                            pu1_pred_sblk,
                                            pu1_pred_sblk,
                                            u4_recwidth_cr,
                                            u4_recwidth_cr,
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
                                            u4_scale_v, ai2_tmp, pi2_level);
                        }
                    }
                }
            }

        }
        else
        {
            /* If no inverse transform is needed, pass recon buffer pointer */
            /* to Intraprediction module instead of pred buffer pointer     */
            {
                UWORD16 au2_ngbr_pels[33];
                UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
                UWORD16 *pu2_left_uv;
                UWORD16 *pu2_topleft_uv;
                pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
                pu2_left_uv = (UWORD16 *)pu1_uleft;
                WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
                WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;

                /* Get neighbour pixels */
                /* left pels */
                if(u2_use_left_mb_pack)
                {
                    WORD32 i;
                    if(use_left1)
                    {
                        for(i = 0; i < 4; i++)
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
                    }
                    else
                    {
                        memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
                    }

                    if(use_left2)
                    {
                        for(i = 4; i < 8; i++)
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
                    }
                    else
                    {
                        memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
                    }

                }
                else
                {
                    memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
                }

                /* top left pels */
                au2_ngbr_pels[8] = *pu2_topleft_uv;

                /* top pels */
                if(uc_useTopMB)
                {
                    memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
                           8 * sizeof(UWORD16));
                }
                else
                {
                    memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
                }

                PROFILE_DISABLE_INTRA_PRED()
                ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
                                pu1_ngbr_pels,
                                pu1_mb_cb_rei1_buffer,
                                1,
                                u4_recwidth_cr,
                                ((uc_useTopMB << 2) | (use_left2 << 4)
                                                | use_left1));
            }

        }

    }
    return OK;
}
