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