/******************************************************************************
 *
 * 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_bslice.c
 *
 * \brief
 *    Contains routines that decode B slice type
 *
 * Detailed_description
 *
 * \date
 *    21/12/2002
 *
 * \author  NS
 **************************************************************************
 */
#include "ih264_typedefs.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"

#include <string.h>
#include "ih264d_structs.h"
#include "ih264d_bitstrm.h"
#include "ih264d_parse_cavlc.h"
#include "ih264d_mb_utils.h"
#include "ih264d_mvpred.h"
#include "ih264d_inter_pred.h"
#include "ih264d_process_pslice.h"
#include "ih264d_error_handler.h"
#include "ih264d_tables.h"
#include "ih264d_parse_slice.h"
#include "ih264d_process_pslice.h"
#include "ih264d_process_bslice.h"
#include "ih264d_tables.h"
#include "ih264d_parse_islice.h"
#include "ih264d_mvpred.h"

void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
//UWORD32 g_hits = 0;
//UWORD32 g_miss = 0;
/*!
 **************************************************************************
 * \if Function name : ih264d_decode_spatial_direct \endif
 *
 * \brief
 *    Decodes spatial direct mode.
 *
 * \return
 *    None.
 *    Arunoday T
 **************************************************************************
 */
WORD32 ih264d_decode_spatial_direct(dec_struct_t * ps_dec,
                                    UWORD8 u1_wd_x,
                                    dec_mb_info_t * ps_cur_mb_info,
                                    UWORD8 u1_mb_num)
{
    mv_pred_t s_mv_pred, *ps_mv;
    UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0;
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    mv_pred_t *ps_mv_ntop_start;
    mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
    UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth;
    UWORD8 i;
    WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1;
    struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL,
                    *ps_pic_buff1 = NULL;

    UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b;
    WORD16 i2_def_mv[2], i2_spat_pred_mv[4], *pi2_final_mv0, *pi2_final_mv1;
    UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0, u2_mask = 0;
    UWORD32 *pui32_weight_ofsts = NULL;
    directmv_t s_mvdirect;
    UWORD8 u1_colz;
    UWORD8 u1_final_ref_idx = 0;
    const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
    const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
    const UWORD16 sub_mask_table[] =
        { 0x33, 0x3, 0x11, 0x1 };
    const UWORD16 mask_table[] =
        { 0xffff, /*16x16 NA */
          0xff, /* 16x8*/
          0x3333, /* 8x16*/
          0x33 };/* 8x8*/
    mv_pred_t s_temp_mv_pred;
    WORD32 ret = 0;

    /* CHANGED CODE */
    ps_mv_ntop_start = ps_dec->ps_mv_cur + (u1_mb_num << 4)
                    - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;

    /* assign default values for MotionVector as zero */
    i2_def_mv[0] = 0;
    i2_def_mv[1] = 0;

    u1_direct_zero_pred_flag = ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start,
                                              ps_mv_ntop_start, &s_mv_pred, 0, 4,
                                              0, 1, B_DIRECT_SPATIAL);

    i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0];
    i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1];
    i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2];
    i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3];

    i1_ref_frame0 = s_mv_pred.i1_ref_frame[0];
    i1_ref_frame1 = s_mv_pred.i1_ref_frame[1];

    i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0;
    i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1;

    i1_pred = 0;

    {
        WORD8 u1_ref_idx, u1_ref_idx1;
        UWORD32 uc_Idx, uc_Idx1;
        UWORD8 u1_scale_ref = (ps_dec->ps_cur_slice->u1_mbaff_frame_flag
                        && ps_cur_mb_info->u1_mb_field_decodingflag);
        u1_final_ref_idx = i1_ref_frame0;
        if(i1_ref_frame0 >= 0)
        {
            /* convert RefIdx if it is MbAff */
            u1_ref_idx = i1_ref_frame0;
            u1_ref_idx1 = i1_ref_frame0;
            if(u1_scale_ref)
            {
                u1_ref_idx1 = u1_ref_idx >> 1;
                if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
                    u1_ref_idx1 += MAX_REF_BUFS;
            }
            /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */
            ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1];
            ps_ref_frame = ps_pic_buff0;
            i1_pred = PRED_L0;
        }

        if(i1_ref_frame1 >= 0)
        {
            /* convert RefIdx if it is MbAff */
            u1_ref_idx = i1_ref_frame1;
            u1_ref_idx1 = i1_ref_frame1;
            if(u1_scale_ref)
            {
                u1_ref_idx1 = u1_ref_idx >> 1;
                if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
                    u1_ref_idx1 += MAX_REF_BUFS;
            }
            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1];
            i1_pred = i1_pred | PRED_L1;
        }
        if(i1_ref_frame0 < 0)
        {
            ps_ref_frame = ps_pic_buff1;
            u1_final_ref_idx = i1_ref_frame1;
        }

        u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0);
        u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0);

        if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
        {
            uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0)
                            * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
            if(u1_scale_ref)
                uc_Idx >>= 1;
            uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1;
            uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1;
            pui32_weight_ofsts =
                            (UWORD32*)&ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)];

            if(i1_ref_frame0 < 0)
                pui32_weight_ofsts += 1;

            if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2))
            {
                WORD16 i2_ref_idx;
                i2_ref_idx = MAX(i1_ref_frame0, 0);
                i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
                                << 1);
                i2_ref_idx += MAX(i1_ref_frame1, 0);
                if(!ps_cur_mb_info->u1_topmb)
                    i2_ref_idx +=
                                    (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
                                                    << 1)
                                                    * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
                                                                    << 1);
                pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
                                * X3(i2_ref_idx)];
            }
        }
    }

    s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0;
    s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1;
    s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
    s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type;

    /**********************************************************************/
    /* Call the function which gets the number of partitions and          */
    /* partition info of colocated Mb                                     */
    /**********************************************************************/

    ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
                           ps_dec->i4_submb_ofst, ps_cur_mb_info);
    ps_col_pic = ps_dec->ps_col_pic;
    if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag)
    {
        WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1;
        /* Most probable case */
        u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
                        + s_mvdirect.i4_mv_indices[0]);
        u1_col_zero_flag = u1_col_zero_flag & 0x01;

        if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
        {
            i2_mv_x = 0;
            i2_mv_y = 0;
        }
        else
        {
            i2_mv_x = i2_spat_pred_mv[0];
            i2_mv_y = i2_spat_pred_mv[1];

        }

        if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
        {
            i2_mvX1 = 0;
            i2_mvY1 = 0;
        }
        else
        {
            i2_mvX1 = i2_spat_pred_mv[2];
            i2_mvY1 = i2_spat_pred_mv[3];
        }

        u1_sub_mb_num = ps_dec->u1_sub_mb_num;
        u1_mb_partw = (u1_wd_x >> 2);


        if(i1_ref_frame0 >= 0)
        {
            {
               pred_info_pkd_t *ps_pred_pkd;
               WORD16 i2_mv[2];
               WORD8 i1_ref_idx= 0;

               i2_mv[0] = i2_mv_x;
               i2_mv[1] = i2_mv_y;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
                            ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff0->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }

        }

        if(i1_ref_frame1 >= 0)
        {
            {
                pred_info_pkd_t *ps_pred_pkd;
               WORD16 i2_mv[2];
               WORD8 i1_ref_idx= 0;

               i2_mv[0] = i2_mvX1;
               i2_mv[1] = i2_mvY1;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
                            ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff1->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }
        }


        /* Replication optimisation */
        s_temp_mv_pred.i2_mv[0] = i2_mv_x;
        s_temp_mv_pred.i2_mv[1] = i2_mv_y;
        s_temp_mv_pred.i2_mv[2] = i2_mvX1;
        s_temp_mv_pred.i2_mv[3] = i2_mvY1;

        /* Calculating colocated zero information */
        {
            /*************************************/
            /* If(bit2 and bit3 set)             */
            /* then                              */
            /*  (bit0 and bit1) => submmbmode    */
            /*  (bit2 and bit3) => mbmode        */
            /* else                              */
            /*  (bit0 and bit1) => mbmode        */
            /*************************************/
            /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ?
             (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) << 2);*/
            UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0;

            if(i1_ref_frame0 < 0)
            {
                i2_mv_x = i2_mvX1;
                i2_mv_y = i2_mvY1;
            }

            /* Change from left shift 4 to 6 - Varun */
            u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
                            | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
                                            && (ABS(i2_mv_y) <= 1));
            u1_colz |= (u1_packed_mb_sub_mb_mode << 6);
        }
        ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
        ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
                           u1_mb_partw, u1_mb_partw);
        if(u1_wd_x == MB_SIZE)
            ps_dec->u1_currB_type = 0;



        return OK;
    }
    /***************************************************************************/
    /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */
    /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and       */
    /* spatially predicted motion vector and do the multiplexing after         */
    /* motion compensation                                                     */
    /***************************************************************************/


    if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2))
    {
        ps_cur_mb_info->u1_Mux = 1;
        if(i1_ref_frame0 >= 0)
        {

            {
                pred_info_pkd_t *ps_pred_pkd;
               WORD8 i1_ref_idx= 0;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(&(i2_spat_pred_mv[0]),4,4,0,i1_pred,
                            ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff0->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }

            /******    (0,0) Motion vectors DMA     *****/
            {
                pred_info_pkd_t *ps_pred_pkd;
               WORD16 i2_mv[2];
               WORD8 i1_ref_idx= 0;

               i2_mv[0] = 0;
               i2_mv[1] = 0;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
                            ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff0->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }
        }
        if(i1_ref_frame1 >= 0)
        {
            {
                pred_info_pkd_t *ps_pred_pkd;
               WORD16 i2_mv[2];
               WORD8 i1_ref_idx= 0;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(&(i2_spat_pred_mv[2]),4,4,0,i1_pred,
                            ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff1->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }

            /******    (0,0) Motion vectors DMA     *****/

            {
                pred_info_pkd_t *ps_pred_pkd;
               WORD16 i2_mv[2];
               WORD8 i1_ref_idx= 0;

               i2_mv[0] = 0;
               i2_mv[1] = 0;

               ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
            ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
                            ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                            ps_pic_buff1->u1_pic_type);
            ps_dec->u4_pred_info_pkd_idx++;
            ps_cur_mb_info->u1_num_pred_parts++;


            }
        }
    }

    /*u1_col = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]);
     u1_col &= 1;
     u1_init = 0;*/

    for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
    {
        partition_size = s_mvdirect.i1_partitionsize[i];
        u1_sub_mb_num = s_mvdirect.i1_submb_num[i];

        sub_partition = partition_size >> 2;
        partition_size &= 0x3;
        u1_mb_partw = pu1_mb_partw[partition_size];
        u1_mb_parth = pu1_mb_parth[partition_size];
        u2_mask = mask_table[partition_size];
        if(sub_partition != 0)
        {
            u1_mb_partw >>= 1;
            u1_mb_parth >>= 1;
            u2_mask = sub_mask_table[partition_size];
        }

        u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
                        + s_mvdirect.i4_mv_indices[i]);
        u1_col_zero_flag = u1_col_zero_flag & 0x01;

        /*if(u1_col != u1_col_zero_flag)
         u1_init = 1;*/

        if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
        {
            pi2_final_mv0 = &i2_def_mv[0];
            ui2_mask_fwd |= (u2_mask << u1_sub_mb_num);
        }
        else
            pi2_final_mv0 = &i2_spat_pred_mv[0];

        if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
        {
            pi2_final_mv1 = &i2_def_mv[0];
            ui2_mask_bwd |= (u2_mask << u1_sub_mb_num);
        }
        else
            pi2_final_mv1 = &i2_spat_pred_mv[2];

        if(ps_cur_mb_info->u1_Mux != 1)
        {
            /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
             uc_sub_mb_y = (u1_sub_mb_num >> 2);*/
            if(i1_ref_frame0 >= 0)
            {

                {
                    pred_info_pkd_t *ps_pred_pkd;
                   WORD8 i1_ref_idx= 0;

                   ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
                ih264d_fill_pred_info(pi2_final_mv0,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
                                ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                                ps_pic_buff0->u1_pic_type);
                ps_dec->u4_pred_info_pkd_idx++;
                ps_cur_mb_info->u1_num_pred_parts++;


                }

            }

            if(i1_ref_frame1 >= 0)
            {
                {
                    pred_info_pkd_t *ps_pred_pkd;
                   WORD8 i1_ref_idx= 0;

                   ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
                ih264d_fill_pred_info(pi2_final_mv1,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
                                ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                                ps_pic_buff1->u1_pic_type);
                ps_dec->u4_pred_info_pkd_idx++;
                ps_cur_mb_info->u1_num_pred_parts++;


                }
            }
        }

        /* Replication optimisation */
        s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0];
        s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1];
        s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0];
        s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1];

        /* Calculating colocated zero information */
        {
            WORD16 i2_mv_x = 0, i2_mv_y = 0;
            /*************************************/
            /* If(bit2 and bit3 set)             */
            /* then                              */
            /*  (bit0 and bit1) => submmbmode    */
            /*  (bit2 and bit3) => mbmode        */
            /* else                              */
            /*  (bit0 and bit1) => mbmode        */
            /*************************************/
            UWORD8 u1_packed_mb_sub_mb_mode =
                            sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
                                                            << 2);

            if(i1_ref_frame0 >= 0)
            {
                i2_mv_x = pi2_final_mv0[0];
                i2_mv_y = pi2_final_mv0[1];
            }
            else
            {
                i2_mv_x = pi2_final_mv1[0];
                i2_mv_y = pi2_final_mv1[1];
            }

            u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
                            | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
                                            && (ABS(i2_mv_y) <= 1));
            u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
        }
        ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
        ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
                           u1_mb_parth, u1_mb_partw);
    }
    i = 0;
    if(i1_ref_frame0 >= 0)
        ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd;
    if(i1_ref_frame1 >= 0)
        ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd;

    /*if(u1_init)
     H264_DEC_DEBUG_PRINT("hit\n");
     else
     H264_DEC_DEBUG_PRINT("miss\n");*/

    return OK;
}

