/******************************************************************************
 *
 * 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_mb_utils.c
 *
 * \brief
 *    Contains utitlity functions needed for Macroblock decoding
 *
 * \date
 *    18/12/2002
 *
 * \author  AI
 **************************************************************************
 */
#include <string.h>
#include <stdlib.h>
#include "ih264d_bitstrm.h"
#include "ih264d_defs.h"
#include "ih264d_debug.h"
#include "ih264d_structs.h"
#include "ih264d_defs.h"
#include "ih264d_mb_utils.h"
#include "ih264d_parse_slice.h"
#include "ih264d_error_handler.h"
#include "ih264d_parse_mb_header.h"
#include "ih264d_cabac.h"
#include "ih264d_defs.h"
#include "ih264d_tables.h"

/*****************************************************************************/
/*                                                                           */
/*  Function Name : get_mb_info_cavlc                                        */
/*                                                                           */
/*  Description   : This function sets the following information of cur MB   */
/*                  (a) mb_x and mb_y                                        */
/*                  (b) Neighbour availablity                                */
/*                  (c) Macroblock location in the frame buffer              */
/*                  (e) For mbaff predicts field/frame u4_flag for topMb        */
/*                      and sets the field/frame for botMb. This is          */
/*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
/*                                                                           */
/*  Inputs        : pointer to decstruct                                     */
/*                  pointer to current mb info                               */
/*                  currentMbaddress                                         */
/*                                                                           */
/*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
/*                  DecCtxMbfield  modules so that these modules do not      */
/*                  check for neigbour availability and then find the        */
/*                  neigbours for context increments                         */
/*                                                                           */
/*  Returns       : OK                                                       */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 07 2002   Jay             Draft                                */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t *ps_dec,
                                          const UWORD16 u2_cur_mb_address,
                                          dec_mb_info_t * ps_cur_mb_info,
                                          UWORD32 u4_mbskip_run)
{
    WORD32 mb_x;
    WORD32 mb_y;
    UWORD8 u1_mb_ngbr_avail = 0;
    UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
    WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
    UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
    UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
    UNUSED(u4_mbskip_run);
    /*--------------------------------------------------------------------*/
    /* Calculate values of mb_x and mb_y                                  */
    /*--------------------------------------------------------------------*/
    mb_x = (WORD16)ps_dec->u2_mbx;
    mb_y = (WORD16)ps_dec->u2_mby;

    ps_dec->u2_cur_mb_addr = u2_cur_mb_address;

    mb_x++;

    if(mb_x == u2_frm_width_in_mb)
    {
        mb_x = 0;
        mb_y++;
    }
    if(mb_y > ps_dec->i2_prev_slice_mby)
    {
        /* if not in the immemdiate row of prev slice end then top
         will be available */
        if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
            i2_prev_slice_mbx = -1;

        if(mb_x > i2_prev_slice_mbx)
        {
            u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
            u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
        }

        if((mb_x > (i2_prev_slice_mbx - 1))
                        && (mb_x != (u2_frm_width_in_mb - 1)))
        {
            u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
        }

        if(mb_x > (i2_prev_slice_mbx + 1))
        {
            u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
            u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
        }

        /* Next row  Left will be available*/
        i2_prev_slice_mbx = -1;
    }

    /* Same row */
    if(mb_x > (i2_prev_slice_mbx + 1))
    {
        u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
        u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
    }

    {
        mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
        mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;

        /* copy the parameters of topleft Mb */
        ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
        /* Neighbour pointer assignments*/
        ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
        ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
        ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
        ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;

        /* Update the parameters of topleftmb*/
        ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
    }

    ps_dec->u2_mby = mb_y;
    ps_dec->u2_mbx = mb_x;
    ps_cur_mb_info->u2_mbx = mb_x;
    ps_cur_mb_info->u2_mby = mb_y;
    ps_cur_mb_info->u1_topmb = 1;
    ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
    ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
    ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
    ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
    ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
    return (OK);

}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : get_mb_info_cavlc                                        */
/*                                                                           */
/*  Description   : This function sets the following information of cur MB   */
/*                  (a) mb_x and mb_y                                        */
/*                  (b) Neighbour availablity                                */
/*                  (c) Macroblock location in the frame buffer              */
/*                  (e) For mbaff predicts field/frame u4_flag for topMb        */
/*                      and sets the field/frame for botMb. This is          */
/*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
/*                                                                           */
/*  Inputs        : pointer to decstruct                                     */
/*                  pointer to current mb info                               */
/*                  currentMbaddress                                         */
/*                                                                           */
/*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
/*                  DecCtxMbfield  modules so that these modules do not      */
/*                  check for neigbour availability and then find the        */
/*                  neigbours for context increments                         */
/*                                                                           */
/*  Returns       : OK                                                       */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 07 2002   Jay             Draft                                */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_get_mb_info_cavlc_mbaff(dec_struct_t *ps_dec,
                                       const UWORD16 u2_cur_mb_address,
                                       dec_mb_info_t * ps_cur_mb_info,
                                       UWORD32 u4_mbskip_run)
{
    UWORD16 u2_mb_x;
    UWORD16 u2_mb_y;
    UWORD8 u1_mb_ngbr_avail = 0;
    UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;

    UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
    WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
    UWORD8 u1_cur_mb_field = 0;
    UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
    UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;

    /*--------------------------------------------------------------------*/
    /* Calculate values of mb_x and mb_y                                  */
    /*--------------------------------------------------------------------*/
    u2_mb_x = ps_dec->u2_mbx;
    u2_mb_y = ps_dec->u2_mby;

    ps_dec->u2_cur_mb_addr = u2_cur_mb_address;


    if(u1_top_mb)
    {
        u2_mb_x++;
        if(u2_mb_x == u2_frm_width_in_mb)
        {
            u2_mb_x = 0;
            u2_mb_y += 2;
        }
        if(u2_mb_y > ps_dec->i2_prev_slice_mby)
        {
            /* if not in the immemdiate row of prev slice end then top
             will be available */
            if(u2_mb_y > (ps_dec->i2_prev_slice_mby + 2))
                i2_prev_slice_mbx = -1;
            if(u2_mb_x > i2_prev_slice_mbx)
            {
                u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
                u1_cur_mb_field = ps_dec->ps_top_mb_row[u2_mb_x << 1].u1_mb_fld;
                u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
                u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
            }
            if((u2_mb_x > (i2_prev_slice_mbx - 1))
                            && (u2_mb_x != (u2_frm_width_in_mb - 1)))
            {
                u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
                u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
            }

            if(u2_mb_x > (i2_prev_slice_mbx + 1))
            {
                u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
                u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
            }

            i2_prev_slice_mbx = -1;
        }
        /* Same row */
        if(u2_mb_x > (i2_prev_slice_mbx + 1))
        {
            u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
            u1_cur_mb_field =
                            ps_dec->ps_cur_mb_row[(u2_mb_x << 1) - 1].u1_mb_fld;
            u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
        }
        /* Read u1_cur_mb_field from the bitstream if u4_mbskip_run <= 1*/
        if(u4_mbskip_run <= 1)
            u1_cur_mb_field = (UWORD8)ih264d_get_bit_h264(ps_dec->ps_bitstrm);

        ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
        ps_dec->u2_top_left_mask = u2_top_left_mask;
        ps_dec->u2_top_right_mask = u2_top_right_mask;
    }
    else
    {
        u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
        u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
        u2_top_left_mask = ps_dec->u2_top_left_mask;
        u2_top_right_mask = ps_dec->u2_top_right_mask;

        if(!u1_cur_mb_field)
        {
            /* Top is available */
            u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
            u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
            /* Top Right not available */
            u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
            u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);

            if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
            {
                u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
                u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
                u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
            }
        }
    }

    ps_dec->u2_mby = u2_mb_y;
    ps_dec->u2_mbx = u2_mb_x;
    ps_cur_mb_info->u2_mbx = u2_mb_x;
    ps_cur_mb_info->u2_mby = u2_mb_y;
    ps_cur_mb_info->u1_topmb = u1_top_mb;
    ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
    ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
    ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
    ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
    ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
    return (OK);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : get_mb_info_cabac                                        */
