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#include "mp4dec_lib.h" 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "post_proc.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid CombinedHorzVertRingFilter( 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *rec, 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int width, 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int height, 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 *QP_store, 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int chr, 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *pp_mod) 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Define all local variables 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int index, counter; 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int br, bc, incr, mbr, mbc; 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int QP = 1; 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int v[5]; 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint8 *ptr, *ptr_c, *ptr_n; 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int w1, w2, w3, w4; 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int pp_w, pp_h, brwidth; 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int sum, delta; 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int a3_0, a3_1, a3_2, A3_0; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* for Deringing Threshold approach (MPEG4)*/ 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int max_diff, thres, v0, h0, min_blk, max_blk; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int cnthflag; 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Function body here 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Calculate the width and height of the area in blocks (divide by 8) */ 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_w = (width >> 3); 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_h = (height >> 3); 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set up various values needed for updating pointers into rec */ 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong w1 = width; /* Offset to next row in pixels */ 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong w2 = width << 1; /* Offset to two rows in pixels */ 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong w3 = w1 + w2; /* Offset to three rows in pixels */ 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong w4 = w2 << 1; /* Offset to four rows in pixels */ 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong incr = width - BLKSIZE; /* Offset to next row after processing block */ 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Work through the area hortizontally by two rows per step */ 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbr = 0; mbr < pp_h; mbr += 2) 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* brwidth contains the block number of the leftmost block 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * of the current row */ 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth = mbr * pp_w; 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Work through the area vertically by two columns per step */ 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (mbc = 0; mbc < pp_w; mbc += 2) 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the data is luminance info, get the correct 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * quantization paramenter. One parameter per macroblock */ 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!chr) 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* brwidth/4 is the macroblock number and mbc/2 is the macroblock col number*/ 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = QP_store[(brwidth>>2) + (mbc>>1)]; 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /****************** Horiz. Filtering ********************/ 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Process four blocks for the filtering */ 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /********************************************************/ 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Loop over two rows of blocks */ 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (br = mbr + 1; br < mbr + 3; br++) /* br is the row counter in blocks */ 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set brwidth to the first (leftmost) block number of the next row */ 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* brwidth is used as an index when counting blocks */ 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth += pp_w; 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Loop over two columns of blocks in the row */ 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (bc = mbc; bc < mbc + 2; bc++) /* bc is the column counter in blocks */ 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /****** check boundary for deblocking ************/ 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute if the row and column counters are within the area */ 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br < pp_h && bc < pp_w) 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set the ptr to the first pixel of the first block of the second row 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * brwidth * 64 is the pixel row offset 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * bc * 8 is the pixel column offset */ 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr = rec + (brwidth << 6) + (bc << 3); 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set the index to the current block of the second row counting in blocks */ 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong index = brwidth + bc; 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the data is chrominance info, get the correct 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * quantization paramenter. One parameter per block. */ 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (chr) 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = QP_store[index]; 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute hard horizontal filter if semaphore for horizontal deblocking 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * is set for the current block and block immediately above it */ 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (((pp_mod[index]&0x02) != 0) && ((pp_mod[index-pp_w]&0x02) != 0)) 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* Hard filter */ 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set HorzHflag (bit 4) in the pp_mod location */ 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[index-pp_w] |= 0x10; /* 4/26/00 reuse pp_mod for HorzHflag*/ 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Filter across the 8 pixels of the block */ 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (index = BLKSIZE; index > 0; index--) 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Difference between the current pixel and the pixel above it */ 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 = *ptr - *(ptr - w1); 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the magnitude of the difference is greater than the KThH threshold 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and within the quantization parameter, apply hard filter */ 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((a3_0 > KThH || a3_0 < -KThH) && a3_0<QP && a3_0> -QP) 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c = ptr - w3; /* Points to pixel three rows above */ 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_n = ptr + w1; /* Points to pixel one row below */ 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[0] = (int)(*(ptr_c - w3)); 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[1] = (int)(*(ptr_c - w2)); 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[2] = (int)(*(ptr_c - w1)); 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[3] = (int)(*ptr_c); 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[4] = (int)(*(ptr_c + w1)); 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong sum = v[0] 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[1] 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[2] 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + *ptr_c 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[4] 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + (*(ptr_c + w2)) 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + (*(ptr_c + w3)); /* Current pixel */ 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (sum + *ptr_c + 4) >> 3; /* Average pixel values with rounding */ 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr_c) = (uint8) delta; 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Move pointer down one row of pixels (points to pixel two rows 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * above current pixel) */ 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c += w1; 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (counter = 0; counter < 5; counter++) 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Subtract off highest pixel and add in pixel below */ 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong sum = sum - v[counter] + *ptr_n; 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Average the pixel values with rounding */ 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (sum + *ptr_c + 4) >> 3; 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *ptr_c = (uint8)(delta); 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointers to next pixel row */ 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c += w1; 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_n += w1; 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointer to next pixel */ 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ++ptr; 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* index*/ 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* soft filter*/ 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Clear HorzHflag (bit 4) in the pp_mod location */ 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[index-pp_w] &= 0xef; /* reset 1110,1111 */ 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (index = BLKSIZE; index > 0; index--) 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Difference between the current pixel and the pixel above it */ 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 = *(ptr) - *(ptr - w1); 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the magnitude of the difference is greater than the KTh threshold, 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * apply soft filter */ 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((a3_0 > KTh || a3_0 < -KTh)) 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Sum of weighted differences */ 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 += ((*(ptr - w2) - *(ptr + w1)) << 1) + (a3_0 << 2); 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if sum is less than the quantization parameter */ 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (PV_ABS(a3_0) < (QP << 3)) 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_1 = *(ptr - w2) - *(ptr - w3); 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_1 += ((*(ptr - w4) - *(ptr - w1)) << 1) + (a3_1 << 2); 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_2 = *(ptr + w2) - *(ptr + w1); 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_2 += ((*(ptr) - *(ptr + w3)) << 1) + (a3_2 << 2); 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = PV_ABS(a3_0) - PV_MIN(PV_ABS(a3_1), PV_ABS(a3_2)); 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A3_0 > 0) 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 += A3_0 << 2; 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = (A3_0 + 32) >> 6; 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (a3_0 > 0) 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = -A3_0; 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (*(ptr - w1) - *(ptr)) >> 1; 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (delta >= 0) 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (delta >= A3_0) 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = PV_MAX(A3_0, 0); 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A3_0 > 0) 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = 0; 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = PV_MAX(A3_0, delta); 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr - w1) = (uint8)(*(ptr - w1) - delta); 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr) = (uint8)(*(ptr) + delta); 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*threshold*/ 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointer to next pixel */ 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ++ptr; 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*index*/ 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* Soft filter*/ 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/* boundary checking*/ 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*bc*/ 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*br*/ 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth -= (pp_w << 1); 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /****************** Vert. Filtering *********************/ 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Process four blocks for the filtering */ 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /********************************************************/ 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Loop over two rows of blocks */ 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (br = mbr; br < mbr + 2; br++) /* br is the row counter in blocks */ 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (bc = mbc + 1; bc < mbc + 3; bc++) /* bc is the column counter in blocks */ 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /****** check boundary for deblocking ************/ 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute if the row and column counters are within the area */ 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br < pp_h && bc < pp_w) 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set the ptr to the first pixel of the first block of the second row 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * brwidth * 64 is the pixel row offset 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * bc * 8 is the pixel column offset */ 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr = rec + (brwidth << 6) + (bc << 3); 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set the index to the current block of the second row counting in blocks */ 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong index = brwidth + bc; 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the data is chrominance info, get the correct 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * quantization paramenter. One parameter per block. */ 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (chr) 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = QP_store[index]; 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute hard vertical filter if semaphore for vertical deblocking 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * is set for the current block and block immediately left of it */ 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (((pp_mod[index-1]&0x01) != 0) && ((pp_mod[index]&0x01) != 0)) 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* Hard filter */ 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set VertHflag (bit 5) in the pp_mod location of previous block*/ 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[index-1] |= 0x20; /* 4/26/00 reuse pp_mod for VertHflag*/ 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Filter across the 8 pixels of the block */ 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (index = BLKSIZE; index > 0; index--) 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Difference between the current pixel 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and the pixel to left of it */ 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 = *ptr - *(ptr - 1); 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the magnitude of the difference is greater than the KThH threshold 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and within the quantization parameter, apply hard filter */ 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((a3_0 > KThH || a3_0 < -KThH) && a3_0<QP && a3_0> -QP) 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c = ptr - 3; 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_n = ptr + 1; 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[0] = (int)(*(ptr_c - 3)); 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[1] = (int)(*(ptr_c - 2)); 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[2] = (int)(*(ptr_c - 1)); 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[3] = (int)(*ptr_c); 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v[4] = (int)(*(ptr_c + 1)); 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong sum = v[0] 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[1] 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[2] 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + *ptr_c 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + v[4] 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + (*(ptr_c + 2)) 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong + (*(ptr_c + 3)); 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (sum + *ptr_c + 4) >> 3; 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr_c) = (uint8) delta; 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Move pointer down one pixel to the right */ 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c += 1; 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (counter = 0; counter < 5; counter++) 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Subtract off highest pixel and add in pixel below */ 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong sum = sum - v[counter] + *ptr_n; 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Average the pixel values with rounding */ 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (sum + *ptr_c + 4) >> 3; 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *ptr_c = (uint8)(delta); 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointers to next pixel */ 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_c += 1; 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr_n += 1; 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointers to next pixel row */ 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr += w1; 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* index*/ 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { /* soft filter*/ 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Clear VertHflag (bit 5) in the pp_mod location */ 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pp_mod[index-1] &= 0xdf; /* reset 1101,1111 */ 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (index = BLKSIZE; index > 0; index--) 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Difference between the current pixel and the pixel above it */ 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 = *(ptr) - *(ptr - 1); 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the magnitude of the difference is greater than the KTh threshold, 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * apply soft filter */ 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((a3_0 > KTh || a3_0 < -KTh)) 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Sum of weighted differences */ 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_0 += ((*(ptr - 2) - *(ptr + 1)) << 1) + (a3_0 << 2); 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Check if sum is less than the quantization parameter */ 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (PV_ABS(a3_0) < (QP << 3)) 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_1 = *(ptr - 2) - *(ptr - 3); 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_1 += ((*(ptr - 4) - *(ptr - 1)) << 1) + (a3_1 << 2); 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_2 = *(ptr + 2) - *(ptr + 1); 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong a3_2 += ((*(ptr) - *(ptr + 3)) << 1) + (a3_2 << 2); 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = PV_ABS(a3_0) - PV_MIN(PV_ABS(a3_1), PV_ABS(a3_2)); 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A3_0 > 0) 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 += A3_0 << 2; 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = (A3_0 + 32) >> 6; 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (a3_0 > 0) 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong A3_0 = -A3_0; 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = (*(ptr - 1) - *(ptr)) >> 1; 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (delta >= 0) 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (delta >= A3_0) 3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = PV_MAX(A3_0, 0); 3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (A3_0 > 0) 3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = 0; 3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong delta = PV_MAX(A3_0, delta); 3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr - 1) = (uint8)(*(ptr - 1) - delta); 3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *(ptr) = (uint8)(*(ptr) + delta); 3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*threshold*/ 3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr += w1; 3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*index*/ 3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* Soft filter*/ 3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* boundary*/ 3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*bc*/ 3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Increment pointer to next row of pixels */ 3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth += pp_w; 3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*br*/ 3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth -= (pp_w << 1); 4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /****************** Deringing ***************************/ 4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Process four blocks for the filtering */ 4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /********************************************************/ 4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Loop over two rows of blocks */ 4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (br = mbr; br < mbr + 2; br++) 4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Loop over two columns of blocks in the row */ 4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong for (bc = mbc; bc < mbc + 2; bc++) 4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute if the row and column counters are within the area */ 4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br < pp_h && bc < pp_w) 4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set the index to the current block */ 4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong index = brwidth + bc; 4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Execute deringing if semaphore for deringing (bit-3 of pp_mod) 4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * is set for the current block */ 4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((pp_mod[index]&0x04) != 0) 4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Don't process deringing if on an edge block */ 4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br > 0 && bc > 0 && br < pp_h - 1 && bc < pp_w - 1) 4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* cnthflag = weighted average of HorzHflag of current, 4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * one above, previous blocks*/ 4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = ((pp_mod[index] & 0x10) + 4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (pp_mod[index-pp_w] & 0x10) + 4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index-1] >> 1) & 0x10) + 4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index] >> 1) & 0x10)) >> 4; /* 4/26/00*/ 4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Do the deringing if decision flags indicate it's necessary */ 4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (cnthflag < 3) 4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the data is chrominance info, get the correct 4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * quantization paramenter. One parameter per block. */ 4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (chr) 4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = QP_store[index]; 4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set amount to change luminance if it needs to be changed 4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * based on quantization parameter */ 4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong max_diff = (QP >> 2) + 4; 4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set pointer to first pixel of current block */ 4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr = rec + (brwidth << 6) + (bc << 3); 4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find minimum and maximum value of pixel block */ 4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FindMaxMin(ptr, &min_blk, &max_blk, incr); 4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* threshold determination */ 4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong thres = (max_blk + min_blk + 1) >> 1; 4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* If pixel range is greater or equal than DERING_THR, smooth the region */ 4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((max_blk - min_blk) >= DERING_THR) /*smooth 8x8 region*/ 4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef NoMMX 4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* smooth all pixels in the block*/ 4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DeringAdaptiveSmoothMMX(ptr, width, thres, max_diff); 4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else 4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Setup the starting point of the region to smooth */ 4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v0 = (br << 3) - 1; 4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong h0 = (bc << 3) - 1; 4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*smooth 8x8 region*/ 4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AdaptiveSmooth_NoMMX(rec, v0, h0, v0 + 1, h0 + 1, thres, width, max_diff); 4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*cnthflag*/ 4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*dering br==1 or bc==1 (boundary block)*/ 4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else /* Process the boundary blocks */ 4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Decide to perform deblocking based on the semaphore flags 4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * of the neighboring blocks in each case. A certain number of 4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * hard filtering flags have to be set in order to signal need 4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * for smoothing */ 4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br > 0 && br < pp_h - 1) 4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (bc > 0) 4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = ((pp_mod[index-pp_w] & 0x10) + 4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (pp_mod[index] & 0x10) + 4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index-1] >> 1) & 0x10)) >> 4; 4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = ((pp_mod[index] & 0x10) + 4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong (pp_mod[index-pp_w] & 0x10) + 4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index] >> 1) & 0x10)) >> 4; 4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else if (bc > 0 && bc < pp_w - 1) 4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (br > 0) 4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = ((pp_mod[index-pp_w] & 0x10) + 4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index-1] >> 1) & 0x10) + 4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index] >> 1) & 0x10)) >> 4; 5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = ((pp_mod[index] & 0x10) + 5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index-1] >> 1) & 0x10) + 5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ((pp_mod[index] >> 1) & 0x10)) >> 4; 5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else /* at the corner do default*/ 5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong cnthflag = 0; 5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Do the deringing if decision flags indicate it's necessary */ 5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (cnthflag < 2) 5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if the data is chrominance info, get the correct 5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * quantization paramenter. One parameter per block. */ 5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (chr) 5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong QP = QP_store[index]; 5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set amount to change luminance if it needs to be changed 5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * based on quantization parameter */ 5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong max_diff = (QP >> 2) + 4; 5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Set pointer to first pixel of current block */ 5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ptr = rec + (brwidth << 6) + (bc << 3); 5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Find minimum and maximum value of pixel block */ 5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FindMaxMin(ptr, &min_blk, &max_blk, incr); 5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* threshold determination */ 5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong thres = (max_blk + min_blk + 1) >> 1; 5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Setup the starting point of the region to smooth 5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * This is going to be a 4x4 region */ 5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong v0 = (br << 3) + 1; 5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong h0 = (bc << 3) + 1; 5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* If pixel range is greater or equal than DERING_THR, smooth the region */ 5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((max_blk - min_blk) >= DERING_THR) 5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Smooth 4x4 region */ 5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong AdaptiveSmooth_NoMMX(rec, v0, h0, v0 - 3, h0 - 3, thres, width, max_diff); 5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*cnthflag*/ 5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* br==0, bc==0*/ 5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /* dering*/ 5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } /*boundary condition*/ 5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*bc*/ 5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth += pp_w; 5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*br*/ 5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth -= (pp_w << 1); 5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*mbc*/ 5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong brwidth += (pp_w << 1); 5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong }/*mbr*/ 5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /*---------------------------------------------------------------------------- 5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ; Return nothing or data or data pointer 5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ----------------------------------------------------------------------------*/ 5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 566