pp_semaphore_luma.cpp revision 3306cfee3bf38ab207a0504e49c2d492bb73ffbf
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 xpred = x-axis coordinate of the MB used for prediction (int) 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ypred = y-axis coordinate of the MB used for prediction (int) 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_dec_y = pointer to the post processing semaphore for current 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong luminance frame (uint8) 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pstprcTypPrv = pointer the previous frame's post processing type 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (uint8) 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ll = pointer to the buffer (int) 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mv_loc = flag indicating location of the motion compensated 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (x,y) position with respect to the luminance MB (int); 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 0 -> inside MB, 1 -> outside MB 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dx = horizontal component of the motion vector (int) 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dy = vertical component of the motion vector (int) 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mvwidth = number of blocks per row (int) 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width = luminance VOP width in pixels (int) 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong height = luminance VOP height in pixels (int) 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed: 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong None 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed: 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong None 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs: 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong msk_deblock = flag that indicates whether deblocking is to be 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong performed (msk_deblock = 0) or not (msk_deblock = 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1) (uint8) 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified: 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_dec_y contents are the updated semapohore propagation data 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified: 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong None 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified: 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong None 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------ 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong This functions performs post processing semaphore propagation processing 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong after luminance prediction. 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/ 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_api.h" 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4def.h" 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; MACROS 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Define module specific macros here 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; DEFINES 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Include all pre-processor statements here. Include conditional 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; compile variables also. 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL FUNCTION DEFINITIONS 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Prototype declaration 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Variable declaration - defined here and used outside this module 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL FUNCTION REFERENCES 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare functions defined elsewhere and referenced in this module 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare variables used in this module but defined elsewhere 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern "C" 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; FUNCTION CODE 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 pp_semaphore_luma( 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int xpred, /* i */ 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int ypred, /* i */ 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pp_dec_y, /* i/o */ 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pstprcTypPrv, /* i */ 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int *ll, /* i */ 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int *mv_loc, /* i/o */ 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int dx, /* i */ 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int dy, /* i */ 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mvwidth, /* i */ 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width, /* i */ 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int height /* i */ 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ) 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int kk, mmvy, mmvx, nmvx, nmvy; 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pp_prev1, *pp_prev2, *pp_prev3, *pp_prev4; 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 msk_deblock = 0; /* 11/3/00 */ 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Function body here 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Interframe Processing - 1 MV per MB */ 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* check whether the MV points outside the frame */ 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (xpred >= 0 && xpred <= ((width << 1) - (2*MB_SIZE)) && ypred >= 0 && 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ypred <= ((height << 1) - (2*MB_SIZE))) 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /*****************************/ 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* (x,y) is inside the frame */ 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*****************************/ 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 10/24/2000 post_processing semaphore */ 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* generation */ 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 10/23/2000 no boundary checking*/ 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *mv_loc = 0; 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Calculate block x coordinate. Divide by 16 is for */ 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* converting half-pixel resolution to block */ 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mmvx = xpred >> 4; 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Calculate block y coordinate. Divide by 16 is for */ 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* converting half-pixel resolution to block */ 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mmvy = ypred >> 4; 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find post processing semaphore location for block */ 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* used for prediction, i.e., */ 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 = &pstprcTypPrv[mmvy*mvwidth][mmvx] */ 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev1 = pstprcTypPrv + mmvx + mmvy * mvwidth; 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if MV is a multiple of 16 */ 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((dx&0xF) != 0) 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dx is not a multiple of 16 */ 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev2 is the block to the right of */ 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block */ 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev2 = pp_prev1 + 1; 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((dy&0xF) != 0) 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is not a multiple of 16 */ 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 is the block below */ 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block */ 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1 + mvwidth; 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is a multiple of 16 */ 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1; 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev4 is the block to the right of */ 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 block. */ 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev4 = pp_prev3 + 1; 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dx is a multiple of 16 */ 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev2 = pp_prev1; 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((dy&0xF) != 0) 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is not a multiple of 16 */ 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 is the block below */ 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block. */ 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1 + mvwidth; 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is a multiple of 16 */ 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1; 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong msk_deblock = 0x3; 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev4 = pp_prev3; 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Perform post processing semaphore propagation for each */ 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* of the 4 blocks in a MB. */ 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (kk = 0; kk < 4; kk++) 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Deringing semaphore propagation */ 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((*(pp_dec_y) & 4) == 0) 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_dec_y) |= ((*(pp_prev1) | *(pp_prev2) | 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_prev3) | *(pp_prev4)) & 0x4); 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Deblocking semaphore propagation */ 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 11/3/00, change the propagation for deblocking */ 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (msk_deblock == 0) 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_dec_y) = 0; 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_dec_y += ll[kk]; 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev1 += ll[kk]; 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev2 += ll[kk]; 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 += ll[kk]; 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev4 += ll[kk]; 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /******************************/ 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* (x,y) is outside the frame */ 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /******************************/ 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 10/24/2000 post_processing semaphore */ 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* generation */ 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 10/23/2000 boundary checking*/ 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *mv_loc = 1; 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Perform post processing semaphore propagation for each */ 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* of the 4 blocks in a MB. */ 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (kk = 0; kk < 4; kk++) 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Calculate block x coordinate and round (?). */ 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Divide by 16 is for converting half-pixel */ 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* resolution to block. */ 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mmvx = (xpred + ((kk & 1) << 3)) >> 4; 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvx = mmvx; 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Calculate block y coordinate and round (?). */ 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Divide by 16 is for converting half-pixel */ 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* resolution to block. */ 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mmvy = (ypred + ((kk & 2) << 2)) >> 4; 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvy = mmvy; 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Perform boundary checking */ 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (nmvx < 0) 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvx = 0; 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (nmvx > mvwidth - 1) 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvx = mvwidth - 1; 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (nmvy < 0) 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvy = 0; 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (nmvy > (height >> 3) - 1) 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nmvy = (height >> 3) - 1; 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find post processing semaphore location for block */ 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* used for prediction, i.e., */ 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 = &pstprcTypPrv[nmvy*mvwidth][nmvx] */ 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev1 = pstprcTypPrv + nmvx + nmvy * mvwidth; 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if x component of MV is a multiple of 16 */ 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* and check if block x coordinate is out of bounds */ 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (((dx&0xF) != 0) && (mmvx + 1 < mvwidth - 1)) 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dx is not a multiple of 16 and the block */ 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* x coordinate is within the bounds */ 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev2 is the block to the right of */ 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block */ 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev2 = pp_prev1 + 1; 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if y component of MV is a multiple */ 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* of 16 and check if block y coordinate is */ 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* out of bounds */ 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1)) 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is not a multiple of 16 and */ 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* the block y coordinate is */ 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* within the bounds */ 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 is the block below */ 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block */ 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1 + mvwidth; 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* all prediction are from different blocks */ 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong msk_deblock = 0x3; 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is a multiple of 16 or the block */ 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* y coordinate is out of bounds */ 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1; 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev4 is the block to the right of */ 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 block. */ 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev4 = pp_prev3 + 1; 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dx is a multiple of 16 or the block x */ 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* coordinate is out of bounds */ 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev2 = pp_prev1; 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if y component of MV is a multiple */ 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* of 16 and check if block y coordinate is */ 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* out of bounds */ 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1)) 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is not a multiple of 16 and */ 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* the block y coordinate is */ 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* within the bounds */ 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev3 is the block below */ 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* pp_prev1 block. */ 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1 + mvwidth; 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* dy is a multiple of 16 or the block */ 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* y coordinate is out of bounds */ 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev3 = pp_prev1; 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_prev4 = pp_prev3; 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Deringing semaphore propagation */ 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((*(pp_dec_y)&4) == 0) 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_dec_y) |= ((*(pp_prev1) | 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_prev2) | *(pp_prev3) | 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_prev4)) & 0x4); 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Deblocking semaphore propagation */ 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 11/3/00, change the propaga= */ 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* tion for deblocking */ 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (msk_deblock == 0) 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(pp_dec_y) = 0; 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_dec_y += ll[kk]; 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Return nothing or data or data pointer 3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return (msk_deblock); 3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus 3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 379