/*                                                                           */
/*  Description   : This function sets the following information of cur MB   */
/*                  (a) mb_x and mb_y                                        */
/*                  (b) Neighbour availablity                                */
/*                  (c) Macroblock location in the frame buffer              */
/*                  (e) leftMb parama and TopMb params of curMB              */
/*                  (f) For Mbaff case leftMb params and TopMb params of     */
/*                      bottomMb are also set if curMB is top                */
/*                  (g) For mbaff predicts field/frame u4_flag for topMb        */
/*                      and sets the field/frame for botMb. This is          */
/*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
/*                                                                           */
/*  Inputs        : pointer to decstruct                                     */
/*                  pointer to current mb info                               */
/*                  currentMbaddress                                         */
/*                                                                           */
/*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
/*                  DecCtxMbfield  modules so that these modules do not      */
/*                  check for neigbour availability and then find the        */
/*                  neigbours for context increments                         */
/*                                                                           */
/*  Returns       : OK                                                       */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 07 2002   Jay             Draft                                */
/*                                                                           */
/*****************************************************************************/
UWORD32 ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t *ps_dec,
                                          const UWORD16 u2_cur_mb_address,
                                          dec_mb_info_t * ps_cur_mb_info,
                                          UWORD32 u4_mbskip)
{
    WORD32 mb_x;
    WORD32 mb_y;
    UWORD32 u1_mb_ngbr_avail = 0;
    UWORD32 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
    UWORD32 u1_top_mb = 1;
    WORD32 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
    UWORD32 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
    UWORD32 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
    ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;

    /*--------------------------------------------------------------------*/
    /* Calculate values of mb_x and mb_y                                  */
    /*--------------------------------------------------------------------*/
    mb_x = (WORD16)ps_dec->u2_mbx;
    mb_y = (WORD16)ps_dec->u2_mby;

    ps_dec->u2_cur_mb_addr = u2_cur_mb_address;

    mb_x++;
    if((UWORD32)mb_x == u2_frm_width_in_mb)
    {
        mb_x = 0;
        mb_y++;
    }
    /*********************************************************************/
    /* Cabac Context Initialisations                                     */
    /*********************************************************************/
    ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + mb_x;
    ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
    ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;

    /********************************************************************/
    /* neighbour availablility                                          */
    /********************************************************************/
    if(mb_y > ps_dec->i2_prev_slice_mby)
    {
        /* if not in the immemdiate row of prev slice end then top
         will be available */
        if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
            i2_prev_slice_mbx = -1;

        if(mb_x > i2_prev_slice_mbx)
        {
            u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
            u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
            ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;
        }
        if((mb_x > (i2_prev_slice_mbx - 1))
                        && ((UWORD32)mb_x != (u2_frm_width_in_mb - 1)))
        {
            u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
        }

        if(mb_x > (i2_prev_slice_mbx + 1))
        {
            u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
            u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
        }
        /* Next row */
        i2_prev_slice_mbx = -1;
    }
    /* Same row */
    if(mb_x > (i2_prev_slice_mbx + 1))
    {
        u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
        u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
        ps_dec->p_left_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info - 1;
    }
    {
        mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
        mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
        /* copy the parameters of topleft Mb */
        ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
        /* Neighbour pointer assignments*/
        ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
        ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
        ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
        ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;

        /* Update the parameters of topleftmb*/
        ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
    }

    ps_dec->u2_mby = mb_y;
    ps_dec->u2_mbx = mb_x;
    ps_cur_mb_info->u2_mbx = mb_x;
    ps_cur_mb_info->u2_mby = mb_y;
    ps_cur_mb_info->u1_topmb = u1_top_mb;
    ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
    ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
    ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
    ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
    ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;

    /*********************************************************************/
    /*                  Assign the neigbours                             */
    /*********************************************************************/
    if(u4_mbskip)
    {
        UWORD32 u4_ctx_inc =
                        2
                                        - ((!!(ps_dec->p_top_ctxt_mb_info->u1_mb_type
                                                        & CAB_SKIP_MASK))
                                                        + (!!(ps_dec->p_left_ctxt_mb_info->u1_mb_type
                                                                        & CAB_SKIP_MASK)));

        u4_mbskip = ih264d_decode_bin(u4_ctx_inc, ps_dec->p_mb_skip_flag_t,
                                      ps_dec->ps_bitstrm, &ps_dec->s_cab_dec_env);

        if(!u4_mbskip)
        {
            if(!(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK))
            {
                UWORD32 *pu4_buf;
                UWORD8 *pu1_buf;

                pu1_buf = ps_dec->pu1_left_nnz_y;
                pu4_buf = (UWORD32 *)pu1_buf;
                *pu4_buf = 0;
                pu1_buf = ps_dec->pu1_left_nnz_uv;
                pu4_buf = (UWORD32 *)pu1_buf;
                *pu4_buf = 0;


                *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
                MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
                *(UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc = 0;
            }
            if(!(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK))
            {
                MEMSET_16BYTES(ps_dec->ps_curr_ctxt_mb_info->u1_mv, 0);
                memset(ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx, 0, 4);
            }
        }
    }
    return (u4_mbskip);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : get_mb_info_cabac                                        */
/*                                                                           */
/*  Description   : This function sets the following information of cur MB   */
/*                  (a) mb_x and mb_y                                        */
/*                  (b) Neighbour availablity                                */
/*                  (c) Macroblock location in the frame buffer              */
/*                  (e) leftMb parama and TopMb params of curMB              */
/*                  (f) For Mbaff case leftMb params and TopMb params of     */
/*                      bottomMb are also set if curMB is top                */
/*                  (g) For mbaff predicts field/frame u4_flag for topMb        */
/*                      and sets the field/frame for botMb. This is          */
/*                      written in ps_dec->u1_cur_mb_fld_dec_flag            */
/*                                                                           */
/*  Inputs        : pointer to decstruct                                     */
/*                  pointer to current mb info                               */
/*                  currentMbaddress                                         */
/*                                                                           */
/*  Processing    : leftMb and TopMb params are used by DecMbskip and        */
/*                  DecCtxMbfield  modules so that these modules do not      */
/*                  check for neigbour availability and then find the        */
/*                  neigbours for context increments                         */
/*                                                                           */
/*  Returns       : OK                                                       */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 07 2002   Jay             Draft                                */
/*                                                                           */
/*****************************************************************************/

UWORD32 ih264d_get_mb_info_cabac_mbaff(dec_struct_t *ps_dec,
                                       const UWORD16 u2_cur_mb_address,
                                       dec_mb_info_t * ps_cur_mb_info,
                                       UWORD32 u4_mbskip)
{
    WORD32 mb_x;
    WORD32 mb_y;
    UWORD8 u1_mb_ngbr_avail = 0;
    UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
    ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
    ctxt_inc_mb_info_t *ps_curr_ctxt, *ps_top_ctxt, *ps_left_ctxt;
    mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
    mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
    UWORD32 u4_left_mb_pair_fld = 0;
    UWORD32 u4_top_mb_pair_fld = 0;
    UWORD8 u1_cur_mb_field = 0;
    UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
    WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
    UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
    UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;

    /*--------------------------------------------------------------------*/
    /* Calculate values of mb_x and mb_y                                  */
    /*--------------------------------------------------------------------*/
    mb_x = (WORD16)ps_dec->u2_mbx;
    mb_y = (WORD16)ps_dec->u2_mby;

    ps_dec->u2_cur_mb_addr = u2_cur_mb_address;

    ps_top_ctxt = ps_left_ctxt = p_ctx_inc_mb_map - 1;

    if(u1_top_mb)
    {
        ctxt_inc_mb_info_t *ps_left_mb_of_bot = ps_left_ctxt;
        ctxt_inc_mb_info_t *ps_top_mb_of_bot = ps_top_ctxt;

        mb_x++;

        if(mb_x == u2_frm_width_in_mb)
        {
            mb_x = 0;
            mb_y += 2;
        }

        ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1);
        if(mb_y > ps_dec->i2_prev_slice_mby)
        {
            UWORD8 u1_cur_mb_fld_flag_known = 0;
            /* Next row */
            if(mb_x > 0)
            {
                /***********************************************************************/
                /*                    Left Mb is avialable                             */
                /***********************************************************************/
                u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
                ps_left_ctxt = ps_curr_ctxt - 2;
                ps_left_mb_of_bot = ps_curr_ctxt - 1;
                u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
                                << 1) - 1].u1_mb_fld;
                u1_cur_mb_fld_flag_known = 1;
                u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
            }
            /* if not in the immemdiate row of prev slice end then top
             will be available */
            if(mb_y > (ps_dec->i2_prev_slice_mby + 2))
                i2_prev_slice_mbx = -1;
            if(mb_x > i2_prev_slice_mbx)
            {
                /*********************************************************************/
                /*                    Top Mb is avialable                            */
                /*********************************************************************/
                u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
                u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
                u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;

                /* point to MbAddrB + 1 */
                ps_top_ctxt = ps_curr_ctxt + 1;
                u4_top_mb_pair_fld = ps_top_mb_row[(mb_x << 1)].u1_mb_fld;

                u1_cur_mb_field =
                                u1_cur_mb_fld_flag_known ?
                                                u1_cur_mb_field :
                                                u4_top_mb_pair_fld;
                ps_top_mb_of_bot = u1_cur_mb_field ? ps_top_ctxt : ps_curr_ctxt;

                /* MbAddrB */
                ps_top_ctxt -= (u1_cur_mb_field && u4_top_mb_pair_fld);
            }

            if((mb_x > (i2_prev_slice_mbx - 1))
                            && (mb_x != (u2_frm_width_in_mb - 1)))
            {
                u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
                u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
            }

            if(mb_x > (i2_prev_slice_mbx + 1))
            {
                u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
                u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
            }
        }
        else
        {
            /* Same row */
            if(mb_x > (i2_prev_slice_mbx + 1))
            {
                /***************************************************************/
                /*                    Left Mb is avialable                     */
                /***************************************************************/
                u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;

                u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
                                << 1) - 1].u1_mb_fld;
                ps_left_ctxt = ps_curr_ctxt - 2;
                ps_left_mb_of_bot = ps_curr_ctxt - 1;
                u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
            }
        }
        /*********************************************************/
        /* Check whether the call is from I slice or Inter slice */
        /*********************************************************/
        if(u4_mbskip)
        {
            UWORD32 u4_ctx_inc = 2
                            - ((!!(ps_top_ctxt->u1_mb_type & CAB_SKIP_MASK))
                                            + (!!(ps_left_ctxt->u1_mb_type
                                                            & CAB_SKIP_MASK)));
            dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
            decoding_envirnoment_t *ps_cab_dec_env = &ps_dec->s_cab_dec_env;
            bin_ctxt_model_t *p_mb_skip_flag_t = ps_dec->p_mb_skip_flag_t;

            ps_dec->u4_next_mb_skip = 0;
            u4_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
                                          ps_bitstrm, ps_cab_dec_env);

            if(u4_mbskip)
            {
                UWORD32 u4_next_mbskip;
                ps_curr_ctxt->u1_mb_type = CAB_SKIP;

                u4_ctx_inc =
                                2
                                                - ((!!(ps_top_mb_of_bot->u1_mb_type
                                                                & CAB_SKIP_MASK))
                                                                + (!!(ps_left_mb_of_bot->u1_mb_type
                                                                                & CAB_SKIP_MASK)));

                /* Decode the skip u4_flag of bottom Mb */
                u4_next_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
                                                   ps_bitstrm,
                                                   ps_cab_dec_env);

                ps_dec->u4_next_mb_skip = u4_next_mbskip;

                if(!u4_next_mbskip)
                {
                    u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;

                    u1_cur_mb_field = ih264d_decode_bin(
                                    u4_ctx_inc, ps_dec->p_mb_field_dec_flag_t,
                                    ps_bitstrm, ps_cab_dec_env);
                }
            }
        }

        if(!u4_mbskip)
        {
            UWORD32 u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;
            u1_cur_mb_field = ih264d_decode_bin(u4_ctx_inc,
                                                ps_dec->p_mb_field_dec_flag_t,
                                                ps_dec->ps_bitstrm,
                                                &ps_dec->s_cab_dec_env);
        }

        ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
        ps_dec->u2_top_left_mask = u2_top_left_mask;
        ps_dec->u2_top_right_mask = u2_top_right_mask;
        ps_dec->u2_mby = mb_y;
        ps_dec->u2_mbx = mb_x;
    }
    else
    {
        u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
        u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
        u2_top_left_mask = ps_dec->u2_top_left_mask;
        u2_top_right_mask = ps_dec->u2_top_right_mask;
        ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1) + 1;

        if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
        {
            u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x << 1) - 1].u1_mb_fld;

            /* point to A if top else A+1 */
            ps_left_ctxt = ps_curr_ctxt - 2
                            - (u4_left_mb_pair_fld != u1_cur_mb_field);
        }

        if(u1_cur_mb_field)
        {
            if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
            {
                /* point to MbAddrB + 1 */
                ps_top_ctxt = ps_curr_ctxt;
            }
        }
        else
        {
            /* Top is available */
            u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
            u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
            u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
            /* Top Right not available */
            u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
            u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);

            if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
            {
                u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
                u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
                u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
            }

            /* CurMbAddr - 1 */
            ps_top_ctxt = ps_curr_ctxt - 1;
        }

        if(u4_mbskip)
        {
            if(ps_curr_ctxt[-1].u1_mb_type & CAB_SKIP_MASK)
            {
                /* If previous mb is skipped, return value of next mb skip */
                u4_mbskip = ps_dec->u4_next_mb_skip;

            }
            else
            {
                /* If previous mb is not skipped then call DecMbSkip */
                UWORD32 u4_ctx_inc =
                                2
                                                - ((!!(ps_top_ctxt->u1_mb_type
                                                                & CAB_SKIP_MASK))
                                                                + (!!(ps_left_ctxt->u1_mb_type
                                                                                & CAB_SKIP_MASK)));

                u4_mbskip = ih264d_decode_bin(u4_ctx_inc,
                                              ps_dec->p_mb_skip_flag_t,
                                              ps_dec->ps_bitstrm,
                                              &ps_dec->s_cab_dec_env);
            }
        }
    }

    ps_cur_mb_info->u2_mbx = mb_x;
    ps_cur_mb_info->u2_mby = mb_y;
    ps_cur_mb_info->u1_topmb = u1_top_mb;
    ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
    ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
    ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
    ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
    ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;

    ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
    {
        ih264d_get_cabac_context_mbaff(ps_dec, ps_cur_mb_info, u4_mbskip);
    }

    {
        bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;

        if(u1_cur_mb_field)
        {
            p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FLD;
        }
        else
        {
            p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FRAME;
        }
        {
            bin_ctxt_model_t * * p_significant_coeff_flag_t =
                            ps_dec->p_significant_coeff_flag_t;
            p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_0_OFFSET;
            p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_1_OFFSET;
            p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_2_OFFSET;
            p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_3_OFFSET;
            p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_4_OFFSET;
            p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t
                            + SIG_COEFF_CTXT_CAT_5_OFFSET;

        }
    }
    return (u4_mbskip);
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_get_cabac_context_mbaff                                  */
/*                                                                           */
/*  Description   : Gets the current macroblock Cabac Context and sets the   */
/*                  top and left cabac context ptrs in CtxIncMbMap           */
/*                  1. For Coss field left neigbours it alters coded block   */
/*                     u4_flag , motion vectors, reference indices, cbp of      */
/*                     the left neigbours which increases the code i4_size      */
/*                  2. For Coss field top neigbours it alters motion         */
/*                     vectors reference indices of the top neigbours        */
/*                     which further increases the code i4_size                 */
/*                                                                           */
/*  Inputs        : 1. dec_struct_t                                             */
/*                  2. CurMbAddr used for Mbaff (only to see if curMB        */
/*                  is top or bottom)                                        */
/*                  3. uc_curMbFldDecFlag only for Mbaff                     */
/*                                                                           */
/*  Returns       : 0                                                        */
/*                                                                           */
/*  Issues        : code i4_size can be reduced if ui_CodedBlockFlag storage    */
/*                  structure in context is changed. This change however     */
/*                  would break the parseResidual4x4Cabac asm routine.       */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         18 06 2005   Jay                                                  */
/*                                                                           */
/*****************************************************************************/
UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec,
                                       dec_mb_info_t *ps_cur_mb_info,
                                       UWORD32 u4_mbskip)
{
    const UWORD8 u1_mb_ngbr_availablity = ps_dec->u1_mb_ngbr_availablity;
    ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;

    UWORD8 (*pu1_left_mv_ctxt_inc_2d)[4] = &ps_dec->pu1_left_mv_ctxt_inc[0];
    WORD8 (*pi1_left_ref_idx_ctxt_inc) = ps_dec->pi1_left_ref_idx_ctxt_inc;
    const UWORD8 u1_cur_mb_fld_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
    const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
    const UWORD8 uc_botMb = 1 - ps_cur_mb_info->u1_topmb;

    ctxt_inc_mb_info_t * ps_leftMB;

    ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + (ps_dec->u2_mbx << 1);
    ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;

    if(u1_topmb)
    {
        pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[0];
        pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
        ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb;
    }
    else
    {
        /* uc_botMb */
        pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[1];
        pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];
        ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_bot_mb;
        ps_dec->ps_curr_ctxt_mb_info += 1;
    }

    ps_dec->pu1_left_mv_ctxt_inc = pu1_left_mv_ctxt_inc_2d;
    ps_dec->pi1_left_ref_idx_ctxt_inc = pi1_left_ref_idx_ctxt_inc;

    if(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
    {
        const UWORD8 u1_left_mb_fld_flag = ps_cur_mb_info->ps_left_mb->u1_mb_fld;

        ps_leftMB = ps_dec->ps_curr_ctxt_mb_info - 2;
        if(u1_left_mb_fld_flag != u1_cur_mb_fld_flag)
        {
            ctxt_inc_mb_info_t *ps_tempLeft;
            UWORD8 u1_cbp_t, u1_cbp_b;
            UWORD8 u1_cr_cpb;

            ps_leftMB -= uc_botMb;
            ps_tempLeft = ps_dec->ps_left_mb_ctxt_info;
            ps_tempLeft->u1_mb_type = ps_leftMB->u1_mb_type;
            ps_tempLeft->u1_intra_chroma_pred_mode =
                            ps_leftMB->u1_intra_chroma_pred_mode;

            ps_tempLeft->u1_transform8x8_ctxt = ps_leftMB->u1_transform8x8_ctxt;

            u1_cr_cpb = ps_leftMB->u1_cbp;
            /*****************************************************************/
            /* reform RefIdx, CBP, MV and CBF ctxInc taking care of A and A+1*/
            /*****************************************************************/
            if(u1_cur_mb_fld_flag)
            {
                /* current MB is a FLD and left a FRM */
                UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_top)[4] =
                                ps_dec->u1_left_mv_ctxt_inc_arr[0];
                UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_bot)[4] =
                                ps_dec->u1_left_mv_ctxt_inc_arr[1];
                WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_top) =
                                &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
                WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_bot) =
                                &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];

                u1_cbp_t = ps_leftMB->u1_cbp;
                u1_cbp_b = (ps_leftMB + 1)->u1_cbp;
                ps_tempLeft->u1_cbp = (u1_cbp_t & 0x02)
                                | ((u1_cbp_b & 0x02) << 2);

                // set motionvectors as
                // 0T = 0T  0B = 0T
                // 1T = 2T  1B = 2T
                // 2T = 0B  2B = 0B
                // 3T = 2B  3B = 2B
                if(u1_topmb)
                {
                    /********************************************/
                    /*    Bottoms  DC CBF = Top DC CBF          */
                    /********************************************/
                    ps_dec->u1_yuv_dc_csbp_bot_mb =
                                    ps_dec->u1_yuv_dc_csbp_topmb;

                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[2];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[2];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[0];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[0];

                    i1_left_ref_idx_ctxt_inc_arr_top[1] =
                                    i1_left_ref_idx_ctxt_inc_arr_bot[0];
                    i1_left_ref_idx_ctxt_inc_arr_top[3] =
                                    i1_left_ref_idx_ctxt_inc_arr_bot[2];

                    *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_bot) =
                                    *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_top);

                    memcpy(pu1_left_mv_ctxt_inc_2d_arr_bot,
                           pu1_left_mv_ctxt_inc_2d_arr_top, 16);
                }

                {
                    UWORD8 i;
                    for(i = 0; i < 4; i++)
                    {
                        pu1_left_mv_ctxt_inc_2d[i][1] >>= 1;
                        pu1_left_mv_ctxt_inc_2d[i][3] >>= 1;
                    }
                }
            }
            else
            {
                /* current MB is a FRM and left FLD */
                if(u1_topmb)
                {
                    u1_cbp_t = ps_leftMB->u1_cbp;
                    u1_cbp_t = (u1_cbp_t & 0x02);
                    ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t << 2));

                    /********************************************/
                    /*    Bottoms  DC CBF = Top DC CBF          */
                    /********************************************/
                    ps_dec->u1_yuv_dc_csbp_bot_mb =
                                    ps_dec->u1_yuv_dc_csbp_topmb;

                    // set motionvectors as
                    // 3B = 2B = 3T
                    // 1B = 0B = 2T
                    // 3T = 2T = 1T
                    // 1T = 0T = 0T

                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[7] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[6] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];

                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[5] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[4] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];

                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];
                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];

                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
                                    *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0];

                    pi1_left_ref_idx_ctxt_inc[7] = (pi1_left_ref_idx_ctxt_inc[3]
                                    - 1);
                    pi1_left_ref_idx_ctxt_inc[6] = (pi1_left_ref_idx_ctxt_inc[3]
                                    - 1);

                    pi1_left_ref_idx_ctxt_inc[5] = (pi1_left_ref_idx_ctxt_inc[1]
                                    - 1);
                    pi1_left_ref_idx_ctxt_inc[4] = (pi1_left_ref_idx_ctxt_inc[1]
                                    - 1);

                    pi1_left_ref_idx_ctxt_inc[3] = (pi1_left_ref_idx_ctxt_inc[2]
                                    - 1);
                    pi1_left_ref_idx_ctxt_inc[2] = (pi1_left_ref_idx_ctxt_inc[2]
                                    - 1);

                    pi1_left_ref_idx_ctxt_inc[1] = (pi1_left_ref_idx_ctxt_inc[0]
                                    - 1);
                    pi1_left_ref_idx_ctxt_inc[0] = (pi1_left_ref_idx_ctxt_inc[0]
                                    - 1);
                }
                else
                {
                    u1_cbp_t = ps_leftMB->u1_cbp;
                    u1_cbp_t = (u1_cbp_t & 0x08);
                    ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t >> 2));
                }

                {
                    UWORD8 i;
                    for(i = 0; i < 4; i++)
                    {
                        pu1_left_mv_ctxt_inc_2d[i][1] <<= 1;
                        pu1_left_mv_ctxt_inc_2d[i][3] <<= 1;
                    }
                }

            }

            ps_tempLeft->u1_cbp = ps_tempLeft->u1_cbp + ((u1_cr_cpb >> 4) << 4);
            ps_leftMB = ps_tempLeft;
        }

        ps_dec->p_left_ctxt_mb_info = ps_leftMB;
    }
    else
    {
        ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
        if(!u4_mbskip)
        {
            *(ps_dec->pu1_left_yuv_dc_csbp) = 0;

            MEMSET_16BYTES(&pu1_left_mv_ctxt_inc_2d[0][0], 0);
            *(UWORD32 *)pi1_left_ref_idx_ctxt_inc = 0;
        }
    }

    /*************************************************************************/
    /*                Now get the top context mb info                        */
    /*************************************************************************/
    {
        UWORD8 (*u1_top_mv_ctxt_inc_arr_2d)[4] =
                        ps_dec->ps_curr_ctxt_mb_info->u1_mv;
        WORD8 (*pi1_top_ref_idx_ctxt_inc) =
                        ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx;
        UWORD8 uc_topMbFldDecFlag = ps_cur_mb_info->ps_top_mb->u1_mb_fld;

        if(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
        {
            if(ps_cur_mb_info->i1_offset)
                ps_dec->p_top_ctxt_mb_info += 1;

            if(!u4_mbskip)
            {
                memcpy(u1_top_mv_ctxt_inc_arr_2d,
                       &ps_dec->p_top_ctxt_mb_info->u1_mv, 16);
                memcpy(pi1_top_ref_idx_ctxt_inc,
                       &ps_dec->p_top_ctxt_mb_info->i1_ref_idx, 4);
                if(uc_topMbFldDecFlag ^ u1_cur_mb_fld_flag)
                {
                    UWORD8 i;
                    if(u1_cur_mb_fld_flag)
                    {
                        for(i = 0; i < 4; i++)
                        {
                            u1_top_mv_ctxt_inc_arr_2d[i][1] >>= 1;
                            u1_top_mv_ctxt_inc_arr_2d[i][3] >>= 1;
                        }
                    }
                    else
                    {
                        for(i = 0; i < 4; i++)
                        {
                            u1_top_mv_ctxt_inc_arr_2d[i][1] <<= 1;
                            u1_top_mv_ctxt_inc_arr_2d[i][3] <<= 1;
                            pi1_top_ref_idx_ctxt_inc[i] -= 1;
                        }
                    }
                }
            }
        }
        else
        {
            ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;
            if(!u4_mbskip)
            {

                MEMSET_16BYTES(&u1_top_mv_ctxt_inc_arr_2d[0][0], 0);
                memset(pi1_top_ref_idx_ctxt_inc, 0, 4);
            }
        }
    }

    return OK;
}

