/******************************************************************************
 *
 * 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_inter_pred.c
 *
 * \brief
 *    This file contains routines to perform MotionCompensation tasks
 *
 * Detailed_description
 *
 * \date
 *    20/11/2002
 *
 * \author  Arvind Raman
 **************************************************************************
 */

#include <string.h>
#include "ih264d_defs.h"
#include "ih264d_mvpred.h"
#include "ih264d_error_handler.h"
#include "ih264d_structs.h"
#include "ih264d_defs.h"
#include "ih264d_inter_pred.h"
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"
#include "ih264d_debug.h"
#include "ih264d_tables.h"
#include "ih264d_mb_utils.h"


void ih264d_pad_on_demand(pred_info_t *ps_pred, UWORD8 lum_chrom_blk);



void ih264d_copy_multiplex_data(UWORD8 *puc_Source,
                                UWORD8 *puc_To,
                                UWORD32 uc_w,
                                UWORD32 uc_h,
                                UWORD32 ui16_sourceWidth,
                                UWORD32 ui16_toWidth)
{
    UWORD8 uc_i, uc_j;

    for(uc_i = 0; uc_i < uc_h; uc_i++)
    {
        memcpy(puc_To, puc_Source, uc_w);
        puc_To += ui16_toWidth;
        puc_Source += ui16_sourceWidth;
    }
}


/*!
 **************************************************************************
 * \if Function name : dma_2d1d \endif
 *
 * \brief
 *    2D -> 1D linear DMA into the reference buffers
 *
 * \return
 *    None
 **************************************************************************
 */
void ih264d_copy_2d1d(UWORD8 *puc_src,
                      UWORD8 *puc_dest,
                      UWORD16 ui16_srcWidth,
                      UWORD16 ui16_widthToFill,
                      UWORD16 ui16_heightToFill)
{
    UWORD32 uc_w, uc_h;
    for(uc_h = ui16_heightToFill; uc_h != 0; uc_h--)
    {
        memcpy(puc_dest, puc_src, ui16_widthToFill);
        puc_dest += ui16_widthToFill;
        puc_src += ui16_srcWidth;
    }
}

/*!
 **************************************************************************
 * \if Function name : ih264d_fill_pred_info \endif
 *
 * \brief
 *    Fills inter prediction related info
 *
 * \return
 *    None
 **************************************************************************
 */
void ih264d_fill_pred_info(WORD16 *pi2_mv,WORD32 part_width,WORD32 part_height, WORD32 sub_mb_num,
                           WORD32 pred_dir,pred_info_pkd_t *ps_pred_pkd,WORD8 i1_buf_id,
                           WORD8 i1_ref_idx,UWORD32 *pu4_wt_offset,UWORD8 u1_pic_type)
{
    WORD32 insert_bits;

    ps_pred_pkd->i2_mv[0] = pi2_mv[0];
    ps_pred_pkd->i2_mv[1] = pi2_mv[1];

    insert_bits = sub_mb_num & 3; /*sub mb x*/
    ps_pred_pkd->i1_size_pos_info = insert_bits;
    insert_bits = sub_mb_num >> 2;/*sub mb y*/
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 2;
    insert_bits = part_width >> 1;
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 4;
    insert_bits = part_height >> 1;
    ps_pred_pkd->i1_size_pos_info |= insert_bits << 6;

    ps_pred_pkd->i1_ref_idx_info = i1_ref_idx;
    ps_pred_pkd->i1_ref_idx_info |= (pred_dir << 6);
    ps_pred_pkd->i1_buf_id = i1_buf_id;
    ps_pred_pkd->pu4_wt_offst = pu4_wt_offset;
    ps_pred_pkd->u1_pic_type = u1_pic_type;


}







/*****************************************************************************/
/* \if Function name : formMbPartInfo \endif                                 */
/*                                                                           */
/* \brief                                                                    */
/*    Form the Mb partition information structure, to be used by the MC      */
/*    routine                                                                */
/*                                                                           */
/* \return                                                                   */
/*    None                                                                   */
/* \note                                                                     */
/*    c_bufx is used to select PredBuffer,                                   */
/*    if it's only Forward/Backward prediction always buffer used is         */
/*    puc_MbLumaPredBuffer[0 to X1],pu1_mb_cb_pred_buffer[0 to X1] and          */
/*    pu1_mb_cr_pred_buffer[0 to X1]                                            */
/*                                                                           */
/*    if it's bidirect for forward ..PredBuffer[0 to X1] buffer is used and  */
/*    ..PredBuffer[X2 to X3] for backward prediction. and                    */
/*                                                                           */
/*    Final predicted samples values are the average of ..PredBuffer[0 to X1]*/
/*    and ..PredBuffer[X2 to X3]                                             */
/*                                                                           */
/*    X1 is 255 for Luma and 63 for Chroma                                   */
/*    X2 is 256 for Luma and 64 for Chroma                                   */
/*    X3 is 511 for Luma and 127 for Chroma                                  */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         11 05 2005   SWRN            Modified to handle pod               */
/*****************************************************************************/

