13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = x-axis coordinate of the MB used for prediction (int)
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = y-axis coordinate of the MB used for prediction (int)
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_dec_y = pointer to the post processing semaphore for current
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           luminance frame (uint8)
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pstprcTypPrv = pointer the previous frame's post processing type
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   (uint8)
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ll = pointer to the buffer (int)
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mv_loc = flag indicating location of the motion compensated
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         (x,y) position with respect to the luminance MB (int);
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         0 -> inside MB, 1 -> outside MB
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dx = horizontal component of the motion vector (int)
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dy = vertical component of the motion vector (int)
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mvwidth = number of blocks per row (int)
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width = luminance VOP width in pixels (int)
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    height = luminance VOP height in pixels (int)
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    msk_deblock = flag that indicates whether deblocking is to be
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong              performed (msk_deblock = 0) or not (msk_deblock =
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong              1) (uint8)
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_dec_y contents are the updated semapohore propagation data
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong This functions performs post processing semaphore propagation processing
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong after luminance prediction.
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include    "mp4dec_api.h"
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include    "mp4def.h"
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; MACROS
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Define module specific macros here
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; DEFINES
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Include all pre-processor statements here. Include conditional
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; compile variables also.
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL FUNCTION DEFINITIONS
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Prototype declaration
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Variable declaration - defined here and used outside this module
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL FUNCTION REFERENCES
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare functions defined elsewhere and referenced in this module
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare variables used in this module but defined elsewhere
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern "C"
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; FUNCTION CODE
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 pp_semaphore_luma(
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int xpred,      /* i */
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int ypred,      /* i */
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint8   *pp_dec_y,  /* i/o */
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint8   *pstprcTypPrv,  /* i */
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int *ll,        /* i */
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int *mv_loc,    /* i/o */
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int dx,     /* i */
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int dy,     /* i */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int mvwidth,    /* i */
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int width,      /* i */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int height      /* i */
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    )
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*----------------------------------------------------------------------------
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ; Define all local variables
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ----------------------------------------------------------------------------*/
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        int kk, mmvy, mmvx, nmvx, nmvy;
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint8   *pp_prev1, *pp_prev2, *pp_prev3, *pp_prev4;
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        uint8   msk_deblock = 0;        /*  11/3/00 */
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*----------------------------------------------------------------------------
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ; Function body here
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ----------------------------------------------------------------------------*/
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Interframe Processing - 1 MV per MB */
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* check whether the MV points outside the frame */
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (xpred >= 0 && xpred <= ((width << 1) - (2*MB_SIZE)) && ypred >= 0 &&
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ypred <= ((height << 1) - (2*MB_SIZE)))
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {   /*****************************/
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* (x,y) is inside the frame */
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*****************************/
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  10/24/2000 post_processing semaphore */
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* generation */
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  10/23/2000 no boundary checking*/
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *mv_loc = 0;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Calculate block x coordinate. Divide by 16 is for  */
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* converting half-pixel resolution to block          */
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mmvx = xpred >> 4;
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Calculate block y coordinate. Divide by 16 is for */
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* converting half-pixel resolution to block         */
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mmvy = ypred >> 4;
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Find post processing semaphore location for block */
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* used for prediction, i.e.,                */
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* pp_prev1 = &pstprcTypPrv[mmvy*mvwidth][mmvx]      */
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_prev1 = pstprcTypPrv + mmvx + mmvy * mvwidth;
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Check if MV is a multiple of 16 */
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((dx&0xF) != 0)
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {   /* dx is not a multiple of 16 */
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* pp_prev2 is the block to the right of */
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* pp_prev1 block            */
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev2 = pp_prev1 + 1;
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((dy&0xF) != 0)
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dy is not a multiple of 16 */
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev3 is the block below */
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev1 block          */
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev3 = pp_prev1 + mvwidth;
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dy is a multiple of 16 */
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev3 = pp_prev1;
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* pp_prev4 is the block to the right of */
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* pp_prev3 block.           */
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev4 = pp_prev3 + 1;
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {   /* dx is a multiple of 16 */
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev2 = pp_prev1;
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((dy&0xF) != 0)
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dy is not a multiple of 16 */
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev3 is the block below */
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev1 block.         */
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev3 = pp_prev1 + mvwidth;
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dy is a multiple of 16 */
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev3 = pp_prev1;
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    msk_deblock = 0x3;
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev4 = pp_prev3;
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Perform post processing semaphore propagation for each */
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* of the 4 blocks in a MB.               */
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (kk = 0; kk < 4; kk++)
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Deringing semaphore propagation */
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((*(pp_dec_y) & 4) == 0)
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *(pp_dec_y) |= ((*(pp_prev1) | *(pp_prev2) |
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                     *(pp_prev3) | *(pp_prev4)) & 0x4);
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Deblocking semaphore propagation */
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /*  11/3/00, change the propagation for deblocking */
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (msk_deblock == 0)
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *(pp_dec_y) = 0;
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_dec_y += ll[kk];
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev1 += ll[kk];
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev2 += ll[kk];
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev3 += ll[kk];
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev4 += ll[kk];
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {   /******************************/
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* (x,y) is outside the frame */
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /******************************/
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  10/24/2000 post_processing semaphore */
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* generation */
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  10/23/2000 boundary checking*/
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *mv_loc = 1;
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Perform post processing semaphore propagation for each */
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* of the 4 blocks in a MB.               */
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (kk = 0; kk < 4; kk++)
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Calculate block x coordinate and round (?).  */
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Divide by 16 is for converting half-pixel    */
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* resolution to block.             */
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mmvx = (xpred + ((kk & 1) << 3)) >> 4;
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                nmvx = mmvx;
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Calculate block y coordinate and round (?).  */
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Divide by 16 is for converting half-pixel    */
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* resolution to block.             */
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mmvy = (ypred + ((kk & 2) << 2)) >> 4;
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                nmvy = mmvy;
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Perform boundary checking */
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (nmvx < 0)
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    nmvx = 0;
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (nmvx > mvwidth - 1)
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    nmvx = mvwidth - 1;
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (nmvy < 0)
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    nmvy = 0;
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (nmvy > (height >> 3) - 1)
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    nmvy = (height >> 3) - 1;
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Find post processing semaphore location for block */
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* used for prediction, i.e.,                */
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* pp_prev1 = &pstprcTypPrv[nmvy*mvwidth][nmvx]      */
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_prev1 = pstprcTypPrv + nmvx + nmvy * mvwidth;
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Check if x component of MV is a multiple of 16    */
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* and check if block x coordinate is out of bounds  */
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (((dx&0xF) != 0) && (mmvx + 1 < mvwidth - 1))
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dx is not a multiple of 16 and the block */
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* x coordinate is within the bounds        */
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev2 is the block to the right of */
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev1 block            */
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev2 = pp_prev1 + 1;
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* Check if y component of MV is a multiple */
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* of 16 and check if block y coordinate is */
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* out of bounds                */
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {   /* dy is not a multiple of 16 and */
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* the block y coordinate is      */
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* within the bounds              */
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* pp_prev3 is the block below */
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* pp_prev1 block          */
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        pp_prev3 = pp_prev1 + mvwidth;
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* all prediction are from different blocks */
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        msk_deblock = 0x3;
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {   /* dy is a multiple of 16 or the block */
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* y coordinate is out of bounds       */
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        pp_prev3 = pp_prev1;
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev4 is the block to the right of */
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* pp_prev3 block.           */
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev4 = pp_prev3 + 1;
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* dx is a multiple of 16 or the block x */
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* coordinate is out of bounds           */
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev2 = pp_prev1;
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* Check if y component of MV is a multiple */
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* of 16 and check if block y coordinate is */
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* out of bounds                */
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {   /* dy is not a multiple of 16 and */
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* the block y coordinate is      */
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* within the bounds              */
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* pp_prev3 is the block below */
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* pp_prev1 block.         */
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        pp_prev3 = pp_prev1 + mvwidth;
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {   /* dy is a multiple of 16 or the block */
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* y coordinate is out of bounds       */
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        pp_prev3 = pp_prev1;
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    pp_prev4 = pp_prev3;
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Deringing semaphore propagation */
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((*(pp_dec_y)&4) == 0)
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *(pp_dec_y) |= ((*(pp_prev1) |
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                     *(pp_prev2) | *(pp_prev3) |
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                     *(pp_prev4)) & 0x4);
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Deblocking semaphore propagation */
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /*  11/3/00, change the propaga= */
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* tion for deblocking */
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (msk_deblock == 0)
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *(pp_dec_y) = 0;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                pp_dec_y += ll[kk];
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*----------------------------------------------------------------------------
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ; Return nothing or data or data pointer
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ----------------------------------------------------------------------------*/
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return (msk_deblock);
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
379