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