Home | History | Annotate | Download | only in src
      1 /* ----------------------------------------------------------------
      2  *
      3  *
      4  * File Name:  armVCM4P10_DeBlockPixel.c
      5  * OpenMAX DL: v1.0.2
      6  * Revision:   9641
      7  * Date:       Thursday, February 7, 2008
      8  *
      9  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
     10  *
     11  *
     12  *
     13  * H.264 luma deblock module
     14  *
     15  */
     16 
     17 #ifdef DEBUG_ARMVCM4P10_DEBLOCKPIXEL
     18 #undef DEBUG_ON
     19 #define DEBUG_ON
     20 #endif /* DEBUG_ARMVCM4P10_DEBLOCKPIXEL */
     21 
     22 #include "omxtypes.h"
     23 #include "armOMX.h"
     24 #include "omxVC.h"
     25 
     26 #include "armCOMM.h"
     27 #include "armVC.h"
     28 
     29 /*
     30  * Description
     31  * Deblock one boundary pixel
     32  *
     33  * Parameters:
     34  * [in]	pQ0         Pointer to pixel q0
     35  * [in] Step        Step between pixels q0 and q1
     36  * [in] tC0         Edge threshold value
     37  * [in] alpha       alpha threshold value
     38  * [in] beta        beta threshold value
     39  * [in] bS          deblocking strength
     40  * [in] ChromaFlag  True for chroma blocks
     41  * [out] pQ0        Deblocked pixels
     42  *
     43  */
     44 
     45 void armVCM4P10_DeBlockPixel(
     46     OMX_U8 *pQ0,    /* pointer to the pixel q0 */
     47     int Step,       /* step between pixels q0 and q1 */
     48     int tC0,        /* edge threshold value */
     49     int alpha,      /* alpha */
     50     int beta,       /* beta */
     51     int bS,         /* deblocking strength */
     52     int ChromaFlag
     53 )
     54 {
     55     int p3, p2, p1, p0, q0, q1, q2, q3;
     56     int ap, aq, delta;
     57 
     58     if (bS==0)
     59     {
     60         return;
     61     }
     62 
     63     p3 = pQ0[-4*Step];
     64     p2 = pQ0[-3*Step];
     65     p1 = pQ0[-2*Step];
     66     p0 = pQ0[-1*Step];
     67     q0 = pQ0[ 0*Step];
     68     q1 = pQ0[ 1*Step];
     69     q2 = pQ0[ 2*Step];
     70     q3 = pQ0[ 3*Step];
     71 
     72     if (armAbs(p0-q0)>=alpha || armAbs(p1-p0)>=beta || armAbs(q1-q0)>=beta)
     73     {
     74         DEBUG_PRINTF_10("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x alpha=%d beta=%d\n",
     75             p3, p2, p1, p0, q0, q1, q2, q3, alpha, beta);
     76         return;
     77     }
     78 
     79     ap = armAbs(p2 - p0);
     80     aq = armAbs(q2 - q0);
     81 
     82     if (bS < 4)
     83     {
     84         int tC = tC0;
     85 
     86         if (ChromaFlag)
     87         {
     88             tC++;
     89         }
     90         else
     91         {
     92             if (ap < beta)
     93             {
     94                 tC++;
     95             }
     96             if (aq < beta)
     97             {
     98                 tC++;
     99             }
    100         }
    101 
    102         delta = (((q0-p0)<<2) + (p1-q1) + 4) >> 3;
    103         delta = armClip(-tC, tC, delta);
    104 
    105         pQ0[-1*Step] = (OMX_U8)armClip(0, 255, p0 + delta);
    106         pQ0[ 0*Step] = (OMX_U8)armClip(0, 255, q0 - delta);
    107 
    108         if (ChromaFlag==0 && ap<beta)
    109         {
    110             delta = (p2 + ((p0+q0+1)>>1) - (p1<<1))>>1;
    111             delta = armClip(-tC0, tC0, delta);
    112             pQ0[-2*Step] = (OMX_U8)(p1 + delta);
    113         }
    114 
    115         if (ChromaFlag==0 && aq<beta)
    116         {
    117             delta = (q2 + ((p0+q0+1)>>1) - (q1<<1))>>1;
    118             delta = armClip(-tC0, tC0, delta);
    119             pQ0[ 1*Step] = (OMX_U8)(q1 + delta);
    120         }
    121     }
    122     else /* bS==4 */
    123     {
    124         if (ChromaFlag==0 && ap<beta && armAbs(p0-q0)<((alpha>>2)+2))
    125         {
    126             pQ0[-1*Step] = (OMX_U8)((p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4)>>3);
    127             pQ0[-2*Step] = (OMX_U8)((p2 + p1 + p0 + q0 + 2)>>2);
    128             pQ0[-3*Step] = (OMX_U8)((2*p3 + 3*p2 + p1 + p0 + q0 + 4)>>3);
    129         }
    130         else
    131         {
    132             pQ0[-1*Step] = (OMX_U8)((2*p1 + p0 + q1 + 2)>>2);
    133         }
    134 
    135         if (ChromaFlag==0 && aq<beta && armAbs(p0-q0)<((alpha>>2)+2))
    136         {
    137             pQ0[ 0*Step] = (OMX_U8)((q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4)>>3);
    138             pQ0[ 1*Step] = (OMX_U8)((q2 + q1 + p0 + q0 + 2)>>2);
    139             pQ0[ 2*Step] = (OMX_U8)((2*q3 + 3*q2 + q1 + q0 + p0 + 4)>>3);
    140         }
    141         else
    142         {
    143             pQ0[ 0*Step] = (OMX_U8)((2*q1 + q0 + p1 + 2)>>2);
    144         }
    145     }
    146 
    147     DEBUG_PRINTF_13("DeBlockPixel: %02x %02x %02x %02x | %02x %02x %02x %02x bS=%d -> %02x %02x %02x %02x\n",
    148         p3, p2, p1, p0, q0, q1, q2, q3, bS,
    149         pQ0[-2*Step], pQ0[-1*Step],pQ0[0*Step],pQ0[1*Step]);
    150 
    151 }
    152