Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 ------------------------------------------------------------------------------
     20  INPUT AND OUTPUT DEFINITIONS
     21 
     22  Inputs:
     23     [input_variable_name] = [description of the input to module, its type
     24                  definition, and length (when applicable)]
     25 
     26  Local Stores/Buffers/Pointers Needed:
     27     [local_store_name] = [description of the local store, its type
     28                   definition, and length (when applicable)]
     29     [local_buffer_name] = [description of the local buffer, its type
     30                    definition, and length (when applicable)]
     31     [local_ptr_name] = [description of the local pointer, its type
     32                 definition, and length (when applicable)]
     33 
     34  Global Stores/Buffers/Pointers Needed:
     35     [global_store_name] = [description of the global store, its type
     36                    definition, and length (when applicable)]
     37     [global_buffer_name] = [description of the global buffer, its type
     38                 definition, and length (when applicable)]
     39     [global_ptr_name] = [description of the global pointer, its type
     40                  definition, and length (when applicable)]
     41 
     42  Outputs:
     43     [return_variable_name] = [description of data/pointer returned
     44                   by module, its type definition, and length
     45                   (when applicable)]
     46 
     47  Pointers and Buffers Modified:
     48     [variable_bfr_ptr] points to the [describe where the
     49       variable_bfr_ptr points to, its type definition, and length
     50       (when applicable)]
     51     [variable_bfr] contents are [describe the new contents of
     52       variable_bfr]
     53 
     54  Local Stores Modified:
     55     [local_store_name] = [describe new contents, its type
     56                   definition, and length (when applicable)]
     57 
     58  Global Stores Modified:
     59     [global_store_name] = [describe new contents, its type
     60                    definition, and length (when applicable)]
     61 
     62 ------------------------------------------------------------------------------
     63  FUNCTION DESCRIPTION
     64 
     65    For fast Deblock filtering
     66    Newer version (macroblock based processing)
     67 
     68 ------------------------------------------------------------------------------
     69  REQUIREMENTS
     70 
     71  [List requirements to be satisfied by this module.]
     72 
     73 ------------------------------------------------------------------------------
     74  REFERENCES
     75 
     76  [List all references used in designing this module.]
     77 
     78 ------------------------------------------------------------------------------
     79  PSEUDO-CODE
     80 
     81 ------------------------------------------------------------------------------
     82  RESOURCES USED
     83    When the code is written for a specific target processor the
     84      the resources used should be documented below.
     85 
     86  STACK USAGE: [stack count for this module] + [variable to represent
     87           stack usage for each subroutine called]
     88 
     89      where: [stack usage variable] = stack usage for [subroutine
     90          name] (see [filename].ext)
     91 
     92  DATA MEMORY USED: x words
     93 
     94  PROGRAM MEMORY USED: x words
     95 
     96  CLOCK CYCLES: [cycle count equation for this module] + [variable
     97            used to represent cycle count for each subroutine
     98            called]
     99 
    100      where: [cycle count variable] = cycle count for [subroutine
    101         name] (see [filename].ext)
    102 
    103 ------------------------------------------------------------------------------
    104 */
    105 
    106 
    107 /*----------------------------------------------------------------------------
    108 ; INCLUDES
    109 ----------------------------------------------------------------------------*/
    110 #include    "mp4dec_lib.h"
    111 #include    "post_proc.h"
    112 
    113 #define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
    114 
    115 /*----------------------------------------------------------------------------
    116 ; MACROS
    117 ; Define module specific macros here
    118 ----------------------------------------------------------------------------*/
    119 //#define FILTER_LEN_8
    120 
    121 /*----------------------------------------------------------------------------
    122 ; DEFINES
    123 ; Include all pre-processor statements here. Include conditional
    124 ; compile variables also.
    125 ----------------------------------------------------------------------------*/
    126 
    127 /*----------------------------------------------------------------------------
    128 ; LOCAL FUNCTION DEFINITIONS
    129 ; Function Prototype declaration
    130 
    131 ----------------------------------------------------------------------------
    132 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    133 ; Variable declaration - defined here and used outside this module
    134 ----------------------------------------------------------------------------*/
    135 
    136 /*----------------------------------------------------------------------------
    137 ; EXTERNAL FUNCTION REFERENCES
    138 ; Declare functions defined elsewhere and referenced in this module
    139 ----------------------------------------------------------------------------*/
    140 
    141 /*----------------------------------------------------------------------------
    142 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    143 ; Declare variables used in this module but defined elsewhere
    144 ----------------------------------------------------------------------------*/
    145 #ifdef PV_POSTPROC_ON
    146 
    147 /*************************************************************************
    148     Function prototype : void CombinedHorzVertFilter(   uint8 *rec,
    149                                                         int width,
    150                                                         int height,
    151                                                         int *QP_store,
    152                                                         int chr,
    153                                                         uint8 *pp_mod)
    154     Parameters  :
    155         rec     :   pointer to the decoded frame buffer.
    156         width   :   width of decoded frame.
    157         height  :   height of decoded frame
    158         QP_store:   pointer to the array of QP corresponding to the decoded frame.
    159                     It had only one value for each MB.
    160         chr     :   luma or color indication
    161                     == 0 luma
    162                     == 1 color
    163         pp_mod  :   The semphore used for deblocking
    164 
    165     Remark      :   The function do the deblocking on decoded frames.
    166                     First based on the semaphore info., it is divided into hard and soft filtering.
    167                     To differentiate real and fake edge, it then check the difference with QP to
    168                     decide whether to do the filtering or not.
    169 
    170 *************************************************************************/
    171 
    172 
    173 /*----------------------------------------------------------------------------
    174 ; FUNCTION CODE
    175 ----------------------------------------------------------------------------*/
    176 void CombinedHorzVertFilter(
    177     uint8 *rec,
    178     int width,
    179     int height,
    180     int16 *QP_store,
    181     int chr,
    182     uint8 *pp_mod)
    183 {
    184 
    185     /*----------------------------------------------------------------------------
    186     ; Define all local variables
    187     ----------------------------------------------------------------------------*/
    188     int br, bc, mbr, mbc;
    189     int QP = 1;
    190     uint8 *ptr, *ptr_e;
    191     int pp_w, pp_h;
    192     int brwidth;
    193 
    194     int jVal0, jVal1, jVal2;
    195     /*----------------------------------------------------------------------------
    196     ; Function body here
    197     ----------------------------------------------------------------------------*/
    198     pp_w = (width >> 3);
    199     pp_h = (height >> 3);
    200 
    201     for (mbr = 0; mbr < pp_h; mbr += 2)         /* row of blocks */
    202     {
    203         brwidth = mbr * pp_w;               /* number of blocks above current block row */
    204         for (mbc = 0; mbc < pp_w; mbc += 2)     /* col of blocks */
    205         {
    206             if (!chr)
    207                 QP = QP_store[(brwidth>>2) + (mbc>>1)]; /* QP is per MB based value */
    208 
    209             /********* for each block **************/
    210             /****************** Horiz. Filtering ********************/
    211             for (br = mbr + 1; br < mbr + 3; br++)  /* 2x2 blocks */
    212             {
    213                 brwidth += pp_w;                    /* number of blocks above & left current block row */
    214                 /* the profile on ARM920T shows separate these two boundary check is faster than combine them */
    215                 if (br < pp_h)                  /* boundary : don't do it on the lowest row block */
    216                     for (bc = mbc; bc < mbc + 2; bc++)
    217                     {
    218                         /****** check boundary for deblocking ************/
    219                         if (bc < pp_w)              /* boundary : don't do it on the most right col block */
    220                         {
    221                             ptr = rec + (brwidth << 6) + (bc << 3);
    222                             jVal0 = brwidth + bc;
    223                             if (chr)    QP = QP_store[jVal0];
    224 
    225                             ptr_e = ptr + 8;        /* pointer to where the loop ends */
    226 
    227                             if (((pp_mod[jVal0]&0x02)) && ((pp_mod[jVal0-pp_w]&0x02)))
    228                             {
    229                                 /* Horiz Hard filter */
    230                                 do
    231                                 {
    232                                     jVal0 = *(ptr - width);     /* C */
    233                                     jVal1 = *ptr;               /* D */
    234                                     jVal2 = jVal1 - jVal0;
    235 
    236                                     if (((jVal2 > 0) && (jVal2 < (QP << 1)))
    237                                             || ((jVal2 < 0) && (jVal2 > -(QP << 1)))) /* (D-C) compared with 2QP */
    238                                     {
    239                                         /* differentiate between real and fake edge */
    240                                         jVal0 = ((jVal0 + jVal1) >> 1);     /* (D+C)/2 */
    241                                         *(ptr - width) = (uint8)(jVal0);    /*  C */
    242                                         *ptr = (uint8)(jVal0);          /*  D */
    243 
    244                                         jVal0 = *(ptr - (width << 1));      /* B */
    245                                         jVal1 = *(ptr + width);         /* E */
    246                                         jVal2 = jVal1 - jVal0;      /* E-B */
    247 
    248                                         if (jVal2 > 0)
    249                                         {
    250                                             jVal0 += ((jVal2 + 3) >> 2);
    251                                             jVal1 -= ((jVal2 + 3) >> 2);
    252                                             *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
    253                                             *(ptr + width) = (uint8)jVal1;          /* store E */
    254                                         }
    255                                         else if (jVal2)
    256                                         {
    257                                             jVal0 -= ((3 - jVal2) >> 2);
    258                                             jVal1 += ((3 - jVal2) >> 2);
    259                                             *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
    260                                             *(ptr + width) = (uint8)jVal1;          /* store E */
    261                                         }
    262 
    263                                         jVal0 = *(ptr - (width << 1) - width);  /* A */
    264                                         jVal1 = *(ptr + (width << 1));      /* F */
    265                                         jVal2 = jVal1 - jVal0;              /* (F-A) */
    266 
    267                                         if (jVal2 > 0)
    268                                         {
    269                                             jVal0 += ((jVal2 + 7) >> 3);
    270                                             jVal1 -= ((jVal2 + 7) >> 3);
    271                                             *(ptr - (width << 1) - width) = (uint8)(jVal0);
    272                                             *(ptr + (width << 1)) = (uint8)(jVal1);
    273                                         }
    274                                         else if (jVal2)
    275                                         {
    276                                             jVal0 -= ((7 - jVal2) >> 3);
    277                                             jVal1 += ((7 - jVal2) >> 3);
    278                                             *(ptr - (width << 1) - width) = (uint8)(jVal0);
    279                                             *(ptr + (width << 1)) = (uint8)(jVal1);
    280                                         }
    281                                     }/* a3_0 > 2QP */
    282                                 }
    283                                 while (++ptr < ptr_e);
    284                             }
    285                             else   /* Horiz soft filter*/
    286                             {
    287                                 do
    288                                 {
    289                                     jVal0 = *(ptr - width); /* B */
    290                                     jVal1 = *ptr;           /* C */
    291                                     jVal2 = jVal1 - jVal0;  /* C-B */
    292 
    293                                     if (((jVal2 > 0) && (jVal2 < (QP)))
    294                                             || ((jVal2 < 0) && (jVal2 > -(QP)))) /* (C-B) compared with QP */
    295                                     {
    296 
    297                                         jVal0 = ((jVal0 + jVal1) >> 1);     /* (B+C)/2 cannot overflow; ceil() */
    298                                         *(ptr - width) = (uint8)(jVal0);    /* B = (B+C)/2 */
    299                                         *ptr = (uint8)jVal0;            /* C = (B+C)/2 */
    300 
    301                                         jVal0 = *(ptr - (width << 1));      /* A */
    302                                         jVal1 = *(ptr + width);         /* D */
    303                                         jVal2 = jVal1 - jVal0;          /* D-A */
    304 
    305 
    306                                         if (jVal2 > 0)
    307                                         {
    308                                             jVal1 -= ((jVal2 + 7) >> 3);
    309                                             jVal0 += ((jVal2 + 7) >> 3);
    310                                             *(ptr - (width << 1)) = (uint8)jVal0;       /* A */
    311                                             *(ptr + width) = (uint8)jVal1;          /* D */
    312                                         }
    313                                         else if (jVal2)
    314                                         {
    315                                             jVal1 += ((7 - jVal2) >> 3);
    316                                             jVal0 -= ((7 - jVal2) >> 3);
    317                                             *(ptr - (width << 1)) = (uint8)jVal0;       /* A */
    318                                             *(ptr + width) = (uint8)jVal1;          /* D */
    319                                         }
    320                                     }
    321                                 }
    322                                 while (++ptr < ptr_e);
    323                             } /* Soft filter*/
    324                         }/* boundary checking*/
    325                     }/*bc*/
    326             }/*br*/
    327             brwidth -= (pp_w << 1);
    328             /****************** Vert. Filtering ********************/
    329             for (br = mbr; br < mbr + 2; br++)
    330             {
    331                 if (br < pp_h)
    332                     for (bc = mbc + 1; bc < mbc + 3; bc++)
    333                     {
    334                         /****** check boundary for deblocking ************/
    335                         if (bc < pp_w)
    336                         {
    337                             ptr = rec + (brwidth << 6) + (bc << 3);
    338                             jVal0 = brwidth + bc;
    339                             if (chr)    QP = QP_store[jVal0];
    340 
    341                             ptr_e = ptr + (width << 3);
    342 
    343                             if (((pp_mod[jVal0-1]&0x01)) && ((pp_mod[jVal0]&0x01)))
    344                             {
    345                                 /* Vert Hard filter */
    346                                 do
    347                                 {
    348                                     jVal1 = *ptr;       /* D */
    349                                     jVal0 = *(ptr - 1); /* C */
    350                                     jVal2 = jVal1 - jVal0;  /* D-C */
    351 
    352                                     if (((jVal2 > 0) && (jVal2 < (QP << 1)))
    353                                             || ((jVal2 < 0) && (jVal2 > -(QP << 1))))
    354                                     {
    355                                         jVal1 = (jVal0 + jVal1) >> 1;   /* (C+D)/2 */
    356                                         *ptr        =   jVal1;
    357                                         *(ptr - 1)  =   jVal1;
    358 
    359                                         jVal1 = *(ptr + 1);     /* E */
    360                                         jVal0 = *(ptr - 2);     /* B */
    361                                         jVal2 = jVal1 - jVal0;      /* E-B */
    362 
    363                                         if (jVal2 > 0)
    364                                         {
    365                                             jVal1 -= ((jVal2 + 3) >> 2);        /* E = E -(E-B)/4 */
    366                                             jVal0 += ((jVal2 + 3) >> 2);        /* B = B +(E-B)/4 */
    367                                             *(ptr + 1) = jVal1;
    368                                             *(ptr - 2) = jVal0;
    369                                         }
    370                                         else if (jVal2)
    371                                         {
    372                                             jVal1 += ((3 - jVal2) >> 2);        /* E = E -(E-B)/4 */
    373                                             jVal0 -= ((3 - jVal2) >> 2);        /* B = B +(E-B)/4 */
    374                                             *(ptr + 1) = jVal1;
    375                                             *(ptr - 2) = jVal0;
    376                                         }
    377 
    378                                         jVal1 = *(ptr + 2);     /* F */
    379                                         jVal0 = *(ptr - 3);     /* A */
    380 
    381                                         jVal2 = jVal1 - jVal0;          /* (F-A) */
    382 
    383                                         if (jVal2 > 0)
    384                                         {
    385                                             jVal1 -= ((jVal2 + 7) >> 3);    /* F -= (F-A)/8 */
    386                                             jVal0 += ((jVal2 + 7) >> 3);    /* A += (F-A)/8 */
    387                                             *(ptr + 2) = jVal1;
    388                                             *(ptr - 3) = jVal0;
    389                                         }
    390                                         else if (jVal2)
    391                                         {
    392                                             jVal1 -= ((jVal2 - 7) >> 3);    /* F -= (F-A)/8 */
    393                                             jVal0 += ((jVal2 - 7) >> 3);    /* A += (F-A)/8 */
    394                                             *(ptr + 2) = jVal1;
    395                                             *(ptr - 3) = jVal0;
    396                                         }
    397                                     }   /* end of ver hard filetering */
    398                                 }
    399                                 while ((ptr += width) < ptr_e);
    400                             }
    401                             else   /* Vert soft filter*/
    402                             {
    403                                 do
    404                                 {
    405                                     jVal1 = *ptr;               /* C */
    406                                     jVal0 = *(ptr - 1);         /* B */
    407                                     jVal2 = jVal1 - jVal0;
    408 
    409                                     if (((jVal2 > 0) && (jVal2 < (QP)))
    410                                             || ((jVal2 < 0) && (jVal2 > -(QP))))
    411                                     {
    412 
    413                                         jVal1 = (jVal0 + jVal1 + 1) >> 1;
    414                                         *ptr = jVal1;           /* C */
    415                                         *(ptr - 1) = jVal1;     /* B */
    416 
    417                                         jVal1 = *(ptr + 1);     /* D */
    418                                         jVal0 = *(ptr - 2);     /* A */
    419                                         jVal2 = (jVal1 - jVal0);        /* D- A */
    420 
    421                                         if (jVal2 > 0)
    422                                         {
    423                                             jVal1 -= (((jVal2) + 7) >> 3);      /* D -= (D-A)/8 */
    424                                             jVal0 += (((jVal2) + 7) >> 3);      /* A += (D-A)/8 */
    425                                             *(ptr + 1) = jVal1;
    426                                             *(ptr - 2) = jVal0;
    427 
    428                                         }
    429                                         else if (jVal2)
    430                                         {
    431                                             jVal1 += ((7 - (jVal2)) >> 3);      /* D -= (D-A)/8 */
    432                                             jVal0 -= ((7 - (jVal2)) >> 3);      /* A += (D-A)/8 */
    433                                             *(ptr + 1) = jVal1;
    434                                             *(ptr - 2) = jVal0;
    435                                         }
    436                                     }
    437                                 }
    438                                 while ((ptr += width) < ptr_e);
    439                             } /* Soft filter*/
    440                         } /* boundary*/
    441                     } /*bc*/
    442                 brwidth += pp_w;
    443             }/*br*/
    444             brwidth -= (pp_w << 1);
    445         }/*mbc*/
    446         brwidth += (pp_w << 1);
    447     }/*mbr*/
    448     /*----------------------------------------------------------------------------
    449     ; Return nothing or data or data pointer
    450     ----------------------------------------------------------------------------*/
    451     return;
    452 }
    453 void CombinedHorzVertFilter_NoSoftDeblocking(
    454     uint8 *rec,
    455     int width,
    456     int height,
    457     int16 *QP_store,
    458     int chr,
    459     uint8 *pp_mod)
    460 {
    461 
    462     /*----------------------------------------------------------------------------
    463     ; Define all local variables
    464     ----------------------------------------------------------------------------*/
    465     int br, bc, mbr, mbc;
    466     int QP = 1;
    467     uint8 *ptr, *ptr_e;
    468     int pp_w, pp_h;
    469     int brwidth;
    470 
    471     int jVal0, jVal1, jVal2;
    472     /*----------------------------------------------------------------------------
    473     ; Function body here
    474     ----------------------------------------------------------------------------*/
    475     pp_w = (width >> 3);
    476     pp_h = (height >> 3);
    477 
    478     for (mbr = 0; mbr < pp_h; mbr += 2)         /* row of blocks */
    479     {
    480         brwidth = mbr * pp_w;               /* number of blocks above current block row */
    481         for (mbc = 0; mbc < pp_w; mbc += 2)     /* col of blocks */
    482         {
    483             if (!chr)
    484                 QP = QP_store[(brwidth>>2) + (mbc>>1)]; /* QP is per MB based value */
    485 
    486             /********* for each block **************/
    487             /****************** Horiz. Filtering ********************/
    488             for (br = mbr + 1; br < mbr + 3; br++)  /* 2x2 blocks */
    489             {
    490                 brwidth += pp_w;                    /* number of blocks above & left current block row */
    491                 /* the profile on ARM920T shows separate these two boundary check is faster than combine them */
    492                 if (br < pp_h)                  /* boundary : don't do it on the lowest row block */
    493                     for (bc = mbc; bc < mbc + 2; bc++)
    494                     {
    495                         /****** check boundary for deblocking ************/
    496                         if (bc < pp_w)              /* boundary : don't do it on the most right col block */
    497                         {
    498                             ptr = rec + (brwidth << 6) + (bc << 3);
    499                             jVal0 = brwidth + bc;
    500                             if (chr)    QP = QP_store[jVal0];
    501 
    502                             ptr_e = ptr + 8;        /* pointer to where the loop ends */
    503 
    504                             if (((pp_mod[jVal0]&0x02)) && ((pp_mod[jVal0-pp_w]&0x02)))
    505                             {
    506                                 /* Horiz Hard filter */
    507                                 do
    508                                 {
    509                                     jVal0 = *(ptr - width);     /* C */
    510                                     jVal1 = *ptr;               /* D */
    511                                     jVal2 = jVal1 - jVal0;
    512 
    513                                     if (((jVal2 > 0) && (jVal2 < (QP << 1)))
    514                                             || ((jVal2 < 0) && (jVal2 > -(QP << 1)))) /* (D-C) compared with 2QP */
    515                                     {
    516                                         /* differentiate between real and fake edge */
    517                                         jVal0 = ((jVal0 + jVal1) >> 1);     /* (D+C)/2 */
    518                                         *(ptr - width) = (uint8)(jVal0);    /*  C */
    519                                         *ptr = (uint8)(jVal0);          /*  D */
    520 
    521                                         jVal0 = *(ptr - (width << 1));      /* B */
    522                                         jVal1 = *(ptr + width);         /* E */
    523                                         jVal2 = jVal1 - jVal0;      /* E-B */
    524 
    525                                         if (jVal2 > 0)
    526                                         {
    527                                             jVal0 += ((jVal2 + 3) >> 2);
    528                                             jVal1 -= ((jVal2 + 3) >> 2);
    529                                             *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
    530                                             *(ptr + width) = (uint8)jVal1;          /* store E */
    531                                         }
    532                                         else if (jVal2)
    533                                         {
    534                                             jVal0 -= ((3 - jVal2) >> 2);
    535                                             jVal1 += ((3 - jVal2) >> 2);
    536                                             *(ptr - (width << 1)) = (uint8)jVal0;       /*  store B */
    537                                             *(ptr + width) = (uint8)jVal1;          /* store E */
    538                                         }
    539 
    540                                         jVal0 = *(ptr - (width << 1) - width);  /* A */
    541                                         jVal1 = *(ptr + (width << 1));      /* F */
    542                                         jVal2 = jVal1 - jVal0;              /* (F-A) */
    543 
    544                                         if (jVal2 > 0)
    545                                         {
    546                                             jVal0 += ((jVal2 + 7) >> 3);
    547                                             jVal1 -= ((jVal2 + 7) >> 3);
    548                                             *(ptr - (width << 1) - width) = (uint8)(jVal0);
    549                                             *(ptr + (width << 1)) = (uint8)(jVal1);
    550                                         }
    551                                         else if (jVal2)
    552                                         {
    553                                             jVal0 -= ((7 - jVal2) >> 3);
    554                                             jVal1 += ((7 - jVal2) >> 3);
    555                                             *(ptr - (width << 1) - width) = (uint8)(jVal0);
    556                                             *(ptr + (width << 1)) = (uint8)(jVal1);
    557                                         }
    558                                     }/* a3_0 > 2QP */
    559                                 }
    560                                 while (++ptr < ptr_e);
    561                             }
    562 
    563                         }/* boundary checking*/
    564                     }/*bc*/
    565             }/*br*/
    566             brwidth -= (pp_w << 1);
    567             /****************** Vert. Filtering ********************/
    568             for (br = mbr; br < mbr + 2; br++)
    569             {
    570                 if (br < pp_h)
    571                     for (bc = mbc + 1; bc < mbc + 3; bc++)
    572                     {
    573                         /****** check boundary for deblocking ************/
    574                         if (bc < pp_w)
    575                         {
    576                             ptr = rec + (brwidth << 6) + (bc << 3);
    577                             jVal0 = brwidth + bc;
    578                             if (chr)    QP = QP_store[jVal0];
    579 
    580                             ptr_e = ptr + (width << 3);
    581 
    582                             if (((pp_mod[jVal0-1]&0x01)) && ((pp_mod[jVal0]&0x01)))
    583                             {
    584                                 /* Vert Hard filter */
    585                                 do
    586                                 {
    587                                     jVal1 = *ptr;       /* D */
    588                                     jVal0 = *(ptr - 1); /* C */
    589                                     jVal2 = jVal1 - jVal0;  /* D-C */
    590 
    591                                     if (((jVal2 > 0) && (jVal2 < (QP << 1)))
    592                                             || ((jVal2 < 0) && (jVal2 > -(QP << 1))))
    593                                     {
    594                                         jVal1 = (jVal0 + jVal1) >> 1;   /* (C+D)/2 */
    595                                         *ptr        =   jVal1;
    596                                         *(ptr - 1)  =   jVal1;
    597 
    598                                         jVal1 = *(ptr + 1);     /* E */
    599                                         jVal0 = *(ptr - 2);     /* B */
    600                                         jVal2 = jVal1 - jVal0;      /* E-B */
    601 
    602                                         if (jVal2 > 0)
    603                                         {
    604                                             jVal1 -= ((jVal2 + 3) >> 2);        /* E = E -(E-B)/4 */
    605                                             jVal0 += ((jVal2 + 3) >> 2);        /* B = B +(E-B)/4 */
    606                                             *(ptr + 1) = jVal1;
    607                                             *(ptr - 2) = jVal0;
    608                                         }
    609                                         else if (jVal2)
    610                                         {
    611                                             jVal1 += ((3 - jVal2) >> 2);        /* E = E -(E-B)/4 */
    612                                             jVal0 -= ((3 - jVal2) >> 2);        /* B = B +(E-B)/4 */
    613                                             *(ptr + 1) = jVal1;
    614                                             *(ptr - 2) = jVal0;
    615                                         }
    616 
    617                                         jVal1 = *(ptr + 2);     /* F */
    618                                         jVal0 = *(ptr - 3);     /* A */
    619 
    620                                         jVal2 = jVal1 - jVal0;          /* (F-A) */
    621 
    622                                         if (jVal2 > 0)
    623                                         {
    624                                             jVal1 -= ((jVal2 + 7) >> 3);    /* F -= (F-A)/8 */
    625                                             jVal0 += ((jVal2 + 7) >> 3);    /* A += (F-A)/8 */
    626                                             *(ptr + 2) = jVal1;
    627                                             *(ptr - 3) = jVal0;
    628                                         }
    629                                         else if (jVal2)
    630                                         {
    631                                             jVal1 -= ((jVal2 - 7) >> 3);    /* F -= (F-A)/8 */
    632                                             jVal0 += ((jVal2 - 7) >> 3);    /* A += (F-A)/8 */
    633                                             *(ptr + 2) = jVal1;
    634                                             *(ptr - 3) = jVal0;
    635                                         }
    636                                     }   /* end of ver hard filetering */
    637                                 }
    638                                 while ((ptr += width) < ptr_e);
    639                             }
    640 
    641                         } /* boundary*/
    642                     } /*bc*/
    643                 brwidth += pp_w;
    644             }/*br*/
    645             brwidth -= (pp_w << 1);
    646         }/*mbc*/
    647         brwidth += (pp_w << 1);
    648     }/*mbr*/
    649     /*----------------------------------------------------------------------------
    650     ; Return nothing or data or data pointer
    651     ----------------------------------------------------------------------------*/
    652     return;
    653 }
    654 #endif
    655