WORD32 ih264d_form_mb_part_info_bp(pred_info_pkd_t *ps_pred_pkd,
                                 dec_struct_t * ps_dec,
                                 UWORD16 u2_mb_x,
                                 UWORD16 u2_mb_y,
                                 WORD32 mb_index,
                                 dec_mb_info_t *ps_cur_mb_info)
{
    /* The reference buffer pointer */
    WORD32 i2_frm_x, i2_frm_y;
    WORD32 i2_tmp_mv_x, i2_tmp_mv_y;
    WORD32 i2_rec_x, i2_rec_y;

    WORD32 u2_pic_ht;
    WORD32 u2_frm_wd;
    WORD32 u2_rec_wd;
    UWORD8 u1_sub_x = 0,u1_sub_y=0 ;
    UWORD8  u1_part_wd = 0,u1_part_ht = 0;
    WORD16 i2_mv_x,i2_mv_y;

    /********************************************/
    /* i1_mc_wd       width reqd for mcomp      */
    /* u1_dma_ht      height reqd for mcomp     */
    /* u1_dma_wd      width aligned to 4 bytes  */
    /* u1_dx          fractional part of width  */
    /* u1_dx          fractional part of height */
    /********************************************/
    UWORD32 i1_mc_wd;

    WORD32 u1_dma_ht;

    UWORD32 u1_dma_wd;
    UWORD32 u1_dx;
    UWORD32 u1_dy;
    pred_info_t * ps_pred = ps_dec->ps_pred + ps_dec->u4_pred_info_idx;
    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
    tfr_ctxt_t *ps_frame_buf;
    struct pic_buffer_t *ps_ref_frm;
    UWORD8 u1_scale_ref,u1_mbaff,u1_field;
    pic_buffer_t  **pps_ref_frame;
    WORD8 i1_size_pos_info,i1_buf_id;

    PROFILE_DISABLE_MB_PART_INFO()

     UNUSED(ps_cur_mb_info);
     i1_size_pos_info = ps_pred_pkd->i1_size_pos_info;
     GET_XPOS_PRED(u1_sub_x,i1_size_pos_info);
     GET_YPOS_PRED(u1_sub_y,i1_size_pos_info);
     GET_WIDTH_PRED(u1_part_wd,i1_size_pos_info);
     GET_HEIGHT_PRED(u1_part_ht,i1_size_pos_info);
     i2_mv_x = ps_pred_pkd->i2_mv[0];
     i2_mv_y = ps_pred_pkd->i2_mv[1];
     i1_buf_id = ps_pred_pkd->i1_buf_id;


     ps_ref_frm = ps_dec->apv_buf_id_pic_buf_map[i1_buf_id];


    {
        ps_frame_buf = &ps_dec->s_tran_addrecon;
    }


    /* Transfer Setup Y */
    {
        UWORD8 *pu1_pred, *pu1_rec;

        /* calculating rounded motion vectors and fractional components */
        i2_tmp_mv_x = i2_mv_x;
        i2_tmp_mv_y = i2_mv_y;
        u1_dx = i2_tmp_mv_x & 0x3;
        u1_dy = i2_tmp_mv_y & 0x3;
        i2_tmp_mv_x >>= 2;
        i2_tmp_mv_y >>= 2;
        i1_mc_wd = u1_part_wd << 2;
        u1_dma_ht = u1_part_ht << 2;
        if(u1_dx)
        {
            i2_tmp_mv_x -= 2;
            i1_mc_wd += 5;
        }
        if(u1_dy)
        {
            i2_tmp_mv_y -= 2;
            u1_dma_ht += 5;
        }

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the reference frame, and subsequent clipping             */
        /********************************************************************/
        u2_pic_ht = ps_dec->u2_pic_ht;
        u2_frm_wd = ps_dec->u2_frm_wd_y;
        i2_rec_x = u1_sub_x << 2;
        i2_rec_y = u1_sub_y << 2;

        i2_frm_x = (u2_mb_x << 4) + i2_rec_x + i2_tmp_mv_x;
        i2_frm_y = (u2_mb_y << 4) + i2_rec_y + i2_tmp_mv_y;

        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_X_FRM, (ps_dec->u2_pic_wd - 1),
                         i2_frm_x);
        i2_frm_y = CLIP3(((1 - u1_dma_ht)), (u2_pic_ht - (1)), i2_frm_y);

        pu1_pred = ps_ref_frm->pu1_buf1 + i2_frm_y * u2_frm_wd + i2_frm_x;

        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the recon buffer                                         */
        /********************************************************************/
        u2_rec_wd = MB_SIZE;
        {
            u2_rec_wd = ps_dec->u2_frm_wd_y;
            i2_rec_x += (mb_index << 4);
            pu1_rec = ps_frame_buf->pu1_dest_y + i2_rec_y * u2_rec_wd
                            + i2_rec_x;
        }

        /* filling the pred and dma structures for Y */
        u2_frm_wd = ps_dec->u2_frm_wd_y;

        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
        ps_pred->i1_dma_ht = u1_dma_ht;
        ps_pred->i1_mc_wd = i1_mc_wd;
        ps_pred->u2_frm_wd = u2_frm_wd;
        ps_pred->pu1_rec_y_u = pu1_rec;
        ps_pred->u2_dst_stride = u2_rec_wd;

        ps_pred->i1_mb_partwidth = u1_part_wd << 2;
        ps_pred->i1_mb_partheight = u1_part_ht << 2;
        ps_pred->u1_dydx = (u1_dy << 2) + u1_dx;

        ps_pred->pu1_y_ref = pu1_pred;

    }

    /* Increment ps_pred index */
    ps_pred++;

    /* Transfer Setup U & V */
    {
        WORD32 i4_ref_offset, i4_rec_offset;
        UWORD8 *pu1_pred_u, *pu1_pred_v;


        /* calculating rounded motion vectors and fractional components */
        i2_tmp_mv_x = i2_mv_x;
        i2_tmp_mv_y = i2_mv_y;

        /************************************************************************/
        /* Table 8-9: Derivation of the vertical component of the chroma vector */
        /* in field coding mode                                                 */
        /************************************************************************/

        /* Eighth sample of the chroma MV */
        u1_dx = i2_tmp_mv_x & 0x7;
        u1_dy = i2_tmp_mv_y & 0x7;

        /********************************************************************/
        /* Calculating the full pel MV for chroma which is 1/2 of the Luma  */
        /* MV in full pel units                                             */
        /********************************************************************/
        i2_mv_x = i2_tmp_mv_x;
        i2_mv_y = i2_tmp_mv_y;
        i2_tmp_mv_x = SIGN_POW2_DIV(i2_tmp_mv_x, 3);
        i2_tmp_mv_y = SIGN_POW2_DIV(i2_tmp_mv_y, 3);
        i1_mc_wd = u1_part_wd << 1;
        u1_dma_ht = u1_part_ht << 1;
        if(u1_dx)
        {
            i2_tmp_mv_x -= (i2_mv_x < 0);
            i1_mc_wd++;
        }
        if(u1_dy != 0)
        {
            i2_tmp_mv_y -= (i2_mv_y < 0);
            u1_dma_ht++;
        }

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the reference frame, and subsequent clipping             */
        /********************************************************************/
        u2_pic_ht >>= 1;
        u2_frm_wd = ps_dec->u2_frm_wd_uv;
        i2_rec_x = u1_sub_x << 1;
        i2_rec_y = u1_sub_y << 1;

        i2_frm_x = (u2_mb_x << 3) + i2_rec_x + i2_tmp_mv_x;
        i2_frm_y = (u2_mb_y << 3) + i2_rec_y + i2_tmp_mv_y;

        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_UV_FRM,
                         ((ps_dec->u2_pic_wd >> 1) - 1), i2_frm_x);
        i2_frm_y = CLIP3(((1 - u1_dma_ht)), (u2_pic_ht - (1)), i2_frm_y);

        i4_ref_offset = i2_frm_y * u2_frm_wd + i2_frm_x * YUV420SP_FACTOR;
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the recon buffer                                         */
        /********************************************************************/
        /* CHANGED CODE */
        u2_rec_wd = BLK8x8SIZE * YUV420SP_FACTOR;
        i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;

        {
            u2_rec_wd = ps_dec->u2_frm_wd_uv;
            i2_rec_x += (mb_index << 3);
            i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
            ps_pred->pu1_rec_y_u = ps_frame_buf->pu1_dest_u + i4_rec_offset;
            ps_pred->u1_pi1_wt_ofst_rec_v = ps_frame_buf->pu1_dest_v
                            + i4_rec_offset;
        }

        /* CHANGED CODE */

        /* filling the common pred structures for U */
        u2_frm_wd = ps_dec->u2_frm_wd_uv;

        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
        ps_pred->i1_dma_ht = u1_dma_ht;
        ps_pred->i1_mc_wd = i1_mc_wd;

        ps_pred->u2_frm_wd = u2_frm_wd;
        ps_pred->u2_dst_stride = u2_rec_wd;

        ps_pred->i1_mb_partwidth = u1_part_wd << 1;
        ps_pred->i1_mb_partheight = u1_part_ht << 1;
        ps_pred->u1_dydx = (u1_dy << 3) + u1_dx;

        pu1_pred_u = ps_ref_frm->pu1_buf2 + i4_ref_offset;
        pu1_pred_v = ps_ref_frm->pu1_buf3 + i4_ref_offset;

        /* Copy U & V partitions */
        ps_pred->pu1_u_ref = pu1_pred_u;

        /* Increment the reference buffer Index */
        ps_pred->pu1_v_ref = pu1_pred_v;
    }

    /* Increment ps_pred index */
    ps_dec->u4_pred_info_idx += 2;

    return OK;

}