/*!
 **************************************************************************
 * \if Function name : ih264d_decode_temporal_direct \endif
 *
 * \brief
 *    Decodes temporal direct mode.
 *
 * \return
 *    None.
 *
 **************************************************************************
 */
WORD32 ih264d_decode_temporal_direct(dec_struct_t * ps_dec,
                                     UWORD8 u1_wd_x,
                                     dec_mb_info_t * ps_cur_mb_info,
                                     UWORD8 u1_mb_num)
{
    struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1, *ps_col_pic;
    mv_pred_t *ps_mv, s_temp_mv_pred;
    UWORD8 u1_sub_mb_num;
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    WORD16 i2_mv_x0, i2_mv_y0, i2_mv_x1, i2_mv_y1;
    UWORD8 u1_mb_partw, u1_mb_parth;
    UWORD8 i, partition_size, sub_partition;
    UWORD32 *pui32_weight_ofsts = NULL;
    directmv_t s_mvdirect;
    const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
    const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
    WORD8 c_refFrm0, c_refFrm1;
    UWORD8 u1_ref_idx0, u1_is_cur_mb_fld;
    UWORD32 pic0_poc, pic1_poc, cur_poc;
    WORD32 ret = 0;

    u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];

    /**********************************************************************/
    /* Call the function which gets the number of partitions and          */
    /* partition info of colocated Mb                                     */
    /**********************************************************************/
    ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
                           ps_dec->i4_submb_ofst, ps_cur_mb_info);
    ps_col_pic = ps_dec->ps_col_pic;

    for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
    {
        UWORD8 u1_colz;
        partition_size = s_mvdirect.i1_partitionsize[i];
        u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
        ps_mv = ps_col_pic->ps_mv + s_mvdirect.i4_mv_indices[i];

        /* This should be removed to catch unitialized memory read */
        u1_ref_idx0 = 0;

        sub_partition = partition_size >> 2;
        partition_size &= 0x3;
        u1_mb_partw = pu1_mb_partw[partition_size];
        u1_mb_parth = pu1_mb_parth[partition_size];
        if(sub_partition != 0)
        {
            u1_mb_partw >>= 1;
            u1_mb_parth >>= 1;
        }
        c_refFrm0 = ps_mv->i1_ref_frame[0];
        c_refFrm1 = ps_mv->i1_ref_frame[1];

        if((c_refFrm0 == -1) && (c_refFrm1 == -1))
        {
            u1_ref_idx0 = 0;
            ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][0];
            if(u1_mbaff && u1_is_cur_mb_fld)
            {
                if(ps_cur_mb_info->u1_topmb)
                {
                    pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
                    pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
                    cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
                }
                else
                {
                    pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
                    cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
                    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
                    pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
                    ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][MAX_REF_BUFS];
                }
            }
            else
            {
                pic0_poc = ps_pic_buff0->i4_avg_poc;
                pic1_poc = ps_pic_buff1->i4_avg_poc;
                cur_poc = ps_dec->ps_cur_pic->i4_poc;
            }
        }
        else
        {
            UWORD8 uc_i, u1_num_frw_ref_pics;
            UWORD8 buf_id, u1_pic_type;
            buf_id = ps_mv->u1_col_ref_pic_idx;
            u1_pic_type = ps_mv->u1_pic_type;
            if(ps_dec->ps_cur_slice->u1_field_pic_flag)
            {
                if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
                {
                    u1_pic_type = TOP_FLD;
                    if(ps_dec->ps_cur_slice->u1_bottom_field_flag)
                        u1_pic_type = BOT_FLD;
                }
            }
            u1_num_frw_ref_pics =
                            ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];

            for(uc_i = 0; uc_i < u1_num_frw_ref_pics; uc_i++)
            {
                if(ps_dec->ps_cur_slice->u1_field_pic_flag)
                {
                    if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
                    {
                        if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_pic_type
                                        == u1_pic_type)
                        {
                            u1_ref_idx0 = uc_i;
                            break;
                        }
                    }
                }
                else
                {
                    if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
                    {
                        u1_ref_idx0 = uc_i;
                        break;
                    }
                }
            }

            ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx0];
            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];

            if(u1_mbaff && u1_is_cur_mb_fld)
            {
                pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
                u1_ref_idx0 <<= 1;
                if(s_mvdirect.u1_vert_mv_scale == ONE_TO_ONE)
                {
                    if(u1_pic_type == BOT_FLD)
                    {
                        pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
                        ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
                                        >> 1) + MAX_REF_BUFS];
                        if(ps_cur_mb_info->u1_topmb)
                            u1_ref_idx0++;
                    }
                    else
                    {
                        if(1 - ps_cur_mb_info->u1_topmb)
                            u1_ref_idx0++;
                    }
                }
                if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
                {
                    if(1 - ps_cur_mb_info->u1_topmb)
                    {
                        pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
                        ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
                                        >> 1) + MAX_REF_BUFS];
                    }
                }
                if(ps_cur_mb_info->u1_topmb)
                {
                    pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
                    cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
                }
                else
                {
                    pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
                    cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
                    ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
                }
            }
            else
            {
                pic0_poc = ps_pic_buff0->i4_avg_poc;
                pic1_poc = ps_pic_buff1->i4_avg_poc;
                cur_poc = ps_dec->ps_cur_pic->i4_poc;
            }
        }
        {
            WORD16 i16_td;

            if(c_refFrm0 >= 0)
            {
                i2_mv_x0 = ps_mv->i2_mv[0];
                i2_mv_y0 = ps_mv->i2_mv[1];
            }
            else if(c_refFrm1 >= 0)
            {
                i2_mv_x0 = ps_mv->i2_mv[2];
                i2_mv_y0 = ps_mv->i2_mv[3];
            }
            else
            {
                i2_mv_x0 = 0;
                i2_mv_y0 = 0;
            }
            /* If FRM_TO_FLD or FLD_TO_FRM scale the "y" component of the colocated Mv*/
            if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
            {
                i2_mv_y0 /= 2;
            }
            else if(s_mvdirect.u1_vert_mv_scale == FLD_TO_FRM)
            {
                i2_mv_y0 *= 2;
            }

            i16_td = pic1_poc - pic0_poc;
            if((ps_pic_buff0->u1_is_short == 0) || (i16_td == 0))
            {
                i2_mv_x1 = 0;
                i2_mv_y1 = 0;
            }
            else
            {
                WORD16 i16_tb, i16_tx, i2_dist_scale_factor, i16_temp;

                i16_td = CLIP3(-128, 127, i16_td);
                i16_tb = cur_poc - pic0_poc;
                i16_tb = CLIP3(-128, 127, i16_tb);

                i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td;
                i2_dist_scale_factor = CLIP3(-1024, 1023,
                                            (((i16_tb * i16_tx) + 32) >> 6));
                i16_temp = (i2_mv_x0 * i2_dist_scale_factor + 128) >> 8;
                i2_mv_x1 = i16_temp - i2_mv_x0;
                i2_mv_x0 = i16_temp;

                i16_temp = (i2_mv_y0 * i2_dist_scale_factor + 128) >> 8;
                i2_mv_y1 = i16_temp - i2_mv_y0;
                i2_mv_y0 = i16_temp;
            }
            {
                mv_pred_t *ps_mv;

                /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
                 uc_sub_mb_y = u1_sub_mb_num >> 2;*/
                if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
                {
                    UWORD8 u1_idx =
                                    u1_ref_idx0
                                                    * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
                    UWORD8 u1_scale_ref = u1_mbaff && u1_is_cur_mb_fld;
                    if(u1_scale_ref)
                        u1_idx >>= 1;
                    pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
                                    * X3(u1_idx)];
                    if(u1_scale_ref
                                    && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
                                                    == 2))
                    {
                        WORD16 i2_ref_idx;
                        i2_ref_idx = u1_ref_idx0;
                        i2_ref_idx *=
                                        (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
                                                        << 1);
                        if(!ps_cur_mb_info->u1_topmb)
                            i2_ref_idx +=
                                            (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
                                                            << 1)
                                                            * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
                                                                            << 1);
                        pui32_weight_ofsts =
                                        (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
                                                        * X3(i2_ref_idx)];
                    }
                }
                {
                    pred_info_pkd_t *ps_pred_pkd;
                   WORD16 i2_mv[2];
                   WORD8 i1_ref_idx= 0;

                   i2_mv[0] = i2_mv_x0;
                   i2_mv[1] = i2_mv_y0;

                   ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
                ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
                                ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                                ps_pic_buff0->u1_pic_type);
                ps_dec->u4_pred_info_pkd_idx++;
                ps_cur_mb_info->u1_num_pred_parts++;


                }
                {
                   pred_info_pkd_t *ps_pred_pkd;
                   WORD16 i2_mv[2];
                   WORD8 i1_ref_idx= 0;

                   i2_mv[0] = i2_mv_x1;
                   i2_mv[1] = i2_mv_y1;

                   ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
                ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
                                ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
                                ps_pic_buff1->u1_pic_type);
                ps_dec->u4_pred_info_pkd_idx++;
                ps_cur_mb_info->u1_num_pred_parts++;


                }

                /* Replication optimisation */
                s_temp_mv_pred.i2_mv[0] = i2_mv_x0;
                s_temp_mv_pred.i2_mv[1] = i2_mv_y0;
                s_temp_mv_pred.i2_mv[2] = i2_mv_x1;
                s_temp_mv_pred.i2_mv[3] = i2_mv_y1;
                s_temp_mv_pred.i1_ref_frame[0] = u1_ref_idx0;
                s_temp_mv_pred.i1_ref_frame[1] = 0;
                s_temp_mv_pred.u1_col_ref_pic_idx = ps_pic_buff0->u1_mv_buf_id;
                s_temp_mv_pred.u1_pic_type = ps_pic_buff0->u1_pic_type;
                ps_mv = ps_dec->ps_mv_cur + (u1_mb_num << 4) + u1_sub_mb_num;

                {
                    WORD16 i2_mv_x = 0, i2_mv_y = 0;
                    UWORD8 u1_packed_mb_sub_mb_mode =
                                    sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
                                                                    << 2);

                    if(c_refFrm0 >= 0)
                    {
                        i2_mv_x = i2_mv_x0;
                        i2_mv_y = i2_mv_y0;
                    }
                    else
                    {
                        i2_mv_x = i2_mv_x1;
                        i2_mv_y = i2_mv_y1;
                    }

                    u1_colz =
                                    (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
                                                    | ((u1_ref_idx0 == 0)
                                                                    && (ABS(i2_mv_x)
                                                                                    <= 1)
                                                                    && (ABS(i2_mv_y)
                                                                                    <= 1));
                    u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
                }
                ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num,
                                   u1_colz, u1_mb_parth, u1_mb_partw);
            }
        }
    }
    /* return value set to UWORD8 to make it homogeneous  */
    /* with decodespatialdirect                           */
    return OK;
}

