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 xpred = x-axis coordinate of the MB used for prediction (int) 2402f5b5447de349216a40086ca6061efefb5a3025James Dong ypred = y-axis coordinate of the MB used for prediction (int) 2502f5b5447de349216a40086ca6061efefb5a3025James Dong pp_dec_y = pointer to the post processing semaphore for current 2602f5b5447de349216a40086ca6061efefb5a3025James Dong luminance frame (uint8) 2702f5b5447de349216a40086ca6061efefb5a3025James Dong pstprcTypPrv = pointer the previous frame's post processing type 2802f5b5447de349216a40086ca6061efefb5a3025James Dong (uint8) 2902f5b5447de349216a40086ca6061efefb5a3025James Dong ll = pointer to the buffer (int) 3002f5b5447de349216a40086ca6061efefb5a3025James Dong mv_loc = flag indicating location of the motion compensated 3102f5b5447de349216a40086ca6061efefb5a3025James Dong (x,y) position with respect to the luminance MB (int); 3202f5b5447de349216a40086ca6061efefb5a3025James Dong 0 -> inside MB, 1 -> outside MB 3302f5b5447de349216a40086ca6061efefb5a3025James Dong dx = horizontal component of the motion vector (int) 3402f5b5447de349216a40086ca6061efefb5a3025James Dong dy = vertical component of the motion vector (int) 3502f5b5447de349216a40086ca6061efefb5a3025James Dong mvwidth = number of blocks per row (int) 3602f5b5447de349216a40086ca6061efefb5a3025James Dong width = luminance VOP width in pixels (int) 3702f5b5447de349216a40086ca6061efefb5a3025James Dong height = luminance VOP height in pixels (int) 3802f5b5447de349216a40086ca6061efefb5a3025James Dong 3902f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed: 4002f5b5447de349216a40086ca6061efefb5a3025James Dong None 4102f5b5447de349216a40086ca6061efefb5a3025James Dong 4202f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed: 4302f5b5447de349216a40086ca6061efefb5a3025James Dong None 4402f5b5447de349216a40086ca6061efefb5a3025James Dong 4502f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs: 4602f5b5447de349216a40086ca6061efefb5a3025James Dong msk_deblock = flag that indicates whether deblocking is to be 4702f5b5447de349216a40086ca6061efefb5a3025James Dong performed (msk_deblock = 0) or not (msk_deblock = 4802f5b5447de349216a40086ca6061efefb5a3025James Dong 1) (uint8) 4902f5b5447de349216a40086ca6061efefb5a3025James Dong 5002f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified: 5102f5b5447de349216a40086ca6061efefb5a3025James Dong pp_dec_y contents are the updated semapohore propagation data 5202f5b5447de349216a40086ca6061efefb5a3025James Dong 5302f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified: 5402f5b5447de349216a40086ca6061efefb5a3025James Dong None 5502f5b5447de349216a40086ca6061efefb5a3025James Dong 5602f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified: 5702f5b5447de349216a40086ca6061efefb5a3025James Dong None 5802f5b5447de349216a40086ca6061efefb5a3025James Dong 5902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------ 6002f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION 6102f5b5447de349216a40086ca6061efefb5a3025James Dong 6202f5b5447de349216a40086ca6061efefb5a3025James Dong This functions performs post processing semaphore propagation processing 6302f5b5447de349216a40086ca6061efefb5a3025James Dong after luminance prediction. 6402f5b5447de349216a40086ca6061efefb5a3025James Dong 6502f5b5447de349216a40086ca6061efefb5a3025James Dong*/ 6602f5b5447de349216a40086ca6061efefb5a3025James Dong 6702f5b5447de349216a40086ca6061efefb5a3025James Dong 6802f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 6902f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES 7002f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 7102f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_api.h" 7202f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4def.h" 7302f5b5447de349216a40086ca6061efefb5a3025James Dong 7402f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 7502f5b5447de349216a40086ca6061efefb5a3025James Dong; MACROS 7602f5b5447de349216a40086ca6061efefb5a3025James Dong; Define module specific macros here 7702f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 7802f5b5447de349216a40086ca6061efefb5a3025James Dong 7902f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 8002f5b5447de349216a40086ca6061efefb5a3025James Dong; DEFINES 8102f5b5447de349216a40086ca6061efefb5a3025James Dong; Include all pre-processor statements here. Include conditional 8202f5b5447de349216a40086ca6061efefb5a3025James Dong; compile variables also. 8302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 8402f5b5447de349216a40086ca6061efefb5a3025James Dong 8502f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 8602f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL FUNCTION DEFINITIONS 8702f5b5447de349216a40086ca6061efefb5a3025James Dong; Function Prototype declaration 8802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 8902f5b5447de349216a40086ca6061efefb5a3025James Dong 9002f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 9102f5b5447de349216a40086ca6061efefb5a3025James Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS 9202f5b5447de349216a40086ca6061efefb5a3025James Dong; Variable declaration - defined here and used outside this module 9302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 9402f5b5447de349216a40086ca6061efefb5a3025James Dong 9502f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 9602f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL FUNCTION REFERENCES 9702f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare functions defined elsewhere and referenced in this module 9802f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 9902f5b5447de349216a40086ca6061efefb5a3025James Dong 10002f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 10102f5b5447de349216a40086ca6061efefb5a3025James Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 10202f5b5447de349216a40086ca6061efefb5a3025James Dong; Declare variables used in this module but defined elsewhere 10302f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 10402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 10502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus 10602f5b5447de349216a40086ca6061efefb5a3025James Dongextern "C" 10702f5b5447de349216a40086ca6061efefb5a3025James Dong{ 10802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 10902f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 11002f5b5447de349216a40086ca6061efefb5a3025James Dong ; FUNCTION CODE 11102f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 11202f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 pp_semaphore_luma( 11302f5b5447de349216a40086ca6061efefb5a3025James Dong int xpred, /* i */ 11402f5b5447de349216a40086ca6061efefb5a3025James Dong int ypred, /* i */ 11502f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pp_dec_y, /* i/o */ 11602f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pstprcTypPrv, /* i */ 11702f5b5447de349216a40086ca6061efefb5a3025James Dong int *ll, /* i */ 11802f5b5447de349216a40086ca6061efefb5a3025James Dong int *mv_loc, /* i/o */ 11902f5b5447de349216a40086ca6061efefb5a3025James Dong int dx, /* i */ 12002f5b5447de349216a40086ca6061efefb5a3025James Dong int dy, /* i */ 12102f5b5447de349216a40086ca6061efefb5a3025James Dong int mvwidth, /* i */ 12202f5b5447de349216a40086ca6061efefb5a3025James Dong int width, /* i */ 12302f5b5447de349216a40086ca6061efefb5a3025James Dong int height /* i */ 12402f5b5447de349216a40086ca6061efefb5a3025James Dong ) 12502f5b5447de349216a40086ca6061efefb5a3025James Dong { 12602f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 12702f5b5447de349216a40086ca6061efefb5a3025James Dong ; Define all local variables 12802f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 12902f5b5447de349216a40086ca6061efefb5a3025James Dong int kk, mmvy, mmvx, nmvx, nmvy; 13002f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pp_prev1, *pp_prev2, *pp_prev3, *pp_prev4; 13102f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 msk_deblock = 0; /* 11/3/00 */ 13202f5b5447de349216a40086ca6061efefb5a3025James Dong 13302f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 13402f5b5447de349216a40086ca6061efefb5a3025James Dong ; Function body here 13502f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 13602f5b5447de349216a40086ca6061efefb5a3025James Dong /* Interframe Processing - 1 MV per MB */ 13702f5b5447de349216a40086ca6061efefb5a3025James Dong 13802f5b5447de349216a40086ca6061efefb5a3025James Dong /* check whether the MV points outside the frame */ 13902f5b5447de349216a40086ca6061efefb5a3025James Dong if (xpred >= 0 && xpred <= ((width << 1) - (2*MB_SIZE)) && ypred >= 0 && 14002f5b5447de349216a40086ca6061efefb5a3025James Dong ypred <= ((height << 1) - (2*MB_SIZE))) 14102f5b5447de349216a40086ca6061efefb5a3025James Dong { /*****************************/ 14202f5b5447de349216a40086ca6061efefb5a3025James Dong /* (x,y) is inside the frame */ 14302f5b5447de349216a40086ca6061efefb5a3025James Dong /*****************************/ 14402f5b5447de349216a40086ca6061efefb5a3025James Dong 14502f5b5447de349216a40086ca6061efefb5a3025James Dong /* 10/24/2000 post_processing semaphore */ 14602f5b5447de349216a40086ca6061efefb5a3025James Dong /* generation */ 14702f5b5447de349216a40086ca6061efefb5a3025James Dong 14802f5b5447de349216a40086ca6061efefb5a3025James Dong /* 10/23/2000 no boundary checking*/ 14902f5b5447de349216a40086ca6061efefb5a3025James Dong *mv_loc = 0; 15002f5b5447de349216a40086ca6061efefb5a3025James Dong 15102f5b5447de349216a40086ca6061efefb5a3025James Dong /* Calculate block x coordinate. Divide by 16 is for */ 15202f5b5447de349216a40086ca6061efefb5a3025James Dong /* converting half-pixel resolution to block */ 15302f5b5447de349216a40086ca6061efefb5a3025James Dong mmvx = xpred >> 4; 15402f5b5447de349216a40086ca6061efefb5a3025James Dong 15502f5b5447de349216a40086ca6061efefb5a3025James Dong /* Calculate block y coordinate. Divide by 16 is for */ 15602f5b5447de349216a40086ca6061efefb5a3025James Dong /* converting half-pixel resolution to block */ 15702f5b5447de349216a40086ca6061efefb5a3025James Dong mmvy = ypred >> 4; 15802f5b5447de349216a40086ca6061efefb5a3025James Dong 15902f5b5447de349216a40086ca6061efefb5a3025James Dong /* Find post processing semaphore location for block */ 16002f5b5447de349216a40086ca6061efefb5a3025James Dong /* used for prediction, i.e., */ 16102f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 = &pstprcTypPrv[mmvy*mvwidth][mmvx] */ 16202f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev1 = pstprcTypPrv + mmvx + mmvy * mvwidth; 16302f5b5447de349216a40086ca6061efefb5a3025James Dong 16402f5b5447de349216a40086ca6061efefb5a3025James Dong /* Check if MV is a multiple of 16 */ 16502f5b5447de349216a40086ca6061efefb5a3025James Dong if ((dx&0xF) != 0) 16602f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dx is not a multiple of 16 */ 16702f5b5447de349216a40086ca6061efefb5a3025James Dong 16802f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev2 is the block to the right of */ 16902f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block */ 17002f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev2 = pp_prev1 + 1; 17102f5b5447de349216a40086ca6061efefb5a3025James Dong 17202f5b5447de349216a40086ca6061efefb5a3025James Dong if ((dy&0xF) != 0) 17302f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is not a multiple of 16 */ 17402f5b5447de349216a40086ca6061efefb5a3025James Dong 17502f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 is the block below */ 17602f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block */ 17702f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1 + mvwidth; 17802f5b5447de349216a40086ca6061efefb5a3025James Dong } 17902f5b5447de349216a40086ca6061efefb5a3025James Dong else 18002f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is a multiple of 16 */ 18102f5b5447de349216a40086ca6061efefb5a3025James Dong 18202f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1; 18302f5b5447de349216a40086ca6061efefb5a3025James Dong } 18402f5b5447de349216a40086ca6061efefb5a3025James Dong 18502f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev4 is the block to the right of */ 18602f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 block. */ 18702f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev4 = pp_prev3 + 1; 18802f5b5447de349216a40086ca6061efefb5a3025James Dong } 18902f5b5447de349216a40086ca6061efefb5a3025James Dong else 19002f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dx is a multiple of 16 */ 19102f5b5447de349216a40086ca6061efefb5a3025James Dong 19202f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev2 = pp_prev1; 19302f5b5447de349216a40086ca6061efefb5a3025James Dong 19402f5b5447de349216a40086ca6061efefb5a3025James Dong if ((dy&0xF) != 0) 19502f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is not a multiple of 16 */ 19602f5b5447de349216a40086ca6061efefb5a3025James Dong 19702f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 is the block below */ 19802f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block. */ 19902f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1 + mvwidth; 20002f5b5447de349216a40086ca6061efefb5a3025James Dong } 20102f5b5447de349216a40086ca6061efefb5a3025James Dong else 20202f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is a multiple of 16 */ 20302f5b5447de349216a40086ca6061efefb5a3025James Dong 20402f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1; 20502f5b5447de349216a40086ca6061efefb5a3025James Dong msk_deblock = 0x3; 20602f5b5447de349216a40086ca6061efefb5a3025James Dong } 20702f5b5447de349216a40086ca6061efefb5a3025James Dong 20802f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev4 = pp_prev3; 20902f5b5447de349216a40086ca6061efefb5a3025James Dong } 21002f5b5447de349216a40086ca6061efefb5a3025James Dong 21102f5b5447de349216a40086ca6061efefb5a3025James Dong /* Perform post processing semaphore propagation for each */ 21202f5b5447de349216a40086ca6061efefb5a3025James Dong /* of the 4 blocks in a MB. */ 21302f5b5447de349216a40086ca6061efefb5a3025James Dong for (kk = 0; kk < 4; kk++) 21402f5b5447de349216a40086ca6061efefb5a3025James Dong { 21502f5b5447de349216a40086ca6061efefb5a3025James Dong /* Deringing semaphore propagation */ 21602f5b5447de349216a40086ca6061efefb5a3025James Dong if ((*(pp_dec_y) & 4) == 0) 21702f5b5447de349216a40086ca6061efefb5a3025James Dong { 21802f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_dec_y) |= ((*(pp_prev1) | *(pp_prev2) | 21902f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_prev3) | *(pp_prev4)) & 0x4); 22002f5b5447de349216a40086ca6061efefb5a3025James Dong } 22102f5b5447de349216a40086ca6061efefb5a3025James Dong /* Deblocking semaphore propagation */ 22202f5b5447de349216a40086ca6061efefb5a3025James Dong /* 11/3/00, change the propagation for deblocking */ 22302f5b5447de349216a40086ca6061efefb5a3025James Dong if (msk_deblock == 0) 22402f5b5447de349216a40086ca6061efefb5a3025James Dong { 22502f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_dec_y) = 0; 22602f5b5447de349216a40086ca6061efefb5a3025James Dong } 22702f5b5447de349216a40086ca6061efefb5a3025James Dong 22802f5b5447de349216a40086ca6061efefb5a3025James Dong pp_dec_y += ll[kk]; 22902f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev1 += ll[kk]; 23002f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev2 += ll[kk]; 23102f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 += ll[kk]; 23202f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev4 += ll[kk]; 23302f5b5447de349216a40086ca6061efefb5a3025James Dong } 23402f5b5447de349216a40086ca6061efefb5a3025James Dong 23502f5b5447de349216a40086ca6061efefb5a3025James Dong } 23602f5b5447de349216a40086ca6061efefb5a3025James Dong else 23702f5b5447de349216a40086ca6061efefb5a3025James Dong { /******************************/ 23802f5b5447de349216a40086ca6061efefb5a3025James Dong /* (x,y) is outside the frame */ 23902f5b5447de349216a40086ca6061efefb5a3025James Dong /******************************/ 24002f5b5447de349216a40086ca6061efefb5a3025James Dong 24102f5b5447de349216a40086ca6061efefb5a3025James Dong /* 10/24/2000 post_processing semaphore */ 24202f5b5447de349216a40086ca6061efefb5a3025James Dong /* generation */ 24302f5b5447de349216a40086ca6061efefb5a3025James Dong 24402f5b5447de349216a40086ca6061efefb5a3025James Dong /* 10/23/2000 boundary checking*/ 24502f5b5447de349216a40086ca6061efefb5a3025James Dong *mv_loc = 1; 24602f5b5447de349216a40086ca6061efefb5a3025James Dong 24702f5b5447de349216a40086ca6061efefb5a3025James Dong /* Perform post processing semaphore propagation for each */ 24802f5b5447de349216a40086ca6061efefb5a3025James Dong /* of the 4 blocks in a MB. */ 24902f5b5447de349216a40086ca6061efefb5a3025James Dong for (kk = 0; kk < 4; kk++) 25002f5b5447de349216a40086ca6061efefb5a3025James Dong { 25102f5b5447de349216a40086ca6061efefb5a3025James Dong /* Calculate block x coordinate and round (?). */ 25202f5b5447de349216a40086ca6061efefb5a3025James Dong /* Divide by 16 is for converting half-pixel */ 25302f5b5447de349216a40086ca6061efefb5a3025James Dong /* resolution to block. */ 25402f5b5447de349216a40086ca6061efefb5a3025James Dong mmvx = (xpred + ((kk & 1) << 3)) >> 4; 25502f5b5447de349216a40086ca6061efefb5a3025James Dong nmvx = mmvx; 25602f5b5447de349216a40086ca6061efefb5a3025James Dong 25702f5b5447de349216a40086ca6061efefb5a3025James Dong /* Calculate block y coordinate and round (?). */ 25802f5b5447de349216a40086ca6061efefb5a3025James Dong /* Divide by 16 is for converting half-pixel */ 25902f5b5447de349216a40086ca6061efefb5a3025James Dong /* resolution to block. */ 26002f5b5447de349216a40086ca6061efefb5a3025James Dong mmvy = (ypred + ((kk & 2) << 2)) >> 4; 26102f5b5447de349216a40086ca6061efefb5a3025James Dong nmvy = mmvy; 26202f5b5447de349216a40086ca6061efefb5a3025James Dong 26302f5b5447de349216a40086ca6061efefb5a3025James Dong /* Perform boundary checking */ 26402f5b5447de349216a40086ca6061efefb5a3025James Dong if (nmvx < 0) 26502f5b5447de349216a40086ca6061efefb5a3025James Dong { 26602f5b5447de349216a40086ca6061efefb5a3025James Dong nmvx = 0; 26702f5b5447de349216a40086ca6061efefb5a3025James Dong } 26802f5b5447de349216a40086ca6061efefb5a3025James Dong else if (nmvx > mvwidth - 1) 26902f5b5447de349216a40086ca6061efefb5a3025James Dong { 27002f5b5447de349216a40086ca6061efefb5a3025James Dong nmvx = mvwidth - 1; 27102f5b5447de349216a40086ca6061efefb5a3025James Dong } 27202f5b5447de349216a40086ca6061efefb5a3025James Dong 27302f5b5447de349216a40086ca6061efefb5a3025James Dong if (nmvy < 0) 27402f5b5447de349216a40086ca6061efefb5a3025James Dong { 27502f5b5447de349216a40086ca6061efefb5a3025James Dong nmvy = 0; 27602f5b5447de349216a40086ca6061efefb5a3025James Dong } 27702f5b5447de349216a40086ca6061efefb5a3025James Dong else if (nmvy > (height >> 3) - 1) 27802f5b5447de349216a40086ca6061efefb5a3025James Dong { 27902f5b5447de349216a40086ca6061efefb5a3025James Dong nmvy = (height >> 3) - 1; 28002f5b5447de349216a40086ca6061efefb5a3025James Dong } 28102f5b5447de349216a40086ca6061efefb5a3025James Dong 28202f5b5447de349216a40086ca6061efefb5a3025James Dong /* Find post processing semaphore location for block */ 28302f5b5447de349216a40086ca6061efefb5a3025James Dong /* used for prediction, i.e., */ 28402f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 = &pstprcTypPrv[nmvy*mvwidth][nmvx] */ 28502f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev1 = pstprcTypPrv + nmvx + nmvy * mvwidth; 28602f5b5447de349216a40086ca6061efefb5a3025James Dong 28702f5b5447de349216a40086ca6061efefb5a3025James Dong /* Check if x component of MV is a multiple of 16 */ 28802f5b5447de349216a40086ca6061efefb5a3025James Dong /* and check if block x coordinate is out of bounds */ 28902f5b5447de349216a40086ca6061efefb5a3025James Dong if (((dx&0xF) != 0) && (mmvx + 1 < mvwidth - 1)) 29002f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dx is not a multiple of 16 and the block */ 29102f5b5447de349216a40086ca6061efefb5a3025James Dong /* x coordinate is within the bounds */ 29202f5b5447de349216a40086ca6061efefb5a3025James Dong 29302f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev2 is the block to the right of */ 29402f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block */ 29502f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev2 = pp_prev1 + 1; 29602f5b5447de349216a40086ca6061efefb5a3025James Dong 29702f5b5447de349216a40086ca6061efefb5a3025James Dong /* Check if y component of MV is a multiple */ 29802f5b5447de349216a40086ca6061efefb5a3025James Dong /* of 16 and check if block y coordinate is */ 29902f5b5447de349216a40086ca6061efefb5a3025James Dong /* out of bounds */ 30002f5b5447de349216a40086ca6061efefb5a3025James Dong if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1)) 30102f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is not a multiple of 16 and */ 30202f5b5447de349216a40086ca6061efefb5a3025James Dong /* the block y coordinate is */ 30302f5b5447de349216a40086ca6061efefb5a3025James Dong /* within the bounds */ 30402f5b5447de349216a40086ca6061efefb5a3025James Dong 30502f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 is the block below */ 30602f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block */ 30702f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1 + mvwidth; 30802f5b5447de349216a40086ca6061efefb5a3025James Dong 30902f5b5447de349216a40086ca6061efefb5a3025James Dong /* all prediction are from different blocks */ 31002f5b5447de349216a40086ca6061efefb5a3025James Dong msk_deblock = 0x3; 31102f5b5447de349216a40086ca6061efefb5a3025James Dong } 31202f5b5447de349216a40086ca6061efefb5a3025James Dong else 31302f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is a multiple of 16 or the block */ 31402f5b5447de349216a40086ca6061efefb5a3025James Dong /* y coordinate is out of bounds */ 31502f5b5447de349216a40086ca6061efefb5a3025James Dong 31602f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1; 31702f5b5447de349216a40086ca6061efefb5a3025James Dong } 31802f5b5447de349216a40086ca6061efefb5a3025James Dong 31902f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev4 is the block to the right of */ 32002f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 block. */ 32102f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev4 = pp_prev3 + 1; 32202f5b5447de349216a40086ca6061efefb5a3025James Dong } 32302f5b5447de349216a40086ca6061efefb5a3025James Dong else 32402f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dx is a multiple of 16 or the block x */ 32502f5b5447de349216a40086ca6061efefb5a3025James Dong /* coordinate is out of bounds */ 32602f5b5447de349216a40086ca6061efefb5a3025James Dong 32702f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev2 = pp_prev1; 32802f5b5447de349216a40086ca6061efefb5a3025James Dong 32902f5b5447de349216a40086ca6061efefb5a3025James Dong /* Check if y component of MV is a multiple */ 33002f5b5447de349216a40086ca6061efefb5a3025James Dong /* of 16 and check if block y coordinate is */ 33102f5b5447de349216a40086ca6061efefb5a3025James Dong /* out of bounds */ 33202f5b5447de349216a40086ca6061efefb5a3025James Dong if (((dy&0xF) != 0) && (mmvy + 1 < (height >> 3) - 1)) 33302f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is not a multiple of 16 and */ 33402f5b5447de349216a40086ca6061efefb5a3025James Dong /* the block y coordinate is */ 33502f5b5447de349216a40086ca6061efefb5a3025James Dong /* within the bounds */ 33602f5b5447de349216a40086ca6061efefb5a3025James Dong 33702f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev3 is the block below */ 33802f5b5447de349216a40086ca6061efefb5a3025James Dong /* pp_prev1 block. */ 33902f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1 + mvwidth; 34002f5b5447de349216a40086ca6061efefb5a3025James Dong } 34102f5b5447de349216a40086ca6061efefb5a3025James Dong else 34202f5b5447de349216a40086ca6061efefb5a3025James Dong { /* dy is a multiple of 16 or the block */ 34302f5b5447de349216a40086ca6061efefb5a3025James Dong /* y coordinate is out of bounds */ 34402f5b5447de349216a40086ca6061efefb5a3025James Dong 34502f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev3 = pp_prev1; 34602f5b5447de349216a40086ca6061efefb5a3025James Dong } 34702f5b5447de349216a40086ca6061efefb5a3025James Dong 34802f5b5447de349216a40086ca6061efefb5a3025James Dong pp_prev4 = pp_prev3; 34902f5b5447de349216a40086ca6061efefb5a3025James Dong } 35002f5b5447de349216a40086ca6061efefb5a3025James Dong 35102f5b5447de349216a40086ca6061efefb5a3025James Dong /* Deringing semaphore propagation */ 35202f5b5447de349216a40086ca6061efefb5a3025James Dong if ((*(pp_dec_y)&4) == 0) 35302f5b5447de349216a40086ca6061efefb5a3025James Dong { 35402f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_dec_y) |= ((*(pp_prev1) | 35502f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_prev2) | *(pp_prev3) | 35602f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_prev4)) & 0x4); 35702f5b5447de349216a40086ca6061efefb5a3025James Dong } 35802f5b5447de349216a40086ca6061efefb5a3025James Dong /* Deblocking semaphore propagation */ 35902f5b5447de349216a40086ca6061efefb5a3025James Dong /* 11/3/00, change the propaga= */ 36002f5b5447de349216a40086ca6061efefb5a3025James Dong /* tion for deblocking */ 36102f5b5447de349216a40086ca6061efefb5a3025James Dong if (msk_deblock == 0) 36202f5b5447de349216a40086ca6061efefb5a3025James Dong { 36302f5b5447de349216a40086ca6061efefb5a3025James Dong *(pp_dec_y) = 0; 36402f5b5447de349216a40086ca6061efefb5a3025James Dong } 36502f5b5447de349216a40086ca6061efefb5a3025James Dong 36602f5b5447de349216a40086ca6061efefb5a3025James Dong pp_dec_y += ll[kk]; 36702f5b5447de349216a40086ca6061efefb5a3025James Dong } 36802f5b5447de349216a40086ca6061efefb5a3025James Dong } 36902f5b5447de349216a40086ca6061efefb5a3025James Dong 37002f5b5447de349216a40086ca6061efefb5a3025James Dong /*---------------------------------------------------------------------------- 37102f5b5447de349216a40086ca6061efefb5a3025James Dong ; Return nothing or data or data pointer 37202f5b5447de349216a40086ca6061efefb5a3025James Dong ----------------------------------------------------------------------------*/ 37302f5b5447de349216a40086ca6061efefb5a3025James Dong return (msk_deblock); 37402f5b5447de349216a40086ca6061efefb5a3025James Dong } 37502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus 37602f5b5447de349216a40086ca6061efefb5a3025James Dong} 37702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 37802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 379