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
45void 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