/*****************************************************************************/
/*                                                                           */
/*  Function Name : ih264d_update_mbaff_left_nnz                                    */
/*                                                                           */
/*  Description   : This function updates the left luma and chroma nnz for   */
/*                  mbaff cases.                                             */
/*                                                                           */
/*  Inputs        : <What inputs does the function take?>                    */
/*  Globals       : <Does it use any global variables?>                      */
/*  Processing    : <Describe how the function operates - include algorithm  */
/*                  description>                                             */
/*  Outputs       : <What does the function produce?>                        */
/*  Returns       : <What does the function return?>                         */
/*                                                                           */
/*  Issues        : <List any issues or problems with this function>         */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         13 07 2002   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/
void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec,
                                  dec_mb_info_t * ps_cur_mb_info)
{
    UWORD32 *pu4_buf;
    UWORD8 *pu1_buf;
    if(ps_cur_mb_info->u1_topmb)
    {
        pu1_buf = ps_dec->pu1_left_nnz_y;
        pu4_buf = (UWORD32 *)pu1_buf;
        ps_dec->u4_n_left_temp_y = *pu4_buf;

        pu1_buf = ps_dec->pu1_left_nnz_uv;
        pu4_buf = (UWORD32 *)pu1_buf;
        ps_dec->u4_n_left_temp_uv = *pu4_buf;
    }
    else
    {

        ps_dec->u4_n_leftY[0] = ps_dec->u4_n_left_temp_y;
        pu1_buf = ps_dec->pu1_left_nnz_y;
        pu4_buf = (UWORD32 *)pu1_buf;
        ps_dec->u4_n_leftY[1] = *pu4_buf;
        ps_dec->u4_n_left_cr[0] = ps_dec->u4_n_left_temp_uv;
        pu1_buf = ps_dec->pu1_left_nnz_uv;
        pu4_buf = (UWORD32 *)pu1_buf;
        ps_dec->u4_n_left_cr[1] = *pu4_buf;

    }
}