void ih264d_convert_frm_to_fld_list(struct pic_buffer_t *ps_ref_pic_buf_lx,
                                    UWORD8 *pu1_L0,
                                    dec_struct_t *ps_dec,
                                    UWORD8 u1_num_short_term_bufs)
{
    UWORD8 uc_count = *pu1_L0, i, uc_l1, uc_lx, j;
    struct pic_buffer_t *ps_ref_lx[2], *ps_ref_pic_lx;
    UWORD8 u1_bottom_field_flag;
    dec_slice_params_t *ps_cur_slice;
    UWORD8 u1_ref[2], u1_fld[2], u1_same_fld, u1_op_fld;
    UWORD32 ui_half_num_of_sub_mbs;

    uc_l1 = 0;
    uc_lx = 0;
    ps_cur_slice = ps_dec->ps_cur_slice;
    ps_ref_pic_lx = ps_ref_pic_buf_lx - MAX_REF_BUFS;
    ps_ref_lx[0] = ps_ref_pic_buf_lx;
    ps_ref_lx[1] = ps_ref_pic_buf_lx;
    u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
    ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
    if(u1_bottom_field_flag)
    {
        u1_ref[0] = BOT_REF;
        u1_ref[1] = TOP_REF;
        u1_fld[0] = BOT_FLD;
        u1_fld[1] = TOP_FLD;
        u1_same_fld = BOT_FLD;
        u1_op_fld = TOP_FLD;
    }
    else
    {
        u1_ref[0] = TOP_REF;
        u1_ref[1] = BOT_REF;
        u1_fld[0] = TOP_FLD;
        u1_fld[1] = BOT_FLD;
        u1_same_fld = TOP_FLD;
        u1_op_fld = BOT_FLD;
    }

    /* Create the field list starting with all the short term     */
    /* frames followed by all the long term frames. No long term  */
    /* reference field should have a list idx less than a short   */
    /* term reference field during initiailization.               */

    for(j = 0; j < 2; j++)
    {
        i = ((j == 0) ? 0 : u1_num_short_term_bufs);
        uc_count = ((j == 0) ? u1_num_short_term_bufs : *pu1_L0);
        for(; i < uc_count; i++, ps_ref_lx[0]++)
        {
            /* Search field of same parity in Frame list */
            if((ps_ref_lx[0]->u1_pic_type & u1_ref[0])) // || ((ps_ref_lx[0]->u1_picturetype & 0x3) == 0))
            {
                /* Insert PIC of same parity in RefPicList */
                ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, ps_ref_lx[0]);
                ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2 + 1);
                ps_ref_pic_lx->u1_long_term_pic_num =
                                (ps_ref_pic_lx->u1_long_term_frm_idx * 2 + 1);
                ps_ref_pic_lx->u1_pic_type = u1_same_fld;
                if(u1_fld[0] & BOT_FLD)
                {
                    ps_ref_pic_lx->u1_pic_type = BOT_FLD;
                    ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
                    ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
                    ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
                    if(ps_ref_pic_lx->u1_picturetype & 0x3)
                    {
                        ps_ref_pic_lx->pu1_col_zero_flag += ui_half_num_of_sub_mbs;
                        ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
                    }
                    ps_ref_pic_lx->i4_poc =
                                    ps_ref_pic_lx->i4_bottom_field_order_cnt;
                    ps_ref_pic_lx->i4_avg_poc =
                                    ps_ref_pic_lx->i4_bottom_field_order_cnt;
                }
                else
                {
                    ps_ref_pic_lx->u1_pic_type = TOP_FLD;
                    ps_ref_pic_lx->i4_poc = ps_ref_pic_lx->i4_top_field_order_cnt;
                    ps_ref_pic_lx->i4_avg_poc =
                                    ps_ref_pic_lx->i4_top_field_order_cnt;
                }

                ps_ref_pic_lx++;
                uc_lx++;
                /* Find field of opposite parity */
                if(uc_l1 < uc_count && ps_ref_lx[1])
                {
                    while(!(ps_ref_lx[1]->u1_pic_type & u1_ref[1]))
                    {
                        ps_ref_lx[1]++;
                        uc_l1++;
                        if(uc_l1 >= uc_count)
                            ps_ref_lx[1] = 0;
                        if(!ps_ref_lx[1])
                            break;
                    }

                    if(ps_ref_lx[1])
                    {
                        uc_l1++;
                        ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
                                                           ps_ref_lx[1]);
                        ps_ref_pic_lx->u1_pic_type = u1_op_fld;
                        ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
                        ps_ref_pic_lx->u1_long_term_pic_num =
                                        (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
                        if(u1_fld[1] & BOT_FLD)
                        {
                            ps_ref_pic_lx->u1_pic_type = BOT_FLD;
                            ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
                            ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
                            ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
                            if(ps_ref_pic_lx->u1_picturetype & 0x3)
                            {
                                ps_ref_pic_lx->pu1_col_zero_flag +=
                                                ui_half_num_of_sub_mbs;
                                ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
                            }
                            ps_ref_pic_lx->i4_poc =
                                            ps_ref_pic_lx->i4_bottom_field_order_cnt;
                            ps_ref_pic_lx->i4_avg_poc =
                                            ps_ref_pic_lx->i4_bottom_field_order_cnt;
                        }
                        else
                        {
                            ps_ref_pic_lx->u1_pic_type = TOP_FLD;
                            ps_ref_pic_lx->i4_poc =
                                            ps_ref_pic_lx->i4_top_field_order_cnt;
                            ps_ref_pic_lx->i4_avg_poc =
                                            ps_ref_pic_lx->i4_top_field_order_cnt;
                        }
                        ps_ref_pic_lx++;
                        uc_lx++;
                        ps_ref_lx[1]++;
                    }
                }
            }
        }

        /* Same parity fields are over, now insert left over opposite parity fields */
        /** Added  if(ps_ref_lx[1]) for error checks */
        if(ps_ref_lx[1])
        {
            for(; uc_l1 < uc_count; uc_l1++)
            {
                if(ps_ref_lx[1]->u1_pic_type & u1_ref[1])
                {
                    /* Insert PIC of opposite parity in RefPicList */
                    ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
                                                       ps_ref_lx[1]);
                    ps_ref_pic_lx->u1_pic_type = u1_op_fld;
                    ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
                    ps_ref_pic_lx->u1_long_term_pic_num =
                                    (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
                    if(u1_op_fld == BOT_FLD)
                    {
                        ps_ref_pic_lx->u1_pic_type = BOT_FLD;
                        ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
                        ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
                        ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
                        if(ps_ref_pic_lx->u1_picturetype & 0x3)
                        {
                            ps_ref_pic_lx->pu1_col_zero_flag +=
                                            ui_half_num_of_sub_mbs;
                            ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
                        }
                        ps_ref_pic_lx->i4_poc =
                                        ps_ref_pic_lx->i4_bottom_field_order_cnt;
                        ps_ref_pic_lx->i4_avg_poc =
                                        ps_ref_pic_lx->i4_bottom_field_order_cnt;
                    }
                    else
                    {
                        ps_ref_pic_lx->i4_poc =
                                        ps_ref_pic_lx->i4_top_field_order_cnt;
                        ps_ref_pic_lx->i4_avg_poc =
                                        ps_ref_pic_lx->i4_top_field_order_cnt;
                    }
                    ps_ref_pic_lx++;
                    uc_lx++;
                    ps_ref_lx[1]++;
                }
            }
        }
    }
    *pu1_L0 = uc_lx;
}

