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    video = pointer to structure of type VideoDecData
2402f5b5447de349216a40086ca6061efefb5a3025James Dong
2502f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
2602f5b5447de349216a40086ca6061efefb5a3025James Dong    roundtab16 = rounding table
2702f5b5447de349216a40086ca6061efefb5a3025James Dong
2802f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
2902f5b5447de349216a40086ca6061efefb5a3025James Dong    None
3002f5b5447de349216a40086ca6061efefb5a3025James Dong
3102f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
3202f5b5447de349216a40086ca6061efefb5a3025James Dong    None
3302f5b5447de349216a40086ca6061efefb5a3025James Dong
3402f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
3502f5b5447de349216a40086ca6061efefb5a3025James Dong    video->currVop->yChan contents are the newly calculated luminance
3602f5b5447de349216a40086ca6061efefb5a3025James Dong      data
3702f5b5447de349216a40086ca6061efefb5a3025James Dong    video->currVop->uChan contents are the newly calculated chrominance
3802f5b5447de349216a40086ca6061efefb5a3025James Dong      b data
3902f5b5447de349216a40086ca6061efefb5a3025James Dong    video->currVop->vChan contents are the newly calculated chrominance
4002f5b5447de349216a40086ca6061efefb5a3025James Dong      r data
4102f5b5447de349216a40086ca6061efefb5a3025James Dong    video->pstprcTypCur contents are the updated semaphore propagation
4202f5b5447de349216a40086ca6061efefb5a3025James Dong      values
4302f5b5447de349216a40086ca6061efefb5a3025James Dong
4402f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
4502f5b5447de349216a40086ca6061efefb5a3025James Dong    None
4602f5b5447de349216a40086ca6061efefb5a3025James Dong
4702f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
4802f5b5447de349216a40086ca6061efefb5a3025James Dong    None
4902f5b5447de349216a40086ca6061efefb5a3025James Dong
5002f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
5102f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION
5202f5b5447de349216a40086ca6061efefb5a3025James Dong
5302f5b5447de349216a40086ca6061efefb5a3025James Dong This function performs high level motion compensation on the luminance and
5402f5b5447de349216a40086ca6061efefb5a3025James Dong chrominance data. It sets up all the parameters required by the functions
5502f5b5447de349216a40086ca6061efefb5a3025James Dong that perform luminance and chrominance prediction and it initializes the
5602f5b5447de349216a40086ca6061efefb5a3025James Dong pointer to the post processing semaphores of a given block. It also checks
5702f5b5447de349216a40086ca6061efefb5a3025James Dong the motion compensation mode in order to determine which luminance or
5802f5b5447de349216a40086ca6061efefb5a3025James Dong chrominance prediction functions to call and determines how the post
5902f5b5447de349216a40086ca6061efefb5a3025James Dong processing semaphores are updated.
6002f5b5447de349216a40086ca6061efefb5a3025James Dong
6102f5b5447de349216a40086ca6061efefb5a3025James Dong*/
6202f5b5447de349216a40086ca6061efefb5a3025James Dong
6302f5b5447de349216a40086ca6061efefb5a3025James Dong
6402f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
6502f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES
6602f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
6702f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h"
6802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "motion_comp.h"
6902f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
7002f5b5447de349216a40086ca6061efefb5a3025James Dong; MACROS
7102f5b5447de349216a40086ca6061efefb5a3025James Dong; Define module specific macros here
7202f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
7302f5b5447de349216a40086ca6061efefb5a3025James Dong
7402f5b5447de349216a40086ca6061efefb5a3025James Dong
7502f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
7602f5b5447de349216a40086ca6061efefb5a3025James Dong; DEFINES
7702f5b5447de349216a40086ca6061efefb5a3025James Dong; Include all pre-processor statements here. Include conditional
7802f5b5447de349216a40086ca6061efefb5a3025James Dong; compile variables also.
7902f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
8002f5b5447de349216a40086ca6061efefb5a3025James Dong
8102f5b5447de349216a40086ca6061efefb5a3025James Dong
8202f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
8302f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL FUNCTION DEFINITIONS
8402f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Prototype declaration
8502f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
8602f5b5447de349216a40086ca6061efefb5a3025James Dong
8702f5b5447de349216a40086ca6061efefb5a3025James Dong
8802f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
8902f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
9002f5b5447de349216a40086ca6061efefb5a3025James Dong; Variable declaration - defined here and used outside this module
9102f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
9202f5b5447de349216a40086ca6061efefb5a3025James Dong/* 09/29/2000 bring this from mp4def.h */
9302f5b5447de349216a40086ca6061efefb5a3025James Dong// const static int roundtab4[] = {0,1,1,1};
9402f5b5447de349216a40086ca6061efefb5a3025James Dong// const static int roundtab8[] = {0,0,1,1,1,1,1,2};
9502f5b5447de349216a40086ca6061efefb5a3025James Dong/*** 10/30 for TPS */
9602f5b5447de349216a40086ca6061efefb5a3025James Dong// const static int roundtab12[] = {0,0,0,1,1,1,1,1,1,1,2,2};
9702f5b5447de349216a40086ca6061efefb5a3025James Dong/* 10/30 for TPS ***/
9802f5b5447de349216a40086ca6061efefb5a3025James Dongconst static int roundtab16[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};
9902f5b5447de349216a40086ca6061efefb5a3025James Dong
10002f5b5447de349216a40086ca6061efefb5a3025James Dong
10102f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
10202f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL FUNCTION REFERENCES
10302f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare functions defined elsewhere and referenced in this module
10402f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
10502f5b5447de349216a40086ca6061efefb5a3025James Dong
10602f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
10702f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
10802f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare variables used in this module but defined elsewhere
10902f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
11002f5b5447de349216a40086ca6061efefb5a3025James Dong
11102f5b5447de349216a40086ca6061efefb5a3025James Dong
11202f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
11302f5b5447de349216a40086ca6061efefb5a3025James Dong; FUNCTION CODE
11402f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
11502f5b5447de349216a40086ca6061efefb5a3025James Dong
11602f5b5447de349216a40086ca6061efefb5a3025James Dong/** modified 3 August 2005 to do prediction and put the results in
11702f5b5447de349216a40086ca6061efefb5a3025James Dongvideo->mblock->pred_block, no adding with residue */
11802f5b5447de349216a40086ca6061efefb5a3025James Dong
11902f5b5447de349216a40086ca6061efefb5a3025James Dongvoid  MBMotionComp(
12002f5b5447de349216a40086ca6061efefb5a3025James Dong    VideoDecData *video,
12102f5b5447de349216a40086ca6061efefb5a3025James Dong    int CBP
12202f5b5447de349216a40086ca6061efefb5a3025James Dong)
12302f5b5447de349216a40086ca6061efefb5a3025James Dong{
12402f5b5447de349216a40086ca6061efefb5a3025James Dong
12502f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
12602f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Define all local variables
12702f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
12802f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Previous Video Object Plane */
12902f5b5447de349216a40086ca6061efefb5a3025James Dong    Vop *prev = video->prevVop;
13002f5b5447de349216a40086ca6061efefb5a3025James Dong
13102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Current Macroblock (MB) in the VOP */
13202f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
13302f5b5447de349216a40086ca6061efefb5a3025James Dong
13402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Number of MB per data row */
13502f5b5447de349216a40086ca6061efefb5a3025James Dong    int MB_in_width = video->nMBPerRow;
13602f5b5447de349216a40086ca6061efefb5a3025James Dong    int ypos, xpos;
13702f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *c_comp, *c_prev;
13802f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cu_comp, *cu_prev;
13902f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cv_comp, *cv_prev;
14002f5b5447de349216a40086ca6061efefb5a3025James Dong    int height, width, pred_width;
14102f5b5447de349216a40086ca6061efefb5a3025James Dong    int imv, mvwidth;
14202f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 offset;
14302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 mode;
14402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred_block, *pred;
14502f5b5447de349216a40086ca6061efefb5a3025James Dong
14602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Motion vector (dx,dy) in half-pel resolution */
14702f5b5447de349216a40086ca6061efefb5a3025James Dong    int dx, dy;
14802f5b5447de349216a40086ca6061efefb5a3025James Dong
14902f5b5447de349216a40086ca6061efefb5a3025James Dong    MOT px[4], py[4];
15002f5b5447de349216a40086ca6061efefb5a3025James Dong    int xpred, ypred;
15102f5b5447de349216a40086ca6061efefb5a3025James Dong    int xsum;
15202f5b5447de349216a40086ca6061efefb5a3025James Dong    int round1;
15302f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON // 2/14/2001
15402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Total number of pixels in the VOL */
15502f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 size = (int32) video->nTotalMB << 8;
15602f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pp_dec_y, *pp_dec_u;
15702f5b5447de349216a40086ca6061efefb5a3025James Dong    int ll[4];
15802f5b5447de349216a40086ca6061efefb5a3025James Dong    int tmp = 0;
15902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 msk_deblock = 0;
16002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
16102f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
16202f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Function body here
16302f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
16402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Set rounding type */
16502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* change from array to single 09/29/2000 */
16602f5b5447de349216a40086ca6061efefb5a3025James Dong    round1 = (int)(1 - video->currVop->roundingType);
16702f5b5447de349216a40086ca6061efefb5a3025James Dong
16802f5b5447de349216a40086ca6061efefb5a3025James Dong    /* width of luminance data in pixels (y axis) */
16902f5b5447de349216a40086ca6061efefb5a3025James Dong    width = video->width;
17002f5b5447de349216a40086ca6061efefb5a3025James Dong
17102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* heigth of luminance data in pixels (x axis) */
17202f5b5447de349216a40086ca6061efefb5a3025James Dong    height = video->height;
17302f5b5447de349216a40086ca6061efefb5a3025James Dong
17402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* number of blocks per row */
17502f5b5447de349216a40086ca6061efefb5a3025James Dong    mvwidth = MB_in_width << 1;
17602f5b5447de349216a40086ca6061efefb5a3025James Dong
17702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* starting y position in current MB; origin of MB */
17802f5b5447de349216a40086ca6061efefb5a3025James Dong    ypos = video->mbnum_row << 4 ;
17902f5b5447de349216a40086ca6061efefb5a3025James Dong    /* starting x position in current MB; origin of MB */
18002f5b5447de349216a40086ca6061efefb5a3025James Dong    xpos = video->mbnum_col << 4 ;
18102f5b5447de349216a40086ca6061efefb5a3025James Dong
18202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* offset to (x,y) position in current luminance MB */
18302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* in pixel resolution                              */
18402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* ypos*width -> row, +x -> column */
18502f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = (int32)ypos * width + xpos;
18602f5b5447de349216a40086ca6061efefb5a3025James Dong
18702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* get mode for current MB */
18802f5b5447de349216a40086ca6061efefb5a3025James Dong    mode = video->headerInfo.Mode[mbnum];
18902f5b5447de349216a40086ca6061efefb5a3025James Dong
19002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* block index */
19102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* imv = (xpos/8) + ((ypos/8) * mvwidth) */
19202f5b5447de349216a40086ca6061efefb5a3025James Dong    imv = (offset >> 6) - (xpos >> 6) + (xpos >> 3);
19302f5b5447de349216a40086ca6061efefb5a3025James Dong    if (mode & INTER_1VMASK)
19402f5b5447de349216a40086ca6061efefb5a3025James Dong    {
19502f5b5447de349216a40086ca6061efefb5a3025James Dong        dx = px[0] = px[1] = px[2] = px[3] = video->motX[imv];
19602f5b5447de349216a40086ca6061efefb5a3025James Dong        dy = py[0] = py[1] = py[2] = py[3] = video->motY[imv];
19702f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((dx & 3) == 0)
19802f5b5447de349216a40086ca6061efefb5a3025James Dong        {
19902f5b5447de349216a40086ca6061efefb5a3025James Dong            dx = dx >> 1;
20002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
20102f5b5447de349216a40086ca6061efefb5a3025James Dong        else
20202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
20302f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x component of MV is or'ed for rounding (?) */
20402f5b5447de349216a40086ca6061efefb5a3025James Dong            dx = (dx >> 1) | 1;
20502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
20602f5b5447de349216a40086ca6061efefb5a3025James Dong
20702f5b5447de349216a40086ca6061efefb5a3025James Dong        /* y component of motion vector; divide by 2 for to */
20802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* convert to full-pel resolution.                  */
20902f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((dy & 3) == 0)
21002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
21102f5b5447de349216a40086ca6061efefb5a3025James Dong            dy = dy >> 1;
21202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
21302f5b5447de349216a40086ca6061efefb5a3025James Dong        else
21402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
21502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y component of MV is or'ed for rounding (?) */
21602f5b5447de349216a40086ca6061efefb5a3025James Dong            dy = (dy >> 1) | 1;
21702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
21802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
21902f5b5447de349216a40086ca6061efefb5a3025James Dong    else
22002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
22102f5b5447de349216a40086ca6061efefb5a3025James Dong        px[0] = video->motX[imv];
22202f5b5447de349216a40086ca6061efefb5a3025James Dong        px[1] = video->motX[imv+1];
22302f5b5447de349216a40086ca6061efefb5a3025James Dong        px[2] = video->motX[imv+mvwidth];
22402f5b5447de349216a40086ca6061efefb5a3025James Dong        px[3] = video->motX[imv+mvwidth+1];
22502f5b5447de349216a40086ca6061efefb5a3025James Dong        xsum = px[0] + px[1] + px[2] + px[3];
22602f5b5447de349216a40086ca6061efefb5a3025James Dong        dx = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] +
22702f5b5447de349216a40086ca6061efefb5a3025James Dong                              (((PV_ABS(xsum)) >> 4) << 1));
22802f5b5447de349216a40086ca6061efefb5a3025James Dong        py[0] = video->motY[imv];
22902f5b5447de349216a40086ca6061efefb5a3025James Dong        py[1] = video->motY[imv+1];
23002f5b5447de349216a40086ca6061efefb5a3025James Dong        py[2] = video->motY[imv+mvwidth];
23102f5b5447de349216a40086ca6061efefb5a3025James Dong        py[3] = video->motY[imv+mvwidth+1];
23202f5b5447de349216a40086ca6061efefb5a3025James Dong        xsum = py[0] + py[1] + py[2] + py[3];
23302f5b5447de349216a40086ca6061efefb5a3025James Dong        dy = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] +
23402f5b5447de349216a40086ca6061efefb5a3025James Dong                              (((PV_ABS(xsum)) >> 4) << 1));
23502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
23602f5b5447de349216a40086ca6061efefb5a3025James Dong
23702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Pointer to previous luminance frame */
23802f5b5447de349216a40086ca6061efefb5a3025James Dong    c_prev  = prev->yChan;
23902f5b5447de349216a40086ca6061efefb5a3025James Dong
24002f5b5447de349216a40086ca6061efefb5a3025James Dong    pred_block = video->mblock->pred_block;
24102f5b5447de349216a40086ca6061efefb5a3025James Dong
24202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* some blocks have no residue or INTER4V */
24302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*if (mode == MODE_INTER4V)   05/08/15 */
24402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Motion Compensation for an 8x8 block within a MB */
24502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* (4 MV per MB) */
24602f5b5447de349216a40086ca6061efefb5a3025James Dong
24702f5b5447de349216a40086ca6061efefb5a3025James Dong
24802f5b5447de349216a40086ca6061efefb5a3025James Dong
24902f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Call function that performs luminance prediction */
25002f5b5447de349216a40086ca6061efefb5a3025James Dong    /*      luminance_pred_mode_inter4v(xpos, ypos, px, py, c_prev,
25102f5b5447de349216a40086ca6061efefb5a3025James Dong                    video->mblock->pred_block, width, height,
25202f5b5447de349216a40086ca6061efefb5a3025James Dong                    round1, mvwidth, &xsum, &ysum);*/
25302f5b5447de349216a40086ca6061efefb5a3025James Dong    c_comp = video->currVop->yChan + offset;
25402f5b5447de349216a40086ca6061efefb5a3025James Dong
25502f5b5447de349216a40086ca6061efefb5a3025James Dong
25602f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = (int)((xpos << 1) + px[0]);
25702f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = (int)((ypos << 1) + py[0]);
25802f5b5447de349216a40086ca6061efefb5a3025James Dong
25902f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((CBP >> 5)&1)
26002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
26102f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = pred_block;
26202f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = 16;
26302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
26402f5b5447de349216a40086ca6061efefb5a3025James Dong    else
26502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
26602f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = c_comp;
26702f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = width;
26802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
26902f5b5447de349216a40086ca6061efefb5a3025James Dong
27002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* check whether the MV points outside the frame */
27102f5b5447de349216a40086ca6061efefb5a3025James Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
27202f5b5447de349216a40086ca6061efefb5a3025James Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
27302f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /*****************************/
27402f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is inside the frame */
27502f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
27602f5b5447de349216a40086ca6061efefb5a3025James Dong        ;
27702f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
27802f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
27902f5b5447de349216a40086ca6061efefb5a3025James Dong    }
28002f5b5447de349216a40086ca6061efefb5a3025James Dong    else
28102f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /******************************/
28202f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is outside the frame */
28302f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
28402f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred, c_prev,
28502f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
28602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
28702f5b5447de349216a40086ca6061efefb5a3025James Dong
28802f5b5447de349216a40086ca6061efefb5a3025James Dong
28902f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Compute prediction values over current luminance MB */
29002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* (blocks 1); add motion vector prior to input;       */
29102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* add 8 to x_pos to advance to next block         */
29202f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = (int)(((xpos + B_SIZE) << 1) + px[1]);
29302f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = (int)((ypos << 1) + py[1]);
29402f5b5447de349216a40086ca6061efefb5a3025James Dong
29502f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((CBP >> 4)&1)
29602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
29702f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = pred_block + 8;
29802f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = 16;
29902f5b5447de349216a40086ca6061efefb5a3025James Dong    }
30002f5b5447de349216a40086ca6061efefb5a3025James Dong    else
30102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
30202f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = c_comp + 8;
30302f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = width;
30402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
30502f5b5447de349216a40086ca6061efefb5a3025James Dong
30602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* check whether the MV points outside the frame */
30702f5b5447de349216a40086ca6061efefb5a3025James Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
30802f5b5447de349216a40086ca6061efefb5a3025James Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
30902f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /*****************************/
31002f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is inside the frame */
31102f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
31202f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
31302f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
31402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
31502f5b5447de349216a40086ca6061efefb5a3025James Dong    else
31602f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /******************************/
31702f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is outside the frame */
31802f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
31902f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred, c_prev,
32002f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
32102f5b5447de349216a40086ca6061efefb5a3025James Dong    }
32202f5b5447de349216a40086ca6061efefb5a3025James Dong
32302f5b5447de349216a40086ca6061efefb5a3025James Dong
32402f5b5447de349216a40086ca6061efefb5a3025James Dong
32502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Compute prediction values over current luminance MB */
32602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* (blocks 2); add motion vector prior to input        */
32702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* add 8 to y_pos to advance to block on next row      */
32802f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = (int)((xpos << 1) + px[2]);
32902f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = (int)(((ypos + B_SIZE) << 1) + py[2]);
33002f5b5447de349216a40086ca6061efefb5a3025James Dong
33102f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((CBP >> 3)&1)
33202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
33302f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = pred_block + 128;
33402f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = 16;
33502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
33602f5b5447de349216a40086ca6061efefb5a3025James Dong    else
33702f5b5447de349216a40086ca6061efefb5a3025James Dong    {
33802f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = c_comp + (width << 3);
33902f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = width;
34002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
34102f5b5447de349216a40086ca6061efefb5a3025James Dong
34202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* check whether the MV points outside the frame */
34302f5b5447de349216a40086ca6061efefb5a3025James Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
34402f5b5447de349216a40086ca6061efefb5a3025James Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
34502f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /*****************************/
34602f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is inside the frame */
34702f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
34802f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
34902f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
35002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
35102f5b5447de349216a40086ca6061efefb5a3025James Dong    else
35202f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /******************************/
35302f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is outside the frame */
35402f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
35502f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred, c_prev,
35602f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
35702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
35802f5b5447de349216a40086ca6061efefb5a3025James Dong
35902f5b5447de349216a40086ca6061efefb5a3025James Dong
36002f5b5447de349216a40086ca6061efefb5a3025James Dong
36102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Compute prediction values over current luminance MB */
36202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* (blocks 3); add motion vector prior to input;       */
36302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* add 8 to x_pos and y_pos to advance to next block   */
36402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* on next row                         */
36502f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = (int)(((xpos + B_SIZE) << 1) + px[3]);
36602f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = (int)(((ypos + B_SIZE) << 1) + py[3]);
36702f5b5447de349216a40086ca6061efefb5a3025James Dong
36802f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((CBP >> 2)&1)
36902f5b5447de349216a40086ca6061efefb5a3025James Dong    {
37002f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = pred_block + 136;
37102f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = 16;
37202f5b5447de349216a40086ca6061efefb5a3025James Dong    }
37302f5b5447de349216a40086ca6061efefb5a3025James Dong    else
37402f5b5447de349216a40086ca6061efefb5a3025James Dong    {
37502f5b5447de349216a40086ca6061efefb5a3025James Dong        pred = c_comp + (width << 3) + 8;
37602f5b5447de349216a40086ca6061efefb5a3025James Dong        pred_width = width;
37702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
37802f5b5447de349216a40086ca6061efefb5a3025James Dong
37902f5b5447de349216a40086ca6061efefb5a3025James Dong    /* check whether the MV points outside the frame */
38002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
38102f5b5447de349216a40086ca6061efefb5a3025James Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
38202f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /*****************************/
38302f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is inside the frame */
38402f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
38502f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
38602f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
38702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
38802f5b5447de349216a40086ca6061efefb5a3025James Dong    else
38902f5b5447de349216a40086ca6061efefb5a3025James Dong    {   /******************************/
39002f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is outside the frame */
39102f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
39202f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred, c_prev,
39302f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
39402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
39502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Call function to set de-blocking and de-ringing */
39602f5b5447de349216a40086ca6061efefb5a3025James Dong    /*   semaphores for luminance                      */
39702f5b5447de349216a40086ca6061efefb5a3025James Dong
39802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON
39902f5b5447de349216a40086ca6061efefb5a3025James Dong    if (video->postFilterType != PV_NO_POST_PROC)
40002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
40102f5b5447de349216a40086ca6061efefb5a3025James Dong        if (mode&INTER_1VMASK)
40202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
40302f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_dec_y = video->pstprcTypCur + imv;
40402f5b5447de349216a40086ca6061efefb5a3025James Dong            ll[0] = 1;
40502f5b5447de349216a40086ca6061efefb5a3025James Dong            ll[1] = mvwidth - 1;
40602f5b5447de349216a40086ca6061efefb5a3025James Dong            ll[2] = 1;
40702f5b5447de349216a40086ca6061efefb5a3025James Dong            ll[3] = -mvwidth - 1;
40802f5b5447de349216a40086ca6061efefb5a3025James Dong            msk_deblock = pp_semaphore_luma(xpred, ypred, pp_dec_y,
40902f5b5447de349216a40086ca6061efefb5a3025James Dong                                            video->pstprcTypPrv, ll, &tmp, px[0], py[0], mvwidth,
41002f5b5447de349216a40086ca6061efefb5a3025James Dong                                            width, height);
41102f5b5447de349216a40086ca6061efefb5a3025James Dong
41202f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_dec_u = video->pstprcTypCur + (size >> 6) +
41302f5b5447de349216a40086ca6061efefb5a3025James Dong                       ((imv + (xpos >> 3)) >> 2);
41402f5b5447de349216a40086ca6061efefb5a3025James Dong
41502f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_semaphore_chroma_inter(xpred, ypred, pp_dec_u,
41602f5b5447de349216a40086ca6061efefb5a3025James Dong                                      video->pstprcTypPrv, dx, dy, mvwidth, height, size,
41702f5b5447de349216a40086ca6061efefb5a3025James Dong                                      tmp, msk_deblock);
41802f5b5447de349216a40086ca6061efefb5a3025James Dong        }
41902f5b5447de349216a40086ca6061efefb5a3025James Dong        else
42002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
42102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* Post-processing mode (MBM_INTER8) */
42202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* deblocking and deringing) */
42302f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_dec_y = video->pstprcTypCur + imv;
42402f5b5447de349216a40086ca6061efefb5a3025James Dong            *pp_dec_y = 4;
42502f5b5447de349216a40086ca6061efefb5a3025James Dong            *(pp_dec_y + 1) = 4;
42602f5b5447de349216a40086ca6061efefb5a3025James Dong            *(pp_dec_y + mvwidth) = 4;
42702f5b5447de349216a40086ca6061efefb5a3025James Dong            *(pp_dec_y + mvwidth + 1) = 4;
42802f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_dec_u = video->pstprcTypCur + (size >> 6) +
42902f5b5447de349216a40086ca6061efefb5a3025James Dong                       ((imv + (xpos >> 3)) >> 2);
43002f5b5447de349216a40086ca6061efefb5a3025James Dong            *pp_dec_u = 4;
43102f5b5447de349216a40086ca6061efefb5a3025James Dong            pp_dec_u[size>>8] = 4;
43202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
43302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
43402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
43502f5b5447de349216a40086ca6061efefb5a3025James Dong
43602f5b5447de349216a40086ca6061efefb5a3025James Dong
43702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* xpred and ypred calculation for Chrominance is */
43802f5b5447de349216a40086ca6061efefb5a3025James Dong    /* in full-pel resolution.                        */
43902f5b5447de349216a40086ca6061efefb5a3025James Dong
44002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Chrominance */
44102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* width of chrominance data in pixels (y axis) */
44202f5b5447de349216a40086ca6061efefb5a3025James Dong    width >>= 1;
44302f5b5447de349216a40086ca6061efefb5a3025James Dong
44402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* heigth of chrominance data in pixels (x axis) */
44502f5b5447de349216a40086ca6061efefb5a3025James Dong    height >>= 1;
44602f5b5447de349216a40086ca6061efefb5a3025James Dong
44702f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Pointer to previous chrominance b frame */
44802f5b5447de349216a40086ca6061efefb5a3025James Dong    cu_prev = prev->uChan;
44902f5b5447de349216a40086ca6061efefb5a3025James Dong
45002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Pointer to previous chrominance r frame */
45102f5b5447de349216a40086ca6061efefb5a3025James Dong    cv_prev = prev->vChan;
45202f5b5447de349216a40086ca6061efefb5a3025James Dong
45302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* x position in prediction data offset by motion vector */
45402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* xpred calculation for Chrominance is in full-pel      */
45502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* resolution.                                           */
45602f5b5447de349216a40086ca6061efefb5a3025James Dong    xpred = xpos + dx;
45702f5b5447de349216a40086ca6061efefb5a3025James Dong
45802f5b5447de349216a40086ca6061efefb5a3025James Dong    /* y position in prediction data offset by motion vector */
45902f5b5447de349216a40086ca6061efefb5a3025James Dong    /* ypred calculation for Chrominance is in full-pel      */
46002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* resolution.                                           */
46102f5b5447de349216a40086ca6061efefb5a3025James Dong    ypred = ypos + dy;
46202f5b5447de349216a40086ca6061efefb5a3025James Dong
46302f5b5447de349216a40086ca6061efefb5a3025James Dong    cu_comp = video->currVop->uChan + (offset >> 2) + (xpos >> 2);
46402f5b5447de349216a40086ca6061efefb5a3025James Dong    cv_comp = video->currVop->vChan + (offset >> 2) + (xpos >> 2);
46502f5b5447de349216a40086ca6061efefb5a3025James Dong
46602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Call function that performs chrominance prediction */
46702f5b5447de349216a40086ca6061efefb5a3025James Dong    /*      chrominance_pred(xpred, ypred, cu_prev, cv_prev,
46802f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_block, width_uv, height_uv,
46902f5b5447de349216a40086ca6061efefb5a3025James Dong            round1);*/
47002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) && ypred >= 0 &&
47102f5b5447de349216a40086ca6061efefb5a3025James Dong            ypred <= ((height << 1) - (2*B_SIZE)))
47202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
47302f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
47402f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is inside the frame */
47502f5b5447de349216a40086ca6061efefb5a3025James Dong        /*****************************/
47602f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((CBP >> 1)&1)
47702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
47802f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = pred_block + 256;
47902f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = 16;
48002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
48102f5b5447de349216a40086ca6061efefb5a3025James Dong        else
48202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
48302f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = cu_comp;
48402f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = width;
48502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
48602f5b5447de349216a40086ca6061efefb5a3025James Dong
48702f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Compute prediction for Chrominance b (block[4]) */
48802f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](cu_prev + (xpred >> 1) + ((ypred >> 1)*width),
48902f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
49002f5b5447de349216a40086ca6061efefb5a3025James Dong
49102f5b5447de349216a40086ca6061efefb5a3025James Dong        if (CBP&1)
49202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
49302f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = pred_block + 264;
49402f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = 16;
49502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
49602f5b5447de349216a40086ca6061efefb5a3025James Dong        else
49702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
49802f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = cv_comp;
49902f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = width;
50002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
50102f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Compute prediction for Chrominance r (block[5]) */
50202f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredAdvBTable[ypred&1][xpred&1](cv_prev + (xpred >> 1) + ((ypred >> 1)*width),
50302f5b5447de349216a40086ca6061efefb5a3025James Dong                                           pred, width, (pred_width << 1) | round1);
50402f5b5447de349216a40086ca6061efefb5a3025James Dong
50502f5b5447de349216a40086ca6061efefb5a3025James Dong        return ;
50602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
50702f5b5447de349216a40086ca6061efefb5a3025James Dong    else
50802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
50902f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
51002f5b5447de349216a40086ca6061efefb5a3025James Dong        /* (x,y) is outside the frame */
51102f5b5447de349216a40086ca6061efefb5a3025James Dong        /******************************/
51202f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((CBP >> 1)&1)
51302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
51402f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = pred_block + 256;
51502f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = 16;
51602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
51702f5b5447de349216a40086ca6061efefb5a3025James Dong        else
51802f5b5447de349216a40086ca6061efefb5a3025James Dong        {
51902f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = cu_comp;
52002f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = width;
52102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
52202f5b5447de349216a40086ca6061efefb5a3025James Dong
52302f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Compute prediction for Chrominance b (block[4]) */
52402f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred,    cu_prev,
52502f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
52602f5b5447de349216a40086ca6061efefb5a3025James Dong
52702f5b5447de349216a40086ca6061efefb5a3025James Dong        if (CBP&1)
52802f5b5447de349216a40086ca6061efefb5a3025James Dong        {
52902f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = pred_block + 264;
53002f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = 16;
53102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
53202f5b5447de349216a40086ca6061efefb5a3025James Dong        else
53302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
53402f5b5447de349216a40086ca6061efefb5a3025James Dong            pred = cv_comp;
53502f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_width = width;
53602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
53702f5b5447de349216a40086ca6061efefb5a3025James Dong
53802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Compute prediction for Chrominance r (block[5]) */
53902f5b5447de349216a40086ca6061efefb5a3025James Dong        GetPredOutside(xpred, ypred,    cv_prev,
54002f5b5447de349216a40086ca6061efefb5a3025James Dong                       pred, width, height, round1, pred_width);
54102f5b5447de349216a40086ca6061efefb5a3025James Dong
54202f5b5447de349216a40086ca6061efefb5a3025James Dong        return ;
54302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
54402f5b5447de349216a40086ca6061efefb5a3025James Dong
54502f5b5447de349216a40086ca6061efefb5a3025James Dong}
54602f5b5447de349216a40086ca6061efefb5a3025James Dong
54702f5b5447de349216a40086ca6061efefb5a3025James Dong/*** special function for skipped macroblock,  Aug 15, 2005 */
54802f5b5447de349216a40086ca6061efefb5a3025James Dongvoid  SkippedMBMotionComp(
54902f5b5447de349216a40086ca6061efefb5a3025James Dong    VideoDecData *video
55002f5b5447de349216a40086ca6061efefb5a3025James Dong)
55102f5b5447de349216a40086ca6061efefb5a3025James Dong{
55202f5b5447de349216a40086ca6061efefb5a3025James Dong    Vop *prev = video->prevVop;
55302f5b5447de349216a40086ca6061efefb5a3025James Dong    Vop *comp;
55402f5b5447de349216a40086ca6061efefb5a3025James Dong    int ypos, xpos;
55502f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *c_comp, *c_prev;
55602f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cu_comp, *cu_prev;
55702f5b5447de349216a40086ca6061efefb5a3025James Dong    PIXEL *cv_comp, *cv_prev;
55802f5b5447de349216a40086ca6061efefb5a3025James Dong    int width, width_uv;
55902f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 offset;
56002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON // 2/14/2001
56102f5b5447de349216a40086ca6061efefb5a3025James Dong    int imv;
56202f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 size = (int32) video->nTotalMB << 8;
56302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pp_dec_y, *pp_dec_u;
56402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pp_prev1;
56502f5b5447de349216a40086ca6061efefb5a3025James Dong    int mvwidth = video->nMBPerRow << 1;
56602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
56702f5b5447de349216a40086ca6061efefb5a3025James Dong
56802f5b5447de349216a40086ca6061efefb5a3025James Dong    width = video->width;
56902f5b5447de349216a40086ca6061efefb5a3025James Dong    width_uv  = width >> 1;
57002f5b5447de349216a40086ca6061efefb5a3025James Dong    ypos = video->mbnum_row << 4 ;
57102f5b5447de349216a40086ca6061efefb5a3025James Dong    xpos = video->mbnum_col << 4 ;
57202f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = (int32)ypos * width + xpos;
57302f5b5447de349216a40086ca6061efefb5a3025James Dong
57402f5b5447de349216a40086ca6061efefb5a3025James Dong
57502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* zero motion compensation for previous frame */
57602f5b5447de349216a40086ca6061efefb5a3025James Dong    /*mby*width + mbx;*/
57702f5b5447de349216a40086ca6061efefb5a3025James Dong    c_prev  = prev->yChan + offset;
57802f5b5447de349216a40086ca6061efefb5a3025James Dong    /*by*width_uv + bx;*/
57902f5b5447de349216a40086ca6061efefb5a3025James Dong    cu_prev = prev->uChan + (offset >> 2) + (xpos >> 2);
58002f5b5447de349216a40086ca6061efefb5a3025James Dong    /*by*width_uv + bx;*/
58102f5b5447de349216a40086ca6061efefb5a3025James Dong    cv_prev = prev->vChan + (offset >> 2) + (xpos >> 2);
58202f5b5447de349216a40086ca6061efefb5a3025James Dong
58302f5b5447de349216a40086ca6061efefb5a3025James Dong    comp = video->currVop;
58402f5b5447de349216a40086ca6061efefb5a3025James Dong
58502f5b5447de349216a40086ca6061efefb5a3025James Dong    c_comp  = comp->yChan + offset;
58602f5b5447de349216a40086ca6061efefb5a3025James Dong    cu_comp = comp->uChan + (offset >> 2) + (xpos >> 2);
58702f5b5447de349216a40086ca6061efefb5a3025James Dong    cv_comp = comp->vChan + (offset >> 2) + (xpos >> 2);
58802f5b5447de349216a40086ca6061efefb5a3025James Dong
58902f5b5447de349216a40086ca6061efefb5a3025James Dong
59002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Copy previous reconstructed frame into the current frame */
59102f5b5447de349216a40086ca6061efefb5a3025James Dong    PutSKIPPED_MB(c_comp,  c_prev, width);
59202f5b5447de349216a40086ca6061efefb5a3025James Dong    PutSKIPPED_B(cu_comp, cu_prev, width_uv);
59302f5b5447de349216a40086ca6061efefb5a3025James Dong    PutSKIPPED_B(cv_comp, cv_prev, width_uv);
59402f5b5447de349216a40086ca6061efefb5a3025James Dong
59502f5b5447de349216a40086ca6061efefb5a3025James Dong    /*  10/24/2000 post_processing semaphore generation */
59602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON // 2/14/2001
59702f5b5447de349216a40086ca6061efefb5a3025James Dong    if (video->postFilterType != PV_NO_POST_PROC)
59802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
59902f5b5447de349216a40086ca6061efefb5a3025James Dong        imv = (offset >> 6) - (xpos >> 6) + (xpos >> 3);
60002f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Post-processing mode (copy previous MB) */
60102f5b5447de349216a40086ca6061efefb5a3025James Dong        pp_prev1 = video->pstprcTypPrv + imv;
60202f5b5447de349216a40086ca6061efefb5a3025James Dong        pp_dec_y = video->pstprcTypCur + imv;
60302f5b5447de349216a40086ca6061efefb5a3025James Dong        *pp_dec_y = *pp_prev1;
60402f5b5447de349216a40086ca6061efefb5a3025James Dong        *(pp_dec_y + 1) = *(pp_prev1 + 1);
60502f5b5447de349216a40086ca6061efefb5a3025James Dong        *(pp_dec_y + mvwidth) = *(pp_prev1 + mvwidth);
60602f5b5447de349216a40086ca6061efefb5a3025James Dong        *(pp_dec_y + mvwidth + 1) = *(pp_prev1 + mvwidth + 1);
60702f5b5447de349216a40086ca6061efefb5a3025James Dong
60802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* chrominance */
60902f5b5447de349216a40086ca6061efefb5a3025James Dong        /*4*MB_in_width*MB_in_height*/
61002f5b5447de349216a40086ca6061efefb5a3025James Dong        pp_prev1 = video->pstprcTypPrv + (size >> 6) +
61102f5b5447de349216a40086ca6061efefb5a3025James Dong                   ((imv + (xpos >> 3)) >> 2);
61202f5b5447de349216a40086ca6061efefb5a3025James Dong        pp_dec_u = video->pstprcTypCur + (size >> 6) +
61302f5b5447de349216a40086ca6061efefb5a3025James Dong                   ((imv + (xpos >> 3)) >> 2);
61402f5b5447de349216a40086ca6061efefb5a3025James Dong        *pp_dec_u = *pp_prev1;
61502f5b5447de349216a40086ca6061efefb5a3025James Dong        pp_dec_u[size>>8] = pp_prev1[size>>8];
61602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
61702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
61802f5b5447de349216a40086ca6061efefb5a3025James Dong    /*----------------------------------------------------------------------------
61902f5b5447de349216a40086ca6061efefb5a3025James Dong    ; Return nothing or data or data pointer
62002f5b5447de349216a40086ca6061efefb5a3025James Dong    ----------------------------------------------------------------------------*/
62102f5b5447de349216a40086ca6061efefb5a3025James Dong
62202f5b5447de349216a40086ca6061efefb5a3025James Dong    return;
62302f5b5447de349216a40086ca6061efefb5a3025James Dong}
624