/*****************************************************************************/
/* \if Function name : formMbPartInfo \endif                                 */
/*                                                                           */
/* \brief                                                                    */
/*    Form the Mb partition information structure, to be used by the MC      */
/*    routine                                                                */
/*                                                                           */
/* \return                                                                   */
/*    None                                                                   */
/* \note                                                                     */
/*    c_bufx is used to select PredBuffer,                                   */
/*    if it's only Forward/Backward prediction always buffer used is         */
/*    puc_MbLumaPredBuffer[0 to X1],pu1_mb_cb_pred_buffer[0 to X1] and          */
/*    pu1_mb_cr_pred_buffer[0 to X1]                                            */
/*                                                                           */
/*    if it's bidirect for forward ..PredBuffer[0 to X1] buffer is used and  */
/*    ..PredBuffer[X2 to X3] for backward prediction. and                    */
/*                                                                           */
/*    Final predicted samples values are the average of ..PredBuffer[0 to X1]*/
/*    and ..PredBuffer[X2 to X3]                                             */
/*                                                                           */
/*    X1 is 255 for Luma and 63 for Chroma                                   */
/*    X2 is 256 for Luma and 64 for Chroma                                   */
/*    X3 is 511 for Luma and 127 for Chroma                                  */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         11 05 2005   SWRN            Modified to handle pod               */
/*****************************************************************************/
WORD32 ih264d_form_mb_part_info_mp(pred_info_pkd_t *ps_pred_pkd,
                                 dec_struct_t * ps_dec,
                                 UWORD16 u2_mb_x,
                                 UWORD16 u2_mb_y,
                                 WORD32 mb_index,
                                 dec_mb_info_t *ps_cur_mb_info)
{
    /* The reference buffer pointer */
    UWORD8 *pu1_ref_buf;
    WORD16 i2_frm_x, i2_frm_y, i2_tmp_mv_x, i2_tmp_mv_y, i2_pod_ht;
    WORD16 i2_rec_x, i2_rec_y;
    UWORD16 u2_pic_ht, u2_frm_wd, u2_rec_wd;
    UWORD8 u1_wght_pred_type, u1_wted_bipred_idc;
    UWORD16 u2_tot_ref_scratch_size;
    UWORD8 u1_sub_x = 0;
    UWORD8 u1_sub_y = 0;
    UWORD8 u1_is_bi_dir = 0;

    /********************************************/
    /* i1_mc_wd       width reqd for mcomp      */
    /* u1_dma_ht      height reqd for mcomp     */
    /* u1_dma_wd      width aligned to 4 bytes  */
    /* u1_dx          fractional part of width  */
    /* u1_dx          fractional part of height */
    /********************************************/
    UWORD8 i1_mc_wd, u1_dma_ht, u1_dma_wd, u1_dx, u1_dy;
    pred_info_t * ps_pred ;
    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
    const UWORD8 u1_slice_type = ps_cur_slice->u1_slice_type;
    UWORD8 u1_pod_bot, u1_pod_top;

    /* load the pictype for pod u4_flag & chroma motion vector derivation */
    UWORD8 u1_ref_pic_type ;

    /* set default value to flags specifying field nature of picture & mb */
    UWORD32 u1_mb_fld = 0, u1_mb_or_pic_fld;
    UWORD32 u1_mb_bot = 0, u1_pic_bot = 0, u1_mb_or_pic_bot;
    tfr_ctxt_t *ps_frame_buf;
    /* calculate flags specifying field nature of picture & mb */
    const UWORD32 u1_pic_fld = ps_cur_slice->u1_field_pic_flag;
    WORD8 i1_pred;
    WORD8 i1_size_pos_info,i1_buf_id,i1_ref_idx;
    UWORD8 u1_part_wd,u1_part_ht;
    WORD16 i2_mv_x,i2_mv_y;
    struct pic_buffer_t *ps_ref_frm;
    UWORD32 *pu4_wt_offset;
    UWORD8 *pu1_buf1,*pu1_buf2,*pu1_buf3;


    PROFILE_DISABLE_MB_PART_INFO()

    ps_pred = ps_dec->ps_pred + ps_dec->u4_pred_info_idx;


     i1_size_pos_info = ps_pred_pkd->i1_size_pos_info;
     GET_XPOS_PRED(u1_sub_x,i1_size_pos_info);
     GET_YPOS_PRED(u1_sub_y,i1_size_pos_info);
     GET_WIDTH_PRED(u1_part_wd,i1_size_pos_info);
     GET_HEIGHT_PRED(u1_part_ht,i1_size_pos_info);
     i2_mv_x = ps_pred_pkd->i2_mv[0];
     i2_mv_y = ps_pred_pkd->i2_mv[1];
     i1_ref_idx = ps_pred_pkd->i1_ref_idx_info & 0x3f;
     i1_buf_id = ps_pred_pkd->i1_buf_id;
     ps_ref_frm = ps_dec->apv_buf_id_pic_buf_map[i1_buf_id];

     i1_pred = (ps_pred_pkd->i1_ref_idx_info & 0xC0) >> 6;
     u1_is_bi_dir = (i1_pred == BI_PRED);


    u1_ref_pic_type = ps_pred_pkd->u1_pic_type & PIC_MASK;

    pu1_buf1  = ps_ref_frm->pu1_buf1;
    pu1_buf2  = ps_ref_frm->pu1_buf2;
    pu1_buf3  = ps_ref_frm->pu1_buf3;

    if(u1_ref_pic_type == BOT_FLD)
    {
        pu1_buf1 += ps_ref_frm->u2_frm_wd_y;
        pu1_buf2 += ps_ref_frm->u2_frm_wd_uv;
        pu1_buf3 += ps_ref_frm->u2_frm_wd_uv;

    }



    if(ps_dec->ps_cur_pps->u1_wted_pred_flag)
    {
            pu4_wt_offset = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
                            * X3(i1_ref_idx)];
    }


    pu4_wt_offset = ps_pred_pkd->pu4_wt_offst;


    /* Pointer to the frame buffer */
    {
        ps_frame_buf = &ps_dec->s_tran_addrecon;
        /* CHANGED CODE */
    }

    if(!u1_pic_fld)
    {
        u1_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
        u1_mb_bot = 1 - ps_cur_mb_info->u1_topmb;
    }
    else
        u1_pic_bot = ps_cur_slice->u1_bottom_field_flag;

    /****************************************************************/
    /* calculating the flags the tell whether to use frame-padding  */
    /* or use software pad-on-demand                                */
    /****************************************************************/
    u1_mb_or_pic_bot = u1_mb_bot | u1_pic_bot;
    u1_mb_or_pic_fld = u1_mb_fld | u1_pic_fld;
    u1_pod_bot = u1_mb_or_pic_fld && (u1_ref_pic_type == TOP_FLD);
    u1_pod_top = u1_mb_or_pic_fld && (u1_ref_pic_type == BOT_FLD);

    /* Weighted Pred additions */
    u1_wted_bipred_idc = ps_dec->ps_cur_pps->u1_wted_bipred_idc;

    if((u1_slice_type == P_SLICE) || (u1_slice_type == SP_SLICE))
    {
        /* P Slice only */
        u1_wght_pred_type = ps_dec->ps_cur_pps->u1_wted_pred_flag;

    }
    else
    {
        /* B Slice only */
        u1_wght_pred_type = 1 + u1_is_bi_dir;
        if(u1_wted_bipred_idc == 0)
            u1_wght_pred_type = 0;
        if((u1_wted_bipred_idc == 2) && (!u1_is_bi_dir))
            u1_wght_pred_type = 0;
    }
    /* load the scratch reference buffer index */
    pu1_ref_buf = ps_dec->pu1_ref_buff + ps_dec->u4_dma_buf_idx;
    u2_tot_ref_scratch_size = 0;


    /* Transfer Setup Y */
    {
        UWORD8 *pu1_pred, *pu1_rec;
        /* calculating rounded motion vectors and fractional components */
        i2_tmp_mv_x = i2_mv_x;
        i2_tmp_mv_y = i2_mv_y;

        u1_dx = i2_tmp_mv_x & 0x3;
        u1_dy = i2_tmp_mv_y & 0x3;
        i2_tmp_mv_x >>= 2;
        i2_tmp_mv_y >>= 2;
        i1_mc_wd = u1_part_wd << 2;
        u1_dma_ht = u1_part_ht << 2;
        if(u1_dx)
        {
            i2_tmp_mv_x -= 2;
            i1_mc_wd += 5;
        }
        if(u1_dy)
        {
            i2_tmp_mv_y -= 2;
            u1_dma_ht += 5;
        }

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the reference frame, and subsequent clipping             */
        /********************************************************************/
        u2_pic_ht = ps_dec->u2_pic_ht >> u1_pic_fld;
        u2_frm_wd = ps_dec->u2_frm_wd_y << u1_pic_fld;
        i2_frm_x = (u2_mb_x << 4) + (u1_sub_x << 2) + i2_tmp_mv_x;
        i2_frm_y = ((u2_mb_y + (u1_mb_bot && !u1_mb_fld)) << 4)
                        + (((u1_sub_y << 2) + i2_tmp_mv_y) << u1_mb_fld);

        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_X_FRM, (ps_dec->u2_pic_wd - 1),
                         i2_frm_x);
        i2_frm_y = CLIP3(((1 - u1_dma_ht) << u1_mb_fld),
                         (u2_pic_ht - (1 << u1_mb_fld)), i2_frm_y);

        pu1_pred = pu1_buf1 + i2_frm_y * u2_frm_wd + i2_frm_x;
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;
        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the recon buffer                                         */
        /********************************************************************/
        /* CHANGED CODE */
        u2_rec_wd = MB_SIZE;
        i2_rec_x = u1_sub_x << 2;
        i2_rec_y = u1_sub_y << 2;
        {
            u2_rec_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;
            i2_rec_x += (mb_index << 4);
            pu1_rec = ps_frame_buf->pu1_dest_y + i2_rec_y * u2_rec_wd
                            + i2_rec_x;
            if(u1_mb_bot)
                pu1_rec += ps_dec->u2_frm_wd_y << ((u1_mb_fld) ? 0 : 4);
        }

        /* CHANGED CODE */

        /* filling the pred and dma structures for Y */
        u2_frm_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;

        ps_pred->pu1_dma_dest_addr = pu1_ref_buf;
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
        ps_pred->u2_frm_wd = u2_frm_wd;
        ps_pred->i1_dma_ht = u1_dma_ht;
        ps_pred->i1_mc_wd = i1_mc_wd;
        ps_pred->pu1_rec_y_u = pu1_rec;
        ps_pred->u2_dst_stride = u2_rec_wd;

        ps_pred->i1_mb_partwidth = u1_part_wd << 2;
        ps_pred->i1_mb_partheight = u1_part_ht << 2;
        ps_pred->u1_dydx = (u1_dy << 2) + u1_dx;
        ps_pred->u1_is_bi_direct = u1_is_bi_dir;
        ps_pred->u1_pi1_wt_ofst_rec_v = (UWORD8 *)pu4_wt_offset;
        ps_pred->u1_wght_pred_type = u1_wght_pred_type;
        ps_pred->i1_pod_ht = 0;

        /* Increment the Reference buffer Indices */
        pu1_ref_buf += u1_dma_wd * u1_dma_ht;
        u2_tot_ref_scratch_size += u1_dma_wd * u1_dma_ht;

        /* unrestricted field motion comp for top region outside frame */
        i2_pod_ht = (-i2_frm_y) >> u1_mb_fld;
        if((i2_pod_ht > 0) && u1_pod_top)
        {
            ps_pred->i1_pod_ht = (WORD8)(-i2_pod_ht);
            u1_dma_ht -= i2_pod_ht;
            pu1_pred += i2_pod_ht * u2_frm_wd;
        }
        /* unrestricted field motion comp for bottom region outside frame */
        else if(u1_pod_bot)
        {
            i2_pod_ht = u1_dma_ht + ((i2_frm_y - u2_pic_ht) >> u1_mb_fld);
            if(i2_pod_ht > 0)
            {
                u1_dma_ht -= i2_pod_ht;
                ps_pred->i1_pod_ht = (WORD8)i2_pod_ht;
            }
        }

        /* Copy Y partition */

        /*
         * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
         * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
         */
        if(ps_pred->i1_pod_ht)
        {
            ps_pred->pu1_pred = pu1_pred;
            ps_pred->u1_dma_ht_y = u1_dma_ht;
            ps_pred->u1_dma_wd_y = u1_dma_wd;
        }
        ps_pred->pu1_y_ref = pu1_pred;
    }



    /* Increment ps_pred index */
    ps_pred++;

    /* Transfer Setup U & V */
    {
        WORD32 i4_ref_offset, i4_rec_offset;
        UWORD8 *pu1_pred_u, *pu1_pred_v, u1_tmp_dma_ht;
        /* CHANGED CODE */
        UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);
        /* CHANGED CODE */

        /* calculating rounded motion vectors and fractional components */
        i2_tmp_mv_x = i2_mv_x;
        i2_tmp_mv_y = i2_mv_y;

        /************************************************************************/
        /* Table 8-9: Derivation of the vertical component of the chroma vector */
        /* in field coding mode                                                 */
        /************************************************************************/
        if(u1_pod_bot && u1_mb_or_pic_bot)
            i2_tmp_mv_y += 2;
        if(u1_pod_top && !u1_mb_or_pic_bot)
            i2_tmp_mv_y -= 2;

        /* Eighth sample of the chroma MV */
        u1_dx = i2_tmp_mv_x & 0x7;
        u1_dy = i2_tmp_mv_y & 0x7;

        /********************************************************************/
        /* Calculating the full pel MV for chroma which is 1/2 of the Luma  */
        /* MV in full pel units                                             */
        /********************************************************************/
        i2_mv_x = i2_tmp_mv_x;
        i2_mv_y = i2_tmp_mv_y;
        i2_tmp_mv_x = SIGN_POW2_DIV(i2_tmp_mv_x, 3);
        i2_tmp_mv_y = SIGN_POW2_DIV(i2_tmp_mv_y, 3);
        i1_mc_wd = u1_part_wd << 1;
        u1_dma_ht = u1_part_ht << 1;
        if(u1_dx)
        {
            if(i2_mv_x < 0)
                i2_tmp_mv_x -= 1;
            i1_mc_wd++;
        }
        if(u1_dy != 0)
        {
            if(i2_mv_y < 0)
                i2_tmp_mv_y -= 1;
            u1_dma_ht++;
        }

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the reference frame, and subsequent clipping             */
        /********************************************************************/
        u2_pic_ht >>= 1;
        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_pic_fld;
        i2_frm_x = (u2_mb_x << 3) + (u1_sub_x << 1) + i2_tmp_mv_x;
        i2_frm_y = ((u2_mb_y + (u1_mb_bot && !u1_mb_fld)) << 3)
                        + (((u1_sub_y << 1) + i2_tmp_mv_y) << u1_mb_fld);

        i2_frm_x = CLIP3(MAX_OFFSET_OUTSIDE_UV_FRM,
                         ((ps_dec->u2_pic_wd >> 1) - 1), i2_frm_x);
        i2_frm_y = CLIP3(((1 - u1_dma_ht) << u1_mb_fld),
                         (u2_pic_ht - (1 << u1_mb_fld)), i2_frm_y);

        i4_ref_offset = i2_frm_y * u2_frm_wd + i2_frm_x * YUV420SP_FACTOR;
        u1_dma_wd = (i1_mc_wd + 3) & 0xFC;

        /********************************************************************/
        /* Calulating the horizontal and the vertical u4_ofst from top left  */
        /* edge of the recon buffer                                         */
        /********************************************************************/
        /* CHANGED CODE */
        u2_rec_wd = BLK8x8SIZE * YUV420SP_FACTOR;
        i2_rec_x = u1_sub_x << 1;
        i2_rec_y = u1_sub_y << 1;
        i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
        {
            u2_rec_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;

            i2_rec_x += (mb_index << 3);
            i4_rec_offset = i2_rec_y * u2_rec_wd + i2_rec_x * YUV420SP_FACTOR;
            if(u1_mb_bot)
                i4_rec_offset += ps_dec->u2_frm_wd_uv << ((u1_mb_fld) ? 0 : 3);
            ps_pred->pu1_rec_y_u = ps_frame_buf->pu1_dest_u + i4_rec_offset;
            ps_pred->u1_pi1_wt_ofst_rec_v = ps_frame_buf->pu1_dest_v
                            + i4_rec_offset;

        }

        /* CHANGED CODE */

        /* filling the common pred structures for U */
        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
        u1_tmp_dma_ht = u1_dma_ht;
        ps_pred->u2_u1_ref_buf_wd = u1_dma_wd;
        ps_pred->u2_frm_wd = u2_frm_wd;
        ps_pred->i1_dma_ht = u1_dma_ht;
        ps_pred->i1_mc_wd = i1_mc_wd;
        ps_pred->u2_dst_stride = u2_rec_wd;

        ps_pred->i1_mb_partwidth = u1_part_wd << 1;
        ps_pred->i1_mb_partheight = u1_part_ht << 1;
        ps_pred->u1_dydx = (u1_dy << 3) + u1_dx;
        ps_pred->u1_is_bi_direct = u1_is_bi_dir;
        ps_pred->u1_wght_pred_type = u1_wght_pred_type;
        ps_pred->i1_pod_ht = 0;

        ps_pred->pu1_dma_dest_addr = pu1_ref_buf;

        /* unrestricted field motion comp for top region outside frame */
        i2_pod_ht = (-i2_frm_y) >> u1_mb_fld;
        if((i2_pod_ht > 0) && u1_pod_top)
        {
            i4_ref_offset += i2_pod_ht * u2_frm_wd;
            u1_dma_ht -= i2_pod_ht;
            ps_pred->i1_pod_ht = (WORD8)(-i2_pod_ht);
        }
        /* unrestricted field motion comp for bottom region outside frame */
        else if(u1_pod_bot)
        {
            i2_pod_ht = u1_dma_ht + ((i2_frm_y - u2_pic_ht) >> u1_mb_fld);
            if(i2_pod_ht > 0)
            {
                u1_dma_ht -= i2_pod_ht;
                ps_pred->i1_pod_ht = (WORD8)i2_pod_ht;
            }
        }

        pu1_pred_u = pu1_buf2 + i4_ref_offset;
        pu1_pred_v = pu1_buf3 + i4_ref_offset;

        /* Copy U & V partitions */
        if(ps_pred->i1_pod_ht)
        {
            ps_pred->pu1_pred_u = pu1_pred_u;
            ps_pred->u1_dma_ht_uv = u1_dma_ht;
            ps_pred->u1_dma_wd_uv = u1_dma_wd;

        }
        ps_pred->pu1_u_ref = pu1_pred_u;

        /* Increment the reference buffer Index */
        u2_tot_ref_scratch_size += (u1_dma_wd * u1_tmp_dma_ht) << 1;

        if(ps_pred->i1_pod_ht)
        {
            ps_pred->pu1_pred_v = pu1_pred_v;
            ps_pred->u1_dma_ht_uv = u1_dma_ht;
            ps_pred->u1_dma_wd_uv = u1_dma_wd;
        }

        ps_pred->pu1_v_ref = pu1_pred_v;
    }

    /* Increment ps_pred index */
    ps_dec->u4_pred_info_idx += 2;


    /* Increment the reference buffer Index */
    ps_dec->u4_dma_buf_idx += u2_tot_ref_scratch_size;

    if(ps_dec->u4_dma_buf_idx > MAX_REF_BUF_SIZE)
        return ERROR_NUM_MV;

    return OK;



}