/*!
 **************************************************************************
 * \if Function name : ih264d_get_mbaff_neighbours \endif
 *
 * \brief
 *    Gets the neighbors for the current MB if it is of type MB-AFF
 *  frame.
 *
 * \return
 *    None
 *
 **************************************************************************
 */
void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec,
                                 dec_mb_info_t * ps_cur_mb_info,
                                 UWORD8 uc_curMbFldDecFlag)
{

    mb_neigbour_params_t *ps_left_mb;
    mb_neigbour_params_t *ps_top_mb;
    mb_neigbour_params_t *ps_top_right_mb = NULL;
    mb_neigbour_params_t *ps_curmb;
    const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
    const UWORD8 uc_botMb = 1 - u1_topmb;
    const UWORD32 u4_mb_x = ps_cur_mb_info->u2_mbx;

    /* Current MbParams location in top row buffer */
    ps_curmb = ps_dec->ps_cur_mb_row + (u4_mb_x << 1) + uc_botMb;
    ps_left_mb = ps_curmb - 2;
    /* point to A if top else A+1 */
    if(uc_botMb && (ps_left_mb->u1_mb_fld != uc_curMbFldDecFlag))
    {
        /* move from A + 1 to A */
        ps_left_mb--;
    }
    ps_cur_mb_info->i1_offset = 0;
    if((uc_curMbFldDecFlag == 0) && uc_botMb)
    {
        mb_neigbour_params_t *ps_topleft_mb;
        /* CurMbAddr - 1 */
        ps_top_mb = ps_curmb - 1;

        /* Mark Top right Not available */
        /* point to A */
        ps_topleft_mb = ps_curmb - 3;

        if(ps_topleft_mb->u1_mb_fld)
        {
            /* point to A + 1 */
            ps_topleft_mb++;
        }
        ps_cur_mb_info->u1_topleft_mb_fld = ps_topleft_mb->u1_mb_fld;
        ps_cur_mb_info->u1_topleft_mbtype = ps_topleft_mb->u1_mb_type;
    }
    else
    {
        /* Top = B + 1 */
        ps_top_mb = ps_dec->ps_top_mb_row + (u4_mb_x << 1) + 1;
        ps_top_right_mb = ps_top_mb + 2;
        ps_cur_mb_info->i1_offset = 4;
        /* TopRight =  C + 1 */

        /* TopLeft = D+1 */
        ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld_bot;
        ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype_bot;

        if(uc_curMbFldDecFlag && u1_topmb)
        {
            if(ps_top_mb->u1_mb_fld)
            {
                /* MbAddrB */
                ps_top_mb--;
                ps_cur_mb_info->i1_offset = 0;
            }
            /* If topright is field then point to C */
            ps_top_right_mb -= ps_top_right_mb->u1_mb_fld ? 1 : 0;
            if(ps_cur_mb_info->u1_topleft_mb_fld)
            {
                /* TopLeft = D */
                ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld;
                ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
            }
        }
    }
    if(u1_topmb)
    {
        /* Update the parameters of topleftmb*/
        ps_dec->u1_topleft_mb_fld = ps_top_mb->u1_mb_fld;
        ps_dec->u1_topleft_mbtype = ps_top_mb->u1_mb_type;
        /* Set invscan and dequantMatrixScan*/
        if(uc_curMbFldDecFlag)
        {
            ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
        }
        else
        {
            ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
        }
        ps_dec->pu2_quant_scale_y =
                        gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6];
        ps_dec->pu2_quant_scale_u =
                        gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6];
        ps_dec->pu2_quant_scale_v =
                        gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6];

    }
    else
    {
        /* Update the parameters of topleftmb*/
        mb_neigbour_params_t *ps_top_mb_temp = ps_dec->ps_top_mb_row
                        + (u4_mb_x << 1) + 1;
        ps_dec->u1_topleft_mb_fld_bot = ps_top_mb_temp->u1_mb_fld;
        ps_dec->u1_topleft_mbtype_bot = ps_top_mb_temp->u1_mb_type;
    }

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

    {
        /* Form Left NNZ */
        UWORD8 u1_is_left_mb_fld = ps_left_mb->u1_mb_fld;
        UWORD8 *pu1_left_mb_pair_nnz_y = (UWORD8 *)&ps_dec->u4_n_leftY[0];
        UWORD8 *pu1_left_mb_pair_nnz_uv = (UWORD8 *)&ps_dec->u4_n_left_cr[0];
        UWORD8 *pu1_left_nnz_y = ps_dec->pu1_left_nnz_y;
        UWORD8 *pu1_left_nnz_uv = ps_dec->pu1_left_nnz_uv;

        if(uc_curMbFldDecFlag == u1_is_left_mb_fld)
        {
            *(UWORD32 *)pu1_left_nnz_y = *(UWORD32 *)(pu1_left_mb_pair_nnz_y
                            + (uc_botMb << 2));
            *(UWORD32 *)pu1_left_nnz_uv = *(UWORD32 *)(pu1_left_mb_pair_nnz_uv
                            + (uc_botMb << 2));
        }
        else if((uc_curMbFldDecFlag == 0) && u1_topmb && u1_is_left_mb_fld)
        {
            /* 0 0 1 1 of u4_n_leftY[0], 0 0 2 2 of u4_n_left_cr[0] */
            pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[0];
            pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[1];
            pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
                            pu1_left_mb_pair_nnz_uv[0];
            pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
                            pu1_left_mb_pair_nnz_uv[2];
        }
        else if((uc_curMbFldDecFlag == 0) && uc_botMb && u1_is_left_mb_fld)
        {
            /* 2 2 3 3 of u4_n_leftY[0] , 1 1 3 3 of u4_n_left_cr[0] */
            pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
            pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[3];
            pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
                            pu1_left_mb_pair_nnz_uv[1];
            pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
                            pu1_left_mb_pair_nnz_uv[3];
        }
        else
        {
            /* 0 2 0 2 of u4_n_leftY[0], u4_n_leftY[1] */
            pu1_left_nnz_y[0] = pu1_left_mb_pair_nnz_y[0];
            pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
            pu1_left_nnz_y[2] = pu1_left_mb_pair_nnz_y[4 + 0];
            pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[4 + 2];

            /* 0 of u4_n_left_cr[0] and 0 u4_n_left_cr[1]
             2 of u4_n_left_cr[0] and 2 u4_n_left_cr[1] */
            pu1_left_nnz_uv[0] = pu1_left_mb_pair_nnz_uv[0];
            pu1_left_nnz_uv[1] = pu1_left_mb_pair_nnz_uv[4 + 0];
            pu1_left_nnz_uv[2] = pu1_left_mb_pair_nnz_uv[2];
            pu1_left_nnz_uv[3] = pu1_left_mb_pair_nnz_uv[4 + 2];
        }
    }
}