void ih264d_convert_frm_mbaff_list(dec_struct_t *ps_dec)
{
    struct pic_buffer_t **ps_ref_pic_lx;
    UWORD8 u1_max_ref_idx, idx;
    UWORD16 u2_frm_wd_y, u2_frm_wd_uv;
    struct pic_buffer_t **ps_ref_pic_buf_lx;
    UWORD32 u4_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);

    ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[0];
    ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[0];
    u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
    for(idx = 0; idx < u1_max_ref_idx; idx++)
    {
        ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
        ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;

    }
    u2_frm_wd_y = ps_dec->u2_frm_wd_y;
    u2_frm_wd_uv = ps_dec->u2_frm_wd_uv;

    for(idx = 0; idx < u1_max_ref_idx; idx++)
    {
        *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
        ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
                        ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
        ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
                        ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
        ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
                        ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;

        ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
        ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
                        ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;
        if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
        {
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
                            ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
                                            + u4_half_num_of_sub_mbs;
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
                            ps_ref_pic_buf_lx[idx]->ps_mv + u4_half_num_of_sub_mbs;
        }
    }

    if(ps_dec->u1_B)
    {
        ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[1];
        ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[1];
        u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
        for(idx = 0; idx < u1_max_ref_idx; idx++)
        {
            ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
            ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;

        }

        for(idx = 0; idx < u1_max_ref_idx; idx++)
        {
            *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
                            ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
                            ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
                            ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
            ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
                            ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;

            if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
            {
                ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
                                ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
                                                + u4_half_num_of_sub_mbs;
                ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
                                ps_ref_pic_buf_lx[idx]->ps_mv
                                                + u4_half_num_of_sub_mbs;
            }
        }
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_init_ref_idx_lx_b \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_init_ref_idx_lx_b(dec_struct_t *ps_dec)
{
    struct pic_buffer_t *ps_ref_pic_buf_lx;
    dpb_manager_t *ps_dpb_mgr;
    struct dpb_info_t *ps_next_dpb;
    WORD32 i_cur_poc, i_max_st_poc, i_min_st_poc, i_ref_poc, i_temp_poc;
    WORD8 i;
    UWORD8 u1_max_lt_index, u1_min_lt_index, u1_lt_index;
    UWORD8 u1_field_pic_flag;
    dec_slice_params_t *ps_cur_slice;
    UWORD8 u1_L0, u1_L1;
    UWORD8 u1_num_short_term_bufs;
    UWORD8 u1_max_ref_idx_l0, u1_max_ref_idx_l1;

    ps_cur_slice = ps_dec->ps_cur_slice;
    u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
    u1_max_ref_idx_l0 = ps_cur_slice->u1_num_ref_idx_lx_active[0]
                    << u1_field_pic_flag;
    u1_max_ref_idx_l1 = ps_cur_slice->u1_num_ref_idx_lx_active[1]
                    << u1_field_pic_flag;

    ps_dpb_mgr = ps_dec->ps_dpb_mgr;
    /* Get the current POC */
    i_cur_poc = ps_dec->ps_cur_pic->i4_poc;

    /* Get MaxStPOC,MinStPOC,MaxLt,MinLt */
    i_max_st_poc = i_cur_poc;
    i_min_st_poc = i_cur_poc;
    u1_max_lt_index = MAX_REF_BUFS + 1;
    u1_min_lt_index = MAX_REF_BUFS + 1;
    /* Start from ST head */
    ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
    for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
    {
        i_ref_poc = ps_next_dpb->ps_pic_buf->i4_poc;
        if(i_ref_poc < i_cur_poc)
        {
            /* RefPic Buf POC is before Current POC in display order */
            i_min_st_poc = MIN(i_min_st_poc, i_ref_poc);
        }
        else
        {
            /* RefPic Buf POC is after Current POC in display order */
            i_max_st_poc = MAX(i_max_st_poc, i_ref_poc);
        }

        /* Chase the next link */
        ps_next_dpb = ps_next_dpb->ps_prev_short;
    }

    /* Start from LT head */
    ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
    if(ps_next_dpb)
    {
        u1_max_lt_index = ps_next_dpb->u1_lt_idx;
        u1_min_lt_index = ps_next_dpb->u1_lt_idx;
    }
    for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
    {
        u1_lt_index = ps_next_dpb->u1_lt_idx;
        u1_max_lt_index = (UWORD8)(MAX(u1_max_lt_index, u1_lt_index));
        u1_min_lt_index = (UWORD8)(MIN(u1_min_lt_index, u1_lt_index));

        /* Chase the next link */
        ps_next_dpb = ps_next_dpb->ps_prev_long;
    }

    /* 1. Initialize refIdxL0 */
    u1_L0 = 0;
    if(u1_field_pic_flag)
    {
        ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
        ps_ref_pic_buf_lx += MAX_REF_BUFS;
        i_temp_poc = i_cur_poc;
    }
    else
    {
        ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
        i_temp_poc = i_cur_poc - 1;
    }
    /* Arrange all short term buffers in output order as given by POC */
    /* 1.1 Arrange POC's less than CurrPOC in the descending POC order starting
     from (CurrPOC - 1)*/
    for(; i_temp_poc >= i_min_st_poc; i_temp_poc--)
    {
        /* Start from ST head */
        ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
        for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
        {
            if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
            {
                /* Copy info in pic buffer */
                ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                   ps_next_dpb->ps_pic_buf);
                ps_ref_pic_buf_lx++;
                u1_L0++;
                break;
            }
            ps_next_dpb = ps_next_dpb->ps_prev_short;
        }
    }

    {
        /* 1.2. Arrange POC's more than CurrPOC in the ascending POC order starting
         from (CurrPOC + 1)*/
        for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++)
        {
            /* Start from ST head */
            ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
            for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
            {
                if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
                {
                    ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                       ps_next_dpb->ps_pic_buf);
                    ps_ref_pic_buf_lx++;
                    u1_L0++;
                    break;
                }
                ps_next_dpb = ps_next_dpb->ps_prev_short;
            }
        }
    }

    /* 1.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
    /* Start from ST head */

    u1_num_short_term_bufs = u1_L0;
    for(u1_lt_index = u1_min_lt_index; u1_lt_index <= u1_max_lt_index; u1_lt_index++)
    {
        ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
        for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
        {
            if(ps_next_dpb->u1_lt_idx == u1_lt_index)
            {
                ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                   ps_next_dpb->ps_pic_buf);
                ps_ref_pic_buf_lx->u1_long_term_pic_num =
                                ps_ref_pic_buf_lx->u1_long_term_frm_idx;

                ps_ref_pic_buf_lx++;
                u1_L0++;
                break;
            }
            ps_next_dpb = ps_next_dpb->ps_prev_long;
        }
    }

    if(u1_field_pic_flag)
    {
        /* Initialize the rest of the entries in the */
        /* reference list to handle of errors        */
        {
            UWORD8 u1_i;
            pic_buffer_t *ps_ref_pic;

            ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS;

            if(NULL == ps_ref_pic->pu1_buf1)
            {
                ps_ref_pic = ps_dec->ps_cur_pic;
            }
            for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
            {
                *ps_ref_pic_buf_lx = *ps_ref_pic;
                ps_ref_pic_buf_lx++;
            }
        }
        ih264d_convert_frm_to_fld_list(
                        ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS, &u1_L0,
                        ps_dec, u1_num_short_term_bufs);

        ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0] + u1_L0;
    }

    ps_dec->ps_cur_slice->u1_initial_list_size[0] = u1_L0;

    /* Initialize the rest of the entries in the */
    /* reference list to handle of errors        */
    {
        UWORD8 u1_i;
        pic_buffer_t *ps_ref_pic;

        ps_ref_pic = ps_dpb_mgr->ps_init_dpb[0][0];

        if(NULL == ps_ref_pic->pu1_buf1)
        {
            ps_ref_pic = ps_dec->ps_cur_pic;
        }
        for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
        {
            *ps_ref_pic_buf_lx = *ps_ref_pic;
            ps_ref_pic_buf_lx++;
        }
    }
    {
        /* 2. Initialize refIdxL1 */
        u1_L1 = 0;
        if(u1_field_pic_flag)
        {
            ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS;
        }
        else
        {
            ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0];
        }

        /* 2.1. Arrange POC's more than CurrPOC in the ascending POC order starting
         from (CurrPOC + 1)*/
        for(i_temp_poc = i_cur_poc + 1; i_temp_poc <= i_max_st_poc; i_temp_poc++)
        {
            /* Start from ST head */
            ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
            for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
            {
                if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
                {
                    ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                       ps_next_dpb->ps_pic_buf);
                    ps_ref_pic_buf_lx++;
                    u1_L1++;
                    break;
                }
                ps_next_dpb = ps_next_dpb->ps_prev_short;
            }
        }

        if(u1_field_pic_flag)
        {
            i_temp_poc = i_cur_poc;
        }
        else
        {
            i_temp_poc = i_cur_poc - 1;
        }

        /* Arrange all short term buffers in output order as given by POC */
        /* 2.2 Arrange POC's less than CurrPOC in the descending POC order starting
         from (CurrPOC - 1)*/
        for(; i_temp_poc >= i_min_st_poc; i_temp_poc--)
        {
            /* Start from ST head */
            ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
            for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
            {
                if((WORD32)ps_next_dpb->ps_pic_buf->i4_poc == i_temp_poc)
                {
                    ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                       ps_next_dpb->ps_pic_buf);
                    ps_ref_pic_buf_lx++;
                    u1_L1++;
                    break;
                }
                ps_next_dpb = ps_next_dpb->ps_prev_short;
            }
        }

        /* 2.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
        /* Start from ST head */
        u1_num_short_term_bufs = u1_L1;
        ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
        for(u1_lt_index = u1_min_lt_index; u1_lt_index <= u1_max_lt_index;
                        u1_lt_index++)
        {
            for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
            {
                if(ps_next_dpb->u1_lt_idx == u1_lt_index)
                {
                    ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
                                                       ps_next_dpb->ps_pic_buf);
                    ps_ref_pic_buf_lx->u1_long_term_pic_num =
                                    ps_ref_pic_buf_lx->u1_long_term_frm_idx;
                    ps_ref_pic_buf_lx++;
                    u1_L1++;
                    break;
                }
                ps_next_dpb = ps_next_dpb->ps_prev_long;
            }
        }

        if(u1_field_pic_flag)
        {
            /* Initialize the rest of the entries in the */
            /* reference list to handle of errors        */
            {
                UWORD8 u1_i;
                pic_buffer_t *ps_ref_pic;

                ps_ref_pic = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS;

                if(NULL == ps_ref_pic->pu1_buf1)
                {
                    ps_ref_pic = ps_dec->ps_cur_pic;
                }
                for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
                {
                    *ps_ref_pic_buf_lx = *ps_ref_pic;
                    ps_ref_pic_buf_lx++;
                }
            }

            ih264d_convert_frm_to_fld_list(
                            ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS,
                            &u1_L1, ps_dec, u1_num_short_term_bufs);
            ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + u1_L1;
        }

        ps_dec->ps_cur_slice->u1_initial_list_size[1] = u1_L1;

        /* Initialize the rest of the entries in the */
        /* reference list to handle of errors        */
        {
            UWORD8 u1_i;
            pic_buffer_t *ps_ref_pic;

            ps_ref_pic = ps_dpb_mgr->ps_init_dpb[1][0];

            if(NULL == ps_ref_pic->pu1_buf1)
            {
                ps_ref_pic = ps_dec->ps_cur_pic;
            }
            for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
            {
                *ps_ref_pic_buf_lx = *ps_ref_pic;
                ps_ref_pic_buf_lx++;
            }
        }

        /* If list0 and list 1 ebtries are same then swap the 0th and 1st entry */
        /* of list 1                                                            */
        {
            struct pic_buffer_t *ps_ref_pic1_buf_l0, *ps_ref_pic1_buf_l1;
            struct pic_buffer_t s_ref_pic1_buf_temp;

            ps_ref_pic1_buf_l0 = ps_dpb_mgr->ps_init_dpb[0][0];
            ps_ref_pic1_buf_l1 = ps_dpb_mgr->ps_init_dpb[1][0];

            if((u1_L0 == u1_L1) && (u1_L0 > 1))
            {
                WORD32 i_index, i_swap;

                i_swap = 1;

                for(i_index = 0; i_index < u1_L0; i_index++)
                {
                    if((ps_ref_pic1_buf_l0[i_index]).pu1_buf1
                                    != (ps_ref_pic1_buf_l1[i_index]).pu1_buf1)
                    {
                        i_swap = 0;
                        break;
                    }
                }
                if(1 == i_swap)
                {
                    memcpy(&s_ref_pic1_buf_temp, &ps_ref_pic1_buf_l1[1],
                           sizeof(struct pic_buffer_t));
                    memcpy(&ps_ref_pic1_buf_l1[1], &ps_ref_pic1_buf_l1[0],
                           sizeof(struct pic_buffer_t));
                    memcpy(&ps_ref_pic1_buf_l1[0], &s_ref_pic1_buf_temp,
                           sizeof(struct pic_buffer_t));
                }
            }
        }
    }
}