/*!
 **************************************************************************
 * \if Function name : MotionCompensate \endif
 *
 * \brief
 *    The routine forms predictor blocks for the entire MB and stores it in
 *    predictor buffers.This function works only for BASELINE profile
 *
 * \param ps_dec: Pointer to the structure decStruct. This is used to get
 *     pointers to the current and the reference frame and to the MbParams
 *     structure.
 *
 * \return
 *    None
 *
 * \note
 *    The routine forms predictors for all the luma and the chroma MB
 *    partitions.
 **************************************************************************
 */

void ih264d_motion_compensate_bp(dec_struct_t * ps_dec, dec_mb_info_t *ps_cur_mb_info)
{
    pred_info_t *ps_pred ;
    UWORD8 *puc_ref, *pu1_dest_y;
    UWORD8 *pu1_dest_u;
    UWORD32 u2_num_pels, u2_ref_wd_y, u2_ref_wd_uv, u2_dst_wd;

    UWORD32 u4_wd_y, u4_ht_y, u4_wd_uv;
    UWORD32 u4_ht_uv;
    UWORD8 *puc_pred0 = (UWORD8 *)(ps_dec->pi2_pred1);


    PROFILE_DISABLE_INTER_PRED()
    UNUSED(ps_cur_mb_info);
    ps_pred = ps_dec->ps_pred ;

    for(u2_num_pels = 0; u2_num_pels < 256;)
    {
        UWORD32 uc_dx, uc_dy;
        /* Pointer to the destination buffer. If the CBPs of all 8x8 blocks in
         the MB partition are zero then it would be better to copy the
         predictor valus directly to the current frame buffer */
        /*
         * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
         * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
         */

        u2_ref_wd_y = ps_pred->u2_frm_wd;
        puc_ref = ps_pred->pu1_y_ref;
        if(ps_pred->u1_dydx & 0x3)
            puc_ref += 2;
        if(ps_pred->u1_dydx >> 2)
            puc_ref += 2 * u2_ref_wd_y;

        u4_wd_y = ps_pred->i1_mb_partwidth;
        u4_ht_y = ps_pred->i1_mb_partheight;
        uc_dx = ps_pred->u1_dydx;
        uc_dy = uc_dx >> 2;
        uc_dx &= 0x3;

        pu1_dest_y = ps_pred->pu1_rec_y_u;
        u2_dst_wd = ps_pred->u2_dst_stride;

        ps_dec->apf_inter_pred_luma[ps_pred->u1_dydx](puc_ref, pu1_dest_y,
                                                      u2_ref_wd_y,
                                                      u2_dst_wd,
                                                      u4_ht_y,
                                                      u4_wd_y, puc_pred0,
                                                      ps_pred->u1_dydx);

        ps_pred++;

        /* Interpolate samples for the chroma components */
        {
            UWORD8 *pu1_ref_u;

            u2_ref_wd_uv = ps_pred->u2_frm_wd;
            pu1_ref_u = ps_pred->pu1_u_ref;

            u4_wd_uv = ps_pred->i1_mb_partwidth;
            u4_ht_uv = ps_pred->i1_mb_partheight;
            uc_dx = ps_pred->u1_dydx; /* 8*dy + dx */
            uc_dy = uc_dx >> 3;
            uc_dx &= 0x7;

            pu1_dest_u = ps_pred->pu1_rec_y_u;
            u2_dst_wd = ps_pred->u2_dst_stride;

            ps_pred++;
            ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_dest_u, u2_ref_wd_uv,
                                         u2_dst_wd, uc_dx, uc_dy,
                                         u4_ht_uv, u4_wd_uv);

        }

        u2_num_pels += (UWORD8)u4_wd_y * (UWORD8)u4_ht_y;

    }
}


