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#include "mp4dec_lib.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h" 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mbtype_mode.h" 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst static int STRENGTH_tab[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12}; 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*---------------------------------------------------------------------------- 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; FUNCTION CODE 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/ 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid PostFilter( 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong VideoDecData *video, 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int filter_type, 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *output) 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pp_mod; 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *QP_store; 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int combined_with_deblock_filter; 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width, height; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 size; 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int softDeblocking; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *decodedFrame = video->videoDecControls->outputFrame; 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Function body here 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width = video->width; 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong height = video->height; 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong size = (int32)width * height; 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(output, decodedFrame, size); 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(output + size, decodedFrame + size, (size >> 2)); 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong oscl_memcpy(output + size + (size >> 2), decodedFrame + size + (size >> 2), (size >> 2)); 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type == 0) 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* The softDecoding cutoff corresponds to ~93000 bps for QCIF 15fps clip */ 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (PVGetDecBitrate(video->videoDecControls) > (100*video->frameRate*(size >> 12))) // MC_sofDeblock 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong softDeblocking = FALSE; 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong softDeblocking = TRUE; 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong combined_with_deblock_filter = filter_type & PV_DEBLOCK; 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_store = video->QPMB; 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Luma */ 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod = video->pstprcTypCur; 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((filter_type & PV_DEBLOCK) && (filter_type & PV_DERING)) 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertRingFilter(output, width, height, QP_store, 0, pp_mod); 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DEBLOCK) 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (softDeblocking) 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter(output, width, height, 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_store, 0, pp_mod); 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter_NoSoftDeblocking(output, width, height, 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP_store, 0, pp_mod); 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DERING) 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Deringing_Luma(output, width, height, QP_store, 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong combined_with_deblock_filter, pp_mod); 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Chroma */ 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod += (nTotalMB << 2); 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong output += size; 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((filter_type & PV_DEBLOCK) && (filter_type & PV_DERING)) 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertRingFilter(output, (int)(width >> 1), (int)(height >> 1), QP_store, (int) 1, pp_mod); 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DEBLOCK) 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (softDeblocking) 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter(output, (int)(width >> 1), 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, (int) 1, pp_mod); 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter_NoSoftDeblocking(output, (int)(width >> 1), 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, (int) 1, pp_mod); 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DERING) 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Deringing_Chroma(output, (int)(width >> 1), 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong combined_with_deblock_filter, pp_mod); 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod += nTotalMB; 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong output += (size >> 2); 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((filter_type & PV_DEBLOCK) && (filter_type & PV_DERING)) 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertRingFilter(output, (int)(width >> 1), (int)(height >> 1), QP_store, (int) 1, pp_mod); 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DEBLOCK) 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (softDeblocking) 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter(output, (int)(width >> 1), 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, (int) 1, pp_mod); 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CombinedHorzVertFilter_NoSoftDeblocking(output, (int)(width >> 1), 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, (int) 1, pp_mod); 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (filter_type & PV_DERING) 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Deringing_Chroma(output, (int)(width >> 1), 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (int)(height >> 1), QP_store, 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong combined_with_deblock_filter, pp_mod); 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* swap current pp_mod to prev_frame pp_mod */ 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod = video->pstprcTypCur; 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->pstprcTypCur = video->pstprcTypPrv; 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong video->pstprcTypPrv = pp_mod; 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Return nothing or data or data pointer 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid H263_Deblock(uint8 *rec, 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width, 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int height, 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *QP_store, 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *mode, 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int chr, int annex_T) 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i, j, k; 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *rec_y; 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int tmpvar; 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int mbnum, strength, A_D, d1_2, d1, d2, A, B, C, D, b_size; 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int d, offset, nMBPerRow, nMBPerCol, width2 = (width << 1); 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* MAKE SURE I-VOP INTRA MACROBLOCKS ARE SET TO NON-SKIPPED MODE*/ 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = 0; 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (chr) 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nMBPerRow = width >> 3; 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nMBPerCol = height >> 3; 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_size = 8; 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nMBPerRow = width >> 4; 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong nMBPerCol = height >> 4; 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong b_size = 16; 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /********************************* VERTICAL FILTERING ****************************/ 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* vertical filtering of mid sections no need to check neighboring QP's etc */ 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!chr) 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y = rec + (width << 3); 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 0; i < (height >> 4); i++) 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (j = 0; j < (width >> 4); j++) 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED) 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong k = 16; 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[QP_store[mbnum]]; 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (k--) 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A = *(rec_y - width2); 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong D = *(rec_y + width); 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A_D = A - D; 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong C = *rec_y; 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong B = *(rec_y - width); 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d = (((C - B) << 2) + A_D); 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d < 0) 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -(-d >> 3); 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 < -(strength << 1)) 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 < -strength) 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -d1 - (strength << 1); 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = -d1 >> 1; 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = d >> 3; 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 > (strength << 1)) 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 > strength) 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = (strength << 1) - d1; 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = d1 >> 1; 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A_D < 0) 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -(-A_D >> 2); 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 < -d1_2) 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -d1_2; 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = A_D >> 2; 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 > d1_2) 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = d1_2; 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - width2) = A - d2; 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = B + d1; 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - width) = tmpvar; 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = C - d1; 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *rec_y = tmpvar; 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y + width) = D + d2; 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y++; 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += b_size; 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum++; 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += (15 * width); 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* VERTICAL boundary blocks */ 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y = rec + width * b_size; 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = nMBPerRow; 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 0; i < nMBPerCol - 1; i++) 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (j = 0; j < nMBPerRow; j++) 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED || mode[mbnum - nMBPerRow] != MODE_SKIPPED) 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong k = b_size; 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED) 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[(annex_T ? MQ_chroma_QP_table[QP_store[mbnum]] : QP_store[mbnum])]; 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[(annex_T ? MQ_chroma_QP_table[QP_store[mbnum - nMBPerRow]] : QP_store[mbnum - nMBPerRow])]; 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (k--) 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A = *(rec_y - width2); 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong D = *(rec_y + width); 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A_D = A - D; 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong C = *rec_y; 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong B = *(rec_y - width); 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d = (((C - B) << 2) + A_D); 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d < 0) 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -(-d >> 3); 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 < -(strength << 1)) 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 < -strength) 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -d1 - (strength << 1); 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = -d1 >> 1; 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = d >> 3; 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 > (strength << 1)) 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 > strength) 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = (strength << 1) - d1; 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = d1 >> 1; 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A_D < 0) 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -(-A_D >> 2); 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 < -d1_2) 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -d1_2; 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = A_D >> 2; 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 > d1_2) 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = d1_2; 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - width2) = A - d2; 3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = B + d1; 3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - width) = tmpvar; 3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = C - d1; 3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *rec_y = tmpvar; 3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y + width) = D + d2; 3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y++; 3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += b_size; 3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum++; 3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += ((b_size - 1) * width); 3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /***************************HORIZONTAL FILTERING ********************************************/ 3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = 0; 3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* HORIZONTAL INNER */ 3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!chr) 3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y = rec + 8; 3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong offset = width * b_size - b_size; 4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 0; i < nMBPerCol; i++) 4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (j = 0; j < nMBPerRow; j++) 4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED) 4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong k = 16; 4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[QP_store[mbnum]]; 4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (k--) 4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A = *(rec_y - 2); 4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong D = *(rec_y + 1); 4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A_D = A - D; 4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong C = *rec_y; 4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong B = *(rec_y - 1); 4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d = (((C - B) << 2) + A_D); 4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d < 0) 4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -(-d >> 3); 4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 < -(strength << 1)) 4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 < -strength) 4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -d1 - (strength << 1); 4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = -d1 >> 1; 4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = d >> 3; 4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 > (strength << 1)) 4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 > strength) 4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = (strength << 1) - d1; 4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = d1 >> 1; 4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A_D < 0) 4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -(-A_D >> 2); 4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 < -d1_2) 4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -d1_2; 4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = A_D >> 2; 4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 > d1_2) 4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = d1_2; 4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - 2) = A - d2; 4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = B + d1; 4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - 1) = tmpvar; 4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = C - d1; 4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *rec_y = tmpvar; 4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y + 1) = D + d2; 4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += width; 4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y -= offset; 4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += b_size; 4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum++; 4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += (15 * width); 4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* HORIZONTAL EDGE */ 4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y = rec + b_size; 4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong offset = width * b_size - b_size; 4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum = 1; 4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (i = 0; i < nMBPerCol; i++) 4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (j = 0; j < nMBPerRow - 1; j++) 4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED || mode[mbnum-1] != MODE_SKIPPED) 4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong k = b_size; 4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (mode[mbnum] != MODE_SKIPPED) 4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[(annex_T ? MQ_chroma_QP_table[QP_store[mbnum]] : QP_store[mbnum])]; 5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong strength = STRENGTH_tab[(annex_T ? MQ_chroma_QP_table[QP_store[mbnum - 1]] : QP_store[mbnum - 1])]; 5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (k--) 5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A = *(rec_y - 2); 5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong D = *(rec_y + 1); 5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A_D = A - D; 5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong C = *rec_y; 5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong B = *(rec_y - 1); 5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d = (((C - B) << 2) + A_D); 5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d < 0) 5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -(-d >> 3); 5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 < -(strength << 1)) 5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 < -strength) 5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = -d1 - (strength << 1); 5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = -d1 >> 1; 5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = d >> 3; 5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d1 > (strength << 1)) 5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = 0; 5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (d1 > strength) 5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1 = (strength << 1) - d1; 5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d1_2 = d1 >> 1; 5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A_D < 0) 5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -(-A_D >> 2); 5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 < -d1_2) 5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = -d1_2; 5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = A_D >> 2; 5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (d2 > d1_2) 5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong d2 = d1_2; 5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - 2) = A - d2; 5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = B + d1; 5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y - 1) = tmpvar; 5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar = C - d1; 5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmpvar) 5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *rec_y = tmpvar; 5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(rec_y + 1) = D + d2; 5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += width; 5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y -= offset; 5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += b_size; 5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum++; 5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong rec_y += ((width * (b_size - 1)) + b_size); 5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong mbnum++; 5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 586