13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong INPUT AND OUTPUT DEFINITIONS
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Inputs:
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [input_variable_name] = [description of the input to module, its type
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores/Buffers/Pointers Needed:
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [description of the local store, its type
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_buffer_name] = [description of the local buffer, its type
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_ptr_name] = [description of the local pointer, its type
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores/Buffers/Pointers Needed:
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [description of the global store, its type
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_buffer_name] = [description of the global buffer, its type
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                definition, and length (when applicable)]
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_ptr_name] = [description of the global pointer, its type
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 definition, and length (when applicable)]
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Outputs:
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [return_variable_name] = [description of data/pointer returned
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  by module, its type definition, and length
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  (when applicable)]
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Pointers and Buffers Modified:
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr_ptr] points to the [describe where the
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr_ptr points to, its type definition, and length
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      (when applicable)]
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [variable_bfr] contents are [describe the new contents of
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong      variable_bfr]
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Local Stores Modified:
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [local_store_name] = [describe new contents, its type
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                  definition, and length (when applicable)]
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Global Stores Modified:
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    [global_store_name] = [describe new contents, its type
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                   definition, and length (when applicable)]
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong FUNCTION DESCRIPTION
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   For fast Deblock filtering
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   Newer version (macroblock based processing)
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REQUIREMENTS
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong [List requirements to be satisfied by this module.]
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong REFERENCES
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong [List all references used in designing this module.]
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PSEUDO-CODE
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong RESOURCES USED
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong   When the code is written for a specific target processor the
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     the resources used should be documented below.
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong STACK USAGE: [stack count for this module] + [variable to represent
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong          stack usage for each subroutine called]
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [stack usage variable] = stack usage for [subroutine
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong         name] (see [filename].ext)
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong DATA MEMORY USED: x words
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PROGRAM MEMORY USED: x words
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLOCK CYCLES: [cycle count equation for this module] + [variable
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           used to represent cycle count for each subroutine
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong           called]
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong     where: [cycle count variable] = cycle count for [subroutine
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        name] (see [filename].ext)
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong------------------------------------------------------------------------------
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; INCLUDES
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include    "mp4dec_lib.h"
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include    "post_proc.h"
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; MACROS
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Define module specific macros here
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//#define FILTER_LEN_8
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; DEFINES
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Include all pre-processor statements here. Include conditional
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; compile variables also.
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL FUNCTION DEFINITIONS
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Function Prototype declaration
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; LOCAL STORE/BUFFER/POINTER DEFINITIONS
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Variable declaration - defined here and used outside this module
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL FUNCTION REFERENCES
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare functions defined elsewhere and referenced in this module
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; Declare variables used in this module but defined elsewhere
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*************************************************************************
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Function prototype : void CombinedHorzVertFilter(   uint8 *rec,
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                        int width,
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                        int height,
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                        int *QP_store,
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                        int chr,
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                        uint8 *pp_mod)
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Parameters  :
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        rec     :   pointer to the decoded frame buffer.
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        width   :   width of decoded frame.
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        height  :   height of decoded frame
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QP_store:   pointer to the array of QP corresponding to the decoded frame.
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    It had only one value for each MB.
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        chr     :   luma or color indication
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    == 0 luma
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    == 1 color
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod  :   The semphore used for deblocking
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Remark      :   The function do the deblocking on decoded frames.
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    First based on the semaphore info., it is divided into hard and soft filtering.
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    To differentiate real and fake edge, it then check the difference with QP to
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    decide whether to do the filtering or not.
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*************************************************************************/
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*----------------------------------------------------------------------------
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong; FUNCTION CODE
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong----------------------------------------------------------------------------*/
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid CombinedHorzVertFilter(
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *rec,
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width,
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int height,
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *QP_store,
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int chr,
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_mod)
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int br, bc, mbr, mbc;
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = 1;
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr, *ptr_e;
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int pp_w, pp_h;
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int brwidth;
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int jVal0, jVal1, jVal2;
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_w = (width >> 3);
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_h = (height >> 3);
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbr = 0; mbr < pp_h; mbr += 2)         /* row of blocks */
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        brwidth = mbr * pp_w;               /* number of blocks above current block row */
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (mbc = 0; mbc < pp_w; mbc += 2)     /* col of blocks */
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!chr)
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                QP = QP_store[(brwidth>>2) + (mbc>>1)]; /* QP is per MB based value */
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /********* for each block **************/
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /****************** Horiz. Filtering ********************/
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (br = mbr + 1; br < mbr + 3; br++)  /* 2x2 blocks */
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                brwidth += pp_w;                    /* number of blocks above & left current block row */
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* the profile on ARM920T shows separate these two boundary check is faster than combine them */
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (br < pp_h)                  /* boundary : don't do it on the lowest row block */
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    for (bc = mbc; bc < mbc + 2; bc++)
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /****** check boundary for deblocking ************/
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (bc < pp_w)              /* boundary : don't do it on the most right col block */
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr = rec + (brwidth << 6) + (bc << 3);
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            jVal0 = brwidth + bc;
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (chr)    QP = QP_store[jVal0];
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr_e = ptr + 8;        /* pointer to where the loop ends */
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (((pp_mod[jVal0]&0x02)) && ((pp_mod[jVal0-pp_w]&0x02)))
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                /* Horiz Hard filter */
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - width);     /* C */
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;               /* D */
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP << 1)))
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP << 1)))) /* (D-C) compared with 2QP */
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        /* differentiate between real and fake edge */
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = ((jVal0 + jVal1) >> 1);     /* (D+C)/2 */
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - width) = (uint8)(jVal0);    /*  C */
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr = (uint8)(jVal0);          /*  D */
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - (width << 1));      /* B */
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + width);         /* E */
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;      /* E-B */
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 3) >> 2);
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 3) >> 2);
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* store E */
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((3 - jVal2) >> 2);
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((3 - jVal2) >> 2);
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* store E */
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - (width << 1) - width);  /* A */
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + (width << 1));      /* F */
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;              /* (F-A) */
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 7) >> 3);
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 7) >> 3);
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1) - width) = (uint8)(jVal0);
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + (width << 1)) = (uint8)(jVal1);
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((7 - jVal2) >> 3);
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((7 - jVal2) >> 3);
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1) - width) = (uint8)(jVal0);
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + (width << 1)) = (uint8)(jVal1);
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }/* a3_0 > 2QP */
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while (++ptr < ptr_e);
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            }
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            else   /* Horiz soft filter*/
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - width); /* B */
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;           /* C */
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;  /* C-B */
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP)))
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP)))) /* (C-B) compared with QP */
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = ((jVal0 + jVal1) >> 1);     /* (B+C)/2 cannot overflow; ceil() */
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - width) = (uint8)(jVal0);    /* B = (B+C)/2 */
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr = (uint8)jVal0;            /* C = (B+C)/2 */
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - (width << 1));      /* A */
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + width);         /* D */
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;          /* D-A */
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 7) >> 3);
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 7) >> 3);
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /* A */
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* D */
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((7 - jVal2) >> 3);
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((7 - jVal2) >> 3);
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /* A */
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* D */
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while (++ptr < ptr_e);
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            } /* Soft filter*/
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }/* boundary checking*/
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }/*bc*/
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }/*br*/
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            brwidth -= (pp_w << 1);
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /****************** Vert. Filtering ********************/
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (br = mbr; br < mbr + 2; br++)
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (br < pp_h)
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    for (bc = mbc + 1; bc < mbc + 3; bc++)
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /****** check boundary for deblocking ************/
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (bc < pp_w)
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr = rec + (brwidth << 6) + (bc << 3);
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            jVal0 = brwidth + bc;
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (chr)    QP = QP_store[jVal0];
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr_e = ptr + (width << 3);
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (((pp_mod[jVal0-1]&0x01)) && ((pp_mod[jVal0]&0x01)))
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                /* Vert Hard filter */
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;       /* D */
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - 1); /* C */
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;  /* D-C */
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP << 1)))
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP << 1))))
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = (jVal0 + jVal1) >> 1;   /* (C+D)/2 */
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr        =   jVal1;
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - 1)  =   jVal1;
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + 1);     /* E */
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - 2);     /* B */
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;      /* E-B */
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 3) >> 2);        /* E = E -(E-B)/4 */
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 3) >> 2);        /* B = B +(E-B)/4 */
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((3 - jVal2) >> 2);        /* E = E -(E-B)/4 */
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((3 - jVal2) >> 2);        /* B = B +(E-B)/4 */
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + 2);     /* F */
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - 3);     /* A */
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;          /* (F-A) */
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 7) >> 3);    /* F -= (F-A)/8 */
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 7) >> 3);    /* A += (F-A)/8 */
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 2) = jVal1;
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 3) = jVal0;
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 - 7) >> 3);    /* F -= (F-A)/8 */
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 - 7) >> 3);    /* A += (F-A)/8 */
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 2) = jVal1;
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 3) = jVal0;
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }   /* end of ver hard filetering */
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while ((ptr += width) < ptr_e);
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            }
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            else   /* Vert soft filter*/
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;               /* C */
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - 1);         /* B */
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP)))
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP))))
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = (jVal0 + jVal1 + 1) >> 1;
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr = jVal1;           /* C */
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - 1) = jVal1;     /* B */
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + 1);     /* D */
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - 2);     /* A */
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = (jVal1 - jVal0);        /* D- A */
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= (((jVal2) + 7) >> 3);      /* D -= (D-A)/8 */
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += (((jVal2) + 7) >> 3);      /* A += (D-A)/8 */
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((7 - (jVal2)) >> 3);      /* D -= (D-A)/8 */
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((7 - (jVal2)) >> 3);      /* A += (D-A)/8 */
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while ((ptr += width) < ptr_e);
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            } /* Soft filter*/
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        } /* boundary*/
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    } /*bc*/
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                brwidth += pp_w;
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }/*br*/
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            brwidth -= (pp_w << 1);
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }/*mbc*/
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        brwidth += (pp_w << 1);
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }/*mbr*/
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid CombinedHorzVertFilter_NoSoftDeblocking(
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *rec,
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width,
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int height,
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *QP_store,
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int chr,
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_mod)
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Define all local variables
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int br, bc, mbr, mbc;
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = 1;
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr, *ptr_e;
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int pp_w, pp_h;
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int brwidth;
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int jVal0, jVal1, jVal2;
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Function body here
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_w = (width >> 3);
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pp_h = (height >> 3);
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbr = 0; mbr < pp_h; mbr += 2)         /* row of blocks */
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        brwidth = mbr * pp_w;               /* number of blocks above current block row */
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (mbc = 0; mbc < pp_w; mbc += 2)     /* col of blocks */
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!chr)
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                QP = QP_store[(brwidth>>2) + (mbc>>1)]; /* QP is per MB based value */
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /********* for each block **************/
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /****************** Horiz. Filtering ********************/
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (br = mbr + 1; br < mbr + 3; br++)  /* 2x2 blocks */
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                brwidth += pp_w;                    /* number of blocks above & left current block row */
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* the profile on ARM920T shows separate these two boundary check is faster than combine them */
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (br < pp_h)                  /* boundary : don't do it on the lowest row block */
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    for (bc = mbc; bc < mbc + 2; bc++)
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /****** check boundary for deblocking ************/
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (bc < pp_w)              /* boundary : don't do it on the most right col block */
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr = rec + (brwidth << 6) + (bc << 3);
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            jVal0 = brwidth + bc;
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (chr)    QP = QP_store[jVal0];
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr_e = ptr + 8;        /* pointer to where the loop ends */
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (((pp_mod[jVal0]&0x02)) && ((pp_mod[jVal0-pp_w]&0x02)))
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                /* Horiz Hard filter */
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - width);     /* C */
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;               /* D */
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP << 1)))
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP << 1)))) /* (D-C) compared with 2QP */
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        /* differentiate between real and fake edge */
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = ((jVal0 + jVal1) >> 1);     /* (D+C)/2 */
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - width) = (uint8)(jVal0);    /*  C */
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr = (uint8)(jVal0);          /*  D */
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - (width << 1));      /* B */
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + width);         /* E */
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;      /* E-B */
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 3) >> 2);
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 3) >> 2);
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* store E */
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((3 - jVal2) >> 2);
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((3 - jVal2) >> 2);
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + width) = (uint8)jVal1;          /* store E */
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - (width << 1) - width);  /* A */
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + (width << 1));      /* F */
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;              /* (F-A) */
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 7) >> 3);
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 7) >> 3);
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1) - width) = (uint8)(jVal0);
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + (width << 1)) = (uint8)(jVal1);
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((7 - jVal2) >> 3);
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((7 - jVal2) >> 3);
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - (width << 1) - width) = (uint8)(jVal0);
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + (width << 1)) = (uint8)(jVal1);
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }/* a3_0 > 2QP */
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while (++ptr < ptr_e);
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            }
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }/* boundary checking*/
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }/*bc*/
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }/*br*/
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            brwidth -= (pp_w << 1);
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /****************** Vert. Filtering ********************/
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (br = mbr; br < mbr + 2; br++)
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (br < pp_h)
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    for (bc = mbc + 1; bc < mbc + 3; bc++)
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /****** check boundary for deblocking ************/
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (bc < pp_w)
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr = rec + (brwidth << 6) + (bc << 3);
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            jVal0 = brwidth + bc;
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (chr)    QP = QP_store[jVal0];
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ptr_e = ptr + (width << 3);
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (((pp_mod[jVal0-1]&0x01)) && ((pp_mod[jVal0]&0x01)))
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            {
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                /* Vert Hard filter */
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                do
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                {
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal1 = *ptr;       /* D */
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal0 = *(ptr - 1); /* C */
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    jVal2 = jVal1 - jVal0;  /* D-C */
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    if (((jVal2 > 0) && (jVal2 < (QP << 1)))
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            || ((jVal2 < 0) && (jVal2 > -(QP << 1))))
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    {
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = (jVal0 + jVal1) >> 1;   /* (C+D)/2 */
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *ptr        =   jVal1;
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        *(ptr - 1)  =   jVal1;
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + 1);     /* E */
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - 2);     /* B */
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;      /* E-B */
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 3) >> 2);        /* E = E -(E-B)/4 */
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 3) >> 2);        /* B = B +(E-B)/4 */
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 += ((3 - jVal2) >> 2);        /* E = E -(E-B)/4 */
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 -= ((3 - jVal2) >> 2);        /* B = B +(E-B)/4 */
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 1) = jVal1;
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 2) = jVal0;
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal1 = *(ptr + 2);     /* F */
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal0 = *(ptr - 3);     /* A */
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        jVal2 = jVal1 - jVal0;          /* (F-A) */
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        if (jVal2 > 0)
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 + 7) >> 3);    /* F -= (F-A)/8 */
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 + 7) >> 3);    /* A += (F-A)/8 */
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 2) = jVal1;
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 3) = jVal0;
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        else if (jVal2)
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        {
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal1 -= ((jVal2 - 7) >> 3);    /* F -= (F-A)/8 */
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            jVal0 += ((jVal2 - 7) >> 3);    /* A += (F-A)/8 */
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr + 2) = jVal1;
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                            *(ptr - 3) = jVal0;
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        }
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    }   /* end of ver hard filetering */
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                }
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                while ((ptr += width) < ptr_e);
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            }
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        } /* boundary*/
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    } /*bc*/
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                brwidth += pp_w;
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }/*br*/
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            brwidth -= (pp_w << 1);
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }/*mbc*/
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        brwidth += (pp_w << 1);
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }/*mbr*/
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*----------------------------------------------------------------------------
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ; Return nothing or data or data pointer
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ----------------------------------------------------------------------------*/
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
655