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