/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * 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.
 * -------------------------------------------------------------------
 */
/*
------------------------------------------------------------------------------
 INPUT AND OUTPUT DEFINITIONS

 Inputs:
	xpred = x-axis coordinate of the MB used for prediction (int)
	ypred = y-axis coordinate of the MB used for prediction (int)
	pp_dec_y = pointer to the post processing semaphore for current
		   luminance frame (uint8)
	pstprcTypPrv = pointer the previous frame's post processing type
	               (uint8)
	ll = pointer to the buffer (int)
	mv_loc = flag indicating location of the motion compensated
		 (x,y) position with respect to the luminance MB (int);
		 0 -> inside MB, 1 -> outside MB
	dx = horizontal component of the motion vector (int)
	dy = vertical component of the motion vector (int)
	mvwidth = number of blocks per row (int)
	width = luminance VOP width in pixels (int)
	height = luminance VOP height in pixels (int)

 Local Stores/Buffers/Pointers Needed:
	None

 Global Stores/Buffers/Pointers Needed:
	None

 Outputs:
	msk_deblock = flag that indicates whether deblocking is to be
		      performed (msk_deblock = 0) or not (msk_deblock =
		      1) (uint8)

 Pointers and Buffers Modified:
	pp_dec_y contents are the updated semapohore propagation data

 Local Stores Modified:
	None

 Global Stores Modified:
	None

------------------------------------------------------------------------------
 FUNCTION DESCRIPTION

 This functions performs post processing semaphore propagation processing
 after luminance prediction.

*/


/*----------------------------------------------------------------------------
; INCLUDES
----------------------------------------------------------------------------*/
#include	"mp4dec_api.h"
#include	"mp4def.h"

