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 */
182ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen
192ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen#define LOG_TAG "m4v_h263"
202ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen#include <log/log.h>
212ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video = pointer to structure of type VideoDecData
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    roundtab16 = rounding table
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->yChan contents are the newly calculated luminance
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      data
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->uChan contents are the newly calculated chrominance
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      b data
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->vChan contents are the newly calculated chrominance
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      r data
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->pstprcTypCur contents are the updated semaphore propagation
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      values
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    None
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong This function performs high level motion compensation on the luminance and
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong chrominance data. It sets up all the parameters required by the functions
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong that perform luminance and chrominance prediction and it initializes the
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pointer to the post processing semaphores of a given block. It also checks
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong the motion compensation mode in order to determine which luminance or
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong chrominance prediction functions to call and determines how the post
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong processing semaphores are updated.
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h"
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; MACROS
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Define module specific macros here
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
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/*----------------------------------------------------------------------------
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL FUNCTION DEFINITIONS
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Prototype declaration
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Variable declaration - defined here and used outside this module
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 09/29/2000 bring this from mp4def.h */
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// const static int roundtab4[] = {0,1,1,1};
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// const static int roundtab8[] = {0,0,1,1,1,1,1,2};
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*** 10/30 for TPS */
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// const static int roundtab12[] = {0,0,0,1,1,1,1,1,1,1,2,2};
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* 10/30 for TPS ***/
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst static int roundtab16[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL FUNCTION REFERENCES
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare functions defined elsewhere and referenced in this module
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare variables used in this module but defined elsewhere
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; FUNCTION CODE
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/** modified 3 August 2005 to do prediction and put the results in
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvideo->mblock->pred_block, no adding with residue */
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid  MBMotionComp(
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video,
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int CBP
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Previous Video Object Plane */
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *prev = video->prevVop;
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Current Macroblock (MB) in the VOP */
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Number of MB per data row */
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MB_in_width = video->nMBPerRow;
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int ypos, xpos;
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *c_comp, *c_prev;
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cu_comp, *cu_prev;
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cv_comp, *cv_prev;
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int height, width, pred_width;
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int imv, mvwidth;
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 offset;
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 mode;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pred_block, *pred;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Motion vector (dx,dy) in half-pel resolution */
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int dx, dy;
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MOT px[4], py[4];
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int xpred, ypred;
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int xsum;
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int round1;
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON // 2/14/2001
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Total number of pixels in the VOL */
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size = (int32) video->nTotalMB << 8;
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_dec_y, *pp_dec_u;
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int ll[4];
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int tmp = 0;
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 msk_deblock = 0;
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Set rounding type */
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* change from array to single 09/29/2000 */
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    round1 = (int)(1 - video->currVop->roundingType);
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* width of luminance data in pixels (y axis) */
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width = video->width;
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* heigth of luminance data in pixels (x axis) */
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    height = video->height;
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* number of blocks per row */
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mvwidth = MB_in_width << 1;
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* starting y position in current MB; origin of MB */
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypos = video->mbnum_row << 4 ;
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* starting x position in current MB; origin of MB */
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpos = video->mbnum_col << 4 ;
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* offset to (x,y) position in current luminance MB */
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* in pixel resolution                              */
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* ypos*width -> row, +x -> column */
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    offset = (int32)ypos * width + xpos;
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* get mode for current MB */
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mode = video->headerInfo.Mode[mbnum];
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* block index */
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* imv = (xpos/8) + ((ypos/8) * mvwidth) */
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    imv = (offset >> 6) - (xpos >> 6) + (xpos >> 3);
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (mode & INTER_1VMASK)
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dx = px[0] = px[1] = px[2] = px[3] = video->motX[imv];
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dy = py[0] = py[1] = py[2] = py[3] = video->motY[imv];
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((dx & 3) == 0)
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dx = dx >> 1;
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* x component of MV is or'ed for rounding (?) */
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dx = (dx >> 1) | 1;
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* y component of motion vector; divide by 2 for to */
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* convert to full-pel resolution.                  */
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((dy & 3) == 0)
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dy = dy >> 1;
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* y component of MV is or'ed for rounding (?) */
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dy = (dy >> 1) | 1;
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        px[0] = video->motX[imv];
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        px[1] = video->motX[imv+1];
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        px[2] = video->motX[imv+mvwidth];
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        px[3] = video->motX[imv+mvwidth+1];
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        xsum = px[0] + px[1] + px[2] + px[3];
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dx = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] +
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                              (((PV_ABS(xsum)) >> 4) << 1));
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        py[0] = video->motY[imv];
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        py[1] = video->motY[imv+1];
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        py[2] = video->motY[imv+mvwidth];
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        py[3] = video->motY[imv+mvwidth+1];
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        xsum = py[0] + py[1] + py[2] + py[3];
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dy = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] +
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                              (((PV_ABS(xsum)) >> 4) << 1));
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Pointer to previous luminance frame */
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    c_prev  = prev->yChan;
2432ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    if (!c_prev) {
2442ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        ALOGE("b/35269635");
2452ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        android_errorWriteLog(0x534e4554, "35269635");
2462ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        return;
2472ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    }
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pred_block = video->mblock->pred_block;
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* some blocks have no residue or INTER4V */
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*if (mode == MODE_INTER4V)   05/08/15 */
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Motion Compensation for an 8x8 block within a MB */
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* (4 MV per MB) */
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Call function that performs luminance prediction */
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*      luminance_pred_mode_inter4v(xpos, ypos, px, py, c_prev,
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->mblock->pred_block, width, height,
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    round1, mvwidth, &xsum, &ysum);*/
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    c_comp = video->currVop->yChan + offset;
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = (int)((xpos << 1) + px[0]);
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = (int)((ypos << 1) + py[0]);
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((CBP >> 5)&1)
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = pred_block;
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = 16;
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = c_comp;
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = width;
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* check whether the MV points outside the frame */
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*****************************/
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is inside the frame */
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ;
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /******************************/
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is outside the frame */
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred, c_prev,
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Compute prediction values over current luminance MB */
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* (blocks 1); add motion vector prior to input;       */
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* add 8 to x_pos to advance to next block         */
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = (int)(((xpos + B_SIZE) << 1) + px[1]);
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = (int)((ypos << 1) + py[1]);
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((CBP >> 4)&1)
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = pred_block + 8;
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = 16;
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = c_comp + 8;
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = width;
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* check whether the MV points outside the frame */
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*****************************/
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is inside the frame */
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /******************************/
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is outside the frame */
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred, c_prev,
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Compute prediction values over current luminance MB */
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* (blocks 2); add motion vector prior to input        */
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* add 8 to y_pos to advance to block on next row      */
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = (int)((xpos << 1) + px[2]);
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = (int)(((ypos + B_SIZE) << 1) + py[2]);
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((CBP >> 3)&1)
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = pred_block + 128;
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = 16;
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = c_comp + (width << 3);
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = width;
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* check whether the MV points outside the frame */
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*****************************/
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is inside the frame */
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /******************************/
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is outside the frame */
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred, c_prev,
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Compute prediction values over current luminance MB */
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* (blocks 3); add motion vector prior to input;       */
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* add 8 to x_pos and y_pos to advance to next block   */
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* on next row                         */
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = (int)(((xpos + B_SIZE) << 1) + px[3]);
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = (int)(((ypos + B_SIZE) << 1) + py[3]);
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((CBP >> 2)&1)
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = pred_block + 136;
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = 16;
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred = c_comp + (width << 3) + 8;
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pred_width = width;
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* check whether the MV points outside the frame */
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) &&
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ypred >= 0 && ypred <= ((height << 1) - (2*B_SIZE)))
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*****************************/
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is inside the frame */
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*width),
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /******************************/
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is outside the frame */
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred, c_prev,
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Call function to set de-blocking and de-ringing */
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*   semaphores for luminance                      */
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->postFilterType != PV_NO_POST_PROC)
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mode&INTER_1VMASK)
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_dec_y = video->pstprcTypCur + imv;
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ll[0] = 1;
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ll[1] = mvwidth - 1;
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ll[2] = 1;
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ll[3] = -mvwidth - 1;
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            msk_deblock = pp_semaphore_luma(xpred, ypred, pp_dec_y,
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            video->pstprcTypPrv, ll, &tmp, px[0], py[0], mvwidth,
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            width, height);
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_dec_u = video->pstprcTypCur + (size >> 6) +
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       ((imv + (xpos >> 3)) >> 2);
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_semaphore_chroma_inter(xpred, ypred, pp_dec_u,
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                      video->pstprcTypPrv, dx, dy, mvwidth, height, size,
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                      tmp, msk_deblock);
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Post-processing mode (MBM_INTER8) */
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* deblocking and deringing) */
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_dec_y = video->pstprcTypCur + imv;
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *pp_dec_y = 4;
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *(pp_dec_y + 1) = 4;
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *(pp_dec_y + mvwidth) = 4;
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *(pp_dec_y + mvwidth + 1) = 4;
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_dec_u = video->pstprcTypCur + (size >> 6) +
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       ((imv + (xpos >> 3)) >> 2);
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *pp_dec_u = 4;
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pp_dec_u[size>>8] = 4;
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* xpred and ypred calculation for Chrominance is */
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* in full-pel resolution.                        */
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Chrominance */
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* width of chrominance data in pixels (y axis) */
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width >>= 1;
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* heigth of chrominance data in pixels (x axis) */
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    height >>= 1;
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Pointer to previous chrominance b frame */
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cu_prev = prev->uChan;
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Pointer to previous chrominance r frame */
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cv_prev = prev->vChan;
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* x position in prediction data offset by motion vector */
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* xpred calculation for Chrominance is in full-pel      */
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* resolution.                                           */
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpred = xpos + dx;
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* y position in prediction data offset by motion vector */
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* ypred calculation for Chrominance is in full-pel      */
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* resolution.                                           */
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypred = ypos + dy;
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cu_comp = video->currVop->uChan + (offset >> 2) + (xpos >> 2);
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cv_comp = video->currVop->vChan + (offset >> 2) + (xpos >> 2);
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Call function that performs chrominance prediction */
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*      chrominance_pred(xpred, ypred, cu_prev, cv_prev,
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_block, width_uv, height_uv,
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            round1);*/
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (xpred >= 0 && xpred <= ((width << 1) - (2*B_SIZE)) && ypred >= 0 &&
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ypred <= ((height << 1) - (2*B_SIZE)))
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is inside the frame */
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****************************/
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((CBP >> 1)&1)
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = pred_block + 256;
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = 16;
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = cu_comp;
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = width;
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Compute prediction for Chrominance b (block[4]) */
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](cu_prev + (xpred >> 1) + ((ypred >> 1)*width),
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP&1)
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = pred_block + 264;
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = 16;
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = cv_comp;
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = width;
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Compute prediction for Chrominance r (block[5]) */
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredAdvBTable[ypred&1][xpred&1](cv_prev + (xpred >> 1) + ((ypred >> 1)*width),
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                           pred, width, (pred_width << 1) | round1);
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return ;
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* (x,y) is outside the frame */
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /******************************/
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((CBP >> 1)&1)
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = pred_block + 256;
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = 16;
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = cu_comp;
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = width;
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Compute prediction for Chrominance b (block[4]) */
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred,    cu_prev,
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP&1)
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = pred_block + 264;
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = 16;
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred = cv_comp;
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pred_width = width;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Compute prediction for Chrominance r (block[5]) */
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        GetPredOutside(xpred, ypred,    cv_prev,
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       pred, width, height, round1, pred_width);
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return ;
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*** special function for skipped macroblock,  Aug 15, 2005 */
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid  SkippedMBMotionComp(
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong)
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *prev = video->prevVop;
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *comp;
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int ypos, xpos;
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *c_comp, *c_prev;
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cu_comp, *cu_prev;
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *cv_comp, *cv_prev;
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width, width_uv;
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 offset;
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON // 2/14/2001
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int imv;
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size = (int32) video->nTotalMB << 8;
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_dec_y, *pp_dec_u;
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_prev1;
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mvwidth = video->nMBPerRow << 1;
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width = video->width;
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    width_uv  = width >> 1;
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ypos = video->mbnum_row << 4 ;
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    xpos = video->mbnum_col << 4 ;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    offset = (int32)ypos * width + xpos;
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* zero motion compensation for previous frame */
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*mby*width + mbx;*/
5862ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    c_prev  = prev->yChan;
5872ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    if (!c_prev) {
5882ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        ALOGE("b/35269635");
5892ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        android_errorWriteLog(0x534e4554, "35269635");
5902ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        return;
5912ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    }
5922ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen    c_prev += offset;
5932ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*by*width_uv + bx;*/
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cu_prev = prev->uChan + (offset >> 2) + (xpos >> 2);
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*by*width_uv + bx;*/
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cv_prev = prev->vChan + (offset >> 2) + (xpos >> 2);
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    comp = video->currVop;
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    c_comp  = comp->yChan + offset;
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cu_comp = comp->uChan + (offset >> 2) + (xpos >> 2);
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    cv_comp = comp->vChan + (offset >> 2) + (xpos >> 2);
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Copy previous reconstructed frame into the current frame */
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PutSKIPPED_MB(c_comp,  c_prev, width);
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PutSKIPPED_B(cu_comp, cu_prev, width_uv);
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PutSKIPPED_B(cv_comp, cv_prev, width_uv);
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  10/24/2000 post_processing semaphore generation */
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON // 2/14/2001
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->postFilterType != PV_NO_POST_PROC)
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        imv = (offset >> 6) - (xpos >> 6) + (xpos >> 3);
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Post-processing mode (copy previous MB) */
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_prev1 = video->pstprcTypPrv + imv;
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_dec_y = video->pstprcTypCur + imv;
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *pp_dec_y = *pp_prev1;
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *(pp_dec_y + 1) = *(pp_prev1 + 1);
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *(pp_dec_y + mvwidth) = *(pp_prev1 + mvwidth);
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *(pp_dec_y + mvwidth + 1) = *(pp_prev1 + mvwidth + 1);
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* chrominance */
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*4*MB_in_width*MB_in_height*/
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_prev1 = video->pstprcTypPrv + (size >> 6) +
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   ((imv + (xpos >> 3)) >> 2);
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_dec_u = video->pstprcTypCur + (size >> 6) +
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   ((imv + (xpos >> 3)) >> 2);
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *pp_dec_u = *pp_prev1;
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_dec_u[size>>8] = pp_prev1[size>>8];
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
640