1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20/**************************************************************************** */
21/*                                                                            */
22/*  File Name         : ih264_deblk_edge_filters.c                            */
23/*                                                                            */
24/*  Description       : Contains function definitions for deblocking          */
25/*                                                                            */
26/*  List of Functions : ih264_deblk_luma_vert_bs4()                           */
27/*                      ih264_deblk_luma_horz_bs4()                           */
28/*                      ih264_deblk_luma_vert_bslt4()                         */
29/*                      ih264_deblk_luma_horz_bslt4()                         */
30/*                      ih264_deblk_luma_vert_bs4_mbaff()                     */
31/*                      ih264_deblk_luma_vert_bslt4_mbaff()                   */
32/*                      ih264_deblk_chroma_vert_bs4_bp()                      */
33/*                      ih264_deblk_chroma_horz_bs4_bp()                      */
34/*                      ih264_deblk_chroma_vert_bslt4_bp()                    */
35/*                      ih264_deblk_chroma_horz_bslt4_bp()                    */
36/*                      ih264_deblk_chroma_vert_bs4_mbaff_bp()                */
37/*                      ih264_deblk_chroma_vert_bslt4_mbaff_bp()              */
38/*                      ih264_deblk_chroma_vert_bs4()                         */
39/*                      ih264_deblk_chroma_horz_bs4()                         */
40/*                      ih264_deblk_chroma_vert_bslt4()                       */
41/*                      ih264_deblk_chroma_horz_bslt4()                       */
42/*                      ih264_deblk_chroma_vert_bs4_mbaff()                   */
43/*                      ih264_deblk_chroma_vert_bslt4_mbaff()                 */
44/*                                                                            */
45/*  Issues / Problems : None                                                  */
46/*                                                                            */
47/*  Revision History  :                                                       */
48/*                                                                            */
49/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)   */
50/*         28 11 2013   Ittiam          Draft                                 */
51/*         29 12 2014   Kaushik         Added double-call vertical            */
52/*                      Senthoor        deblocking and high profile           */
53/*                                      deblocking functions                  */
54/*                                                                            */
55/******************************************************************************/
56
57/*****************************************************************************/
58/* File Includes                                                             */
59/*****************************************************************************/
60
61/* System include files */
62#include <stdio.h>
63
64/* User include files */
65#include "ih264_typedefs.h"
66#include "ih264_platform_macros.h"
67#include "ih264_deblk_edge_filters.h"
68#include "ih264_macros.h"
69
70/*****************************************************************************/
71/* Function Definitions                                                      */
72/*****************************************************************************/
73
74/*****************************************************************************/
75/*                                                                           */
76/*  Function Name : ih264_deblk_luma_vert_bs4()                              */
77/*                                                                           */
78/*  Description   : This function performs filtering of a luma block         */
79/*                  vertical edge when the boundary strength is set to 4.    */
80/*                                                                           */
81/*  Inputs        : pu1_src    - pointer to the src sample q0                */
82/*                  src_strd   - source stride                               */
83/*                  alpha      - alpha value for the boundary                */
84/*                  beta       - beta value for the boundary                 */
85/*                                                                           */
86/*  Globals       : None                                                     */
87/*                                                                           */
88/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
89/*                  title "Filtering process for edges for bS equal to 4" in */
90/*                  ITU T Rec H.264.                                         */
91/*                                                                           */
92/*  Outputs       : None                                                     */
93/*                                                                           */
94/*  Returns       : None                                                     */
95/*                                                                           */
96/*  Issues        : None                                                     */
97/*                                                                           */
98/*  Revision History:                                                        */
99/*                                                                           */
100/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
101/*         28 11 2013   Ittiam          Draft                                */
102/*                                                                           */
103/*****************************************************************************/
104void ih264_deblk_luma_vert_bs4(UWORD8 *pu1_src,
105                               WORD32 src_strd,
106                               WORD32 alpha,
107                               WORD32 beta)
108{
109    UWORD8 p3, p2, p1, p0, q0, q1, q2, q3;
110    WORD32 pos_p3, pos_p2, pos_p1, pos_p0;
111    WORD32 pos_q0, pos_q1, pos_q2,pos_q3;
112    UWORD8 a_p, a_q; /* threshold variables */
113    WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */
114    UWORD8 *pu1_src_temp;
115    WORD8 i = 0, edge;
116
117    pos_q0 = 0;
118    pos_q1 = 1;
119    pos_q2 = 2;
120    pos_q3 = 3;
121    pos_p0 = -1;
122    pos_p1 = -2;
123    pos_p2 = -3;
124    pos_p3 = -4;
125
126    for(edge = 0; edge < 4; edge++, pu1_src += blk_strd)
127    {
128        pu1_src_temp = pu1_src;
129        for(i = 0; i < 4; ++i, pu1_src_temp += src_strd)
130        {
131            q0 = pu1_src_temp[pos_q0];
132            q1 = pu1_src_temp[pos_q1];
133            p0 = pu1_src_temp[pos_p0];
134            p1 = pu1_src_temp[pos_p1];
135
136            /* Filter Decision */
137            if((ABS(p0 - q0) >= alpha) ||
138               (ABS(q1 - q0) >= beta)  ||
139               (ABS(p1 - p0) >= beta))
140                continue;
141
142            p2 = pu1_src_temp[pos_p2];
143            p3 = pu1_src_temp[pos_p3];
144            q2 = pu1_src_temp[pos_q2];
145            q3 = pu1_src_temp[pos_q3];
146
147            if(ABS(p0 - q0) < ((alpha >> 2) + 2))
148            {
149                /* Threshold Variables */
150                a_p = (UWORD8)ABS(p2 - p0);
151                a_q = (UWORD8)ABS(q2 - q0);
152
153                if(a_p < beta)
154                {
155                    /* p0', p1', p2' */
156                    pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1
157                                    + 4) >> 3);
158                    pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2);
159                    pu1_src_temp[pos_p2] =
160                                    ((X2(p3) + X3(p2) + p1 + p0 + q0
161                                                    + 4) >> 3);
162                }
163                else
164                {
165                    /* p0'*/
166                    pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2);
167                }
168
169                if(a_q < beta)
170                {
171                    /* q0', q1', q2' */
172                    pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2
173                                    + 4) >> 3;
174                    pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2;
175                    pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4)
176                                    >> 3;
177                }
178                else
179                {
180                    /* q0'*/
181                    pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
182                }
183            }
184            else
185            {
186                /* p0', q0'*/
187                pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2);
188                pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
189            }
190        }
191    }
192}
193
194/*****************************************************************************/
195/*                                                                           */
196/*  Function Name : ih264_deblk_luma_horz_bs4()                              */
197/*                                                                           */
198/*  Description   : This function performs filtering of a luma block         */
199/*                  horizontal edge when the boundary strength is set to 4.  */
200/*                                                                           */
201/*  Inputs        : pu1_src    - pointer to the src sample q0                */
202/*                  src_strd   - source stride                               */
203/*                  alpha      - alpha value for the boundary                */
204/*                  beta       - beta value for the boundary                 */
205/*                                                                           */
206/*  Globals       : None                                                     */
207/*                                                                           */
208/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
209/*                  title "Filtering process for edges for bS equal to 4" in */
210/*                  ITU T Rec H.264.                                         */
211/*                                                                           */
212/*  Outputs       : None                                                     */
213/*                                                                           */
214/*  Returns       : None                                                     */
215/*                                                                           */
216/*  Issues        : None                                                     */
217/*                                                                           */
218/*  Revision History:                                                        */
219/*                                                                           */
220/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
221/*         28 11 2013   Ittiam          Draft                                */
222/*                                                                           */
223/*****************************************************************************/
224void ih264_deblk_luma_horz_bs4(UWORD8 *pu1_src,
225                               WORD32 src_strd,
226                               WORD32 alpha,
227                               WORD32 beta)
228{
229    UWORD8 p3, p2, p1, p0, q0, q1, q2, q3;
230    WORD32 pos_p3, pos_p2, pos_p1, pos_p0, pos_q0, pos_q1,
231                    pos_q2, pos_q3;
232    UWORD8 a_p, a_q; /* threshold variables */
233    UWORD8 *pu1_p3; /* pointer to the src sample p3 */
234    UWORD8 *pu1_p3_temp;
235    UWORD8 *pu1_src_temp;
236    WORD8 i = 0, edge;
237
238    pu1_p3 = pu1_src - (src_strd << 2);
239    pos_q0 = 0;
240    pos_q1 = src_strd;
241    pos_q2 = X2(src_strd);
242    pos_q3 = X3(src_strd);
243    pos_p0 = X3(src_strd);
244    pos_p1 = X2(src_strd);
245    pos_p2 = src_strd;
246    pos_p3 = 0;
247
248    for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p3 += 4)
249    {
250        pu1_src_temp = pu1_src;
251        pu1_p3_temp = pu1_p3;
252        for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p3_temp++)
253        {
254            q0 = pu1_src_temp[pos_q0];
255            q1 = pu1_src_temp[pos_q1];
256            p0 = pu1_p3_temp[pos_p0];
257            p1 = pu1_p3_temp[pos_p1];
258
259            /* Filter Decision */
260            if((ABS(p0 - q0) >= alpha) ||
261               (ABS(q1 - q0) >= beta) ||
262               (ABS(p1 - p0) >= beta))
263                continue;
264
265            p2 = pu1_p3_temp[pos_p2];
266            p3 = pu1_p3_temp[pos_p3];
267            q2 = pu1_src_temp[pos_q2];
268            q3 = pu1_src_temp[pos_q3];
269
270            if(ABS(p0 - q0) < ((alpha >> 2) + 2))
271            {
272                /* Threshold Variables */
273                a_p = ABS(p2 - p0);
274                a_q = ABS(q2 - q0);
275
276                if((a_p < beta))
277                {
278                    /* p0', p1', p2' */
279                    pu1_p3_temp[pos_p0] = (p2 + X2(p1) + X2(p0) + X2(q0) + q1
280                                    + 4) >> 3;
281                    pu1_p3_temp[pos_p1] = (p2 + p1 + p0 + q0 + 2) >> 2;
282                    pu1_p3_temp[pos_p2] =
283                                    (X2(p3) + X3(p2) + p1 + p0 + q0
284                                                    + 4) >> 3;
285                }
286                else
287                {
288                    /* p0'*/
289                    pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2;
290                }
291
292                if(a_q < beta)
293                {
294                    /* q0', q1', q2' */
295                    pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1)
296                                    + q2 + 4) >> 3;
297                    pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2;
298                    pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0
299                                    + 4) >> 3;
300                }
301                else
302                {
303                    /* q0'*/
304                    pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
305                }
306            }
307            else
308            {
309                /* p0', q0'*/
310                pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2;
311                pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
312            }
313        }
314    }
315}
316
317/*****************************************************************************/
318/*                                                                           */
319/*  Function Name : ih264_deblk_chroma_vert_bs4_bp()                         */
320/*                                                                           */
321/*  Description   : This function performs filtering of a chroma block       */
322/*                  vertical edge when the boundary strength is set to 4.    */
323/*                                                                           */
324/*  Inputs        : pu1_src    - pointer to the src sample q0 of U           */
325/*                  src_strd   - source stride                               */
326/*                  alpha      - alpha value for the boundary                */
327/*                  beta       - beta value for the boundary                 */
328/*                                                                           */
329/*  Globals       : None                                                     */
330/*                                                                           */
331/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
332/*                  title "Filtering process for edges for bS equal to 4" in */
333/*                  ITU T Rec H.264.                                         */
334/*                                                                           */
335/*  Outputs       : None                                                     */
336/*                                                                           */
337/*  Returns       : None                                                     */
338/*                                                                           */
339/*  Issues        : None                                                     */
340/*                                                                           */
341/*  Revision History:                                                        */
342/*                                                                           */
343/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
344/*         28 11 2013   Ittiam          Draft                                */
345/*                                                                           */
346/*****************************************************************************/
347void ih264_deblk_chroma_vert_bs4_bp(UWORD8 *pu1_src,
348                                    WORD32 src_strd,
349                                    WORD32 alpha,
350                                    WORD32 beta)
351{
352    UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */
353    UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */
354    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
355    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */
356    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
357    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
358    WORD8 i = 0, edge;
359
360    pos_q0 = 0;
361    pos_q1 = 2;
362    pos_p0 = -2;
363    pos_p1 = -4;
364
365    for(edge = 0; edge < 4;
366                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
367    {
368        pu1_src_temp_u = pu1_src_u;
369        pu1_src_temp_v = pu1_src_v;
370        for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v +=
371                        src_strd)
372        {
373            q0_u = pu1_src_temp_u[pos_q0];
374            q1_u = pu1_src_temp_u[pos_q1];
375            p0_u = pu1_src_temp_u[pos_p0];
376            p1_u = pu1_src_temp_u[pos_p1];
377            q0_v = pu1_src_temp_v[pos_q0];
378            q1_v = pu1_src_temp_v[pos_q1];
379            p0_v = pu1_src_temp_v[pos_p0];
380            p1_v = pu1_src_temp_v[pos_p1];
381
382            /* Filter Decision */
383            if((ABS(p0_u - q0_u) < alpha) &&
384               (ABS(q1_u - q0_u) < beta) &&
385               (ABS(p1_u - p0_u) < beta))
386            {
387                /* p0' */
388                pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2);
389                /* q0' */
390                pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
391            }
392
393            /* Filter Decision */
394            if((ABS(p0_v - q0_v) < alpha) &&
395               (ABS(q1_v - q0_v) < beta) &&
396               (ABS(p1_v - p0_v) < beta))
397            {
398                /* p0' */
399                pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2);
400                /* q0' */
401                pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
402            }
403        }
404    }
405}
406
407/*****************************************************************************/
408/*                                                                           */
409/*  Function Name : ih264_deblk_chroma_horz_bs4_bp()                         */
410/*                                                                           */
411/*  Description   : This function performs filtering of a chroma block       */
412/*                  horizontal edge when the boundary strength is set to 4.  */
413/*                                                                           */
414/*  Inputs        : pu1_src    - pointer to the src sample q0 of U           */
415/*                  src_strd   - source stride                               */
416/*                  alpha      - alpha value for the boundary                */
417/*                  beta       - beta value for the boundary                 */
418/*                                                                           */
419/*  Globals       : None                                                     */
420/*                                                                           */
421/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
422/*                  title "Filtering process for edges for bS equal to 4" in */
423/*                  ITU T Rec H.264.                                         */
424/*                                                                           */
425/*  Outputs       : None                                                     */
426/*                                                                           */
427/*  Returns       : None                                                     */
428/*                                                                           */
429/*  Issues        : None                                                     */
430/*                                                                           */
431/*  Revision History:                                                        */
432/*                                                                           */
433/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
434/*         28 11 2013   Ittiam          Draft                                */
435/*                                                                           */
436/*****************************************************************************/
437void ih264_deblk_chroma_horz_bs4_bp(UWORD8 *pu1_src,
438                                    WORD32 src_strd,
439                                    WORD32 alpha,
440                                    WORD32 beta)
441{
442    UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */
443    UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */
444    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
445    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
446    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
447    UWORD8 *pu1_p1_u; /* pointer to the src sample p1 of U */
448    UWORD8 *pu1_p1_v; /* pointer to the src sample p1 of U */
449    UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v;
450    WORD8 i = 0, edge;
451
452    pu1_p1_u = pu1_src_u - (src_strd << 1);
453    pu1_p1_v = pu1_src_v - (src_strd << 1);
454    pos_q0 = 0;
455    pos_q1 = src_strd;
456    pos_p0 = src_strd;
457    pos_p1 = 0;
458
459    for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4,
460                    pu1_src_v += 4, pu1_p1_v += 4)
461    {
462        pu1_src_temp_u = pu1_src_u;
463        pu1_p1_temp_u = pu1_p1_u;
464        pu1_src_temp_v = pu1_src_v;
465        pu1_p1_temp_v = pu1_p1_v;
466        for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2,
467                    pu1_src_temp_v += 2, pu1_p1_temp_v += 2)
468        {
469            q0_u = pu1_src_temp_u[pos_q0];
470            q1_u = pu1_src_temp_u[pos_q1];
471            p0_u = pu1_p1_temp_u[pos_p0];
472            p1_u = pu1_p1_temp_u[pos_p1];
473
474            q0_v = pu1_src_temp_v[pos_q0];
475            q1_v = pu1_src_temp_v[pos_q1];
476            p0_v = pu1_p1_temp_v[pos_p0];
477            p1_v = pu1_p1_temp_v[pos_p1];
478
479            /* Filter Decision */
480            if((ABS(p0_u - q0_u) < alpha) &&
481               (ABS(q1_u - q0_u) < beta) &&
482               (ABS(p1_u - p0_u) < beta))
483            {
484                /* p0' */
485                pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2;
486                /* q0' */
487                pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
488            }
489
490            /* Filter Decision */
491            if((ABS(p0_v - q0_v) < alpha) &&
492               (ABS(q1_v - q0_v) < beta) &&
493               (ABS(p1_v - p0_v) < beta))
494            {
495                /* p0' */
496                pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2;
497                /* q0' */
498                pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
499            }
500        }
501    }
502}
503
504/*****************************************************************************/
505/*                                                                           */
506/*  Function Name : ih264_deblk_luma_vert_bslt4()                            */
507/*                                                                           */
508/*  Description   : This function performs filtering of a luma block         */
509/*                  vertical edge when the boundary strength is less than 4. */
510/*                                                                           */
511/*  Inputs        : pu1_src       - pointer to the src sample q0             */
512/*                  src_strd      - source stride                            */
513/*                  alpha         - alpha value for the boundary             */
514/*                  beta          - beta value for the boundary              */
515/*                  u4_bs         - packed Boundary strength array           */
516/*                  pu1_cliptab   - tc0_table                                */
517/*                                                                           */
518/*  Globals       : None                                                     */
519/*                                                                           */
520/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
521/*                  title "Filtering process for edges for bS less than 4"   */
522/*                  in ITU T Rec H.264.                                      */
523/*                                                                           */
524/*  Outputs       : None                                                     */
525/*                                                                           */
526/*  Returns       : None                                                     */
527/*                                                                           */
528/*  Issues        : None                                                     */
529/*                                                                           */
530/*  Revision History:                                                        */
531/*                                                                           */
532/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
533/*         28 11 2013   Ittiam          Draft                                */
534/*                                                                           */
535/*****************************************************************************/
536void ih264_deblk_luma_vert_bslt4(UWORD8 *pu1_src,
537                                 WORD32 src_strd,
538                                 WORD32 alpha,
539                                 WORD32 beta,
540                                 UWORD32 u4_bs,
541                                 const UWORD8 *pu1_cliptab)
542{
543    WORD8 i = 0, edge;
544    UWORD8 p2, p1, p0, q0, q1, q2;
545    WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2;
546    UWORD8 a_p, a_q; /* threshold variables */
547    WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */
548    UWORD8 *pu1_src_temp;
549    WORD8 delta;
550    WORD8 tc;
551    WORD16 val;
552    UWORD8 tc0, u1_bs;
553
554    pos_q0 = 0;
555    pos_q1 = 1;
556    pos_q2 = 2;
557    pos_p0 = -1;
558    pos_p1 = -2;
559    pos_p2 = -3;
560
561    for(edge = 0; edge < 4; edge++, pu1_src += blk_strd)
562    {
563        pu1_src_temp = pu1_src;
564        /* Filter Decision */
565        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
566        if(!u1_bs)
567            continue;
568        /* tc0 */
569        tc0 = pu1_cliptab[u1_bs];
570        for(i = 0; i < 4; ++i, pu1_src_temp += src_strd)
571        {
572            q0 = pu1_src_temp[pos_q0];
573            q1 = pu1_src_temp[pos_q1];
574            p0 = pu1_src_temp[pos_p0];
575            p1 = pu1_src_temp[pos_p1];
576
577            /* Filter Decision */
578            if((ABS(p0 - q0) >= alpha) ||
579               (ABS(q1 - q0) >= beta) ||
580               (ABS(p1 - p0) >= beta))
581                continue;
582
583            q2 = pu1_src_temp[pos_q2];
584            p2 = pu1_src_temp[pos_p2];
585
586            a_p = ABS(p2 - p0);
587            a_q = ABS(q2 - q0);
588
589            /* tc */
590            tc = tc0 + (a_p < beta) + (a_q < beta);
591
592            val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3);
593            delta = CLIP3(-tc, tc, val);
594
595            /* p0' */
596            val = p0 + delta;
597            pu1_src_temp[pos_p0] = CLIP_U8(val);
598            /* q0' */
599            val = q0 - delta;
600            pu1_src_temp[pos_q0] = CLIP_U8(val);
601
602            /* Luma only */
603            if(a_p < beta)
604            {
605                /* p1' */
606                val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1);
607                pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val);
608            }
609
610            if(a_q < beta)
611            {
612                /* q1' */
613                val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1);
614                pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val);
615            }
616        }
617    }
618}
619
620/*****************************************************************************/
621/*                                                                           */
622/*  Function Name : ih264_deblk_chroma_vert_bslt4_bp()                       */
623/*                                                                           */
624/*  Description   : This function performs filtering of a chroma block       */
625/*                  vertical edge when the boundary strength is less than 4. */
626/*                                                                           */
627/*  Inputs        : pu1_src       - pointer to the src sample q0 of U        */
628/*                  src_strd      - source stride                            */
629/*                  alpha         - alpha value for the boundary             */
630/*                  beta          - beta value for the boundary              */
631/*                  u4_bs         - packed Boundary strength array           */
632/*                  pu1_cliptab   - tc0_table                                */
633/*                                                                           */
634/*  Globals       : None                                                     */
635/*                                                                           */
636/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
637/*                  title "Filtering process for edges for bS less than 4"   */
638/*                  in ITU T Rec H.264.                                      */
639/*                                                                           */
640/*  Outputs       : None                                                     */
641/*                                                                           */
642/*  Returns       : None                                                     */
643/*                                                                           */
644/*  Issues        : None                                                     */
645/*                                                                           */
646/*  Revision History:                                                        */
647/*                                                                           */
648/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
649/*         28 11 2013   Ittiam          Draft                                */
650/*                                                                           */
651/*****************************************************************************/
652void ih264_deblk_chroma_vert_bslt4_bp(UWORD8 *pu1_src,
653                                      WORD32 src_strd,
654                                      WORD32 alpha,
655                                      WORD32 beta,
656                                      UWORD32 u4_bs,
657                                      const UWORD8 *pu1_cliptab)
658{
659    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
660    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
661    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
662    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * (4 >> 1)*/
663    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
664    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
665    WORD8 i = 0, edge;
666    WORD8 delta;
667    WORD8 tc;
668    WORD16 val;
669    UWORD8 tc0, u1_bs;
670
671    pos_q0 = 0;
672    pos_q1 = 2;
673    pos_p0 = -2;
674    pos_p1 = -4;
675
676    for(edge = 0; edge < 4;
677                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
678    {
679        pu1_src_temp_u = pu1_src_u;
680        pu1_src_temp_v = pu1_src_v;
681        /* Filter Decision */
682        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
683        if(!u1_bs)
684            continue;
685        /* tc0 */
686        tc0 = pu1_cliptab[u1_bs];
687        tc = tc0 + 1;
688        for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v +=
689                        src_strd)
690        {
691            q0_u = pu1_src_temp_u[pos_q0];
692            q1_u = pu1_src_temp_u[pos_q1];
693            p0_u = pu1_src_temp_u[pos_p0];
694            p1_u = pu1_src_temp_u[pos_p1];
695
696            q0_v = pu1_src_temp_v[pos_q0];
697            q1_v = pu1_src_temp_v[pos_q1];
698            p0_v = pu1_src_temp_v[pos_p0];
699            p1_v = pu1_src_temp_v[pos_p1];
700
701            /* Filter Decision */
702            if((ABS(p0_u - q0_u) < alpha) &&
703               (ABS(q1_u - q0_u) < beta) &&
704               (ABS(p1_u - p0_u) < beta))
705            {
706                val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
707                delta = CLIP3(-tc, tc, val);
708                /* p0' */
709                val = p0_u + delta;
710                pu1_src_temp_u[pos_p0] = CLIP_U8(val);
711                /* q0' */
712                val = q0_u - delta;
713                pu1_src_temp_u[pos_q0] = CLIP_U8(val);
714            }
715
716            /* Filter Decision */
717            if((ABS(p0_v - q0_v) < alpha) &&
718               (ABS(q1_v - q0_v) < beta) &&
719               (ABS(p1_v - p0_v) < beta))
720            {
721                val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
722                delta = CLIP3(-tc, tc, val);
723                /* p0' */
724                val = p0_v + delta;
725                pu1_src_temp_v[pos_p0] = CLIP_U8(val);
726                /* q0' */
727                val = q0_v - delta;
728                pu1_src_temp_v[pos_q0] = CLIP_U8(val);
729            }
730        }
731    }
732}
733
734/*****************************************************************************/
735/*                                                                           */
736/*  Function Name : ih264_deblk_luma_horz_bslt4()                            */
737/*                                                                           */
738/*  Description   : This function performs filtering of a luma block         */
739/*                  horizontal edge when boundary strength is less than 4.   */
740/*                                                                           */
741/*  Inputs        : pu1_src       - pointer to the src sample q0             */
742/*                  src_strd      - source stride                            */
743/*                  alpha         - alpha value for the boundary             */
744/*                  beta          - beta value for the boundary              */
745/*                  u4_bs         - packed Boundary strength array           */
746/*                  pu1_cliptab   - tc0_table                                */
747/*                                                                           */
748/*  Globals       : None                                                     */
749/*                                                                           */
750/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
751/*                  title "Filtering process for edges for bS less than 4"   */
752/*                  in ITU T Rec H.264.                                      */
753/*                                                                           */
754/*  Outputs       : None                                                     */
755/*                                                                           */
756/*  Returns       : None                                                     */
757/*                                                                           */
758/*  Issues        : None                                                     */
759/*                                                                           */
760/*  Revision History:                                                        */
761/*                                                                           */
762/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
763/*         28 11 2013   Ittiam          Draft                                */
764/*                                                                           */
765/*****************************************************************************/
766void ih264_deblk_luma_horz_bslt4(UWORD8 *pu1_src,
767                                 WORD32 src_strd,
768                                 WORD32 alpha,
769                                 WORD32 beta,
770                                 UWORD32 u4_bs,
771                                 const UWORD8 *pu1_cliptab)
772{
773    UWORD8 p2, p1, p0, q0, q1, q2;
774    WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2;
775    UWORD8 a_p, a_q; /* Threshold variables */
776    UWORD8 *pu1_p2; /* Pointer to the src sample p2 */
777    UWORD8 *pu1_p2_temp;
778    UWORD8 *pu1_src_temp;
779    WORD8 i = 0, edge;
780    WORD8 delta;
781    WORD8 tc;
782    WORD16 val;
783    UWORD8 tc0, u1_bs;
784
785    pu1_p2 = pu1_src - (src_strd << 2);
786    pos_q0 = 0;
787    pos_q1 = src_strd;
788    pos_q2 = X2(src_strd);
789    pos_p0 = X3(src_strd);
790    pos_p1 = X2(src_strd);
791    pos_p2 = src_strd;
792
793    for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p2 += 4)
794    {
795        pu1_src_temp = pu1_src;
796        pu1_p2_temp = pu1_p2;
797
798        /* Filter Decision */
799        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
800        if(!u1_bs)
801            continue;
802        /* tc0 */
803        tc0 = pu1_cliptab[u1_bs];
804
805        for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p2_temp++)
806        {
807            q0 = pu1_src_temp[pos_q0];
808            q1 = pu1_src_temp[pos_q1];
809            p0 = pu1_p2_temp[pos_p0];
810            p1 = pu1_p2_temp[pos_p1];
811
812            /* Filter Decision */
813            if((ABS(p0 - q0) >= alpha) ||
814               (ABS(q1 - q0) >= beta) ||
815               (ABS(p1 - p0) >= beta))
816                continue;
817
818            q2 = pu1_src_temp[pos_q2];
819            p2 = pu1_p2_temp[pos_p2];
820
821            a_p = ABS(p2 - p0);
822            a_q = ABS(q2 - q0);
823
824            /* tc */
825            tc = tc0 + (a_p < beta) + (a_q < beta);
826            val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3);
827            delta = CLIP3(-tc, tc, val);
828            /* p0' */
829            val = p0 + delta;
830            pu1_p2_temp[pos_p0] = CLIP_U8(val);
831            /* q0' */
832            val = q0 - delta;
833            pu1_src_temp[pos_q0] = CLIP_U8(val);
834
835            /* Luma */
836            if(a_p < beta)
837            {
838                /* p1' */
839                val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1);
840                pu1_p2_temp[pos_p1] += CLIP3(-tc0, tc0, val);
841            }
842
843            if(a_q < beta)
844            {
845                /* q1' */
846                val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1);
847                pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val);
848            }
849        }
850    }
851}
852
853/*****************************************************************************/
854/*                                                                           */
855/*  Function Name : ih264_deblk_chroma_horz_bslt4_bp()                       */
856/*                                                                           */
857/*  Description   : This function performs filtering of a chroma block       */
858/*                  horizontal edge when boundary strength is less than 4.   */
859/*                                                                           */
860/*  Inputs        : pu1_src       - pointer to the src sample q0 of U        */
861/*                  src_strd      - source stride                            */
862/*                  alpha         - alpha value for the boundary             */
863/*                  beta          - beta value for the boundary              */
864/*                  u4_bs         - packed Boundary strength array           */
865/*                  pu1_cliptab   - tc0_table                                */
866/*                                                                           */
867/*  Globals       : None                                                     */
868/*                                                                           */
869/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
870/*                  title "Filtering process for edges for bS less than 4"   */
871/*                  in ITU T Rec H.264.                                      */
872/*                                                                           */
873/*  Outputs       : None                                                     */
874/*                                                                           */
875/*  Returns       : None                                                     */
876/*                                                                           */
877/*  Issues        : None                                                     */
878/*                                                                           */
879/*  Revision History:                                                        */
880/*                                                                           */
881/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
882/*         28 11 2013   Ittiam          Draft                                */
883/*                                                                           */
884/*****************************************************************************/
885void ih264_deblk_chroma_horz_bslt4_bp(UWORD8 *pu1_src,
886                                      WORD32 src_strd,
887                                      WORD32 alpha,
888                                      WORD32 beta,
889                                      UWORD32 u4_bs,
890                                      const UWORD8 *pu1_cliptab)
891{
892    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
893    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
894    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
895    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
896    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
897    UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/
898    UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/
899    UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v;
900    WORD8 i = 0, edge;
901    WORD8 delta;
902    WORD8 tc;
903    WORD16 val;
904    UWORD8 u1_bs;
905    UWORD8 tc0;
906
907    pu1_p1_u = pu1_src_u - (src_strd << 1);
908    pu1_p1_v = pu1_src_v - (src_strd << 1);
909    pos_q0 = 0;
910    pos_q1 = src_strd;
911    pos_p0 = src_strd;
912    pos_p1 = 0;
913
914    for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4,
915                    pu1_src_v += 4, pu1_p1_v += 4)
916    {
917        pu1_src_temp_u = pu1_src_u;
918        pu1_p1_temp_u = pu1_p1_u;
919        pu1_src_temp_v = pu1_src_v;
920        pu1_p1_temp_v = pu1_p1_v;
921
922        /* Filter Decision */
923        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
924        if(!u1_bs)
925            continue;
926        /* tc0 */
927        tc0 = pu1_cliptab[u1_bs];
928
929        for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2,
930                       pu1_src_temp_v += 2, pu1_p1_temp_v += 2)
931        {
932            q0_u = pu1_src_temp_u[pos_q0];
933            q1_u = pu1_src_temp_u[pos_q1];
934            p0_u = pu1_p1_temp_u[pos_p0];
935            p1_u = pu1_p1_temp_u[pos_p1];
936
937            q0_v = pu1_src_temp_v[pos_q0];
938            q1_v = pu1_src_temp_v[pos_q1];
939            p0_v = pu1_p1_temp_v[pos_p0];
940            p1_v = pu1_p1_temp_v[pos_p1];
941
942            /* tc */
943            tc = tc0 + 1;
944            /* Filter Decision */
945            if(ABS(p0_u - q0_u) < alpha && ABS(q1_u - q0_u) < beta
946                            && ABS(p1_u - p0_u) < beta)
947            {
948                val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
949                delta = CLIP3(-tc, tc, val);
950                /* p0' */
951                val = p0_u + delta;
952                pu1_p1_temp_u[pos_p0] = CLIP_U8(val);
953                /* q0' */
954                val = q0_u - delta;
955                pu1_src_temp_u[pos_q0] = CLIP_U8(val);
956            }
957            /* Filter Decision */
958            if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta
959                            && ABS(p1_v - p0_v) < beta)
960            {
961                val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
962                delta = CLIP3(-tc, tc, val);
963                /* p0' */
964                val = p0_v + delta;
965                pu1_p1_temp_v[pos_p0] = CLIP_U8(val);
966                /* q0' */
967                val = q0_v - delta;
968                pu1_src_temp_v[pos_q0] = CLIP_U8(val);
969            }
970        }
971    }
972}
973
974/*****************************************************************************/
975/* Function Definitions for vertical edge deblocking for double-call         */
976/*****************************************************************************/
977
978/*****************************************************************************/
979/*                                                                           */
980/*  Function Name : ih264_deblk_luma_vert_bs4_mbaff()                        */
981/*                                                                           */
982/*  Description   : This function performs filtering of a luma block         */
983/*                  vertical edge when boundary strength is set to 4.        */
984/*                                                                           */
985/*  Inputs        : pu1_src       - pointer to the src sample q0             */
986/*                  src_strd      - source stride                            */
987/*                  alpha         - alpha value for the boundary             */
988/*                  beta          - beta value for the boundary              */
989/*                                                                           */
990/*  Globals       : None                                                     */
991/*                                                                           */
992/*  Processing    : When the function is called twice, this operation is as  */
993/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
994/*                  process for edges for bS equal to 4" in ITU T Rec H.264. */
995/*                                                                           */
996/*  Outputs       : None                                                     */
997/*                                                                           */
998/*  Returns       : None                                                     */
999/*                                                                           */
1000/*  Issues        : None                                                     */
1001/*                                                                           */
1002/*  Revision History:                                                        */
1003/*                                                                           */
1004/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1005/*         29 12 2014   Kaushik         Draft                                */
1006/*                      Senthoor                                             */
1007/*                                                                           */
1008/*****************************************************************************/
1009void ih264_deblk_luma_vert_bs4_mbaff(UWORD8 *pu1_src,
1010                                     WORD32 src_strd,
1011                                     WORD32 alpha,
1012                                     WORD32 beta)
1013{
1014    UWORD8 p3, p2, p1, p0, q0, q1, q2, q3;
1015    WORD32 pos_p3, pos_p2, pos_p1, pos_p0;
1016    WORD32 pos_q0, pos_q1, pos_q2, pos_q3;
1017    UWORD8 a_p, a_q; /* threshold variables */
1018    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */
1019    UWORD8 *pu1_src_temp;
1020    WORD8 i = 0, edge;
1021
1022    pos_q0 = 0;
1023    pos_q1 = 1;
1024    pos_q2 = 2;
1025    pos_q3 = 3;
1026    pos_p0 = -1;
1027    pos_p1 = -2;
1028    pos_p2 = -3;
1029    pos_p3 = -4;
1030
1031    for(edge = 0; edge < 4; edge++, pu1_src += blk_strd)
1032    {
1033        pu1_src_temp = pu1_src;
1034        for(i = 0; i < 2; ++i, pu1_src_temp += src_strd)
1035        {
1036            q0 = pu1_src_temp[pos_q0];
1037            q1 = pu1_src_temp[pos_q1];
1038            p0 = pu1_src_temp[pos_p0];
1039            p1 = pu1_src_temp[pos_p1];
1040
1041            /* Filter Decision */
1042            if((ABS(p0 - q0) >= alpha) ||
1043               (ABS(q1 - q0) >= beta) ||
1044               (ABS(p1 - p0) >= beta))
1045                continue;
1046
1047            p2 = pu1_src_temp[pos_p2];
1048            p3 = pu1_src_temp[pos_p3];
1049            q2 = pu1_src_temp[pos_q2];
1050            q3 = pu1_src_temp[pos_q3];
1051
1052            if(ABS(p0 - q0) < ((alpha >> 2) + 2))
1053            {
1054                /* Threshold Variables */
1055                a_p = (UWORD8)ABS(p2 - p0);
1056                a_q = (UWORD8)ABS(q2 - q0);
1057
1058                if(a_p < beta)
1059                {
1060                    /* p0', p1', p2' */
1061                    pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1
1062                                    + 4) >> 3);
1063                    pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2);
1064                    pu1_src_temp[pos_p2] =
1065                                    ((X2(p3) + X3(p2) + p1 + p0 + q0
1066                                                    + 4) >> 3);
1067                }
1068                else
1069                {
1070                    /* p0'*/
1071                    pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2);
1072                }
1073
1074                if(a_q < beta)
1075                {
1076                    /* q0', q1', q2' */
1077                    pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2
1078                                    + 4) >> 3;
1079                    pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2;
1080                    pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4)
1081                                    >> 3;
1082                }
1083                else
1084                {
1085                    /* q0'*/
1086                    pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
1087                }
1088            }
1089            else
1090            {
1091                /* p0', q0'*/
1092                pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2);
1093                pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2;
1094            }
1095        }
1096    }
1097}
1098
1099/*****************************************************************************/
1100/*                                                                           */
1101/*  Function Name : ih264_deblk_chroma_vert_bs4_mbaff_bp()                   */
1102/*                                                                           */
1103/*  Description   : This function performs filtering of a chroma block       */
1104/*                  vertical edge when boundary strength is set to 4.        */
1105/*                                                                           */
1106/*  Inputs        : pu1_src       - pointer to the src sample q0 of U        */
1107/*                  src_strd      - source stride                            */
1108/*                  alpha         - alpha value for the boundary             */
1109/*                  beta          - beta value for the boundary              */
1110/*                                                                           */
1111/*  Globals       : None                                                     */
1112/*                                                                           */
1113/*  Processing    : When the function is called twice, this operation is as  */
1114/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
1115/*                  process for edges for bS equal to 4" in ITU T Rec H.264. */
1116/*                                                                           */
1117/*  Outputs       : None                                                     */
1118/*                                                                           */
1119/*  Returns       : None                                                     */
1120/*                                                                           */
1121/*  Issues        : None                                                     */
1122/*                                                                           */
1123/*  Revision History:                                                        */
1124/*                                                                           */
1125/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1126/*         29 12 2014   Kaushik         Draft                                */
1127/*                      Senthoor                                             */
1128/*                                                                           */
1129/*****************************************************************************/
1130void ih264_deblk_chroma_vert_bs4_mbaff_bp(UWORD8 *pu1_src,
1131                                          WORD32 src_strd,
1132                                          WORD32 alpha,
1133                                          WORD32 beta)
1134{
1135    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */
1136    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */
1137    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1138    WORD32 blk_strd = src_strd;
1139    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1140    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1141    WORD8 edge;
1142
1143    pos_q0 = 0;
1144    pos_q1 = 2;
1145    pos_p0 = -2;
1146    pos_p1 = -4;
1147
1148    for(edge = 0; edge < 4;
1149                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
1150    {
1151        pu1_src_temp_u = pu1_src_u;
1152        pu1_src_temp_v = pu1_src_v;
1153
1154        q0_u = pu1_src_temp_u[pos_q0];
1155        q1_u = pu1_src_temp_u[pos_q1];
1156        p0_u = pu1_src_temp_u[pos_p0];
1157        p1_u = pu1_src_temp_u[pos_p1];
1158        q0_v = pu1_src_temp_v[pos_q0];
1159        q1_v = pu1_src_temp_v[pos_q1];
1160        p0_v = pu1_src_temp_v[pos_p0];
1161        p1_v = pu1_src_temp_v[pos_p1];
1162
1163        /* Filter Decision */
1164        if((ABS(p0_u - q0_u) < alpha) &&
1165           (ABS(q1_u - q0_u) < beta) &&
1166           (ABS(p1_u - p0_u) < beta))
1167        {
1168            /* p0' */
1169            pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2);
1170            /* q0' */
1171            pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
1172        }
1173
1174        /* Filter Decision */
1175        if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta
1176                        && ABS(p1_v - p0_v) < beta)
1177        {
1178            /* p0' */
1179            pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2);
1180            /* q0' */
1181            pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
1182        }
1183    }
1184}
1185
1186/*****************************************************************************/
1187/*                                                                           */
1188/*  Function Name : ih264_deblk_luma_vert_bslt4_mbaff()                      */
1189/*                                                                           */
1190/*  Description   : This function performs filtering of a luma block         */
1191/*                  vertical edge when boundary strength is less than 4.     */
1192/*                                                                           */
1193/*  Inputs        : pu1_src       - pointer to the src sample q0             */
1194/*                  src_strd      - source stride                            */
1195/*                  alpha         - alpha value for the boundary             */
1196/*                  beta          - beta value for the boundary              */
1197/*                  u4_bs         - packed Boundary strength array           */
1198/*                  pu1_cliptab   - tc0_table                                */
1199/*                                                                           */
1200/*  Globals       : None                                                     */
1201/*                                                                           */
1202/*  Processing    : When the function is called twice, this operation is as  */
1203/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
1204/*                  process for edges for bS less than 4" in ITU T Rec H.264.*/
1205/*                                                                           */
1206/*  Outputs       : None                                                     */
1207/*                                                                           */
1208/*  Returns       : None                                                     */
1209/*                                                                           */
1210/*  Issues        : None                                                     */
1211/*                                                                           */
1212/*  Revision History:                                                        */
1213/*                                                                           */
1214/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1215/*         29 12 2014   Kaushik         Draft                                */
1216/*                      Senthoor                                             */
1217/*                                                                           */
1218/*****************************************************************************/
1219void ih264_deblk_luma_vert_bslt4_mbaff(UWORD8 *pu1_src,
1220                                       WORD32 src_strd,
1221                                       WORD32 alpha,
1222                                       WORD32 beta,
1223                                       UWORD32 u4_bs,
1224                                       const UWORD8 *pu1_cliptab)
1225{
1226    WORD8 i = 0, edge;
1227    UWORD8 p2, p1, p0, q0, q1, q2;
1228    WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2;
1229    UWORD8 a_p, a_q; /* Threshold variables */
1230    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */
1231    UWORD8 *pu1_src_temp;
1232    WORD8 delta;
1233    WORD8 tc;
1234    WORD16 val;
1235    UWORD8 tc0, u1_bs;
1236
1237    pos_q0 = 0;
1238    pos_q1 = 1;
1239    pos_q2 = 2;
1240    pos_p0 = -1;
1241    pos_p1 = -2;
1242    pos_p2 = -3;
1243
1244    for(edge = 0; edge < 4; edge++, pu1_src += blk_strd)
1245    {
1246        pu1_src_temp = pu1_src;
1247        /* Filter Decision */
1248        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
1249        if(!u1_bs)
1250            continue;
1251        /* tc0 */
1252        tc0 = pu1_cliptab[u1_bs];
1253        for(i = 0; i < 2; ++i, pu1_src_temp += src_strd)
1254        {
1255            q0 = pu1_src_temp[pos_q0];
1256            q1 = pu1_src_temp[pos_q1];
1257            p0 = pu1_src_temp[pos_p0];
1258            p1 = pu1_src_temp[pos_p1];
1259
1260            /* Filter Decision */
1261            if((ABS(p0 - q0) >= alpha) ||
1262               (ABS(q1 - q0) >= beta) ||
1263               (ABS(p1 - p0) >= beta))
1264                continue;
1265
1266            q2 = pu1_src_temp[pos_q2];
1267            p2 = pu1_src_temp[pos_p2];
1268
1269            a_p = ABS(p2 - p0);
1270            a_q = ABS(q2 - q0);
1271
1272            /* tc */
1273            tc = tc0 + (a_p < beta) + (a_q < beta);
1274
1275            val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3);
1276            delta = CLIP3(-tc, tc, val);
1277            /* p0' */
1278            val = p0 + delta;
1279            pu1_src_temp[pos_p0] = CLIP_U8(val);
1280            /* q0' */
1281            val = q0 - delta;
1282            pu1_src_temp[pos_q0] = CLIP_U8(val);
1283
1284            /* Luma only */
1285            if(a_p < beta)
1286            {
1287                /* p1' */
1288                val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1);
1289                pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val);
1290            }
1291
1292            if(a_q < beta)
1293            {
1294                /* q1' */
1295                val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1);
1296                pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val);
1297            }
1298        }
1299    }
1300}
1301
1302/*****************************************************************************/
1303/*                                                                           */
1304/*  Function Name : ih264_deblk_chroma_vert_bslt4_mbaff_bp()                 */
1305/*                                                                           */
1306/*  Description   : This function performs filtering of a chroma block       */
1307/*                  vertical edge when boundary strength is less than 4.     */
1308/*                                                                           */
1309/*  Inputs        : pu1_src       - pointer to the src sample q0 of U        */
1310/*                  src_strd      - source stride                            */
1311/*                  alpha         - alpha value for the boundary             */
1312/*                  beta          - beta value for the boundary              */
1313/*                  u4_bs         - packed Boundary strength array           */
1314/*                  pu1_cliptab   - tc0_table                                */
1315/*                                                                           */
1316/*  Globals       : None                                                     */
1317/*                                                                           */
1318/*  Processing    : When the function is called twice, this operation is as  */
1319/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
1320/*                  process for edges for bS less than 4" in ITU T Rec H.264.*/
1321/*                                                                           */
1322/*  Outputs       : None                                                     */
1323/*                                                                           */
1324/*  Returns       : None                                                     */
1325/*                                                                           */
1326/*  Issues        : None                                                     */
1327/*                                                                           */
1328/*  Revision History:                                                        */
1329/*                                                                           */
1330/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1331/*         29 12 2014   Kaushik         Draft                                */
1332/*                      Senthoor                                             */
1333/*                                                                           */
1334/*****************************************************************************/
1335void ih264_deblk_chroma_vert_bslt4_mbaff_bp(UWORD8 *pu1_src,
1336                                            WORD32 src_strd,
1337                                            WORD32 alpha,
1338                                            WORD32 beta,
1339                                            UWORD32 u4_bs,
1340                                            const UWORD8 *pu1_cliptab)
1341{
1342    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
1343    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
1344    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1345    WORD32 blk_strd = src_strd;
1346    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1347    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1348    WORD8 edge;
1349    WORD8 delta;
1350    WORD8 tc;
1351    WORD16 val;
1352    UWORD8 tc0, u1_bs;
1353
1354    pos_q0 = 0;
1355    pos_q1 = 2;
1356    pos_p0 = -2;
1357    pos_p1 = -4;
1358
1359    for(edge = 0; edge < 4;
1360                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
1361    {
1362        pu1_src_temp_u = pu1_src_u;
1363        pu1_src_temp_v = pu1_src_v;
1364        /* Filter Decision */
1365        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
1366        if(!u1_bs)
1367            continue;
1368        /* tc0 */
1369        tc0 = pu1_cliptab[u1_bs];
1370        tc = tc0 + 1;
1371
1372        q0_u = pu1_src_temp_u[pos_q0];
1373        q1_u = pu1_src_temp_u[pos_q1];
1374        p0_u = pu1_src_temp_u[pos_p0];
1375        p1_u = pu1_src_temp_u[pos_p1];
1376
1377        q0_v = pu1_src_temp_v[pos_q0];
1378        q1_v = pu1_src_temp_v[pos_q1];
1379        p0_v = pu1_src_temp_v[pos_p0];
1380        p1_v = pu1_src_temp_v[pos_p1];
1381
1382        /* Filter Decision */
1383        if((ABS(p0_u - q0_u) < alpha) &&
1384           (ABS(q1_u - q0_u) < beta) &&
1385           (ABS(p1_u - p0_u) < beta))
1386        {
1387            val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
1388            delta = CLIP3(-tc, tc, val);
1389            /* p0' */
1390            val = p0_u + delta;
1391            pu1_src_temp_u[pos_p0] = CLIP_U8(val);
1392            /* q0' */
1393            val = q0_u - delta;
1394            pu1_src_temp_u[pos_q0] = CLIP_U8(val);
1395        }
1396
1397        /* Filter Decision */
1398        if((ABS(p0_v - q0_v) < alpha) &&
1399           (ABS(q1_v - q0_v) < beta) &&
1400           (ABS(p1_v - p0_v) < beta))
1401        {
1402            val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
1403            delta = CLIP3(-tc, tc, val);
1404            /* p0' */
1405            val = p0_v + delta;
1406            pu1_src_temp_v[pos_p0] = CLIP_U8(val);
1407            /* q0' */
1408            val = q0_v - delta;
1409            pu1_src_temp_v[pos_q0] = CLIP_U8(val);
1410        }
1411    }
1412}
1413
1414/*****************************************************************************/
1415/* Function Definitions for chroma deblocking in high profile                */
1416/*****************************************************************************/
1417
1418/*****************************************************************************/
1419/*                                                                           */
1420/*  Function Name : ih264_deblk_chroma_vert_bs4()                            */
1421/*                                                                           */
1422/*  Description   : This function performs filtering of a chroma block       */
1423/*                  vertical edge when the boundary strength is set to 4 in  */
1424/*                  high profile.                                            */
1425/*                                                                           */
1426/*  Inputs        : pu1_src    - pointer to the src sample q0 of U           */
1427/*                  src_strd   - source stride                               */
1428/*                  alpha_cb   - alpha value for the boundary in U           */
1429/*                  beta_cb    - beta value for the boundary in U            */
1430/*                  alpha_cr   - alpha value for the boundary in V           */
1431/*                  beta_cr    - beta value for the boundary in V            */
1432/*                                                                           */
1433/*  Globals       : None                                                     */
1434/*                                                                           */
1435/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
1436/*                  title "Filtering process for edges for bS equal to 4" in */
1437/*                  ITU T Rec H.264 with alpha and beta values different in  */
1438/*                  U and V.                                                 */
1439/*                                                                           */
1440/*  Outputs       : None                                                     */
1441/*                                                                           */
1442/*  Returns       : None                                                     */
1443/*                                                                           */
1444/*  Issues        : None                                                     */
1445/*                                                                           */
1446/*  Revision History:                                                        */
1447/*                                                                           */
1448/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1449/*         29 12 2014   Kaushik         Draft                                */
1450/*                      Senthoor                                             */
1451/*                                                                           */
1452/*****************************************************************************/
1453void ih264_deblk_chroma_vert_bs4(UWORD8 *pu1_src,
1454                                 WORD32 src_strd,
1455                                 WORD32 alpha_cb,
1456                                 WORD32 beta_cb,
1457                                 WORD32 alpha_cr,
1458                                 WORD32 beta_cr)
1459{
1460    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */
1461    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */
1462    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1463    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2*/
1464    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1465    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1466    WORD8 i = 0, edge;
1467
1468    pos_q0 = 0;
1469    pos_q1 = 2;
1470    pos_p0 = -2;
1471    pos_p1 = -4;
1472
1473    for(edge = 0; edge < 4;
1474                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
1475    {
1476        pu1_src_temp_u = pu1_src_u;
1477        pu1_src_temp_v = pu1_src_v;
1478        for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v +=
1479                        src_strd)
1480        {
1481            q0_u = pu1_src_temp_u[pos_q0];
1482            q1_u = pu1_src_temp_u[pos_q1];
1483            p0_u = pu1_src_temp_u[pos_p0];
1484            p1_u = pu1_src_temp_u[pos_p1];
1485            q0_v = pu1_src_temp_v[pos_q0];
1486            q1_v = pu1_src_temp_v[pos_q1];
1487            p0_v = pu1_src_temp_v[pos_p0];
1488            p1_v = pu1_src_temp_v[pos_p1];
1489
1490            /* Filter Decision */
1491            if((ABS(p0_u - q0_u) < alpha_cb) &&
1492               (ABS(q1_u - q0_u) < beta_cb) &&
1493               (ABS(p1_u - p0_u) < beta_cb))
1494            {
1495                /* p0' */
1496                pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2);
1497                /* q0' */
1498                pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
1499            }
1500
1501            /* Filter Decision */
1502            if((ABS(p0_v - q0_v) < alpha_cr) &&
1503               (ABS(q1_v - q0_v) < beta_cr) &&
1504               (ABS(p1_v - p0_v) < beta_cr))
1505            {
1506                /* p0' */
1507                pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2);
1508                /* q0' */
1509                pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
1510            }
1511        }
1512    }
1513}
1514
1515/*****************************************************************************/
1516/*                                                                           */
1517/*  Function Name : ih264_deblk_chroma_horz_bs4()                            */
1518/*                                                                           */
1519/*  Description   : This function performs filtering of a chroma block       */
1520/*                  horizontal edge when the boundary strength is set to 4   */
1521/*                  in high profile.                                         */
1522/*                                                                           */
1523/*  Inputs        : pu1_src    - pointer to the src sample q0 of U           */
1524/*                  src_strd   - source stride                               */
1525/*                  alpha_cb   - alpha value for the boundary in U           */
1526/*                  beta_cb    - beta value for the boundary in U            */
1527/*                  alpha_cr   - alpha value for the boundary in V           */
1528/*                  beta_cr    - beta value for the boundary in V            */
1529/*                                                                           */
1530/*  Globals       : None                                                     */
1531/*                                                                           */
1532/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
1533/*                  title "Filtering process for edges for bS equal to 4" in */
1534/*                  ITU T Rec H.264 with alpha and beta values different in  */
1535/*                  U and V.                                                 */
1536/*                                                                           */
1537/*  Outputs       : None                                                     */
1538/*                                                                           */
1539/*  Returns       : None                                                     */
1540/*                                                                           */
1541/*  Issues        : None                                                     */
1542/*                                                                           */
1543/*  Revision History:                                                        */
1544/*                                                                           */
1545/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1546/*         29 12 2014   Kaushik         Draft                                */
1547/*                      Senthoor                                             */
1548/*                                                                           */
1549/*****************************************************************************/
1550void ih264_deblk_chroma_horz_bs4(UWORD8 *pu1_src,
1551                                 WORD32 src_strd,
1552                                 WORD32 alpha_cb,
1553                                 WORD32 beta_cb,
1554                                 WORD32 alpha_cr,
1555                                 WORD32 beta_cr)
1556{
1557    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */
1558    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */
1559    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1560    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1561    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1562    UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of U */
1563    UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of U */
1564    UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v;
1565    WORD8 i = 0, edge;
1566
1567    pu1_p1_u = pu1_src_u - (src_strd << 1);
1568    pu1_p1_v = pu1_src_v - (src_strd << 1);
1569    pos_q0 = 0;
1570    pos_q1 = src_strd;
1571    pos_p0 = src_strd;
1572    pos_p1 = 0;
1573
1574    for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, pu1_src_v +=
1575                    4, pu1_p1_v += 4)
1576    {
1577        pu1_src_temp_u = pu1_src_u;
1578        pu1_p1_temp_u = pu1_p1_u;
1579        pu1_src_temp_v = pu1_src_v;
1580        pu1_p1_temp_v = pu1_p1_v;
1581        for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2,
1582                       pu1_src_temp_v += 2, pu1_p1_temp_v += 2)
1583        {
1584            q0_u = pu1_src_temp_u[pos_q0];
1585            q1_u = pu1_src_temp_u[pos_q1];
1586            p0_u = pu1_p1_temp_u[pos_p0];
1587            p1_u = pu1_p1_temp_u[pos_p1];
1588
1589            q0_v = pu1_src_temp_v[pos_q0];
1590            q1_v = pu1_src_temp_v[pos_q1];
1591            p0_v = pu1_p1_temp_v[pos_p0];
1592            p1_v = pu1_p1_temp_v[pos_p1];
1593
1594            /* Filter Decision */
1595            if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb
1596                            && ABS(p1_u - p0_u) < beta_cb)
1597            {
1598                /* p0' */
1599                pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2;
1600                /* q0' */
1601                pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
1602            }
1603
1604            /* Filter Decision */
1605            if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr
1606                            && ABS(p1_v - p0_v) < beta_cr)
1607            {
1608                /* p0' */
1609                pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2;
1610                /* q0' */
1611                pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
1612            }
1613        }
1614    }
1615}
1616
1617/*****************************************************************************/
1618/*                                                                           */
1619/*  Function Name : ih264_deblk_chroma_vert_bslt4()                          */
1620/*                                                                           */
1621/*  Description   : This function performs filtering of a chroma block       */
1622/*                  vertical edge when the boundary strength is less than 4  */
1623/*                  in high profile.                                         */
1624/*                                                                           */
1625/*  Inputs        : pu1_src          - pointer to the src sample q0 of U     */
1626/*                  src_strd         - source stride                         */
1627/*                  alpha_cb         - alpha value for the boundary in U     */
1628/*                  beta_cb          - beta value for the boundary in U      */
1629/*                  alpha_cr         - alpha value for the boundary in V     */
1630/*                  beta_cr          - beta value for the boundary in V      */
1631/*                  u4_bs            - packed Boundary strength array        */
1632/*                  pu1_cliptab_cb   - tc0_table for U                       */
1633/*                  pu1_cliptab_cr   - tc0_table for V                       */
1634/*                                                                           */
1635/*  Globals       : None                                                     */
1636/*                                                                           */
1637/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
1638/*                  title "Filtering process for edges for bS less than 4"   */
1639/*                  in ITU T Rec H.264 with alpha and beta values different  */
1640/*                  in U and V.                                              */
1641/*                                                                           */
1642/*  Outputs       : None                                                     */
1643/*                                                                           */
1644/*  Returns       : None                                                     */
1645/*                                                                           */
1646/*  Issues        : None                                                     */
1647/*                                                                           */
1648/*  Revision History:                                                        */
1649/*                                                                           */
1650/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1651/*         29 12 2014   Kaushik         Draft                                */
1652/*                      Senthoor                                             */
1653/*                                                                           */
1654/*****************************************************************************/
1655void ih264_deblk_chroma_vert_bslt4(UWORD8 *pu1_src,
1656                                   WORD32 src_strd,
1657                                   WORD32 alpha_cb,
1658                                   WORD32 beta_cb,
1659                                   WORD32 alpha_cr,
1660                                   WORD32 beta_cr,
1661                                   UWORD32 u4_bs,
1662                                   const UWORD8 *pu1_cliptab_cb,
1663                                   const UWORD8 *pu1_cliptab_cr)
1664{
1665    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
1666    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
1667    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1668    WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */
1669    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1670    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1671    WORD8 i = 0, edge;
1672    WORD8 delta;
1673    WORD8 tcb, tcr;
1674    WORD16 val;
1675    UWORD8 tcb0, tcr0, u1_bs;
1676
1677    pos_q0 = 0;
1678    pos_q1 = 2;
1679    pos_p0 = -2;
1680    pos_p1 = -4;
1681
1682    for(edge = 0; edge < 4;
1683                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
1684    {
1685        pu1_src_temp_u = pu1_src_u;
1686        pu1_src_temp_v = pu1_src_v;
1687        /* Filter Decision */
1688        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
1689        if(!u1_bs)
1690            continue;
1691        /* tc0 */
1692        tcb0 = pu1_cliptab_cb[u1_bs];
1693        tcr0 = pu1_cliptab_cr[u1_bs];
1694        tcb = tcb0 + 1;
1695        tcr = tcr0 + 1;
1696        for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v +=
1697                        src_strd)
1698        {
1699            q0_u = pu1_src_temp_u[pos_q0];
1700            q1_u = pu1_src_temp_u[pos_q1];
1701            p0_u = pu1_src_temp_u[pos_p0];
1702            p1_u = pu1_src_temp_u[pos_p1];
1703
1704            q0_v = pu1_src_temp_v[pos_q0];
1705            q1_v = pu1_src_temp_v[pos_q1];
1706            p0_v = pu1_src_temp_v[pos_p0];
1707            p1_v = pu1_src_temp_v[pos_p1];
1708
1709            /* Filter Decision */
1710            if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb
1711                            && ABS(p1_u - p0_u) < beta_cb)
1712            {
1713                val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
1714                delta = CLIP3(-tcb, tcb, val);
1715                /* p0' */
1716                val = p0_u + delta;
1717                pu1_src_temp_u[pos_p0] = CLIP_U8(val);
1718                /* q0' */
1719                val = q0_u - delta;
1720                pu1_src_temp_u[pos_q0] = CLIP_U8(val);
1721            }
1722
1723            /* Filter Decision */
1724            if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr
1725                            && ABS(p1_v - p0_v) < beta_cr)
1726            {
1727                val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
1728                delta = CLIP3(-tcr, tcr, val);
1729                /* p0' */
1730                val = p0_v + delta;
1731                pu1_src_temp_v[pos_p0] = CLIP_U8(val);
1732                /* q0' */
1733                val = q0_v - delta;
1734                pu1_src_temp_v[pos_q0] = CLIP_U8(val);
1735            }
1736        }
1737    }
1738}
1739
1740/*****************************************************************************/
1741/*                                                                           */
1742/*  Function Name : ih264_deblk_chroma_horz_bslt4()                          */
1743/*                                                                           */
1744/*  Description   : This function performs filtering of a chroma block       */
1745/*                  horizontal edge when the boundary strength is less than  */
1746/*                  4 in high profile.                                       */
1747/*                                                                           */
1748/*  Inputs        : pu1_src          - pointer to the src sample q0 of U     */
1749/*                  src_strd         - source stride                         */
1750/*                  alpha_cb         - alpha value for the boundary in U     */
1751/*                  beta_cb          - beta value for the boundary in U      */
1752/*                  alpha_cr         - alpha value for the boundary in V     */
1753/*                  beta_cr          - beta value for the boundary in V      */
1754/*                  u4_bs            - packed Boundary strength array        */
1755/*                  pu1_cliptab_cb   - tc0_table for U                       */
1756/*                  pu1_cliptab_cr   - tc0_table for V                       */
1757/*                                                                           */
1758/*  Globals       : None                                                     */
1759/*                                                                           */
1760/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
1761/*                  title "Filtering process for edges for bS less than 4"   */
1762/*                  in ITU T Rec H.264 with alpha and beta values different  */
1763/*                  in U and V.                                              */
1764/*                                                                           */
1765/*  Outputs       : None                                                     */
1766/*                                                                           */
1767/*  Returns       : None                                                     */
1768/*                                                                           */
1769/*  Issues        : None                                                     */
1770/*                                                                           */
1771/*  Revision History:                                                        */
1772/*                                                                           */
1773/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1774/*         29 12 2014   Kaushik         Draft                                */
1775/*                      Senthoor                                             */
1776/*                                                                           */
1777/*****************************************************************************/
1778void ih264_deblk_chroma_horz_bslt4(UWORD8 *pu1_src,
1779                                   WORD32 src_strd,
1780                                   WORD32 alpha_cb,
1781                                   WORD32 beta_cb,
1782                                   WORD32 alpha_cr,
1783                                   WORD32 beta_cr,
1784                                   UWORD32 u4_bs,
1785                                   const UWORD8 *pu1_cliptab_cb,
1786                                   const UWORD8 *pu1_cliptab_cr)
1787{
1788    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
1789    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
1790    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1791    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1792    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1793    UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/
1794    UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/
1795    UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v;
1796    WORD8 i = 0, edge;
1797    WORD8 delta;
1798    WORD8 tcb, tcr;
1799    WORD16 val;
1800    UWORD8 u1_bs;
1801    UWORD8 tcb0, tcr0;
1802
1803    pu1_p1_u = pu1_src_u - (src_strd << 1);
1804    pu1_p1_v = pu1_src_v - (src_strd << 1);
1805    pos_q0 = 0;
1806    pos_q1 = src_strd;
1807    pos_p0 = src_strd;
1808    pos_p1 = 0;
1809
1810    for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4,
1811                    pu1_src_v += 4, pu1_p1_v += 4)
1812    {
1813        pu1_src_temp_u = pu1_src_u;
1814        pu1_p1_temp_u = pu1_p1_u;
1815        pu1_src_temp_v = pu1_src_v;
1816        pu1_p1_temp_v = pu1_p1_v;
1817
1818        /* Filter Decision */
1819        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
1820        if(!u1_bs)
1821            continue;
1822        /* tc0 */
1823        tcb0 = pu1_cliptab_cb[u1_bs];
1824        tcr0 = pu1_cliptab_cr[u1_bs];
1825
1826        for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2,
1827                       pu1_src_temp_v += 2, pu1_p1_temp_v += 2)
1828        {
1829            q0_u = pu1_src_temp_u[pos_q0];
1830            q1_u = pu1_src_temp_u[pos_q1];
1831            p0_u = pu1_p1_temp_u[pos_p0];
1832            p1_u = pu1_p1_temp_u[pos_p1];
1833
1834            q0_v = pu1_src_temp_v[pos_q0];
1835            q1_v = pu1_src_temp_v[pos_q1];
1836            p0_v = pu1_p1_temp_v[pos_p0];
1837            p1_v = pu1_p1_temp_v[pos_p1];
1838
1839            /* tc */
1840            tcb = tcb0 + 1;
1841            tcr = tcr0 + 1;
1842            /* Filter Decision */
1843            if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb
1844                            && ABS(p1_u - p0_u) < beta_cb)
1845            {
1846                val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
1847                delta = CLIP3(-tcb, tcb, val);
1848                /* p0' */
1849                val = p0_u + delta;
1850                pu1_p1_temp_u[pos_p0] = CLIP_U8(val);
1851                /* q0' */
1852                val = q0_u - delta;
1853                pu1_src_temp_u[pos_q0] = CLIP_U8(val);
1854            }
1855            /* Filter Decision */
1856            if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr
1857                            && ABS(p1_v - p0_v) < beta_cr)
1858            {
1859                val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
1860                delta = CLIP3(-tcr, tcr, val);
1861                /* p0' */
1862                val = p0_v + delta;
1863                pu1_p1_temp_v[pos_p0] = CLIP_U8(val);
1864                /* q0' */
1865                val = q0_v - delta;
1866                pu1_src_temp_v[pos_q0] = CLIP_U8(val);
1867            }
1868        }
1869    }
1870}
1871
1872/*****************************************************************************/
1873/*                                                                           */
1874/*  Function Name : ih264_deblk_chroma_vert_bs4_mbaff()                      */
1875/*                                                                           */
1876/*  Description   : This function performs filtering of a chroma block       */
1877/*                  vertical edge when boundary strength is set to 4 in high */
1878/*                  profile.                                                 */
1879/*                                                                           */
1880/*  Inputs        : pu1_src          - pointer to the src sample q0 of U     */
1881/*                  src_strd         - source stride                         */
1882/*                  alpha_cb         - alpha value for the boundary in U     */
1883/*                  beta_cb          - beta value for the boundary in U      */
1884/*                  alpha_cr         - alpha value for the boundary in V     */
1885/*                  beta_cr          - beta value for the boundary in V      */
1886/*                  u4_bs            - packed Boundary strength array        */
1887/*                  pu1_cliptab_cb   - tc0_table for U                       */
1888/*                  pu1_cliptab_cr   - tc0_table for V                       */
1889/*                                                                           */
1890/*  Globals       : None                                                     */
1891/*                                                                           */
1892/*  Processing    : When the function is called twice, this operation is as  */
1893/*                  described in Sec. 8.7.2.4 under the title "Filtering     */
1894/*                  process for edges for bS equal to 4" in ITU T Rec H.264  */
1895/*                  with alpha and beta values different in U and V.         */
1896/*                                                                           */
1897/*  Outputs       : None                                                     */
1898/*                                                                           */
1899/*  Returns       : None                                                     */
1900/*                                                                           */
1901/*  Issues        : None                                                     */
1902/*                                                                           */
1903/*  Revision History:                                                        */
1904/*                                                                           */
1905/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1906/*         29 12 2014   Kaushik         Draft                                */
1907/*                      Senthoor                                             */
1908/*                                                                           */
1909/*****************************************************************************/
1910void ih264_deblk_chroma_vert_bs4_mbaff(UWORD8 *pu1_src,
1911                                       WORD32 src_strd,
1912                                       WORD32 alpha_cb,
1913                                       WORD32 beta_cb,
1914                                       WORD32 alpha_cr,
1915                                       WORD32 beta_cr)
1916{
1917    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */
1918    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */
1919    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
1920    WORD32 blk_strd = src_strd;
1921    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
1922    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
1923    WORD8 edge;
1924
1925    pos_q0 = 0;
1926    pos_q1 = 2;
1927    pos_p0 = -2;
1928    pos_p1 = -4;
1929
1930    for(edge = 0; edge < 4;
1931                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
1932    {
1933        pu1_src_temp_u = pu1_src_u;
1934        pu1_src_temp_v = pu1_src_v;
1935        q0_u = pu1_src_temp_u[pos_q0];
1936        q1_u = pu1_src_temp_u[pos_q1];
1937        p0_u = pu1_src_temp_u[pos_p0];
1938        p1_u = pu1_src_temp_u[pos_p1];
1939        q0_v = pu1_src_temp_v[pos_q0];
1940        q1_v = pu1_src_temp_v[pos_q1];
1941        p0_v = pu1_src_temp_v[pos_p0];
1942        p1_v = pu1_src_temp_v[pos_p1];
1943
1944        /* Filter Decision */
1945        if((ABS(p0_u - q0_u) < alpha_cb) &&
1946           (ABS(q1_u - q0_u) < beta_cb)  &&
1947           (ABS(p1_u - p0_u) < beta_cb))
1948        {
1949            /* p0' */
1950            pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2);
1951            /* q0' */
1952            pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2;
1953        }
1954
1955        /* Filter Decision */
1956        if((ABS(p0_v - q0_v) < alpha_cr) &&
1957           (ABS(q1_v - q0_v) < beta_cr) &&
1958           (ABS(p1_v - p0_v) < beta_cr))
1959        {
1960            /* p0' */
1961            pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2);
1962            /* q0' */
1963            pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2;
1964        }
1965    }
1966}
1967
1968/*****************************************************************************/
1969/*                                                                           */
1970/*  Function Name : ih264_deblk_chroma_vert_bslt4_mbaff()                    */
1971/*                                                                           */
1972/*  Description   : This function performs filtering of a chroma block       */
1973/*                  vertical edge when boundary strength is less than 4 in   */
1974/*                  high profile.                                            */
1975/*                                                                           */
1976/*  Inputs        : pu1_src          - pointer to the src sample q0 of U     */
1977/*                  src_strd         - source stride                         */
1978/*                  alpha_cb         - alpha value for the boundary in U     */
1979/*                  beta_cb          - beta value for the boundary in U      */
1980/*                  alpha_cr         - alpha value for the boundary in V     */
1981/*                  beta_cr          - beta value for the boundary in V      */
1982/*                  u4_bs            - packed Boundary strength array        */
1983/*                  pu1_cliptab_cb   - tc0_table for U                       */
1984/*                  pu1_cliptab_cr   - tc0_table for V                       */
1985/*                                                                           */
1986/*  Globals       : None                                                     */
1987/*                                                                           */
1988/*  Processing    : When the function is called twice, this operation is as  */
1989/*                  described in Sec. 8.7.2.4 under the title "Filtering     */
1990/*                  process for edges for bS less than 4" in ITU T Rec H.264 */
1991/*                  with alpha and beta values different in U and V.         */
1992/*                                                                           */
1993/*  Outputs       : None                                                     */
1994/*                                                                           */
1995/*  Returns       : None                                                     */
1996/*                                                                           */
1997/*  Issues        : None                                                     */
1998/*                                                                           */
1999/*  Revision History:                                                        */
2000/*                                                                           */
2001/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
2002/*         29 12 2014   Kaushik         Draft                                */
2003/*                      Senthoor                                             */
2004/*                                                                           */
2005/*****************************************************************************/
2006void ih264_deblk_chroma_vert_bslt4_mbaff(UWORD8 *pu1_src,
2007                                         WORD32 src_strd,
2008                                         WORD32 alpha_cb,
2009                                         WORD32 beta_cb,
2010                                         WORD32 alpha_cr,
2011                                         WORD32 beta_cr,
2012                                         UWORD32 u4_bs,
2013                                         const UWORD8 *pu1_cliptab_cb,
2014                                         const UWORD8 *pu1_cliptab_cr)
2015{
2016    UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/
2017    UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/
2018    UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v;
2019    WORD32 blk_strd = src_strd;
2020    WORD32 pos_p1, pos_p0, pos_q0, pos_q1;
2021    UWORD8 *pu1_src_temp_u, *pu1_src_temp_v;
2022    WORD8 edge;
2023    WORD8 delta;
2024    WORD8 tcb, tcr;
2025    WORD16 val;
2026    UWORD8 tcb0, tcr0, u1_bs;
2027
2028    pos_q0 = 0;
2029    pos_q1 = 2;
2030    pos_p0 = -2;
2031    pos_p1 = -4;
2032
2033    for(edge = 0; edge < 4;
2034                    edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd)
2035    {
2036        pu1_src_temp_u = pu1_src_u;
2037        pu1_src_temp_v = pu1_src_v;
2038        /* Filter Decision */
2039        u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff);
2040        if(!u1_bs)
2041            continue;
2042        /* tc0 */
2043        tcb0 = pu1_cliptab_cb[u1_bs];
2044        tcr0 = pu1_cliptab_cr[u1_bs];
2045        tcb = tcb0 + 1;
2046        tcr = tcr0 + 1;
2047        q0_u = pu1_src_temp_u[pos_q0];
2048        q1_u = pu1_src_temp_u[pos_q1];
2049        p0_u = pu1_src_temp_u[pos_p0];
2050        p1_u = pu1_src_temp_u[pos_p1];
2051
2052        q0_v = pu1_src_temp_v[pos_q0];
2053        q1_v = pu1_src_temp_v[pos_q1];
2054        p0_v = pu1_src_temp_v[pos_p0];
2055        p1_v = pu1_src_temp_v[pos_p1];
2056
2057        /* Filter Decision */
2058        if((ABS(p0_u - q0_u) < alpha_cb) &&
2059           (ABS(q1_u - q0_u) < beta_cb) &&
2060           (ABS(p1_u - p0_u) < beta_cb))
2061        {
2062            val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3);
2063            delta = CLIP3(-tcb, tcb, val);
2064            /* p0' */
2065            val = p0_u + delta;
2066            pu1_src_temp_u[pos_p0] = CLIP_U8(val);
2067            /* q0' */
2068            val = q0_u - delta;
2069            pu1_src_temp_u[pos_q0] = CLIP_U8(val);
2070        }
2071
2072        /* Filter Decision */
2073        if((ABS(p0_v - q0_v) < alpha_cr) &&
2074           (ABS(q1_v - q0_v) < beta_cr) &&
2075           (ABS(p1_v - p0_v) < beta_cr))
2076        {
2077            val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3);
2078            delta = CLIP3(-tcr, tcr, val);
2079            /* p0' */
2080            val = p0_v + delta;
2081            pu1_src_temp_v[pos_p0] = CLIP_U8(val);
2082            /* q0' */
2083            val = q0_v - delta;
2084            pu1_src_temp_v[pos_q0] = CLIP_U8(val);
2085        }
2086    }
2087}
2088