void ih264d_get_implicit_weights(dec_struct_t *ps_dec);

/*!
 **************************************************************************
 * \if Function name : ih264d_one_to_one \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_one_to_one(dec_struct_t *ps_dec,
                       struct pic_buffer_t *ps_col_pic,
                       directmv_t *ps_direct,
                       UWORD8 u1_wd_x,
                       WORD32 u2_sub_mb_ofst,
                       dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num;
    UWORD8 u1_init_colzero_flag;
    UNUSED(ps_cur_mb_info);
    pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
    u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num];
    u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
    u1_col_mb_pred_mode >>= 6;
    ps_direct->u1_vert_mv_scale = ONE_TO_ONE;
    ps_direct->u1_col_zeroflag_change = 0;

    if(u1_wd_x == MB_SIZE)
    {
        ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
        if(u1_col_mb_pred_mode == PRED_16x16)
        {
            ps_direct->i1_num_partitions = 1;
            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
            ps_direct->i1_submb_num[0] = 0;
            ps_direct->i1_partitionsize[0] = PRED_16x16;

            return;
        }
        else if(u1_col_mb_pred_mode < PRED_8x8)
        {
            ps_direct->i1_num_partitions = 2;
            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
            ps_direct->i1_submb_num[0] = 0;
            ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode;
            u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2;
            ps_direct->i1_submb_num[1] = u1_sub_mb_num;
            ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst
                            + ps_direct->i1_submb_num[1];
            ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode;
            if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag)
                ps_direct->u1_col_zeroflag_change = 1;
            return;
        }
        else
        {
            u1_num_blks = 4;
        }
    }
    else
    {
        u1_num_blks = 1;
    }

    {
        const UWORD8 *pu1_top_lt_mb_part_idx;
        UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0;
        UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num;
        const UWORD8 *pu1_num_sub_mb_part =
                        (const UWORD8 *)gau1_ih264d_num_submb_part;
        UWORD8 i1_num_partitions = 0, partition_size;
        WORD32 mv_index;
        const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;

        u1_sub_mb_num = ps_dec->u1_sub_mb_num;
        uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag;
        pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod
                        + (PRED_8x8 << 1) + 1;

        for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
        {
            partition_size = PRED_8x8;
            pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
            if(uc_direct8x8inf == 1)
            {
                u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
                mv_index = u2_sub_mb_ofst + u1_submb_col;
                u1_num_sub_blks = 1;
            }
            else
            {
                /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */
                pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
                u1_col_sub_mb_pred_mode = *pu1_col_zero_flag;
                u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4;
                partition_size = (UWORD8)((u1_col_sub_mb_pred_mode)
                                | (PRED_8x8 << 2));
                mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
                pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1);
                u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode];

            }

            for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks;
                            u1_sub_blk++, pu1_top_lt_sub_mb_idx++)
            {
                u1_sub_mb_num += *pu1_top_lt_sub_mb_idx;
                mv_index += *pu1_top_lt_sub_mb_idx;
                ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
                ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
                ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
                i1_num_partitions++;
                if(!uc_direct8x8inf)
                    u1_submb_col = u1_sub_mb_num;
                if((pu1_col_zero_flag_start[u1_submb_col] & 1)
                                != u1_init_colzero_flag)
                    ps_direct->u1_col_zeroflag_change = 1;
            }
            u1_sub_mb_num = *pu1_top_lt_mb_part_idx++;
        }
        ps_direct->i1_num_partitions = i1_num_partitions;
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_mbaff_cross_pmbair \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_mbaff_cross_pmbair(dec_struct_t *ps_dec,
                               struct pic_buffer_t *ps_col_pic,
                               directmv_t *ps_direct,
                               UWORD8 u1_wd_x,
                               WORD32 u2_sub_mb_ofst,
                               dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag, u1_sub_mb_num,
                    uc_sub_mb_num_col;
    UWORD8 *pu1_col_zero_flag_right_half;
    WORD32 i4_force_8X8;
    UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk, u1_col_sub_mb_pred_mode,
                    u1_col_sub_mb_pred_mode_rt;
    UWORD8 i1_num_partitions = 0, partition_size;

    WORD32 mv_index;

    UWORD8 u1_num_sub_blks;
    UWORD8 u1_is_cur_mb_fld, i;
    UWORD8 u1_init_colzero_flag;

    u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
    u1_sub_mb_num = ps_dec->u1_sub_mb_num;
    ps_direct->u1_col_zeroflag_change = 0;
    /*pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
     u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num];
     u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
     u1_col_mb_pred_mode >>= 6; */
    if(0 == u1_is_cur_mb_fld)
    {
        ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
        if(u1_wd_x == MB_SIZE)
        {
            pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
                            + u2_sub_mb_ofst;
            u1_col_mb_pred_mode = pu1_col_zero_flag_start[0];
            u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
            u1_col_mb_pred_mode >>= 6;


            if(u1_col_mb_pred_mode & 0x2)
            {
                ps_dec->u1_currB_type = 1;
                if(u1_col_mb_pred_mode == PRED_8x16)
                {
                    ps_direct->i1_num_partitions = 2;
                    ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
                    ps_direct->i1_submb_num[0] = 0;
                    ps_direct->i1_partitionsize[0] = PRED_8x16;
                    ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
                    ps_direct->i1_submb_num[1] = 2;
                    ps_direct->i1_partitionsize[1] = PRED_8x16;
                    if((pu1_col_zero_flag_start[2] & 1) != u1_init_colzero_flag)
                        ps_direct->u1_col_zeroflag_change = 1;
                }
                else
                {
                    pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
                    u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */

                    pu1_col_zero_flag_right_half = pu1_col_zero_flag_start
                                    + u1_sub_mb_num + 2;
                    u1_col_sub_mb_pred_mode_rt =
                                    (*pu1_col_zero_flag_right_half & 0x10);/* 8x4 or 4x4 mode */

                    i4_force_8X8 = (u1_col_sub_mb_pred_mode)
                                    || (u1_col_sub_mb_pred_mode_rt);
                    if(i4_force_8X8)
                    {
                        u1_num_sub_blks = 2;
                        partition_size = PRED_8x8;
                    }
                    else
                    {
                        partition_size = PRED_8x16;
                        u1_num_sub_blks = 1;
                    }

                    for(i = 0; i < 2; i++)
                    {
                        for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
                        {
                            uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
                            uc_sub_mb_num_col &= 0x7;
                            mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;

                            ps_direct->i4_mv_indices[i1_num_partitions] =
                                            mv_index;
                            ps_direct->i1_submb_num[i1_num_partitions] =
                                            u1_sub_mb_num;
                            ps_direct->i1_partitionsize[i1_num_partitions] =
                                            partition_size;
                            i1_num_partitions++;
                            if((pu1_col_zero_flag_start[uc_sub_mb_num_col] & 1)
                                            != u1_init_colzero_flag)
                                ps_direct->u1_col_zeroflag_change = 1;
                            u1_sub_mb_num += 8;
                        }
                        u1_sub_mb_num = 2; /* move to second half of Cur MB */
                    }
                    ps_direct->i1_num_partitions = i1_num_partitions;
                    return;
                }
            }
            else
            {
                ps_direct->i1_num_partitions = 1;
                ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
                ps_direct->i1_submb_num[0] = 0;
                ps_direct->i1_partitionsize[0] = PRED_16x16;
                ps_dec->u1_currB_type = 0;
                return;
            }
        }
        else
        {
            uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
            uc_sub_mb_num_col &= 0x7;

            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
            ps_direct->i1_submb_num[0] = u1_sub_mb_num;
            ps_direct->i1_partitionsize[0] = PRED_8x8;
            ps_direct->i1_num_partitions = 1;
        }
    }
    else
    {
        ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
        pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
        u1_init_colzero_flag = pu1_col_zero_flag_start[0] & 1;

        if(u1_wd_x == MB_SIZE)
        {
            UWORD8 u1_submb_col;
            UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;

            pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
                            + u2_sub_mb_ofst;
            u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;

            puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
                            + u2_sub_mb_ofst + 16;
            uc_colMbPredMode_bot_mb = puc_colZeroFlagStart_bot_mb[8] >> 6;

            i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
                            || (uc_colMbPredMode_bot_mb & 0x2);
            if(i4_force_8X8)
            {
                u1_num_blks = 2;
                partition_size = PRED_8x8;
            }
            else
            {
                u1_num_blks = 1;
                partition_size = PRED_16x8;
            }

            ps_dec->u1_currB_type = 1;
            /*As this mb is derived from 2 Mbs min no of partitions = 2*/
            for(i = 0; i < 2; i++)
            {

                pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
                                + u2_sub_mb_ofst;
                u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;

                for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
                {
                    u1_submb_col = (u1_sub_mb_num & 0x7) ? 1 : 0;
                    u1_submb_col += u1_sub_mb_num;
                    mv_index = u2_sub_mb_ofst + u1_submb_col;


                    ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
                    ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
                    ps_direct->i1_partitionsize[i1_num_partitions] =
                                    partition_size;
                    i1_num_partitions++;
                    if((pu1_col_zero_flag_start[u1_submb_col] & 1)
                                    != u1_init_colzero_flag)
                        ps_direct->u1_col_zeroflag_change = 1;
                    u1_sub_mb_num += 2;
                }
                u1_sub_mb_num = 8; /* move to second half of Cur MB */
                u2_sub_mb_ofst += 16;/* move to next Colocated MB */
            }
            ps_direct->i1_num_partitions = i1_num_partitions;
            return;
        }
        else
        {
            uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
            uc_sub_mb_num_col &= 0xb;
            u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? 16 : 0;

            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
            ps_direct->i1_submb_num[0] = u1_sub_mb_num;
            ps_direct->i1_partitionsize[0] = PRED_8x8;
            ps_direct->i1_num_partitions = 1;
            return;
        }
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_cal_col_pic \endif
 *
 * \brief
 *    Finds the colocated picture.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
WORD32 ih264d_cal_col_pic(dec_struct_t *ps_dec)
{
    struct pic_buffer_t* ps_col_pic = ps_dec->ps_col_pic;
    UWORD8 uc_curpictype, uc_colpictype;
    ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
    uc_curpictype = (ps_dec->ps_cur_pic->u1_picturetype & 0x7);
    uc_colpictype = (ps_col_pic->u1_picturetype & 0x7);
    if(uc_curpictype == FRM_PIC)
    {
        if(uc_colpictype == FRM_PIC)
            ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
        else if(uc_colpictype == COMP_FLD_PAIR)
        {
            ps_dec->pf_parse_mvdirect = ih264d_fld_to_frm;
            if(ps_col_pic->i4_top_field_order_cnt
                            >= ps_col_pic->i4_bottom_field_order_cnt)
            {
                struct pic_buffer_t* ps_tempPic = ps_col_pic;
                UWORD32 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht
                                * ps_dec->u2_pic_wd) >> 5);
                ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
                /* memcpy ps_tempPic to ps_col_pic */
                *ps_col_pic = *ps_tempPic;
                ps_col_pic->pu1_buf1 = ps_tempPic->pu1_buf1
                                + ps_tempPic->u2_frm_wd_y;
                ps_col_pic->pu1_buf2 = ps_tempPic->pu1_buf2
                                + ps_tempPic->u2_frm_wd_uv;
                ps_col_pic->pu1_buf3 = ps_tempPic->pu1_buf3
                                + ps_tempPic->u2_frm_wd_uv;
                ps_col_pic->pu1_col_zero_flag = ps_tempPic->pu1_col_zero_flag
                                + ui_half_num_of_sub_mbs;
                ps_col_pic->ps_mv = ps_tempPic->ps_mv + ui_half_num_of_sub_mbs;


                ps_col_pic->u1_pic_type = 0;/*complementary reference field pair-refering as frame */



            }
        }
        else
        {
            UWORD32 i4_error_code;
            i4_error_code = ERROR_DBP_MANAGER_T;
//          i4_error_code |= 1<<IVD_CORRUPTEDDATA;
            return i4_error_code;
        }
    }
    else if(uc_curpictype == AFRM_PIC)
    {
        ps_dec->pf_parse_mvdirect = ih264d_fld_to_mbaff;
    }
    else /* must be a field*/
    {
        if(uc_colpictype == FRM_PIC)
            ps_dec->pf_parse_mvdirect = ih264d_frm_to_fld;
        else if(uc_colpictype == AFRM_PIC)
            ps_dec->pf_parse_mvdirect = ih264d_mbaff_to_fld;
        else
            ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
    }
    ps_dec->ps_col_pic = ps_col_pic;
    return OK;
}

