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