/*
 **************************************************************************
 * \if Function name : MotionCompensateB \endif
 *
 * \brief
 *    The routine forms predictor blocks for the entire MB and stores it in
 *    predictor buffers.
 *
 * \param ps_dec: Pointer to the structure decStruct. This is used to get
 *     pointers to the current and the reference frame and to the MbParams
 *     structure.
 *
 * \return
 *    None
 *
 * \note
 *    The routine forms predictors for all the luma and the chroma MB
 *    partitions.
 **************************************************************************
 */

void ih264d_motion_compensate_mp(dec_struct_t * ps_dec, dec_mb_info_t *ps_cur_mb_info)
{
    pred_info_t *ps_pred ;
    pred_info_t *ps_pred_y_forw, *ps_pred_y_back, *ps_pred_cr_forw;
    UWORD8 *puc_ref, *pu1_dest_y, *puc_pred0, *puc_pred1;
    UWORD8 *pu1_dest_u, *pu1_dest_v;
    WORD16 *pi16_intm;
    UWORD32 u2_num_pels, u2_ref_wd_y, u2_ref_wd_uv, u2_dst_wd;
    UWORD32 u2_dest_wd_y, u2_dest_wd_uv;
    UWORD32 u2_row_buf_wd_y = 0;
    UWORD32 u2_row_buf_wd_uv = 0;
    UWORD32 u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
    UWORD32 u4_wd_y, u4_ht_y, u1_dir, u4_wd_uv;
    UWORD32 u4_ht_uv;
    UWORD8 *pu1_temp_mc_buffer = ps_dec->pu1_temp_mc_buffer;
    WORD32 i2_pod_ht;
    UWORD32 u2_pic_ht, u2_frm_wd, u2_rec_wd;
    UWORD32 u1_pod_bot, u1_pod_top;
    UWORD8 *pu1_pred, *pu1_dma_dst;
    UWORD32 u1_dma_wd, u1_dma_ht;

    dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;

    /* set default value to flags specifying field nature of picture & mb */
    UWORD32 u1_mb_fld = 0, u1_mb_or_pic_fld;
    UWORD32 u1_mb_or_pic_bot;
    /* calculate flags specifying field nature of picture & mb */
    const UWORD8 u1_pic_fld = ps_cur_slice->u1_field_pic_flag;

    PROFILE_DISABLE_INTER_PRED()
    ps_pred = ps_dec->ps_pred ;
    /* Initialize both ps_pred_y_forw, ps_pred_cr_forw and ps_pred_y_back
     * to avoid static analysis warnings */
    ps_pred_y_forw = ps_pred;
    ps_pred_y_back = ps_pred;
    ps_pred_cr_forw = ps_pred;

    if(ps_dec->u1_separate_parse)
        u2_log2Y_crwd = ps_dec->ps_decode_cur_slice->u2_log2Y_crwd;

    if(!u1_pic_fld)
    {
        u1_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
    }

    u1_mb_or_pic_fld = u1_mb_fld | u1_pic_fld;

    pi16_intm = ps_dec->pi2_pred1;
    puc_pred0 = (UWORD8 *)pi16_intm;
    puc_pred1 = puc_pred0 + PRED_BUFFER_WIDTH * PRED_BUFFER_HEIGHT * sizeof(WORD16);

    for(u2_num_pels = 0; u2_num_pels < 256;)
    {
        UWORD8 uc_dx, uc_dy;
        const UWORD8 u1_is_bi_direct = ps_pred->u1_is_bi_direct;
        for(u1_dir = 0; u1_dir <= u1_is_bi_direct; u1_dir++)
        {
            /* Pointer to the destination buffer. If the CBPs of all 8x8 blocks in
             the MB partition are zero then it would be better to copy the
             predictor valus directly to the current frame buffer */
            /*
             * ps_pred->i1_pod_ht is non zero when MBAFF is present. In case of MBAFF the reference data
             * is copied in the Scrath buffer so that the padding_on_demand doesnot corrupt the frame data
             */

            if(ps_pred->i1_pod_ht)
            {
                u2_ref_wd_y = ps_pred->u2_u1_ref_buf_wd;
                puc_ref = ps_pred->pu1_dma_dest_addr;
            }
            else
            {
                u2_ref_wd_y = ps_pred->u2_frm_wd;
                puc_ref = ps_pred->pu1_y_ref;

            }

            if(ps_pred->u1_dydx & 0x3)
                puc_ref += 2;
            if(ps_pred->u1_dydx >> 2)
                puc_ref += 2 * u2_ref_wd_y;
            u4_wd_y = ps_pred->i1_mb_partwidth;
            u4_ht_y = ps_pred->i1_mb_partheight;

            uc_dx = ps_pred->u1_dydx;
            uc_dy = uc_dx >> 2;
            uc_dx &= 0x3;
            if(u1_dir == 0)
            {
                pu1_dest_y = ps_pred->pu1_rec_y_u;
                u2_row_buf_wd_y = ps_pred->u2_dst_stride;
                u2_dst_wd = ps_pred->u2_dst_stride;
                u2_dest_wd_y = u2_dst_wd;
                ps_pred_y_forw = ps_pred;
            }
            else
            {
                pu1_dest_y = pu1_temp_mc_buffer;
                u2_dst_wd = MB_SIZE;
                u2_dest_wd_y = u2_dst_wd;
                ps_pred_y_back = ps_pred;
                ps_pred_y_back->pu1_rec_y_u = pu1_dest_y;
            }

            /* padding on demand (POD) for y done here */

            if(ps_pred->i1_pod_ht)
            {
                pu1_pred = ps_pred->pu1_pred;
                pu1_dma_dst = ps_pred->pu1_dma_dest_addr;
                u1_dma_wd = ps_pred->u1_dma_wd_y;
                u1_dma_ht = ps_pred->u1_dma_ht_y;
                u2_frm_wd = ps_dec->u2_frm_wd_y << u1_mb_or_pic_fld;
                if(ps_pred->i1_pod_ht < 0)
                {
                    pu1_dma_dst = pu1_dma_dst - (ps_pred->i1_pod_ht * ps_pred->u2_u1_ref_buf_wd);
                }
                ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd, u1_dma_wd,
                                 u1_dma_ht);
                ih264d_pad_on_demand(ps_pred, LUM_BLK);
            }
            ps_dec->apf_inter_pred_luma[ps_pred->u1_dydx](puc_ref, pu1_dest_y,
                                                          u2_ref_wd_y,
                                                          u2_dst_wd,
                                                          u4_ht_y,
                                                          u4_wd_y,
                                                          puc_pred0,
                                                          ps_pred->u1_dydx);
            ps_pred++;

            /* Interpolate samples for the chroma components */
            {
                UWORD8 *pu1_ref_u;
                UWORD32 u1_dma_ht;

                /* padding on demand (POD) for U and V done here */
                u1_dma_ht = ps_pred->i1_dma_ht;

                if(ps_pred->i1_pod_ht)
                {
                    pu1_pred = ps_pred->pu1_pred_u;
                    pu1_dma_dst = ps_pred->pu1_dma_dest_addr;
                    u1_dma_ht = ps_pred->u1_dma_ht_uv;
                    u1_dma_wd = ps_pred->u1_dma_wd_uv * YUV420SP_FACTOR;
                    u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
                    if(ps_pred->i1_pod_ht < 0)
                    {
                        /*Top POD*/
                        pu1_dma_dst -= (ps_pred->i1_pod_ht
                                        * ps_pred->u2_u1_ref_buf_wd
                                        * YUV420SP_FACTOR);
                    }

                    ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd,
                                     u1_dma_wd, u1_dma_ht);

                    pu1_dma_dst += (ps_pred->i1_dma_ht
                                    * ps_pred->u2_u1_ref_buf_wd);
                    pu1_pred = ps_pred->pu1_pred_v;

                    ih264d_pad_on_demand(ps_pred, CHROM_BLK);
                }

                if(ps_pred->i1_pod_ht)
                {
                    pu1_ref_u = ps_pred->pu1_dma_dest_addr;

                    u2_ref_wd_uv = ps_pred->u2_u1_ref_buf_wd
                                    * YUV420SP_FACTOR;
                }
                else
                {
                    u2_ref_wd_uv = ps_pred->u2_frm_wd;
                    pu1_ref_u = ps_pred->pu1_u_ref;

                }

                u4_wd_uv = ps_pred->i1_mb_partwidth;
                u4_ht_uv = ps_pred->i1_mb_partheight;
                uc_dx = ps_pred->u1_dydx; /* 8*dy + dx */
                uc_dy = uc_dx >> 3;
                uc_dx &= 0x7;
                if(u1_dir == 0)
                {
                    pu1_dest_u = ps_pred->pu1_rec_y_u;

                    pu1_dest_v = ps_pred->u1_pi1_wt_ofst_rec_v;
                    u2_row_buf_wd_uv = ps_pred->u2_dst_stride;
                    u2_dst_wd = ps_pred->u2_dst_stride;
                    u2_dest_wd_uv = u2_dst_wd;
                    ps_pred_cr_forw = ps_pred;
                }
                else
                {
                    pu1_dest_u = puc_pred0;

                    pu1_dest_v = puc_pred1;
                    u2_dest_wd_uv = BUFFER_WIDTH;
                    u2_dst_wd = BUFFER_WIDTH;
                    ps_pred->pu1_rec_y_u = pu1_dest_u;
                    ps_pred->u1_pi1_wt_ofst_rec_v = pu1_dest_v;
                }

                ps_pred++;
                ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_dest_u,
                                             u2_ref_wd_uv, u2_dst_wd,
                                             uc_dx, uc_dy, u4_ht_uv,
                                             u4_wd_uv);

                if(ps_cur_mb_info->u1_Mux == 1)
                {
                    /******************************************************************/
                    /* padding on demand (POD) for U and V done here                  */
                    /* ps_pred now points to the Y entry of the 0,0 component         */
                    /* Y need not be checked for POD because Y lies within            */
                    /* the picture((0,0) mv for Y doesnot get changed. But (0,0) for  */
                    /* U and V can need POD beacause of cross-field mv adjustments    */
                    /* (Table 8-9 of standard)                                        */
                    /******************************************************************/
                    if((ps_pred + 1)->i1_pod_ht)
                    {
                        pu1_pred = (ps_pred + 1)->pu1_pred_u;
                        pu1_dma_dst = (ps_pred + 1)->pu1_dma_dest_addr;
                        u1_dma_ht = (ps_pred + 1)->u1_dma_ht_uv;
                        u1_dma_wd = (ps_pred + 1)->u1_dma_wd_uv
                                        * YUV420SP_FACTOR;
                        u2_frm_wd = ps_dec->u2_frm_wd_uv << u1_mb_or_pic_fld;
                        if((ps_pred + 1)->i1_pod_ht < 0)
                        {
                            /*Top POD*/
                            pu1_dma_dst -= ((ps_pred + 1)->i1_pod_ht
                                            * (ps_pred + 1)->u2_u1_ref_buf_wd
                                            * YUV420SP_FACTOR);
                        }
                        ih264d_copy_2d1d(pu1_pred, pu1_dma_dst, u2_frm_wd,
                                         u1_dma_wd, u1_dma_ht);
                        pu1_dma_dst += ((ps_pred + 1)->i1_dma_ht
                                        * (ps_pred + 1)->u2_u1_ref_buf_wd); //(u1_dma_ht * u1_dma_wd);//
                        pu1_pred = (ps_pred + 1)->pu1_pred_v;
                        ih264d_pad_on_demand(ps_pred + 1, CHROM_BLK);

                    }

                    ih264d_multiplex_ref_data(ps_dec, ps_pred, pu1_dest_y,
                                              pu1_dest_u, ps_cur_mb_info,
                                              u2_dest_wd_y, u2_dest_wd_uv,
                                              u1_dir);
                    ps_pred += 2;
                }
            }
        }
        if(u1_dir != 0)
            u2_ref_wd_y = MB_SIZE;

        u2_num_pels += u4_wd_y * u4_ht_y;
        /* if BI_DIRECT, average the two pred's, and put in ..PredBuffer[0] */
        if((u1_is_bi_direct != 0) || (ps_pred_y_forw->u1_wght_pred_type != 0))
        {

            switch(ps_pred_y_forw->u1_wght_pred_type)
            {
                case 0:
                    ps_dec->pf_default_weighted_pred_luma(
                                    ps_pred_y_forw->pu1_rec_y_u, pu1_dest_y,
                                    ps_pred_y_forw->pu1_rec_y_u,
                                    u2_row_buf_wd_y, u2_ref_wd_y,
                                    u2_row_buf_wd_y, u4_ht_uv * 2,
                                    u4_wd_uv * 2);

                    ps_dec->pf_default_weighted_pred_chroma(
                                    ps_pred_cr_forw->pu1_rec_y_u, pu1_dest_u,
                                    ps_pred_cr_forw->pu1_rec_y_u,
                                    u2_row_buf_wd_uv, u2_dst_wd,
                                    u2_row_buf_wd_uv, u4_ht_uv,
                                    u4_wd_uv);

                    break;
                case 1:
                {
                    UWORD32 *pu4_weight_ofst =
                                    (UWORD32*)ps_pred_y_forw->u1_pi1_wt_ofst_rec_v;
                    UWORD32 u4_wt_ofst_u, u4_wt_ofst_v;
                    UWORD32 u4_wt_ofst_y =
                                    (UWORD32)(pu4_weight_ofst[0]);
                    WORD32 weight = (WORD16)(u4_wt_ofst_y & 0xffff);
                    WORD32 ofst = (WORD8)(u4_wt_ofst_y >> 16);

                    ps_dec->pf_weighted_pred_luma(ps_pred_y_forw->pu1_rec_y_u,
                                                  ps_pred_y_forw->pu1_rec_y_u,
                                                  u2_row_buf_wd_y,
                                                  u2_row_buf_wd_y,
                                                  (u2_log2Y_crwd & 0x0ff),
                                                  weight, ofst, u4_ht_y,
                                                  u4_wd_y);

                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[2]);
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[4]);
                    weight = ((u4_wt_ofst_v & 0xffff) << 16)
                                    | (u4_wt_ofst_u & 0xffff);
                    ofst = ((u4_wt_ofst_v >> 16) << 8)
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);

                    ps_dec->pf_weighted_pred_chroma(
                                    ps_pred_cr_forw->pu1_rec_y_u,
                                    ps_pred_cr_forw->pu1_rec_y_u,
                                    u2_row_buf_wd_uv, u2_row_buf_wd_uv,
                                    (u2_log2Y_crwd >> 8), weight, ofst,
                                    u4_ht_y >> 1, u4_wd_y >> 1);
                }

                    break;
                case 2:
                {
                    UWORD32 *pu4_weight_ofst =
                                    (UWORD32*)ps_pred_y_forw->u1_pi1_wt_ofst_rec_v;
                    UWORD32 u4_wt_ofst_u, u4_wt_ofst_v;
                    UWORD32 u4_wt_ofst_y;
                    WORD32 weight1, weight2;
                    WORD32 ofst1, ofst2;

                    u4_wt_ofst_y = (UWORD32)(pu4_weight_ofst[0]);

                    weight1 = (WORD16)(u4_wt_ofst_y & 0xffff);
                    ofst1 = (WORD8)(u4_wt_ofst_y >> 16);

                    u4_wt_ofst_y = (UWORD32)(pu4_weight_ofst[1]);
                    weight2 = (WORD16)(u4_wt_ofst_y & 0xffff);
                    ofst2 = (WORD8)(u4_wt_ofst_y >> 16);

                    ps_dec->pf_weighted_bi_pred_luma(ps_pred_y_forw->pu1_rec_y_u,
                                                     ps_pred_y_back->pu1_rec_y_u,
                                                     ps_pred_y_forw->pu1_rec_y_u,
                                                     u2_row_buf_wd_y,
                                                     u2_ref_wd_y,
                                                     u2_row_buf_wd_y,
                                                     (u2_log2Y_crwd & 0x0ff),
                                                     weight1, weight2, ofst1,
                                                     ofst2, u4_ht_y,
                                                     u4_wd_y);

                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[2]);
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[4]);
                    weight1 = ((u4_wt_ofst_v & 0xffff) << 16)
                                    | (u4_wt_ofst_u & 0xffff);
                    ofst1 = ((u4_wt_ofst_v >> 16) << 8)
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);

                    u4_wt_ofst_u = (UWORD32)(pu4_weight_ofst[3]);
                    u4_wt_ofst_v = (UWORD32)(pu4_weight_ofst[5]);
                    weight2 = ((u4_wt_ofst_v & 0xffff) << 16)
                                    | (u4_wt_ofst_u & 0xffff);
                    ofst2 = ((u4_wt_ofst_v >> 16) << 8)
                                    | ((u4_wt_ofst_u >> 16) & 0xFF);

                    ps_dec->pf_weighted_bi_pred_chroma(
                                    (ps_pred_y_forw + 1)->pu1_rec_y_u,
                                    (ps_pred_y_back + 1)->pu1_rec_y_u,
                                    (ps_pred_y_forw + 1)->pu1_rec_y_u,
                                    u2_row_buf_wd_uv, u2_dst_wd,
                                    u2_row_buf_wd_uv, (u2_log2Y_crwd >> 8),
                                    weight1, weight2, ofst1, ofst2,
                                    u4_ht_y >> 1, u4_wd_y >> 1);
                }

                    break;
            }

        }
    }
}