/*!
 **************************************************************************
 * \if Function name : ih264d_frm_to_fld \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_frm_to_fld(dec_struct_t *ps_dec,
                       struct pic_buffer_t *ps_col_pic,
                       directmv_t *ps_direct,
                       UWORD8 u1_wd_x,
                       WORD32 u2_sub_mb_ofst,
                       dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8 *pu1_col_zero_flag_start, u1_sub_mb_num;
    UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk;
    UWORD8 i1_num_partitions = 0, partition_size, i;
    WORD32 mv_index;
    UWORD32 increment;
    WORD32 i4_force_8X8;
    UNUSED(ps_cur_mb_info);
    ps_direct->u1_col_zeroflag_change = 1;
    ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
    u1_sub_mb_num = ps_dec->u1_sub_mb_num;

    /* new calculation specific to this function */
    if((ps_col_pic->u1_picturetype & 0x7) == FRM_PIC)
    {
        UWORD16 u2_frm_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs;
        increment = (u2_frm_wd_in_mbs << 4);
        /*mbAddrCol = mbAddrCol1 */
        u2_sub_mb_ofst = (ps_dec->u2_mbx
                        + (2 * ps_dec->u2_mby * u2_frm_wd_in_mbs)) << 4;
    }
    else
        increment = 16;

    if(u1_wd_x == MB_SIZE)
    {
        ps_dec->u1_currB_type = 1;

        {
            UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;

            pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
                            + u2_sub_mb_ofst;
            u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);

            puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
                            + u2_sub_mb_ofst + increment;
            uc_colMbPredMode_bot_mb = (*puc_colZeroFlagStart_bot_mb >> 6);

            i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
                            || (uc_colMbPredMode_bot_mb & 0x2);

            if(i4_force_8X8)
            {
                u1_num_blks = 2;
                partition_size = PRED_8x8;
            }
            else
            {
                partition_size = PRED_16x8;
                u1_num_blks = 1;
            }
        }

        /*As this mb is derived from 2 Mbs, min no of partitions = 2*/
        for(i = 0; i < 2; i++)
        {
            for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
            {
                mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
                mv_index += (u1_sub_mb_num & 0x7) ? 1 : 0;

                ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
                ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
                ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
                i1_num_partitions++;

                u1_sub_mb_num += 2;
            }
            u1_sub_mb_num = 8; /* move to second half of Cur MB */
            u2_sub_mb_ofst += increment;/* move to next Colocated MB */
        }
        ps_direct->i1_num_partitions = i1_num_partitions;
        return;
    }
    else
    {
        UWORD8 u1_sub_mb_num_col;
        u1_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
        u1_sub_mb_num_col &= 0xb;
        u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? increment : 0;

        ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + u1_sub_mb_num_col;
        ps_direct->i1_submb_num[0] = u1_sub_mb_num;
        ps_direct->i1_partitionsize[0] = PRED_8x8;
        ps_direct->i1_num_partitions = 1;
        return;
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_fld_to_frm \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_fld_to_frm(dec_struct_t *ps_dec,
                       struct pic_buffer_t *ps_col_pic,
                       directmv_t *ps_direct,
                       UWORD8 u1_wd_x,
                       WORD32 u2_sub_mb_ofst,
                       dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag,
                    *pu1_col_zero_flag_right_half, u1_sub_mb_num, uc_sub_mb_num_col;
    UWORD8 u1_col_mb_pred_mode, uc_blk;
    WORD32 i4_force_8X8;

    UNUSED(ps_cur_mb_info);
    ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
    ps_direct->u1_col_zeroflag_change = 1;
    /* new calculation specific to this function for u2_sub_mb_ofst*/
    u2_sub_mb_ofst = (ps_dec->u2_mbx
                    + ((ps_dec->u2_mby >> 1) * ps_dec->u2_frm_wd_in_mbs)) << 4;
    u2_sub_mb_ofst += ((ps_dec->u2_mby & 1) << 3);

    if(u1_wd_x == MB_SIZE)
    {
        pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
        u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);
        ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);

        if(u1_col_mb_pred_mode & 0x2)
        {
            if(u1_col_mb_pred_mode == PRED_8x16)
            {
                ps_direct->i1_num_partitions = 2;
                ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
                ps_direct->i1_submb_num[0] = 0;
                ps_direct->i1_partitionsize[0] = PRED_8x16;
                ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
                ps_direct->i1_submb_num[1] = 2;
                ps_direct->i1_partitionsize[1] = PRED_8x16;
            }
            else
            {
                UWORD8 i1_num_partitions = 0, partition_size;
                UWORD32 mv_index;
                UWORD8 u1_num_sub_blks, i, u1_col_sub_mb_pred_mode,
                                u1_col_sub_mb_pred_mode_rt;

                u1_sub_mb_num = ps_dec->u1_sub_mb_num;

                pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
                u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */

                pu1_col_zero_flag_right_half = pu1_col_zero_flag_start + u1_sub_mb_num
                                + 2;
                u1_col_sub_mb_pred_mode_rt = (*pu1_col_zero_flag_right_half
                                & 0x10);/* 8x4 or 4x4 mode */

                i4_force_8X8 = (u1_col_sub_mb_pred_mode)
                                || (u1_col_sub_mb_pred_mode_rt);
                if(i4_force_8X8)
                {
                    u1_num_sub_blks = 2;
                    partition_size = PRED_8x8;
                }
                else
                {
                    partition_size = PRED_8x16;
                    u1_num_sub_blks = 1;
                }

                for(i = 0; i < 2; i++)
                {
                    for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
                    {
                        uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
                        uc_sub_mb_num_col &= 0x7;
                        mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;

                        ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
                        ps_direct->i1_submb_num[i1_num_partitions] =
                                        u1_sub_mb_num;
                        ps_direct->i1_partitionsize[i1_num_partitions] =
                                        partition_size;
                        i1_num_partitions++;
                        u1_sub_mb_num += 8;
                    }

                    u1_sub_mb_num = 2; /* move to second half of Cur MB */

                }
                ps_direct->i1_num_partitions = i1_num_partitions;
                return;
            }
        }
        else
        {
            ps_direct->i1_num_partitions = 1;
            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
            ps_direct->i1_submb_num[0] = 0;
            ps_direct->i1_partitionsize[0] = PRED_16x16;
            return;
        }
    }
    else
    {
        u1_sub_mb_num = ps_dec->u1_sub_mb_num;
        uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
        uc_sub_mb_num_col &= 0x7;

        ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
        ps_direct->i1_submb_num[0] = u1_sub_mb_num;
        ps_direct->i1_partitionsize[0] = PRED_8x8;
        ps_direct->i1_num_partitions = 1;
    }
}
/*!
 **************************************************************************
 * \if Function name : ih264d_one_to_one \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_mbaff_to_fld(dec_struct_t *ps_dec,
                         struct pic_buffer_t *ps_col_pic,
                         directmv_t *ps_direct,
                         UWORD8 u1_wd_x,
                         WORD32 u2_sub_mb_ofst,
                         dec_mb_info_t * ps_cur_mb_info)
{
    UWORD8* pu1_col_zero_flag, u1_iscol_mb_fld;
    u2_sub_mb_ofst <<= 1;
    pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
    u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
    if(u1_iscol_mb_fld)
    {
        u2_sub_mb_ofst += (ps_dec->ps_cur_slice->u1_bottom_field_flag << 4);
        ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                          u2_sub_mb_ofst, ps_cur_mb_info);
    }
    else
        ih264d_frm_to_fld(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                          u2_sub_mb_ofst, ps_cur_mb_info);
}
/*!
 **************************************************************************
 * \if Function name : ih264d_one_to_one \endif
 *
 * \brief
 *    Initializes forward and backward refernce lists for B slice decoding.
 *
 *
 * \return
 *    0 on Success and Error code otherwise
 **************************************************************************
 */
