102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------
202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo
302f5b5447de349216a40086ca6061efefb5a3025James Dong *
402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License");
502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License.
602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at
702f5b5447de349216a40086ca6061efefb5a3025James Dong *
802f5b5447de349216a40086ca6061efefb5a3025James Dong *      http://www.apache.org/licenses/LICENSE-2.0
902f5b5447de349216a40086ca6061efefb5a3025James Dong *
1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software
1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied.
1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions
1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License.
1602f5b5447de349216a40086ca6061efefb5a3025James Dong * -------------------------------------------------------------------
1702f5b5447de349216a40086ca6061efefb5a3025James Dong */
1802f5b5447de349216a40086ca6061efefb5a3025James Dong/*
1902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
2002f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS
2102f5b5447de349216a40086ca6061efefb5a3025James Dong
2202f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs:
2302f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = x-axis coordinate of the MB used for prediction (int)
2402f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = y-axis coordinate of the MB used for prediction (int)
2502f5b5447de349216a40086ca6061efefb5a3025James Dong    pp_dec_y = pointer to the post processing semaphore for current
2602f5b5447de349216a40086ca6061efefb5a3025James Dong           luminance frame (uint8)
2702f5b5447de349216a40086ca6061efefb5a3025James Dong    pstprcTypPrv = pointer the previous frame's post processing type
2802f5b5447de349216a40086ca6061efefb5a3025James Dong                   (uint8)
2902f5b5447de349216a40086ca6061efefb5a3025James Dong    ll = pointer to the buffer (int)
3002f5b5447de349216a40086ca6061efefb5a3025James Dong    mv_loc = flag indicating location of the motion compensated
3102f5b5447de349216a40086ca6061efefb5a3025James Dong         (x,y) position with respect to the luminance MB (int);
3202f5b5447de349216a40086ca6061efefb5a3025James Dong         0 -> inside MB, 1 -> outside MB
3302f5b5447de349216a40086ca6061efefb5a3025James Dong    dx = horizontal component of the motion vector (int)
3402f5b5447de349216a40086ca6061efefb5a3025James Dong    dy = vertical component of the motion vector (int)
3502f5b5447de349216a40086ca6061efefb5a3025James Dong    mvwidth = number of blocks per row (int)
3602f5b5447de349216a40086ca6061efefb5a3025James Dong    width = luminance VOP width in pixels (int)
3702f5b5447de349216a40086ca6061efefb5a3025James Dong    height = luminance VOP height in pixels (int)
3802f5b5447de349216a40086ca6061efefb5a3025James Dong
3902f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
4002f5b5447de349216a40086ca6061efefb5a3025James Dong    None
4102f5b5447de349216a40086ca6061efefb5a3025James Dong
4202f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
4302f5b5447de349216a40086ca6061efefb5a3025James Dong    None
4402f5b5447de349216a40086ca6061efefb5a3025James Dong
4502f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
4602f5b5447de349216a40086ca6061efefb5a3025James Dong    msk_deblock = flag that indicates whether deblocking is to be
4702f5b5447de349216a40086ca6061efefb5a3025James Dong              performed (msk_deblock = 0) or not (msk_deblock =
4802f5b5447de349216a40086ca6061efefb5a3025James Dong              1) (uint8)
4902f5b5447de349216a40086ca6061efefb5a3025James Dong
5002f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
5102f5b5447de349216a40086ca6061efefb5a3025James Dong    pp_dec_y contents are the updated semapohore propagation data
5202f5b5447de349216a40086ca6061efefb5a3025James Dong
5302f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
5402f5b5447de349216a40086ca6061efefb5a3025James Dong    None
5502f5b5447de349216a40086ca6061efefb5a3025James Dong
5602f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
5702f5b5447de349216a40086ca6061efefb5a3025James Dong    None
5802f5b5447de349216a40086ca6061efefb5a3025James Dong
5902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
6002f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION
6102f5b5447de349216a40086ca6061efefb5a3025James Dong
6202f5b5447de349216a40086ca6061efefb5a3025James Dong This functions performs post processing semaphore propagation processing
6302f5b5447de349216a40086ca6061efefb5a3025James Dong after luminance prediction.
6402f5b5447de349216a40086ca6061efefb5a3025James Dong
6502f5b5447de349216a40086ca6061efefb5a3025James Dong*/
6602f5b5447de349216a40086ca6061efefb5a3025James Dong
6702f5b5447de349216a40086ca6061efefb5a3025James Dong
6802f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
6902f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES
7002f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
7102f5b5447de349216a40086ca6061efefb5a3025James Dong#include    "mp4dec_api.h"
7202f5b5447de349216a40086ca6061efefb5a3025James Dong#include    "mp4def.h"
7302f5b5447de349216a40086ca6061efefb5a3025James Dong
7402f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
7502f5b5447de349216a40086ca6061efefb5a3025James Dong; MACROS
7602f5b5447de349216a40086ca6061efefb5a3025James Dong; Define module specific macros here
7702f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
7802f5b5447de349216a40086ca6061efefb5a3025James Dong
7902f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
8002f5b5447de349216a40086ca6061efefb5a3025James Dong; DEFINES
8102f5b5447de349216a40086ca6061efefb5a3025James Dong; Include all pre-processor statements here. Include conditional
8202f5b5447de349216a40086ca6061efefb5a3025James Dong; compile variables also.
8302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
8402f5b5447de349216a40086ca6061efefb5a3025James Dong
8502f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
8602f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL FUNCTION DEFINITIONS
8702f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Prototype declaration
8802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
8902f5b5447de349216a40086ca6061efefb5a3025James Dong
9002f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
9102f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
9202f5b5447de349216a40086ca6061efefb5a3025James Dong; Variable declaration - defined here and used outside this module
9302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
9402f5b5447de349216a40086ca6061efefb5a3025James Dong
9502f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
9602f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL FUNCTION REFERENCES
9702f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare functions defined elsewhere and referenced in this module
9802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
9902f5b5447de349216a40086ca6061efefb5a3025James Dong
10002f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
10102f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
10202f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare variables used in this module but defined elsewhere
10302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
10402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON
10502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus
10602f5b5447de349216a40086ca6061efefb5a3025James Dongextern "C"
10702f5b5447de349216a40086ca6061efefb5a3025James Dong{
10802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
10902f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
11002f5b5447de349216a40086ca6061efefb5a3025James Dong    ; FUNCTION CODE
11102f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
11202f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 pp_semaphore_luma(
11302f5b5447de349216a40086ca6061efefb5a3025James Dong        int xpred,      /* i */
11402f5b5447de349216a40086ca6061efefb5a3025James Dong        int ypred,      /* i */
11502f5b5447de349216a40086ca6061efefb5a3025James Dong        uint8   *pp_dec_y,  /* i/o */
11602f5b5447de349216a40086ca6061efefb5a3025James Dong        uint8   *pstprcTypPrv,  /* i */
11702f5b5447de349216a40086ca6061efefb5a3025James Dong        int *ll,        /* i */
11802f5b5447de349216a40086ca6061efefb5a3025James Dong        int *mv_loc,    /* i/o */
11902f5b5447de349216a40086ca6061efefb5a3025James Dong        int dx,     /* i */
12002f5b5447de349216a40086ca6061efefb5a3025James Dong        int dy,     /* i */
12102f5b5447de349216a40086ca6061efefb5a3025James Dong        int mvwidth,    /* i */
12202f5b5447de349216a40086ca6061efefb5a3025James Dong        int width,      /* i */
12302f5b5447de349216a40086ca6061efefb5a3025James Dong        int height      /* i */
12402f5b5447de349216a40086ca6061efefb5a3025James Dong    )
12502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
12602f5b5447de349216a40086ca6061efefb5a3025James Dong        /*----------------------------------------------------------------------------
12702f5b5447de349216a40086ca6061efefb5a3025James Dong        ; Define all local variables
12802f5b5447de349216a40086ca6061efefb5a3025James Dong        ----------------------------------------------------------------------------*/
12902f5b5447de349216a40086ca6061efefb5a3025James Dong        int kk, mmvy, mmvx, nmvx, nmvy;
13002f5b5447de349216a40086ca6061efefb5a3025James Dong        uint8   *pp_prev1, *pp_prev2, *pp_prev3, *pp_prev4;
13102f5b5447de349216a40086ca6061efefb5a3025James Dong        uint8   msk_deblock = 0;        /*  11/3/00 */
13202f5b5447de349216a40086ca6061efefb5a3025James Dong
13302f5b5447de349216a40086ca6061efefb5a3025James Dong        /*----------------------------------------------------------------------------
13402f5b5447de349216a40086ca6061efefb5a3025James Dong        ; Function body here
13502f5b5447de349216a40086ca6061efefb5a3025James Dong        ----------------------------------------------------------------------------*/
13602f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Interframe Processing - 1 MV per MB */
13702f5b5447de349216a40086ca6061efefb5a3025James Dong
13802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* check whether the MV points outside the frame */
13902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (xpred >= 0 && xpred <= ((width << 1) - (2*MB_SIZE)) && ypred >= 0 &&
14002f5b5447de349216a40086ca6061efefb5a3025James Dong                ypred <= ((height << 1) - (2*MB_SIZE)))
14102f5b5447de349216a40086ca6061efefb5a3025James Dong        {   /*****************************/
14202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* (x,y) is inside the frame */
14302f5b5447de349216a40086ca6061efefb5a3025James Dong            /*****************************/
14402f5b5447de349216a40086ca6061efefb5a3025James Dong
14502f5b5447de349216a40086ca6061efefb5a3025James Dong            /*  10/24/2000 post_processing semaphore */
14602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* generation */
14702f5b5447de349216a40086ca6061efefb5a3025James Dong
14802f5b5447de349216a40086ca6061efefb5a3025James Dong            /*  10/23/2000 no boundary checking*/
14902f5b5447de349216a40086ca6061efefb5a3025James Dong            *mv_loc = 0;
15002f5b5447de349216a40086ca6061efefb5a3025James Dong
15102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Calculate block x coordinate. Divide by 16 is for  */
15202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* converting half-pixel resolution to block          */
15302f5b5447de349216a40086ca6061efefb5a3025James Dong            mmvx = xpred >> 4;
15402f5b5447de349216a40086ca6061efefb5a3025James Dong
15502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Calculate block y coordinate. Divide by 16 is for */
15602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* converting half-pixel resolution to block         */
15702f5b5447de349216a40086ca6061efefb5a3025James Dong            mmvy = ypred >> 4;
15802f5b5447de349216a40086ca6061efefb5a3025James Dong
15902f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Find post processing semaphore location for block */
16002f5b5447de349216a40086ca6061efefb5a3025James Dong            /* used for prediction, i.e.,                */
16102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* pp_prev1 = &pstprcTypPrv[mmvy*mvwidth][mmvx]      */
16202f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_prev1 = pstprcTypPrv + mmvx + mmvy * mvwidth;
16302f5b5447de349216a40086ca6061efefb5a3025James Dong
16402f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Check if MV is a multiple of 16 */
16502f5b5447de349216a40086ca6061efefb5a3025James Dong            if ((dx&0xF) != 0)
16602f5b5447de349216a40086ca6061efefb5a3025James Dong            {   /* dx is not a multiple of 16 */
16702f5b5447de349216a40086ca6061efefb5a3025James Dong
16802f5b5447de349216a40086ca6061efefb5a3025James Dong                /* pp_prev2 is the block to the right of */
16902f5b5447de349216a40086ca6061efefb5a3025James Dong                /* pp_prev1 block            */
17002f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev2 = pp_prev1 + 1;
17102f5b5447de349216a40086ca6061efefb5a3025James Dong
17202f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((dy&0xF) != 0)
17302f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dy is not a multiple of 16 */
17402f5b5447de349216a40086ca6061efefb5a3025James Dong
17502f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev3 is the block below */
17602f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev1 block          */
17702f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev3 = pp_prev1 + mvwidth;
17802f5b5447de349216a40086ca6061efefb5a3025James Dong                }
17902f5b5447de349216a40086ca6061efefb5a3025James Dong                else
18002f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dy is a multiple of 16 */
18102f5b5447de349216a40086ca6061efefb5a3025James Dong
18202f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev3 = pp_prev1;
18302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
18402f5b5447de349216a40086ca6061efefb5a3025James Dong
18502f5b5447de349216a40086ca6061efefb5a3025James Dong                /* pp_prev4 is the block to the right of */
18602f5b5447de349216a40086ca6061efefb5a3025James Dong                /* pp_prev3 block.           */
18702f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev4 = pp_prev3 + 1;
18802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
18902f5b5447de349216a40086ca6061efefb5a3025James Dong            else
19002f5b5447de349216a40086ca6061efefb5a3025James Dong            {   /* dx is a multiple of 16 */
19102f5b5447de349216a40086ca6061efefb5a3025James Dong
19202f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev2 = pp_prev1;
19302f5b5447de349216a40086ca6061efefb5a3025James Dong
19402f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((dy&0xF) != 0)
19502f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dy is not a multiple of 16 */
19602f5b5447de349216a40086ca6061efefb5a3025James Dong
19702f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev3 is the block below */
19802f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev1 block.         */
19902f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev3 = pp_prev1 + mvwidth;
20002f5b5447de349216a40086ca6061efefb5a3025James Dong                }
20102f5b5447de349216a40086ca6061efefb5a3025James Dong                else
20202f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dy is a multiple of 16 */
20302f5b5447de349216a40086ca6061efefb5a3025James Dong
20402f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev3 = pp_prev1;
20502f5b5447de349216a40086ca6061efefb5a3025James Dong                    msk_deblock = 0x3;
20602f5b5447de349216a40086ca6061efefb5a3025James Dong                }
20702f5b5447de349216a40086ca6061efefb5a3025James Dong
20802f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev4 = pp_prev3;
20902f5b5447de349216a40086ca6061efefb5a3025James Dong            }
21002f5b5447de349216a40086ca6061efefb5a3025James Dong
21102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Perform post processing semaphore propagation for each */
21202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* of the 4 blocks in a MB.               */
21302f5b5447de349216a40086ca6061efefb5a3025James Dong            for (kk = 0; kk < 4; kk++)
21402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
21502f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Deringing semaphore propagation */
21602f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((*(pp_dec_y) & 4) == 0)
21702f5b5447de349216a40086ca6061efefb5a3025James Dong                {
21802f5b5447de349216a40086ca6061efefb5a3025James Dong                    *(pp_dec_y) |= ((*(pp_prev1) | *(pp_prev2) |
21902f5b5447de349216a40086ca6061efefb5a3025James Dong                                     *(pp_prev3) | *(pp_prev4)) & 0x4);
22002f5b5447de349216a40086ca6061efefb5a3025James Dong                }
22102f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Deblocking semaphore propagation */
22202f5b5447de349216a40086ca6061efefb5a3025James Dong                /*  11/3/00, change the propagation for deblocking */
22302f5b5447de349216a40086ca6061efefb5a3025James Dong                if (msk_deblock == 0)
22402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
22502f5b5447de349216a40086ca6061efefb5a3025James Dong                    *(pp_dec_y) = 0;
22602f5b5447de349216a40086ca6061efefb5a3025James Dong                }
22702f5b5447de349216a40086ca6061efefb5a3025James Dong
22802f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_dec_y += ll[kk];
22902f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev1 += ll[kk];
23002f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev2 += ll[kk];
23102f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev3 += ll[kk];
23202f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev4 += ll[kk];
23302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
23402f5b5447de349216a40086ca6061efefb5a3025James Dong
23502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
23602f5b5447de349216a40086ca6061efefb5a3025James Dong        else
23702f5b5447de349216a40086ca6061efefb5a3025James Dong        {   /******************************/
23802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* (x,y) is outside the frame */
23902f5b5447de349216a40086ca6061efefb5a3025James Dong            /******************************/
24002f5b5447de349216a40086ca6061efefb5a3025James Dong
24102f5b5447de349216a40086ca6061efefb5a3025James Dong            /*  10/24/2000 post_processing semaphore */
24202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* generation */
24302f5b5447de349216a40086ca6061efefb5a3025James Dong
24402f5b5447de349216a40086ca6061efefb5a3025James Dong            /*  10/23/2000 boundary checking*/
24502f5b5447de349216a40086ca6061efefb5a3025James Dong            *mv_loc = 1;
24602f5b5447de349216a40086ca6061efefb5a3025James Dong
24702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Perform post processing semaphore propagation for each */
24802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* of the 4 blocks in a MB.               */
24902f5b5447de349216a40086ca6061efefb5a3025James Dong            for (kk = 0; kk < 4; kk++)
25002f5b5447de349216a40086ca6061efefb5a3025James Dong            {
25102f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Calculate block x coordinate and round (?).  */
25202f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Divide by 16 is for converting half-pixel    */
25302f5b5447de349216a40086ca6061efefb5a3025James Dong                /* resolution to block.             */
25402f5b5447de349216a40086ca6061efefb5a3025James Dong                mmvx = (xpred + ((kk & 1) << 3)) >> 4;
25502f5b5447de349216a40086ca6061efefb5a3025James Dong                nmvx = mmvx;
25602f5b5447de349216a40086ca6061efefb5a3025James Dong
25702f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Calculate block y coordinate and round (?).  */
25802f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Divide by 16 is for converting half-pixel    */
25902f5b5447de349216a40086ca6061efefb5a3025James Dong                /* resolution to block.             */
26002f5b5447de349216a40086ca6061efefb5a3025James Dong                mmvy = (ypred + ((kk & 2) << 2)) >> 4;
26102f5b5447de349216a40086ca6061efefb5a3025James Dong                nmvy = mmvy;
26202f5b5447de349216a40086ca6061efefb5a3025James Dong
26302f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Perform boundary checking */
26402f5b5447de349216a40086ca6061efefb5a3025James Dong                if (nmvx < 0)
26502f5b5447de349216a40086ca6061efefb5a3025James Dong                {
26602f5b5447de349216a40086ca6061efefb5a3025James Dong                    nmvx = 0;
26702f5b5447de349216a40086ca6061efefb5a3025James Dong                }
26802f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (nmvx > mvwidth - 1)
26902f5b5447de349216a40086ca6061efefb5a3025James Dong                {
27002f5b5447de349216a40086ca6061efefb5a3025James Dong                    nmvx = mvwidth - 1;
27102f5b5447de349216a40086ca6061efefb5a3025James Dong                }
27202f5b5447de349216a40086ca6061efefb5a3025James Dong
27302f5b5447de349216a40086ca6061efefb5a3025James Dong                if (nmvy < 0)
27402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
27502f5b5447de349216a40086ca6061efefb5a3025James Dong                    nmvy = 0;
27602f5b5447de349216a40086ca6061efefb5a3025James Dong                }
27702f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (nmvy > (height >> 3) - 1)
27802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
27902f5b5447de349216a40086ca6061efefb5a3025James Dong                    nmvy = (height >> 3) - 1;
28002f5b5447de349216a40086ca6061efefb5a3025James Dong                }
28102f5b5447de349216a40086ca6061efefb5a3025James Dong
28202f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Find post processing semaphore location for block */
28302f5b5447de349216a40086ca6061efefb5a3025James Dong                /* used for prediction, i.e.,                */
28402f5b5447de349216a40086ca6061efefb5a3025James Dong                /* pp_prev1 = &pstprcTypPrv[nmvy*mvwidth][nmvx]      */
28502f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_prev1 = pstprcTypPrv + nmvx + nmvy * mvwidth;
28602f5b5447de349216a40086ca6061efefb5a3025James Dong
28702f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Check if x component of MV is a multiple of 16    */
28802f5b5447de349216a40086ca6061efefb5a3025James Dong                /* and check if block x coordinate is out of bounds  */
28902f5b5447de349216a40086ca6061efefb5a3025James Dong                if (((dx&0xF) != 0) && (mmvx + 1 < mvwidth - 1))
29002f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dx is not a multiple of 16 and the block */
29102f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* x coordinate is within the bounds        */
29202f5b5447de349216a40086ca6061efefb5a3025James Dong
29302f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev2 is the block to the right of */
29402f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev1 block            */
29502f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev2 = pp_prev1 + 1;
29602f5b5447de349216a40086ca6061efefb5a3025James Dong
29702f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* Check if y component of MV is a multiple */
29802f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* of 16 and check if block y coordinate is */
29902f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* out of bounds                */
30002f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
30102f5b5447de349216a40086ca6061efefb5a3025James Dong                    {   /* dy is not a multiple of 16 and */
30202f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* the block y coordinate is      */
30302f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* within the bounds              */
30402f5b5447de349216a40086ca6061efefb5a3025James Dong
30502f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* pp_prev3 is the block below */
30602f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* pp_prev1 block          */
30702f5b5447de349216a40086ca6061efefb5a3025James Dong                        pp_prev3 = pp_prev1 + mvwidth;
30802f5b5447de349216a40086ca6061efefb5a3025James Dong
30902f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* all prediction are from different blocks */
31002f5b5447de349216a40086ca6061efefb5a3025James Dong                        msk_deblock = 0x3;
31102f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
31202f5b5447de349216a40086ca6061efefb5a3025James Dong                    else
31302f5b5447de349216a40086ca6061efefb5a3025James Dong                    {   /* dy is a multiple of 16 or the block */
31402f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* y coordinate is out of bounds       */
31502f5b5447de349216a40086ca6061efefb5a3025James Dong
31602f5b5447de349216a40086ca6061efefb5a3025James Dong                        pp_prev3 = pp_prev1;
31702f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
31802f5b5447de349216a40086ca6061efefb5a3025James Dong
31902f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev4 is the block to the right of */
32002f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* pp_prev3 block.           */
32102f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev4 = pp_prev3 + 1;
32202f5b5447de349216a40086ca6061efefb5a3025James Dong                }
32302f5b5447de349216a40086ca6061efefb5a3025James Dong                else
32402f5b5447de349216a40086ca6061efefb5a3025James Dong                {   /* dx is a multiple of 16 or the block x */
32502f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* coordinate is out of bounds           */
32602f5b5447de349216a40086ca6061efefb5a3025James Dong
32702f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev2 = pp_prev1;
32802f5b5447de349216a40086ca6061efefb5a3025James Dong
32902f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* Check if y component of MV is a multiple */
33002f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* of 16 and check if block y coordinate is */
33102f5b5447de349216a40086ca6061efefb5a3025James Dong                    /* out of bounds                */
33202f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1))
33302f5b5447de349216a40086ca6061efefb5a3025James Dong                    {   /* dy is not a multiple of 16 and */
33402f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* the block y coordinate is      */
33502f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* within the bounds              */
33602f5b5447de349216a40086ca6061efefb5a3025James Dong
33702f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* pp_prev3 is the block below */
33802f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* pp_prev1 block.         */
33902f5b5447de349216a40086ca6061efefb5a3025James Dong                        pp_prev3 = pp_prev1 + mvwidth;
34002f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
34102f5b5447de349216a40086ca6061efefb5a3025James Dong                    else
34202f5b5447de349216a40086ca6061efefb5a3025James Dong                    {   /* dy is a multiple of 16 or the block */
34302f5b5447de349216a40086ca6061efefb5a3025James Dong                        /* y coordinate is out of bounds       */
34402f5b5447de349216a40086ca6061efefb5a3025James Dong
34502f5b5447de349216a40086ca6061efefb5a3025James Dong                        pp_prev3 = pp_prev1;
34602f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
34702f5b5447de349216a40086ca6061efefb5a3025James Dong
34802f5b5447de349216a40086ca6061efefb5a3025James Dong                    pp_prev4 = pp_prev3;
34902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
35002f5b5447de349216a40086ca6061efefb5a3025James Dong
35102f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Deringing semaphore propagation */
35202f5b5447de349216a40086ca6061efefb5a3025James Dong                if ((*(pp_dec_y)&4) == 0)
35302f5b5447de349216a40086ca6061efefb5a3025James Dong                {
35402f5b5447de349216a40086ca6061efefb5a3025James Dong                    *(pp_dec_y) |= ((*(pp_prev1) |
35502f5b5447de349216a40086ca6061efefb5a3025James Dong                                     *(pp_prev2) | *(pp_prev3) |
35602f5b5447de349216a40086ca6061efefb5a3025James Dong                                     *(pp_prev4)) & 0x4);
35702f5b5447de349216a40086ca6061efefb5a3025James Dong                }
35802f5b5447de349216a40086ca6061efefb5a3025James Dong                /* Deblocking semaphore propagation */
35902f5b5447de349216a40086ca6061efefb5a3025James Dong                /*  11/3/00, change the propaga= */
36002f5b5447de349216a40086ca6061efefb5a3025James Dong                /* tion for deblocking */
36102f5b5447de349216a40086ca6061efefb5a3025James Dong                if (msk_deblock == 0)
36202f5b5447de349216a40086ca6061efefb5a3025James Dong                {
36302f5b5447de349216a40086ca6061efefb5a3025James Dong                    *(pp_dec_y) = 0;
36402f5b5447de349216a40086ca6061efefb5a3025James Dong                }
36502f5b5447de349216a40086ca6061efefb5a3025James Dong
36602f5b5447de349216a40086ca6061efefb5a3025James Dong                pp_dec_y += ll[kk];
36702f5b5447de349216a40086ca6061efefb5a3025James Dong            }
36802f5b5447de349216a40086ca6061efefb5a3025James Dong        }
36902f5b5447de349216a40086ca6061efefb5a3025James Dong
37002f5b5447de349216a40086ca6061efefb5a3025James Dong        /*----------------------------------------------------------------------------
37102f5b5447de349216a40086ca6061efefb5a3025James Dong        ; Return nothing or data or data pointer
37202f5b5447de349216a40086ca6061efefb5a3025James Dong        ----------------------------------------------------------------------------*/
37302f5b5447de349216a40086ca6061efefb5a3025James Dong        return (msk_deblock);
37402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
37502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus
37602f5b5447de349216a40086ca6061efefb5a3025James Dong}
37702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
37802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
379