/*!
 **************************************************************************
 * \if Function name : ih264d_multiplex_ref_data \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */

void ih264d_multiplex_ref_data(dec_struct_t * ps_dec,
                               pred_info_t *ps_pred,
                               UWORD8* pu1_dest_y,
                               UWORD8* pu1_dest_u,
                               dec_mb_info_t *ps_cur_mb_info,
                               UWORD16 u2_dest_wd_y,
                               UWORD16 u2_dest_wd_uv,
                               UWORD8 u1_dir)
{
    UWORD16 u2_mask = ps_cur_mb_info->u2_mask[u1_dir];
    UWORD8 *pu1_ref_y, *pu1_ref_u;
    UWORD8 uc_cond, i, j, u1_dydx;
    UWORD16 u2_ref_wd_y, u2_ref_wd_uv;

    PROFILE_DISABLE_INTER_PRED()

    if(ps_pred->i1_pod_ht)
    {
        pu1_ref_y = ps_pred->pu1_dma_dest_addr;

        u2_ref_wd_y = ps_pred->u2_u1_ref_buf_wd;
    }
    else
    {
        pu1_ref_y = ps_pred->pu1_y_ref;
        u2_ref_wd_y = ps_pred->u2_frm_wd;
    }

    ps_pred++;
    if(ps_pred->i1_pod_ht)
    {
        pu1_ref_u = ps_pred->pu1_dma_dest_addr;
        u2_ref_wd_uv = ps_pred->u2_u1_ref_buf_wd * YUV420SP_FACTOR;

    }
    else
    {
        pu1_ref_u = ps_pred->pu1_u_ref;
        u2_ref_wd_uv = ps_pred->u2_frm_wd;

    }

    u1_dydx = ps_pred->u1_dydx;

    {
        UWORD8 uc_dx, uc_dy;
        UWORD8 *pu1_scratch_u;

        uc_dx = u1_dydx & 0x3;
        uc_dy = u1_dydx >> 3;
        if(u1_dydx != 0)
        {
            pred_info_t * ps_prv_pred = ps_pred - 2;
            pu1_scratch_u = ps_prv_pred->pu1_dma_dest_addr;
            ps_dec->pf_inter_pred_chroma(pu1_ref_u, pu1_scratch_u,
                                         u2_ref_wd_uv, 16, uc_dx, uc_dy, 8,
                                         8);

            /* Modify ref pointer and refWidth to point to scratch    */
            /* buffer to be used below in ih264d_copy_multiplex_data functions */
            /* CHANGED CODE */
            pu1_ref_u = pu1_scratch_u;
            u2_ref_wd_uv = 8 * YUV420SP_FACTOR;
        }
    }
    {
        for(i = 0; i < 4; i++)
        {
            for(j = 0; j < 4; j++)
            {
                uc_cond = u2_mask & 1;
                u2_mask >>= 1;
                if(uc_cond)
                {
                    *(UWORD32 *)(pu1_dest_y + u2_dest_wd_y) =
                                    *(UWORD32 *)(pu1_ref_y + u2_ref_wd_y);
                    *(UWORD32 *)(pu1_dest_y + 2 * u2_dest_wd_y) =
                                    *(UWORD32 *)(pu1_ref_y + 2 * u2_ref_wd_y);
                    *(UWORD32 *)(pu1_dest_y + 3 * u2_dest_wd_y) =
                                    *(UWORD32 *)(pu1_ref_y + 3 * u2_ref_wd_y);
                    {
                        UWORD32 *dst, *src;
                        dst = (UWORD32 *)pu1_dest_y;
                        src = (UWORD32 *)pu1_ref_y;
                        *dst = *src;
                        dst++;
                        src++;
                        pu1_dest_y = (UWORD8 *)dst;
                        pu1_ref_y = (UWORD8 *)src;
                    }
                    *(UWORD32 *)(pu1_dest_u + u2_dest_wd_uv) =
                                    *(UWORD32 *)(pu1_ref_u + u2_ref_wd_uv);
                    {
                        UWORD32 *dst, *src;
                        dst = (UWORD32 *)pu1_dest_u;
                        src = (UWORD32 *)pu1_ref_u;
                        *dst = *src;
                        dst++;
                        src++;
                        pu1_dest_u = (UWORD8 *)dst;
                        pu1_ref_u = (UWORD8 *)src;
                    }

                }
                else
                {
                    pu1_dest_y += 4;
                    pu1_ref_y += 4;
                    pu1_dest_u += 2 * YUV420SP_FACTOR;
                    pu1_ref_u += 2 * YUV420SP_FACTOR;
                }
            }
            pu1_ref_y += 4 * (u2_ref_wd_y - 4);
            pu1_ref_u += 2 * (u2_ref_wd_uv - 4 * YUV420SP_FACTOR);
            pu1_dest_y += 4 * (u2_dest_wd_y - 4);
            pu1_dest_u += 2 * (u2_dest_wd_uv - 4 * YUV420SP_FACTOR);
        }
    }
}