void ih264d_fld_to_mbaff(dec_struct_t *ps_dec,
                         struct pic_buffer_t *ps_col_pic,
                         directmv_t *ps_direct,
                         UWORD8 u1_wd_x,
                         WORD32 u2_sub_mb_ofst,
                         dec_mb_info_t * ps_cur_mb_info)
{
    if((ps_col_pic->u1_picturetype & 0x7) == COMP_FLD_PAIR)
    {
        /* first calculate the colocated picture which varies with Mb */
        UWORD8 u1_is_cur_mb_fld;
        u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
        u2_sub_mb_ofst = (u2_sub_mb_ofst & 0xffe0); /* mbaddrCol5 = curmbaddr/2;*/
        u2_sub_mb_ofst >>= 1;

        ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
        if(u1_is_cur_mb_fld)
        {
            if(1 - ps_cur_mb_info->u1_topmb)
                ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];

            ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                              u2_sub_mb_ofst, ps_cur_mb_info);
        }
        else
        {

            if(ABS(ps_col_pic->i4_top_field_order_cnt
                            - ps_dec->ps_cur_pic->i4_poc) >=
                            ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
            {
                ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
            }

            if(ps_cur_mb_info->u1_topmb == 0)
                u2_sub_mb_ofst += 8;
            ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                                      u2_sub_mb_ofst, ps_cur_mb_info);
        }
        ps_dec->ps_col_pic = ps_col_pic;
    }
    else
    {
        UWORD8* pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag
                        + u2_sub_mb_ofst;
        UWORD8 temp, u1_is_cur_mb_fld, u1_iscol_mb_fld;

        u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
        u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
        temp = (u1_iscol_mb_fld ^ u1_is_cur_mb_fld);

        if(temp == 0)
            ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                              u2_sub_mb_ofst, ps_cur_mb_info);
        else
        {
            u2_sub_mb_ofst &= 0xffef;
            if(u1_is_cur_mb_fld == 0)
            {
                if(ABS(ps_col_pic->i4_top_field_order_cnt
                                - ps_dec->ps_cur_pic->i4_poc) >=
                                ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
                {
                    u2_sub_mb_ofst += 0x10;
                }
                if(ps_cur_mb_info->u1_topmb == 0)
                    u2_sub_mb_ofst += 8;
            }
            ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
                                      u2_sub_mb_ofst, ps_cur_mb_info);
        }
    }
}