/*
 **************************************************************************
 * \if Function name : ih264d_transfer_mb_group_data \endif
 *
 * \brief
 *     Transfer the Following things
 *     N-Mb DeblkParams Data    ( To Ext DeblkParams Buffer )
 *     N-Mb Recon Data          ( To Ext Frame Buffer )
 *     N-Mb Intrapredline Data  ( Updated Internally)
 *     N-Mb MV Data             ( To Ext MV Buffer )
 *     N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)
 *
 * \return
 *    None
 *
 **************************************************************************
 */
void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,
                                   const UWORD8 u1_num_mbs,
                                   const UWORD8 u1_end_of_row, /* Cur n-Mb End of Row Flag */
                                   const UWORD8 u1_end_of_row_next /* Next n-Mb End of Row Flag */
                                   )
{
    dec_mb_info_t *ps_cur_mb_info = ps_dec->ps_nmb_info;
    tfr_ctxt_t *ps_trns_addr = &ps_dec->s_tran_addrecon;
    UWORD16 u2_mb_y;
    UWORD32 y_offset;
    UWORD32 u4_frame_stride;
    mb_neigbour_params_t *ps_temp;
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    UNUSED(u1_end_of_row_next);

    ps_trns_addr->pu1_dest_y += ps_trns_addr->u4_inc_y[u1_end_of_row];
    ps_trns_addr->pu1_dest_u += ps_trns_addr->u4_inc_uv[u1_end_of_row];
    ps_trns_addr->pu1_dest_v += ps_trns_addr->u4_inc_uv[u1_end_of_row];

    /* Swap top and current pointers */
    if(u1_end_of_row)
    {

        if(ps_dec->u1_separate_parse)
        {
            u2_mb_y = ps_dec->i2_dec_thread_mb_y;
        }
        else
        {
            ps_temp = ps_dec->ps_cur_mb_row;
            ps_dec->ps_cur_mb_row = ps_dec->ps_top_mb_row;
            ps_dec->ps_top_mb_row = ps_temp;

            u2_mb_y = ps_dec->u2_mby + (1 + u1_mbaff);
        }

        u4_frame_stride = ps_dec->u2_frm_wd_y
                        << ps_dec->ps_cur_slice->u1_field_pic_flag;
        y_offset = (u2_mb_y * u4_frame_stride) << 4;
        ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + y_offset;

        u4_frame_stride = ps_dec->u2_frm_wd_uv
                        << ps_dec->ps_cur_slice->u1_field_pic_flag;
        y_offset = (u2_mb_y * u4_frame_stride) << 3;
        ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + y_offset;
        ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + y_offset;

        ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
        ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
        ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
    }

    /*
     * The Slice boundary is also a valid condition to transfer. So recalculate
     * the Left increment, in case the number of MBs is lesser than the
     * N MB value. u1_num_mbs will be equal to N of N MB if the entire N Mb is
     * decoded.
     */
    ps_dec->s_tran_addrecon.u2_mv_left_inc = ((u1_num_mbs >> u1_mbaff) - 1)
                    << (4 + u1_mbaff);
    ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (u1_num_mbs << 2) - 1
                    - (u1_mbaff << 2);

    if(ps_dec->u1_separate_parse == 0)
    {
        /* reassign left MV and cur MV pointers */
        ps_dec->ps_mv_left = ps_dec->ps_mv_cur
                        + ps_dec->s_tran_addrecon.u2_mv_left_inc;

        ps_dec->ps_mv_cur += (u1_num_mbs << 4);
    }

    /* Increment deblock parameters pointer in external memory */

    if(ps_dec->u1_separate_parse == 1)
    {
        ps_dec->ps_deblk_mbn_dec_thrd += u1_num_mbs;
    }
    else
    {
        ps_dec->ps_deblk_mbn += u1_num_mbs;
    }

}