void ih264d_pad_on_demand(pred_info_t *ps_pred, UWORD8 lum_chrom_blk)
{
    if(CHROM_BLK == lum_chrom_blk)
    {
        UWORD32 *pu4_pod_src_u, *pu4_pod_dst_u;
        UWORD32 *pu4_pod_src_v, *pu4_pod_dst_v;
        WORD32 j, u1_wd_stride;
        WORD32 i, u1_dma_ht, i1_ht;
        UWORD32 u2_dma_size;
        u1_wd_stride = (ps_pred->u2_u1_ref_buf_wd >> 2) * YUV420SP_FACTOR;
        u1_dma_ht = ps_pred->i1_dma_ht;
        u2_dma_size = u1_wd_stride * u1_dma_ht;
        pu4_pod_src_u = (UWORD32 *)ps_pred->pu1_dma_dest_addr;
        pu4_pod_dst_u = pu4_pod_src_u;

        pu4_pod_src_v = pu4_pod_src_u + u2_dma_size;
        pu4_pod_dst_v = pu4_pod_src_v;

        i1_ht = ps_pred->i1_pod_ht;
        pu4_pod_src_u -= u1_wd_stride * i1_ht;
        pu4_pod_src_v -= u1_wd_stride * i1_ht;
        if(i1_ht < 0)
            /* Top POD */
            i1_ht = -i1_ht;
        else
        {
            /* Bottom POD */
            pu4_pod_src_u += (u1_dma_ht - 1) * u1_wd_stride;
            pu4_pod_dst_u += (u1_dma_ht - i1_ht) * u1_wd_stride;
            pu4_pod_src_v += (u1_dma_ht - 1) * u1_wd_stride;
            pu4_pod_dst_v += (u1_dma_ht - i1_ht) * u1_wd_stride;
        }

        for(i = 0; i < i1_ht; i++)
            for(j = 0; j < u1_wd_stride; j++)
            {
                *pu4_pod_dst_u++ = *(pu4_pod_src_u + j);

            }
    }
    else
    {
        UWORD32 *pu4_pod_src, *pu4_pod_dst;
        WORD32 j, u1_wd_stride;
        WORD32 i, i1_ht;
        pu4_pod_src = (UWORD32 *)ps_pred->pu1_dma_dest_addr;
        pu4_pod_dst = pu4_pod_src;
        u1_wd_stride = ps_pred->u2_u1_ref_buf_wd >> 2;
        i1_ht = ps_pred->i1_pod_ht;
        pu4_pod_src -= u1_wd_stride * i1_ht;
        if(i1_ht < 0)
            /* Top POD */
            i1_ht = -i1_ht;
        else
        {
            /* Bottom POD */
            pu4_pod_src += (ps_pred->i1_dma_ht - 1) * u1_wd_stride;
            pu4_pod_dst += (ps_pred->i1_dma_ht - i1_ht) * u1_wd_stride;
        }

        for(i = 0; i < i1_ht; i++)
            for(j = 0; j < u1_wd_stride; j++)
                *pu4_pod_dst++ = *(pu4_pod_src + j);
    }
}