/*----------------------------------------------------------------------------
; MACROS
; Define module specific macros here
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; DEFINES
; Include all pre-processor statements here. Include conditional
; compile variables also.
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL FUNCTION DEFINITIONS
; Function Prototype declaration
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
; Variable declaration - defined here and used outside this module
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; EXTERNAL FUNCTION REFERENCES
; Declare functions defined elsewhere and referenced in this module
----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
; Declare variables used in this module but defined elsewhere
----------------------------------------------------------------------------*/
#ifdef PV_POSTPROC_ON
#ifdef __cplusplus
extern "C"
{
#endif
    /*----------------------------------------------------------------------------
    ; FUNCTION CODE
    ----------------------------------------------------------------------------*/
    uint8 pp_semaphore_luma(
        int	xpred,		/* i */
        int	ypred,		/* i */
        uint8   *pp_dec_y,	/* i/o */
        uint8   *pstprcTypPrv,	/* i */
        int	*ll,		/* i */
        int	*mv_loc,	/* i/o */
        int	dx,		/* i */
        int	dy,		/* i */
        int	mvwidth,	/* i */
        int	width,		/* i */
        int	height		/* i */
    )
    {
        /*----------------------------------------------------------------------------
        ; Define all local variables
        ----------------------------------------------------------------------------*/
        int kk, mmvy, mmvx, nmvx, nmvy;
        uint8	*pp_prev1, *pp_prev2, *pp_prev3, *pp_prev4;
        uint8	msk_deblock = 0;		/*  11/3/00 */

        /*----------------------------------------------------------------------------
        ; Function body here
        ----------------------------------------------------------------------------*/
        /* Interframe Processing - 1 MV per MB */

        /* check whether the MV points outside the frame */
        if (xpred >= 0 && xpred <= ((width << 1) - (2*MB_SIZE)) && ypred >= 0 &&
                ypred <= ((height << 1) - (2*MB_SIZE)))
        {	/*****************************/
            /* (x,y) is inside the frame */
            /*****************************/

            /*  10/24/2000 post_processing semaphore */
            /* generation */

            /*  10/23/2000 no boundary checking*/
            *mv_loc = 0;

            /* Calculate block x coordinate. Divide by 16 is for  */
            /* converting half-pixel resolution to block          */
            mmvx = xpred >> 4;

            /* Calculate block y coordinate. Divide by 16 is for */
            /* converting half-pixel resolution to block         */
            mmvy = ypred >> 4;

            /* Find post processing semaphore location for block */
            /* used for prediction, i.e., 			     */
            /* pp_prev1 = &pstprcTypPrv[mmvy*mvwidth][mmvx]	     */
            pp_prev1 = pstprcTypPrv + mmvx + mmvy * mvwidth;

            /* Check if MV is a multiple of 16 */
            if ((dx&0xF) != 0)
            {	/* dx is not a multiple of 16 */

                /* pp_prev2 is the block to the right of */
                /* pp_prev1 block			 */
                pp_prev2 = pp_prev1 + 1;

                if ((dy&0xF) != 0)
                {	/* dy is not a multiple of 16 */

                    /* pp_prev3 is the block below */
                    /* pp_prev1 block	       */
                    pp_prev3 = pp_prev1 + mvwidth;
                }
                else
                {	/* dy is a multiple of 16 */

                    pp_prev3 = pp_prev1;
                }

                /* pp_prev4 is the block to the right of */
                /* pp_prev3 block.			 */
                pp_prev4 = pp_prev3 + 1;
            }
            else
            {	/* dx is a multiple of 16 */

                pp_prev2 = pp_prev1;

                if ((dy&0xF) != 0)
                {	/* dy is not a multiple of 16 */

                    /* pp_prev3 is the block below */
                    /* pp_prev1 block.	       */
                    pp_prev3 = pp_prev1 + mvwidth;
                }
                else
                {	/* dy is a multiple of 16 */

                    pp_prev3 = pp_prev1;
                    msk_deblock = 0x3;
                }

                pp_prev4 = pp_prev3;
            }

            /* Perform post processing semaphore propagation for each */
            /* of the 4 blocks in a MB.				  */
            for (kk = 0; kk < 4; kk++)
            {
                /* Deringing semaphore propagation */
                if ((*(pp_dec_y) & 4) == 0)
                {
                    *(pp_dec_y) |= ((*(pp_prev1) | *(pp_prev2) |
                                     *(pp_prev3) | *(pp_prev4)) & 0x4);
                }
                /* Deblocking semaphore propagation */
                /*  11/3/00, change the propagation for deblocking */
                if (msk_deblock == 0)
                {
                    *(pp_dec_y) = 0;
                }

                pp_dec_y += ll[kk];
                pp_prev1 += ll[kk];
                pp_prev2 += ll[kk];
                pp_prev3 += ll[kk];
                pp_prev4 += ll[kk];
            }

        }
        else
        {	/******************************/
            /* (x,y) is outside the frame */
            /******************************/

            /*  10/24/2000 post_processing semaphore */
            /* generation */

            /*  10/23/2000 boundary checking*/
            *mv_loc = 1;

            /* Perform post processing semaphore propagation for each */
            /* of the 4 blocks in a MB.				  */
            for (kk = 0; kk < 4; kk++)
            {
                /* Calculate block x coordinate and round (?).  */
                /* Divide by 16 is for converting half-pixel    */
                /* resolution to block.				*/
                mmvx = (xpred + ((kk & 1) << 3)) >> 4;
                nmvx = mmvx;

                /* Calculate block y coordinate and round (?).  */
                /* Divide by 16 is for converting half-pixel    */
                /* resolution to block.				*/
                mmvy = (ypred + ((kk & 2) << 2)) >> 4;
                nmvy = mmvy;

                /* Perform boundary checking */
                if (nmvx < 0)
                {
                    nmvx = 0;
                }
                else if (nmvx > mvwidth - 1)
                {
                    nmvx = mvwidth - 1;
                }

                if (nmvy < 0)
                {
                    nmvy = 0;
                }
                else if (nmvy > (height >> 3) - 1)
                {
                    nmvy = (height >> 3) - 1;
                }

                /* Find post processing semaphore location for block */
                /* used for prediction, i.e., 			     */
                /* pp_prev1 = &pstprcTypPrv[nmvy*mvwidth][nmvx]	     */
                pp_prev1 = pstprcTypPrv + nmvx + nmvy * mvwidth;

                /* Check if x component of MV is a multiple of 16    */
                /* and check if block x coordinate is out of bounds  */
                if (((dx&0xF) != 0) && (mmvx + 1 < mvwidth - 1))
                {	/* dx is not a multiple of 16 and the block */
                    /* x coordinate is within the bounds        */

                    /* pp_prev2 is the block to the right of */
                    /* pp_prev1 block			 */
                    pp_prev2 = pp_prev1 + 1;

                    /* Check if y component of MV is a multiple */
                    /* of 16 and check if block y coordinate is */
                    /* out of bounds			    */
                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
                    {	/* dy is not a multiple of 16 and */
                        /* the block y coordinate is      */
                        /* within the bounds              */

                        /* pp_prev3 is the block below */
                        /* pp_prev1 block	       */
                        pp_prev3 = pp_prev1 + mvwidth;

                        /* all prediction are from different blocks */
                        msk_deblock = 0x3;
                    }
                    else
                    {	/* dy is a multiple of 16 or the block */
                        /* y coordinate is out of bounds       */

                        pp_prev3 = pp_prev1;
                    }

                    /* pp_prev4 is the block to the right of */
                    /* pp_prev3 block.			 */
                    pp_prev4 = pp_prev3 + 1;
                }
                else
                {	/* dx is a multiple of 16 or the block x */
                    /* coordinate is out of bounds           */

                    pp_prev2 = pp_prev1;

                    /* Check if y component of MV is a multiple */
                    /* of 16 and check if block y coordinate is */
                    /* out of bounds			    */
                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
                    {	/* dy is not a multiple of 16 and */
                        /* the block y coordinate is      */
                        /* within the bounds              */

                        /* pp_prev3 is the block below */
                        /* pp_prev1 block.	       */
                        pp_prev3 = pp_prev1 + mvwidth;
                    }
                    else
                    {	/* dy is a multiple of 16 or the block */
                        /* y coordinate is out of bounds       */

                        pp_prev3 = pp_prev1;
                    }

                    pp_prev4 = pp_prev3;
                }

                /* Deringing semaphore propagation */
                if ((*(pp_dec_y)&4) == 0)
                {
                    *(pp_dec_y) |= ((*(pp_prev1) |
                                     *(pp_prev2) | *(pp_prev3) |
                                     *(pp_prev4)) & 0x4);
                }
                /* Deblocking semaphore propagation */
                /*  11/3/00, change the propaga= */
                /* tion for deblocking */
                if (msk_deblock == 0)
                {
                    *(pp_dec_y) = 0;
                }

                pp_dec_y += ll[kk];
            }
        }

        /*----------------------------------------------------------------------------
        ; Return nothing or data or data pointer
        ----------------------------------------------------------------------------*/
        return (msk_deblock);
    }
#ifdef __cplusplus
}
#endif
#endif
