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#include <string.h>
22
23#include "ih264_typedefs.h"
24#include "iv.h"
25#include "ivd.h"
26#include "ih264_macros.h"
27#include "ih264_platform_macros.h"
28#include "ih264d_debug.h"
29#include "ih264d_defs.h"
30#include "ih264d_defs.h"
31#include "ih264d_structs.h"
32#include "ih264d_deblocking.h"
33#include "ih264d_mb_utils.h"
34#include "ih264d_error_handler.h"
35#include "ih264d_utils.h"
36
37
38#include "ih264d_defs.h"
39#include "ih264d_format_conv.h"
40#include "ih264d_deblocking.h"
41#include "ih264d_tables.h"
42
43/*!
44 *************************************************************************
45 * \file ih264d_deblocking.c
46 *
47 * \brief
48 *    Decoder specific deblocking routines
49 *
50 * \author AI
51 *************************************************************************
52 */
53
54/*!
55 **************************************************************************
56 * \if Function name : HorizonPad \endif
57 *
58 * \brief
59 *    Does the Horizontal padding on a whole pic.
60 *
61 * \return
62 *    None
63 **************************************************************************
64 */
65
66/*!
67 **************************************************************************
68 * \if Function name : FilterBoundaryLeft \endif
69 *
70 * \brief
71 *    Filters MacroBlock Left Boundary egdes.
72 *
73 * \return
74 *    None
75 **************************************************************************
76 */
77void ih264d_filter_boundary_left_nonmbaff(dec_struct_t *ps_dec,
78                                          tfr_ctxt_t * ps_tfr_cxt,
79                                          WORD8 i1_cb_qp_idx_ofst,
80                                          WORD8 i1_cr_qp_idx_ofst,
81                                          deblk_mb_t * ps_cur_mb,
82                                          WORD32 i4_strd_y,
83                                          WORD32 i4_strd_uv,
84                                          deblk_mb_t * ps_left_mb,
85                                          UWORD32 pu4_bs_tab[],
86                                          UWORD8 u1_cur_fld)
87{
88    UWORD8 *pu1_y, *pu1_u, *pu1_v;
89    WORD32 uc_tmp, qp_avg;
90    WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
91    WORD32 alpha_y = 0, beta_y = 0;
92
93    WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
94    WORD32 idx_b_y, idx_a_y;
95
96    UWORD32 u4_bs_val;
97
98    UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
99
100    UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
101    WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
102    WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
103
104    PROFILE_DISABLE_DEBLK()
105
106    pu1_y = ps_tfr_cxt->pu1_mb_y;
107    pu1_u = ps_tfr_cxt->pu1_mb_u;
108    pu1_v = ps_tfr_cxt->pu1_mb_v;
109
110    /* LUMA values */
111    /* Deblock rounding change */
112    qp_avg =
113                    (UWORD8)((ps_cur_mb->u1_left_mb_qp + ps_cur_mb->u1_mb_qp + 1)
114                                    >> 1);
115
116    idx_a_y = qp_avg + ofst_a;
117    alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
118    idx_b_y = qp_avg + ofst_b;
119    beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
120
121    /* Chroma cb values */
122    {
123        WORD32 mb_qp1, mb_qp2;
124        mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cb_qp_idx_ofst);
125        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
126        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
127                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
128    }
129    idx_a_u = qp_avg + ofst_a;
130    alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
131    idx_b_u = qp_avg + ofst_b;
132    beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
133    /* Chroma cr values */
134    {
135        WORD32 mb_qp1, mb_qp2;
136        mb_qp1 = (ps_cur_mb->u1_left_mb_qp + i1_cr_qp_idx_ofst);
137        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
138        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
139                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
140    }
141    idx_a_v = qp_avg + ofst_a;
142    alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
143    idx_b_v = qp_avg + ofst_b;
144    beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
145
146    if(u1_double_cl == 0)
147    {
148        u4_bs_val = pu4_bs_tab[4];
149
150        if(0x04040404 == u4_bs_val)
151        {
152            ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
153            ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
154                                             beta_u, alpha_v, beta_v);
155        }
156        else
157        {
158            if(u4_bs_val)
159            {
160
161                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
162                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
163                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
164                ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
165                                                 beta_y, u4_bs_val,
166                                                 pu1_cliptab_y);
167                ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
168                                                   beta_u, alpha_v, beta_v,
169                                                   u4_bs_val, pu1_cliptab_u,
170                                                   pu1_cliptab_v);
171
172            }
173        }
174
175    }
176    else
177    {
178
179        i4_strd_y <<= (!u1_cur_fld);
180        u4_bs_val = pu4_bs_tab[4];
181        i4_strd_uv <<= (!u1_cur_fld);
182
183        if(0x04040404 == u4_bs_val)
184        {
185
186            ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
187                                                 beta_y);
188            ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
189                                                   beta_u, alpha_v, beta_v);
190
191        }
192        else
193        {
194            if(u4_bs_val)
195            {
196
197                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
198                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
199                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
200
201                ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
202                                                       alpha_y, beta_y,
203                                                       u4_bs_val,
204                                                       pu1_cliptab_y);
205                ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
206                                                         alpha_u, beta_u,
207                                                         alpha_v, beta_v,
208                                                         u4_bs_val,
209                                                         pu1_cliptab_u,
210                                                         pu1_cliptab_v);
211            }
212        }
213
214        {
215
216            UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
217            pu1_y += u2_shift;
218            u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
219            pu1_u += u2_shift;
220            pu1_v += u2_shift;
221        }
222
223        qp_avg = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
224
225        idx_a_y = qp_avg + ofst_a;
226        alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
227        idx_b_y = qp_avg + ofst_b;
228        beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
229        u4_bs_val = pu4_bs_tab[9];
230
231        {
232            WORD32 mb_qp1, mb_qp2;
233            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
234            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
235            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
236                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
237        }
238        idx_a_u = qp_avg + ofst_a;
239        alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
240        idx_b_u = qp_avg + ofst_b;
241        beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
242        u4_bs_val = pu4_bs_tab[9];
243        {
244            WORD32 mb_qp1, mb_qp2;
245            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
246            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
247            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
248                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
249        }
250        idx_a_v = qp_avg + ofst_a;
251        alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
252        idx_b_v = qp_avg + ofst_b;
253        beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
254
255        if(0x04040404 == u4_bs_val)
256        {
257            ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
258                                                 beta_y);
259            ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
260                                                   beta_u, alpha_v, beta_v);
261
262        }
263        else
264        {
265            if(u4_bs_val)
266            {
267
268                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
269                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
270                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
271
272                ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
273                                                       alpha_y, beta_y,
274                                                       u4_bs_val,
275                                                       pu1_cliptab_y);
276                ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
277                                                         alpha_u, beta_u,
278                                                         alpha_v, beta_v,
279                                                         u4_bs_val,
280                                                         pu1_cliptab_u,
281                                                         pu1_cliptab_v);
282
283            }
284        }
285    }
286
287}
288
289/*!
290 **************************************************************************
291 * \if Function name : FilterBoundaryTop \endif
292 *
293 * \brief
294 *    Filters MacroBlock Top Boundary egdes.
295 *
296 * \return
297 *    None
298 **************************************************************************
299 */
300
301void ih264d_filter_boundary_top_nonmbaff(dec_struct_t *ps_dec,
302                                         tfr_ctxt_t * ps_tfr_cxt,
303                                         WORD8 i1_cb_qp_idx_ofst,
304                                         WORD8 i1_cr_qp_idx_ofst,
305                                         deblk_mb_t * ps_cur_mb,
306                                         WORD32 i4_strd_y,
307                                         WORD32 i4_strd_uv,
308                                         deblk_mb_t * ps_top_mb,
309                                         UWORD32 u4_bs)
310{
311    UWORD8 *pu1_y, *pu1_u;
312    WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
313    WORD32 alpha_y = 0, beta_y = 0;
314    WORD32 qp_avg;
315    WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
316    WORD32 idx_b_y, idx_a_y;
317    UWORD16 uc_tmp;
318
319    UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
320    WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
321    WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
322
323    UNUSED(ps_top_mb);
324    /* LUMA values */
325    /* Deblock rounding change */
326    uc_tmp = ((ps_cur_mb->u1_topmb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
327    qp_avg = (UWORD8)uc_tmp;
328    idx_a_y = qp_avg + ofst_a;
329    alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
330    idx_b_y = qp_avg + ofst_b;
331    beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
332    pu1_y = ps_tfr_cxt->pu1_mb_y;
333
334    /* CHROMA cb values */
335    {
336        WORD32 mb_qp1, mb_qp2;
337        mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cb_qp_idx_ofst);
338        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
339        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
340                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
341    }
342
343    idx_a_u = qp_avg + ofst_a;
344    alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
345    idx_b_u = qp_avg + ofst_b;
346    beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
347    /* CHROMA cr values */
348    {
349        WORD32 mb_qp1, mb_qp2;
350        mb_qp1 = (ps_cur_mb->u1_topmb_qp + i1_cr_qp_idx_ofst);
351        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
352        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
353                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
354    }
355
356    idx_a_v = qp_avg + ofst_a;
357    alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
358    idx_b_v = qp_avg + ofst_b;
359    beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
360    pu1_u = ps_tfr_cxt->pu1_mb_u;
361
362    if(u4_bs == 0x04040404)
363    {
364        /* Code specific to the assembly module */
365
366        ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
367        ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
368                                         alpha_v, beta_v);
369    }
370    else
371    {
372        if(u4_bs)
373        {
374
375            pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
376            pu1_cliptab_u =
377                            (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
378            pu1_cliptab_v =
379                            (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
380
381            ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
382                                             u4_bs, pu1_cliptab_y);
383            ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
384                                               beta_u, alpha_v, beta_v,
385                                               u4_bs, pu1_cliptab_u,
386                                               pu1_cliptab_v);
387
388        }
389    }
390
391}
392
393void ih264d_deblock_mb_nonmbaff(dec_struct_t *ps_dec,
394                                tfr_ctxt_t * ps_tfr_cxt,
395                                WORD8 i1_cb_qp_idx_ofst,
396                                WORD8 i1_cr_qp_idx_ofst,
397                                WORD32 i4_strd_y,
398                                WORD32 i4_strd_uv )
399{
400    UWORD8 *pu1_y, *pu1_u;
401    UWORD32 u4_bs;
402
403    WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
404
405    UWORD8 *pu1_cliptab_u;
406    UWORD8 *pu1_cliptab_v;
407    UWORD8 *pu1_cliptab_y;
408
409    UWORD32 * pu4_bs_tab;
410    WORD32 idx_a_y, idx_a_u, idx_a_v;
411    UWORD32 u4_deb_mode, u4_mbs_next;
412    UWORD32 u4_image_wd_mb;
413    deblk_mb_t *ps_top_mb,*ps_left_mb,*ps_cur_mb;
414
415    PROFILE_DISABLE_DEBLK()
416    /* Return from here to switch off deblocking */
417
418    u4_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
419
420    ps_cur_mb = ps_dec->ps_cur_deblk_mb;
421    pu4_bs_tab = ps_cur_mb->u4_bs_table;
422    u4_deb_mode = ps_cur_mb->u1_deblocking_mode;
423     if(!(u4_deb_mode & MB_DISABLE_FILTERING))
424     {
425
426         if(ps_dec->u4_deblk_mb_x)
427         {
428             ps_left_mb = ps_cur_mb - 1;
429
430         }
431         else
432         {
433             ps_left_mb = NULL;
434
435         }
436         if(ps_dec->u4_deblk_mb_y != 0)
437         {
438             ps_top_mb = ps_cur_mb - (u4_image_wd_mb);
439         }
440         else
441         {
442             ps_top_mb = NULL;
443         }
444
445         if(u4_deb_mode & MB_DISABLE_LEFT_EDGE)
446             ps_left_mb = NULL;
447         if(u4_deb_mode & MB_DISABLE_TOP_EDGE)
448             ps_top_mb = NULL;
449
450        /*---------------------------------------------------------------------*/
451        /* Filter wrt Left edge                                                */
452        /* except                                                              */
453        /*      - Left Egde is Picture Boundary                                */
454        /*      - Left Egde is part of Slice Boundary and Deblocking           */
455        /*        parameters of slice disable Filtering of Slice Boundary Edges*/
456        /*---------------------------------------------------------------------*/
457        if(ps_left_mb)
458            ih264d_filter_boundary_left_nonmbaff(ps_dec, ps_tfr_cxt,
459                                                 i1_cb_qp_idx_ofst,
460                                                 i1_cr_qp_idx_ofst, ps_cur_mb,
461                                                 i4_strd_y, i4_strd_uv, ps_left_mb,
462                                                 pu4_bs_tab, 0);
463
464        /*--------------------------------------------------------------------*/
465        /* Filter wrt Other Vertical Edges                                    */
466        /*--------------------------------------------------------------------*/
467        {
468            WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
469                            idx_b_v;
470            WORD32 qp_avg, qp_avg_u, qp_avg_v;
471            ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
472            ofst_b = ps_cur_mb->i1_slice_beta_offset;
473
474            qp_avg = ps_cur_mb->u1_mb_qp;
475
476            idx_a_y = qp_avg + ofst_a;
477            alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
478            idx_b_y = qp_avg + ofst_b;
479            beta = gau1_ih264d_beta_table[12 + idx_b_y];
480
481            /* CHROMA values */
482            /* CHROMA Cb values */
483            qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
484            qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
485            idx_a_u = qp_avg_u + ofst_a;
486            alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
487            idx_b_u = qp_avg_u + ofst_b;
488            beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
489            /* CHROMA Cr values */
490            qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
491            qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
492            idx_a_v = qp_avg_v + ofst_a;
493            alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
494            idx_b_v = qp_avg_v + ofst_b;
495            beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
496        }
497
498        pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
499        pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
500        pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
501
502        //edge=1
503
504
505        u4_bs = pu4_bs_tab[5];
506        pu1_y = ps_tfr_cxt->pu1_mb_y;
507        pu1_u = ps_tfr_cxt->pu1_mb_u;
508
509        if(u4_bs)
510        {
511
512            ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
513                                             u4_bs, pu1_cliptab_y);
514
515        }
516        //edge=2
517
518        u4_bs = pu4_bs_tab[6];
519        if(u4_bs)
520        {
521            ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
522                                             u4_bs, pu1_cliptab_y);
523            ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
524                                               i4_strd_uv, alpha_u, beta_u,
525                                               alpha_v, beta_v, u4_bs,
526                                               pu1_cliptab_u, pu1_cliptab_v);
527
528        }
529        //edge=3
530
531        u4_bs = pu4_bs_tab[7];
532        if(u4_bs)
533        {
534            ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
535                                             u4_bs, pu1_cliptab_y);
536
537        }
538
539        /*--------------------------------------------------------------------*/
540        /* Filter wrt Top edge                                                */
541        /* except                                                             */
542        /*      - Top Egde is Picture Boundary                                */
543        /*      - Top Egde is part of Slice Boundary and Deblocking           */
544        /*        parameters of slice disable Filtering of Slice Boundary Edges*/
545        /*--------------------------------------------------------------------*/
546        if(ps_top_mb)
547        {
548            /** if top MB and MB AFF and cur MB is frame and top is field then  */
549            /*  one extra top edge needs to be deblocked                        */
550
551            ih264d_filter_boundary_top_nonmbaff(ps_dec, ps_tfr_cxt,
552                                                i1_cb_qp_idx_ofst,
553                                                i1_cr_qp_idx_ofst, ps_cur_mb,
554                                                i4_strd_y, i4_strd_uv, ps_top_mb,
555                                                pu4_bs_tab[0]);
556
557        }
558
559        /*--------------------------------------------------------------------*/
560        /* Filter wrt Other Horizontal Edges                                  */
561        /*--------------------------------------------------------------------*/
562
563        //edge1
564        u4_bs = pu4_bs_tab[1];
565
566        if(u4_bs)
567        {
568            ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
569                                             alpha, beta, u4_bs, pu1_cliptab_y);
570
571        }
572        //edge2
573        u4_bs = pu4_bs_tab[2];
574
575        if(u4_bs)
576        {
577
578            ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
579                                             alpha, beta, u4_bs, pu1_cliptab_y);
580            ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
581                                               i4_strd_uv, alpha_u, beta_u,
582                                               alpha_v, beta_v, u4_bs,
583                                               pu1_cliptab_u, pu1_cliptab_v);
584
585        }
586        //edge3
587        u4_bs = pu4_bs_tab[3];
588        if(u4_bs)
589        {
590            ps_dec->pf_deblk_luma_horz_bslt4(
591                            (pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
592                            i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
593
594        }
595     }
596
597     ps_dec->u4_deblk_mb_x++;
598     ps_dec->ps_cur_deblk_mb++;
599     ps_dec->u4_cur_deblk_mb_num++;
600     u4_mbs_next = u4_image_wd_mb - ps_dec->u4_deblk_mb_x;
601
602     ps_tfr_cxt->pu1_mb_y += 16;
603     ps_tfr_cxt->pu1_mb_u += 8 * YUV420SP_FACTOR;
604     ps_tfr_cxt->pu1_mb_v += 8;
605
606     if(!u4_mbs_next)
607     {
608         ps_tfr_cxt->pu1_mb_y += ps_tfr_cxt->u4_y_inc;
609         ps_tfr_cxt->pu1_mb_u += ps_tfr_cxt->u4_uv_inc;
610         ps_tfr_cxt->pu1_mb_v += ps_tfr_cxt->u4_uv_inc;
611         ps_dec->u4_deblk_mb_y++;
612         ps_dec->u4_deblk_mb_x = 0;
613     }
614
615}
616
617/**************************************************************************
618 *
619 *  Function Name : ih264d_init_deblk_tfr_ctxt
620 *
621 *  Description   : This function is called once per deblockpicture call
622 *                  This sets up the transfer address contexts
623 *
624 *  Revision History:
625 *
626 *         DD MM YYYY   Author(s)       Changes (Describe the changes made)
627 *         14 06 2005   SWRN            Draft
628 **************************************************************************/
629void ih264d_init_deblk_tfr_ctxt(dec_struct_t * ps_dec,
630                                pad_mgr_t *ps_pad_mgr,
631                                tfr_ctxt_t *ps_tfr_cxt,
632                                UWORD16 u2_image_wd_mb,
633                                UWORD8 u1_mbaff)
634{
635
636    UWORD32 i4_wd_y;
637    UWORD32 i4_wd_uv;
638    UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag  */
639    UNUSED(u2_image_wd_mb);
640    ps_tfr_cxt->pu1_src_y = ps_dec->s_cur_pic.pu1_buf1 - 4;
641    ps_tfr_cxt->pu1_src_u = ps_dec->s_cur_pic.pu1_buf2 - 4;
642    ps_tfr_cxt->pu1_src_v = ps_dec->s_cur_pic.pu1_buf3 - 4;
643    ps_tfr_cxt->pu1_dest_y = ps_tfr_cxt->pu1_src_y;
644    ps_tfr_cxt->pu1_dest_u = ps_tfr_cxt->pu1_src_u;
645    ps_tfr_cxt->pu1_dest_v = ps_tfr_cxt->pu1_src_v;
646
647    ps_tfr_cxt->pu1_mb_y = ps_tfr_cxt->pu1_src_y + 4;
648    ps_tfr_cxt->pu1_mb_u = ps_tfr_cxt->pu1_src_u + 4;
649    ps_tfr_cxt->pu1_mb_v = ps_tfr_cxt->pu1_src_v + 4;
650
651    i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
652    i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
653    ps_tfr_cxt->u4_y_inc = ((i4_wd_y << u1_mbaff) * 16
654                    - (ps_dec->u2_frm_wd_in_mbs << 4));
655
656    ps_tfr_cxt->u4_uv_inc = (i4_wd_uv << u1_mbaff) * 8
657                    - (ps_dec->u2_frm_wd_in_mbs << 4);
658
659    /* padding related initialisations */
660    if(ps_dec->ps_cur_slice->u1_nal_ref_idc)
661    {
662        ps_pad_mgr->u1_vert_pad_top = !(ps_dec->ps_cur_slice->u1_field_pic_flag
663                        && ps_dec->ps_cur_slice->u1_bottom_field_flag);
664        ps_pad_mgr->u1_vert_pad_bot =
665                        ((!ps_dec->ps_cur_slice->u1_field_pic_flag)
666                                        || ps_dec->ps_cur_slice->u1_bottom_field_flag);
667        ps_pad_mgr->u1_horz_pad = 1;
668    }
669    else
670    {
671        ps_pad_mgr->u1_horz_pad = 0;
672        ps_pad_mgr->u1_vert_pad_top = 0;
673        ps_pad_mgr->u1_vert_pad_bot = 0;
674    }
675}
676
677/*****************************************************************************/
678/*                                                                           */
679/*  Function Name : ih264d_deblock_picture_mbaff                                     */
680/*                                                                           */
681/*  Description   : This function carries out deblocking on a whole picture  */
682/*                  with MBAFF                                               */
683/*                                                                           */
684/*  Inputs        : <What inputs does the function take?>                    */
685/*  Processing    : This functions calls deblock MB in the MB increment order*/
686/*                                                                           */
687/*  Outputs       : Produces the deblocked picture                           */
688/*  Returns       : None                                                     */
689/*                                                                           */
690/*  Revision History:                                                        */
691/*                                                                           */
692/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
693/*         17 02 2005   NS              Creation                             */
694/*         14 06 2005   SWRN            clean-up                             */
695/*****************************************************************************/
696
697void ih264d_deblock_picture_mbaff(dec_struct_t * ps_dec)
698{
699    WORD16 i2_mb_x, i2_mb_y;
700    deblk_mb_t *ps_cur_mb;
701    deblk_mb_t *ps_top_mb;
702    deblk_mb_t *ps_left_mb;
703
704    UWORD8 u1_vert_pad_top = 1;
705    UWORD8 u1_cur_fld, u1_top_fld, u1_left_fld;
706    UWORD8 u1_first_row;
707
708    UWORD8 * pu1_deb_y, *pu1_deb_u, *pu1_deb_v;
709    UWORD8 u1_deb_mode, u1_extra_top_edge;
710    WORD32 i4_wd_y, i4_wd_uv;
711
712    UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag                       */
713    UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag*/
714
715    /**************************************************/
716    /* one time loads from ps_dec which will be used  */
717    /* frequently throughout the deblocking procedure */
718    /**************************************************/
719    pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
720    tfr_ctxt_t s_tfr_ctxt;
721    tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt;
722
723    UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
724    UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
725    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
726    WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
727    WORD8 i1_cr_qp_idx_ofst =
728                    ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
729
730    /* Set up Parameter for  DMA transfer */
731    ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
732                               u1_mbaff);
733
734    /* Pic level Initialisations */
735    i2_mb_y = u2_image_ht_mb;
736    i2_mb_x = 0;
737    u1_extra_top_edge = 0;
738
739    u1_first_row = 1;
740
741    i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
742    i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
743    /* Initial filling of the buffers with deblocking data */
744
745    pu1_deb_y = ps_tfr_cxt->pu1_mb_y;
746    pu1_deb_u = ps_tfr_cxt->pu1_mb_u;
747    pu1_deb_v = ps_tfr_cxt->pu1_mb_v;
748    ps_cur_mb = ps_dec->ps_deblk_pic;
749
750    if(ps_dec->u4_app_disable_deblk_frm == 0)
751    {
752        {
753
754            while(i2_mb_y > 0)
755            {
756                do
757                {
758
759                    u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
760                    if(!(u1_deb_mode & MB_DISABLE_FILTERING))
761                    {
762                        ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
763                        ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
764                        ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
765
766                        u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
767                        u1_cur_fld &= 1;
768                        if(i2_mb_x)
769                        {
770                            ps_left_mb = ps_cur_mb - 2;
771                        }
772                        else
773                        {
774                            ps_left_mb = NULL;
775                        }
776                        if(!u1_first_row)
777                        {
778                            ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1) + 1;
779                            u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
780                                            >> 7;
781                        }
782                        else
783                        {
784                            ps_top_mb = NULL;
785                            u1_top_fld = 0;
786                        }
787
788                        if((!u1_first_row) & u1_top_fld & u1_cur_fld)
789                            ps_top_mb--;
790
791                        /********************************************************/
792                        /* if top MB and MB AFF and cur MB is frame and top is  */
793                        /* field, then one extra top edge needs to be deblocked */
794                        /********************************************************/
795                        u1_extra_top_edge = (!u1_cur_fld) & u1_top_fld;
796
797                        if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
798                            ps_left_mb = NULL;
799                        if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
800                            ps_top_mb = NULL;
801
802                        ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
803                                                i1_cb_qp_idx_ofst,
804                                                i1_cr_qp_idx_ofst, ps_cur_mb,
805                                                i4_wd_y, i4_wd_uv, ps_top_mb,
806                                                ps_left_mb, u1_cur_fld,
807                                                u1_extra_top_edge);
808                    }
809
810                    ps_cur_mb++;
811
812                    u1_deb_mode = ps_cur_mb->u1_deblocking_mode;
813                    if(!(u1_deb_mode & MB_DISABLE_FILTERING))
814                    {
815                        ps_tfr_cxt->pu1_mb_y = pu1_deb_y;
816                        ps_tfr_cxt->pu1_mb_u = pu1_deb_u;
817                        ps_tfr_cxt->pu1_mb_v = pu1_deb_v;
818
819                        u1_cur_fld = (ps_cur_mb->u1_mb_type & D_FLD_MB) >> 7;
820                        u1_cur_fld &= 1;
821                        if(i2_mb_x)
822                        {
823                            ps_left_mb = ps_cur_mb - 2;
824                            u1_left_fld = (ps_left_mb->u1_mb_type & D_FLD_MB)
825                                            >> 7;
826                        }
827                        else
828                        {
829                            ps_left_mb = NULL;
830                            u1_left_fld = u1_cur_fld;
831                        }
832                        if(!u1_first_row)
833                        {
834                            ps_top_mb = ps_cur_mb - (u2_image_wd_mb << 1);
835                        }
836                        else
837                        {
838                            ps_top_mb = NULL;
839                        }
840
841                        {
842                            UWORD8 u1_row_shift_y = 0, u1_row_shift_uv = 0;
843                            if(!u1_cur_fld)
844                            {
845                                ps_top_mb = ps_cur_mb - 1;
846                                u1_top_fld = (ps_top_mb->u1_mb_type & D_FLD_MB)
847                                                >> 7;
848                                u1_row_shift_y = 4;
849                                u1_row_shift_uv = 3;
850                            }
851                            ps_tfr_cxt->pu1_mb_y += i4_wd_y << u1_row_shift_y;
852                            ps_tfr_cxt->pu1_mb_u +=
853                                            (i4_wd_uv << u1_row_shift_uv);
854                            ps_tfr_cxt->pu1_mb_v += i4_wd_uv << u1_row_shift_uv;
855                        }
856
857                        /* point to A if top else A+1 */
858                        if(u1_left_fld ^ u1_cur_fld)
859                            ps_left_mb--;
860
861                        /********************************************************/
862                        /* if top MB and MB AFF and cur MB is frame and top is  */
863                        /* field, then one extra top edge needs to be deblocked */
864                        /********************************************************/
865                        u1_extra_top_edge = 0;
866
867                        if(u1_deb_mode & MB_DISABLE_LEFT_EDGE)
868                            ps_left_mb = NULL;
869                        if(u1_deb_mode & MB_DISABLE_TOP_EDGE)
870                            ps_top_mb = NULL;
871
872                        ih264d_deblock_mb_mbaff(ps_dec, ps_tfr_cxt,
873                                                i1_cb_qp_idx_ofst,
874                                                i1_cr_qp_idx_ofst, ps_cur_mb,
875                                                i4_wd_y, i4_wd_uv, ps_top_mb,
876                                                ps_left_mb, u1_cur_fld,
877                                                u1_extra_top_edge);
878                    }
879
880                    ps_cur_mb++;
881                    i2_mb_x++;
882
883                    pu1_deb_y += 16;
884                    pu1_deb_u += 8 * YUV420SP_FACTOR;
885                    pu1_deb_v += 8;
886
887                }
888                while(u2_image_wd_mb > i2_mb_x);
889
890                pu1_deb_y += ps_tfr_cxt->u4_y_inc;
891                pu1_deb_u += ps_tfr_cxt->u4_uv_inc;
892                pu1_deb_v += ps_tfr_cxt->u4_uv_inc;
893
894                i2_mb_x = 0;
895                i2_mb_y -= 2;
896
897                u1_first_row = 0;
898
899            }
900        }
901
902    }
903    //Padd the Picture
904    //Horizontal Padd
905
906    if(ps_pad_mgr->u1_horz_pad)
907    {
908        UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
909        ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
910                                 ps_dec->u2_frm_wd_y << u1_field_pic_flag,
911                                 ps_dec->u2_pic_ht >> u1_field_pic_flag,
912                                 PAD_LEN_Y_H);
913        ps_dec->pf_pad_right_luma(
914                        ps_tfr_cxt->pu1_src_y + 4
915                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
916                        ps_dec->u2_frm_wd_y << u1_field_pic_flag,
917                        ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
918
919        ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
920                                   ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
921                                   (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
922                                   PAD_LEN_UV_H * YUV420SP_FACTOR);
923        ps_dec->pf_pad_right_chroma(
924                        ps_tfr_cxt->pu1_src_u + 4
925                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
926                        ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
927                        (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
928                        PAD_LEN_UV_H * YUV420SP_FACTOR);
929
930    }
931
932//Vertical Padd Top
933    if(ps_pad_mgr->u1_vert_pad_top)
934    {
935        ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
936                           ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
937                           ps_pad_mgr->u1_pad_len_y_v);
938        ps_dec->pf_pad_top(
939                        ps_dec->ps_cur_pic->pu1_buf2
940                                        - PAD_LEN_UV_H * YUV420SP_FACTOR,
941                        ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
942                        ps_pad_mgr->u1_pad_len_cr_v);
943        ps_pad_mgr->u1_vert_pad_top = 0;
944    }
945
946//Vertical Padd Bottom
947    if(ps_pad_mgr->u1_vert_pad_bot)
948    {
949
950        UWORD8 *pu1_buf;
951        pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
952        pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
953        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
954                              ps_pad_mgr->u1_pad_len_y_v);
955        pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
956        pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
957
958        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
959                              ps_dec->u2_frm_wd_uv,
960                              ps_pad_mgr->u1_pad_len_cr_v);
961
962    }
963}
964
965/*****************************************************************************/
966/*                                                                           */
967/*  Function Name : ih264d_deblock_picture_non_mbaff                                  */
968/*                                                                           */
969/*  Description   : This function carries out deblocking on a whole picture  */
970/*                  without MBAFF                                            */
971/*                                                                           */
972/*  Inputs        : <What inputs does the function take?>                    */
973/*  Processing    : This functions calls deblock MB in the MB increment order*/
974/*                                                                           */
975/*  Outputs       : Produces the deblocked picture                           */
976/*  Returns       : None                                                     */
977/*                                                                           */
978/*  Revision History:                                                        */
979/*                                                                           */
980/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
981/*         17 02 2005   NS              Creation                             */
982/*         14 06 2005   SWRN            clean-up                             */
983/*****************************************************************************/
984
985void ih264d_deblock_picture_non_mbaff(dec_struct_t * ps_dec)
986{
987    deblk_mb_t *ps_cur_mb;
988
989    UWORD8 u1_vert_pad_top = 1;
990
991    UWORD8 u1_deb_mode;
992    WORD32 i4_wd_y, i4_wd_uv;
993
994    UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; /*< Field u4_flag                       */
995    UWORD8 u1_bottom_field_flag = ps_dec->ps_cur_slice->u1_bottom_field_flag; /*< Bottom field u4_flag */
996
997    /**************************************************/
998    /* one time loads from ps_dec which will be used  */
999    /* frequently throughout the deblocking procedure */
1000    /**************************************************/
1001    pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
1002    tfr_ctxt_t s_tfr_ctxt;
1003    tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
1004
1005    UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
1006    UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
1007    WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1008    WORD8 i1_cr_qp_idx_ofst =
1009                    ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1010
1011    /* Set up Parameter for  DMA transfer */
1012    ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
1013                               0);
1014
1015    /* Pic level Initialisations */
1016
1017
1018
1019    i4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
1020    i4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
1021    /* Initial filling of the buffers with deblocking data */
1022
1023    ps_cur_mb = ps_dec->ps_deblk_pic;
1024
1025    if(ps_dec->u4_app_disable_deblk_frm == 0)
1026    {
1027        if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
1028        {
1029            while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
1030            {
1031                ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
1032                                           i1_cb_qp_idx_ofst,
1033                                           i1_cr_qp_idx_ofst,
1034                                           i4_wd_y, i4_wd_uv);
1035                ps_cur_mb++;
1036            }
1037        }
1038
1039    }
1040
1041    //Padd the Picture
1042    //Horizontal Padd
1043    if(ps_pad_mgr->u1_horz_pad)
1044    {
1045        UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1046        ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
1047                                 ps_dec->u2_frm_wd_y << u1_field_pic_flag,
1048                                 ps_dec->u2_pic_ht >> u1_field_pic_flag,
1049                                 PAD_LEN_Y_H);
1050        ps_dec->pf_pad_right_luma(
1051                        ps_tfr_cxt->pu1_src_y + 4
1052                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
1053                        ps_dec->u2_frm_wd_y << u1_field_pic_flag,
1054                        ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
1055
1056        ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
1057                                   ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
1058                                   (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
1059                                   PAD_LEN_UV_H * YUV420SP_FACTOR);
1060        ps_dec->pf_pad_right_chroma(
1061                        ps_tfr_cxt->pu1_src_u + 4
1062                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
1063                        ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
1064                        (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
1065                        PAD_LEN_UV_H * YUV420SP_FACTOR);
1066
1067    }
1068
1069//Vertical Padd Top
1070    if(ps_pad_mgr->u1_vert_pad_top)
1071    {
1072        ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
1073                           ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
1074                           ps_pad_mgr->u1_pad_len_y_v);
1075        ps_dec->pf_pad_top(
1076                        ps_dec->ps_cur_pic->pu1_buf2
1077                                        - PAD_LEN_UV_H * YUV420SP_FACTOR,
1078                        ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
1079                        ps_pad_mgr->u1_pad_len_cr_v);
1080        ps_pad_mgr->u1_vert_pad_top = 0;
1081    }
1082
1083//Vertical Padd Bottom
1084    if(ps_pad_mgr->u1_vert_pad_bot)
1085    {
1086
1087        UWORD8 *pu1_buf;
1088        pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
1089        pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
1090        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
1091                              ps_pad_mgr->u1_pad_len_y_v);
1092        pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
1093        pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
1094
1095        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
1096                              ps_dec->u2_frm_wd_uv,
1097                              ps_pad_mgr->u1_pad_len_cr_v);
1098
1099    }
1100}
1101
1102void ih264d_deblock_picture_progressive(dec_struct_t * ps_dec)
1103{
1104    deblk_mb_t *ps_cur_mb;
1105
1106    UWORD8 u1_vert_pad_top = 1;
1107    UWORD8 u1_mbs_next;
1108    UWORD8 u1_deb_mode;
1109    WORD32 i4_wd_y, i4_wd_uv;
1110
1111
1112    /**************************************************/
1113    /* one time loads from ps_dec which will be used  */
1114    /* frequently throughout the deblocking procedure */
1115    /**************************************************/
1116    pad_mgr_t * ps_pad_mgr = &ps_dec->s_pad_mgr;
1117
1118    tfr_ctxt_t s_tfr_ctxt;
1119    tfr_ctxt_t * ps_tfr_cxt = &s_tfr_ctxt; // = &ps_dec->s_tran_addrecon;
1120    UWORD16 u2_image_wd_mb = ps_dec->u2_frm_wd_in_mbs;
1121    UWORD16 u2_image_ht_mb = ps_dec->u2_frm_ht_in_mbs;
1122    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1123
1124    WORD8 i1_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1125    WORD8 i1_cr_qp_idx_ofst =
1126                    ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1127
1128    /* Set up Parameter for  deblocking */
1129    ih264d_init_deblk_tfr_ctxt(ps_dec, ps_pad_mgr, ps_tfr_cxt, u2_image_wd_mb,
1130                               0);
1131
1132    /* Pic level Initialisations */
1133
1134    i4_wd_y = ps_dec->u2_frm_wd_y;
1135    i4_wd_uv = ps_dec->u2_frm_wd_uv;
1136    /* Initial filling of the buffers with deblocking data */
1137    ps_cur_mb = ps_dec->ps_deblk_pic;
1138
1139    if(ps_dec->u4_app_disable_deblk_frm == 0)
1140    {
1141        if(ps_dec->ps_cur_sps->u1_mb_aff_flag == 1)
1142        {
1143            while( ps_dec->u4_deblk_mb_y < u2_image_ht_mb)
1144            {
1145                ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt,
1146                                           i1_cb_qp_idx_ofst,
1147                                           i1_cr_qp_idx_ofst,
1148                                           i4_wd_y, i4_wd_uv);
1149                ps_cur_mb++;
1150            }
1151        }
1152
1153    }
1154
1155    //Padd the Picture
1156    //Horizontal Padd
1157    if(ps_pad_mgr->u1_horz_pad)
1158    {
1159        UWORD32 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1160        ps_dec->pf_pad_left_luma(ps_tfr_cxt->pu1_src_y + 4,
1161                                 ps_dec->u2_frm_wd_y << u1_field_pic_flag,
1162                                 ps_dec->u2_pic_ht >> u1_field_pic_flag,
1163                                 PAD_LEN_Y_H);
1164        ps_dec->pf_pad_right_luma(
1165                        ps_tfr_cxt->pu1_src_y + 4
1166                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
1167                        ps_dec->u2_frm_wd_y << u1_field_pic_flag,
1168                        ps_dec->u2_pic_ht >> u1_field_pic_flag, PAD_LEN_Y_H);
1169
1170        ps_dec->pf_pad_left_chroma(ps_tfr_cxt->pu1_src_u + 4,
1171                                   ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
1172                                   (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
1173                                   PAD_LEN_UV_H * YUV420SP_FACTOR);
1174        ps_dec->pf_pad_right_chroma(
1175                        ps_tfr_cxt->pu1_src_u + 4
1176                                        + (ps_dec->u2_frm_wd_in_mbs << 4),
1177                        ps_dec->u2_frm_wd_uv << u1_field_pic_flag,
1178                        (ps_dec->u2_pic_ht / 2) >> u1_field_pic_flag,
1179                        PAD_LEN_UV_H * YUV420SP_FACTOR);
1180
1181    }
1182
1183//Vertical Padd Top
1184    if(ps_pad_mgr->u1_vert_pad_top)
1185    {
1186        ps_dec->pf_pad_top(ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H,
1187                           ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
1188                           ps_pad_mgr->u1_pad_len_y_v);
1189        ps_dec->pf_pad_top(
1190                        ps_dec->ps_cur_pic->pu1_buf2
1191                                        - PAD_LEN_UV_H * YUV420SP_FACTOR,
1192                        ps_dec->u2_frm_wd_uv, ps_dec->u2_frm_wd_uv,
1193                        ps_pad_mgr->u1_pad_len_cr_v);
1194
1195    }
1196
1197//Vertical Padd Bottom
1198    if(ps_pad_mgr->u1_vert_pad_bot)
1199    {
1200
1201        UWORD8 *pu1_buf;
1202        pu1_buf = ps_dec->ps_cur_pic->pu1_buf1 - PAD_LEN_Y_H;
1203        pu1_buf += ps_dec->u2_pic_ht * ps_dec->u2_frm_wd_y;
1204        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_y, ps_dec->u2_frm_wd_y,
1205                              ps_pad_mgr->u1_pad_len_y_v);
1206        pu1_buf = ps_dec->ps_cur_pic->pu1_buf2 - PAD_LEN_UV_H * YUV420SP_FACTOR;
1207        pu1_buf += (ps_dec->u2_pic_ht >> 1) * ps_dec->u2_frm_wd_uv;
1208
1209        ps_dec->pf_pad_bottom(pu1_buf, ps_dec->u2_frm_wd_uv,
1210                              ps_dec->u2_frm_wd_uv,
1211                              ps_pad_mgr->u1_pad_len_cr_v);
1212
1213    }
1214}
1215
1216/*!
1217 **************************************************************************
1218 * \if Function name : ih264d_set_deblocking_parameters \endif
1219 *
1220 * \brief
1221 *    Sets the deblocking parameters of the macroblock
1222 *
1223 * \return
1224 *    0 on Success and Error code otherwise
1225 *
1226 * \note
1227 *   Given the neighbour availablity information, and the deblocking
1228 *   parameters of the slice,this function will set the deblocking
1229 *   mode of the macroblock.
1230 **************************************************************************
1231 */
1232
1233WORD8 ih264d_set_deblocking_parameters(deblk_mb_t * ps_cur_mb,
1234                                       dec_slice_params_t * ps_slice,
1235                                       UWORD8 u1_mb_ngbr_availablity,
1236                                       UWORD8 u1_mb_field_decoding_flag)
1237{
1238    /*------------------------------------------------------------------*/
1239    /* Set the deblocking parameters                                  */
1240    /*------------------------------------------------------------------*/
1241    ps_cur_mb->i1_slice_alpha_c0_offset = ps_slice->i1_slice_alpha_c0_offset;
1242    ps_cur_mb->i1_slice_beta_offset = ps_slice->i1_slice_beta_offset;
1243    ps_cur_mb->u1_mb_type = (u1_mb_field_decoding_flag << 7);
1244
1245    switch(ps_slice->u1_disable_dblk_filter_idc)
1246    {
1247        case DBLK_ENABLED:
1248            ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
1249            break;
1250        case DBLK_DISABLED:
1251            ps_cur_mb->u1_deblocking_mode = MB_DISABLE_FILTERING;
1252            break;
1253        case SLICE_BOUNDARY_DBLK_DISABLED:
1254        {
1255            ps_cur_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
1256            if(!(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK))
1257                ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_LEFT_EDGE;
1258            if(!(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK))
1259                ps_cur_mb->u1_deblocking_mode |= MB_DISABLE_TOP_EDGE;
1260            break;
1261        }
1262    }
1263
1264    return (0);
1265}
1266
1267void ih264d_copy_intra_pred_line(dec_struct_t *ps_dec,
1268                                 dec_mb_info_t *ps_cur_mb_info,
1269                                 UWORD32 nmb_index)
1270{
1271    UWORD8 *pu1_mb_last_row, u1_mb_field_decoding_flag;
1272    UWORD32 u4_recWidth, u4_recwidth_cr;
1273
1274    u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
1275
1276    u4_recWidth = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
1277    u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
1278
1279    pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_y
1280                    + (u4_recWidth * (MB_SIZE - 1));
1281    pu1_mb_last_row += MB_SIZE * nmb_index;
1282    MEMCPY_16BYTES(ps_dec->pu1_cur_y_intra_pred_line, pu1_mb_last_row);
1283
1284    pu1_mb_last_row = ps_dec->ps_frame_buf_ip_recon->pu1_dest_u
1285                    + (u4_recwidth_cr * (BLK8x8SIZE - 1));
1286    pu1_mb_last_row += BLK8x8SIZE * nmb_index * YUV420SP_FACTOR;
1287
1288    MEMCPY_16BYTES(ps_dec->pu1_cur_u_intra_pred_line, pu1_mb_last_row);
1289
1290    ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_cur_y_intra_pred_line_base
1291                    + (MB_SIZE * (ps_cur_mb_info->u2_mbx + 1));
1292    ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_cur_u_intra_pred_line_base
1293                    + (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1))
1294                                    * YUV420SP_FACTOR;
1295    ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_cur_v_intra_pred_line_base
1296                    + (BLK8x8SIZE * (ps_cur_mb_info->u2_mbx + 1));
1297
1298    if(ps_cur_mb_info->u2_mbx == (ps_dec->u2_frm_wd_in_mbs - 1))
1299    {
1300        UWORD8* pu1_temp;
1301
1302        ps_dec->pu1_cur_y_intra_pred_line =
1303                        ps_dec->pu1_cur_y_intra_pred_line_base;
1304        ps_dec->pu1_cur_u_intra_pred_line =
1305                        ps_dec->pu1_cur_u_intra_pred_line_base;
1306        ps_dec->pu1_cur_v_intra_pred_line =
1307                        ps_dec->pu1_cur_v_intra_pred_line_base;
1308
1309        /*swap current and previous rows*/
1310        pu1_temp = ps_dec->pu1_cur_y_intra_pred_line;
1311        ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_prev_y_intra_pred_line;
1312        ps_dec->pu1_prev_y_intra_pred_line = pu1_temp;
1313
1314        pu1_temp = ps_dec->pu1_cur_u_intra_pred_line;
1315        ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_prev_u_intra_pred_line;
1316        ps_dec->pu1_prev_u_intra_pred_line = pu1_temp;
1317
1318        pu1_temp = ps_dec->pu1_cur_v_intra_pred_line;
1319        ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_prev_v_intra_pred_line;
1320        ps_dec->pu1_prev_v_intra_pred_line = pu1_temp;
1321
1322        ps_dec->pu1_cur_y_intra_pred_line_base =
1323                        ps_dec->pu1_cur_y_intra_pred_line;
1324        ps_dec->pu1_cur_u_intra_pred_line_base =
1325                        ps_dec->pu1_cur_u_intra_pred_line;
1326        ps_dec->pu1_cur_v_intra_pred_line_base =
1327                        ps_dec->pu1_cur_v_intra_pred_line;
1328
1329
1330
1331
1332
1333    }
1334
1335}
1336
1337
1338void ih264d_filter_boundary_left_mbaff(dec_struct_t *ps_dec,
1339                                       tfr_ctxt_t * ps_tfr_cxt,
1340                                       WORD8 i1_cb_qp_idx_ofst,
1341                                       WORD8 i1_cr_qp_idx_ofst,
1342                                       deblk_mb_t * ps_cur_mb,
1343                                       WORD32 i4_strd_y,
1344                                       WORD32 i4_strd_uv,
1345                                       deblk_mb_t * ps_left_mb, /* Neighbouring MB parameters   */
1346                                       UWORD32 pu4_bs_tab[], /* pointer to the BsTable array */
1347                                       UWORD8 u1_cur_fld)
1348{
1349    UWORD8 *pu1_y, *pu1_u, *pu1_v;
1350    UWORD8 uc_tmp, qp_avg;
1351    WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
1352    WORD32 alpha_y = 0, beta_y = 0;
1353
1354    WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
1355    WORD32 idx_b_y, idx_a_y;
1356
1357    UWORD32 u4_bs_val;
1358
1359    UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
1360
1361    UWORD8 u1_double_cl = !ps_cur_mb->u1_single_call;
1362    WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
1363    WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
1364
1365    PROFILE_DISABLE_DEBLK()
1366
1367    pu1_y = ps_tfr_cxt->pu1_mb_y;
1368    pu1_u = ps_tfr_cxt->pu1_mb_u;
1369    pu1_v = ps_tfr_cxt->pu1_mb_v;
1370
1371    /* LUMA values */
1372    /* Deblock rounding change */
1373    uc_tmp = (UWORD8)((ps_left_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
1374    qp_avg = uc_tmp;
1375    idx_a_y = qp_avg + ofst_a;
1376    alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
1377    idx_b_y = qp_avg + ofst_b;
1378    beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
1379
1380    /* Chroma cb values */
1381    {
1382        WORD32 mb_qp1, mb_qp2;
1383        mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
1384        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
1385        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1386                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1387    }
1388    idx_a_u = qp_avg + ofst_a;
1389    alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
1390    idx_b_u = qp_avg + ofst_b;
1391    beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
1392
1393    /* Chroma cr values */
1394    {
1395        WORD32 mb_qp1, mb_qp2;
1396        mb_qp1 = (ps_left_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
1397        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
1398        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1399                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1400    }
1401    idx_a_v = qp_avg + ofst_a;
1402    alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
1403    idx_b_v = qp_avg + ofst_b;
1404    beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
1405
1406    if(u1_double_cl == 0)
1407    {
1408        u4_bs_val = pu4_bs_tab[4];
1409
1410        if(0x04040404 == u4_bs_val)
1411        {
1412            ps_dec->pf_deblk_luma_vert_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
1413            ps_dec->pf_deblk_chroma_vert_bs4(pu1_u, i4_strd_uv, alpha_u,
1414                                             beta_u, alpha_v, beta_v);
1415
1416        }
1417        else
1418        {
1419            if(u4_bs_val)
1420            {
1421
1422                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12
1423                                + idx_a_y];
1424                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12
1425                                + idx_a_u];
1426                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12
1427                                + idx_a_v];
1428
1429                ps_dec->pf_deblk_luma_vert_bslt4(pu1_y, i4_strd_y, alpha_y,
1430                                                 beta_y, u4_bs_val,
1431                                                 pu1_cliptab_y);
1432                ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u, i4_strd_uv, alpha_u,
1433                                                   beta_u, alpha_v, beta_v,
1434                                                   u4_bs_val, pu1_cliptab_u,
1435                                                   pu1_cliptab_v);
1436
1437            }
1438        }
1439
1440    }
1441    else
1442    {
1443
1444        i4_strd_y <<= (!u1_cur_fld);
1445        u4_bs_val = pu4_bs_tab[4];
1446        i4_strd_uv <<= (!u1_cur_fld);
1447
1448        if(0x04040404 == u4_bs_val)
1449        {
1450            ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
1451                                                 beta_y);
1452            ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
1453                                                   beta_u, alpha_v, beta_v);
1454        }
1455        else
1456        {
1457            if(u4_bs_val)
1458            {
1459
1460                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
1461                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
1462                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
1463                ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
1464                                                       alpha_y, beta_y,
1465                                                       u4_bs_val,
1466                                                       pu1_cliptab_y);
1467                ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
1468                                                         alpha_u, beta_u,
1469                                                         alpha_v, beta_v,
1470                                                         u4_bs_val,
1471                                                         pu1_cliptab_u,
1472                                                         pu1_cliptab_v);
1473
1474            }
1475        }
1476
1477        {
1478
1479            UWORD16 u2_shift = (i4_strd_y >> 1) << (u1_cur_fld ? 4 : 0);
1480            pu1_y += u2_shift;
1481            u2_shift = (i4_strd_uv >> 1) << (u1_cur_fld ? 3 : 0);
1482            pu1_u += u2_shift;
1483            pu1_v += u2_shift;
1484        }
1485
1486        uc_tmp = (((ps_left_mb + 1)->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
1487        qp_avg = uc_tmp;
1488        idx_a_y = qp_avg + ofst_a;
1489        alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
1490        idx_b_y = qp_avg + ofst_b;
1491        beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
1492        u4_bs_val = pu4_bs_tab[9];
1493
1494        {
1495            WORD32 mb_qp1, mb_qp2;
1496            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cb_qp_idx_ofst);
1497            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
1498            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1499                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1500        }
1501        idx_a_u = qp_avg + ofst_a;
1502        alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
1503        idx_b_u = qp_avg + ofst_b;
1504        beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
1505        u4_bs_val = pu4_bs_tab[9];
1506        {
1507            WORD32 mb_qp1, mb_qp2;
1508            mb_qp1 = ((ps_left_mb + 1)->u1_mb_qp + i1_cr_qp_idx_ofst);
1509            mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
1510            qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1511                            + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1512        }
1513        idx_a_v = qp_avg + ofst_a;
1514        alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
1515        idx_b_v = qp_avg + ofst_b;
1516        beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
1517
1518        if(0x04040404 == u4_bs_val)
1519        {
1520            ps_dec->pf_deblk_luma_vert_bs4_mbaff(pu1_y, i4_strd_y, alpha_y,
1521                                                 beta_y);
1522            ps_dec->pf_deblk_chroma_vert_bs4_mbaff(pu1_u, i4_strd_uv, alpha_u,
1523                                                   beta_u, alpha_v, beta_v);
1524
1525        }
1526        else
1527        {
1528            if(u4_bs_val)
1529            {
1530
1531                pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
1532                pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
1533                pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
1534
1535                ps_dec->pf_deblk_luma_vert_bslt4_mbaff(pu1_y, i4_strd_y,
1536                                                       alpha_y, beta_y,
1537                                                       u4_bs_val,
1538                                                       pu1_cliptab_y);
1539                ps_dec->pf_deblk_chroma_vert_bslt4_mbaff(pu1_u, i4_strd_uv,
1540                                                         alpha_u, beta_u,
1541                                                         alpha_v, beta_v,
1542                                                         u4_bs_val,
1543                                                         pu1_cliptab_u,
1544                                                         pu1_cliptab_v);
1545
1546            }
1547        }
1548    }
1549
1550}
1551
1552void ih264d_filter_boundary_topmbaff(dec_struct_t *ps_dec,
1553                                     tfr_ctxt_t * ps_tfr_cxt,
1554                                     WORD8 i1_cb_qp_idx_ofst,
1555                                     WORD8 i1_cr_qp_idx_ofst,
1556                                     deblk_mb_t * ps_cur_mb,
1557                                     WORD32 i4_strd_y,
1558                                     WORD32 i4_strd_uv,
1559                                     deblk_mb_t * ps_top_mb,
1560                                     UWORD32 u4_bs)
1561{
1562    UWORD8 *pu1_y, *pu1_u;
1563    WORD32 alpha_u = 0, beta_u = 0, alpha_v = 0, beta_v = 0;
1564    WORD32 alpha_y = 0, beta_y = 0;
1565    WORD32 qp_avg;
1566    WORD32 idx_b_u, idx_a_u, idx_b_v, idx_a_v;
1567    WORD32 idx_b_y, idx_a_y;
1568    UWORD16 uc_tmp;
1569
1570    UWORD8 *pu1_cliptab_u, *pu1_cliptab_v, *pu1_cliptab_y;
1571    WORD32 ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
1572    WORD32 ofst_b = ps_cur_mb->i1_slice_beta_offset;
1573
1574    /* LUMA values */
1575    /* Deblock rounding change */
1576    uc_tmp = ((ps_top_mb->u1_mb_qp + ps_cur_mb->u1_mb_qp + 1) >> 1);
1577    qp_avg = (UWORD8)uc_tmp;
1578    idx_a_y = qp_avg + ofst_a;
1579    alpha_y = gau1_ih264d_alpha_table[12 + idx_a_y];
1580    idx_b_y = qp_avg + ofst_b;
1581    beta_y = gau1_ih264d_beta_table[12 + idx_b_y];
1582    pu1_y = ps_tfr_cxt->pu1_mb_y;
1583
1584    /* CHROMA cb values */
1585    {
1586        WORD32 mb_qp1, mb_qp2;
1587        mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
1588        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cb_qp_idx_ofst);
1589        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1590                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1591    }
1592
1593    idx_a_u = qp_avg + ofst_a;
1594    alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
1595    idx_b_u = qp_avg + ofst_b;
1596    beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
1597    /* CHROMA cr values */
1598    {
1599        WORD32 mb_qp1, mb_qp2;
1600        mb_qp1 = (ps_top_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
1601        mb_qp2 = (ps_cur_mb->u1_mb_qp + i1_cr_qp_idx_ofst);
1602        qp_avg = (UWORD8)((gau1_ih264d_qp_scale_cr[12 + mb_qp1]
1603                        + gau1_ih264d_qp_scale_cr[12 + mb_qp2] + 1) >> 1);
1604    }
1605
1606    idx_a_v = qp_avg + ofst_a;
1607    alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
1608    idx_b_v = qp_avg + ofst_b;
1609    beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
1610    pu1_u = ps_tfr_cxt->pu1_mb_u;
1611
1612    if(u4_bs == 0x04040404)
1613    {
1614        /* Code specific to the assembly module */
1615        ps_dec->pf_deblk_luma_horz_bs4(pu1_y, i4_strd_y, alpha_y, beta_y);
1616        ps_dec->pf_deblk_chroma_horz_bs4(pu1_u, i4_strd_uv, alpha_u, beta_u,
1617                                         alpha_v, beta_v);
1618
1619    }
1620    else
1621    {
1622        if(u4_bs)
1623        {
1624
1625            pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y];
1626            pu1_cliptab_u =
1627                            (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u];
1628            pu1_cliptab_v =
1629                            (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v];
1630
1631            ps_dec->pf_deblk_luma_horz_bslt4(pu1_y, i4_strd_y, alpha_y, beta_y,
1632                                             u4_bs, pu1_cliptab_y);
1633            ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u, i4_strd_uv, alpha_u,
1634                                               beta_u, alpha_v, beta_v,
1635                                               u4_bs, pu1_cliptab_u,
1636                                               pu1_cliptab_v);
1637
1638        }
1639    }
1640
1641}
1642
1643void ih264d_deblock_mb_mbaff(dec_struct_t *ps_dec,
1644                             tfr_ctxt_t * ps_tfr_cxt,
1645                             WORD8 i1_cb_qp_idx_ofst,
1646                             WORD8 i1_cr_qp_idx_ofst,
1647                             deblk_mb_t * ps_cur_mb,
1648                             WORD32 i4_strd_y,
1649                             WORD32 i4_strd_uv,
1650                             deblk_mb_t * ps_top_mb,
1651                             deblk_mb_t * ps_left_mb,
1652                             UWORD8 u1_cur_fld,
1653                             UWORD8 u1_extra_top_edge)
1654{
1655    UWORD8 *pu1_y, *pu1_u;
1656    UWORD32 u4_bs;
1657//  WORD8  edge;
1658    WORD32 alpha, beta, alpha_u, beta_u, alpha_v, beta_v;
1659
1660    UWORD8 *pu1_cliptab_u;
1661    UWORD8 *pu1_cliptab_v;
1662    UWORD8 *pu1_cliptab_y;
1663
1664    UWORD32 * pu4_bs_tab = ps_cur_mb->u4_bs_table;
1665    WORD32 idx_a_y, idx_a_u, idx_a_v;
1666    /* Return from here to switch off deblocking */
1667    PROFILE_DISABLE_DEBLK()
1668
1669    i4_strd_y <<= u1_cur_fld;
1670    i4_strd_uv <<= u1_cur_fld;
1671    /*--------------------------------------------------------------------*/
1672    /* Filter wrt Left edge                                               */
1673    /* except                                                             */
1674    /*      - Left Egde is Picture Boundary                               */
1675    /*      - Left Egde is part of Slice Boundary and Deblocking          */
1676    /*        parameters of slice disable Filtering of Slice Boundary Edges*/
1677    /*--------------------------------------------------------------------*/
1678    if(ps_left_mb)
1679        ih264d_filter_boundary_left_mbaff(ps_dec, ps_tfr_cxt, i1_cb_qp_idx_ofst,
1680                                          i1_cr_qp_idx_ofst, ps_cur_mb,
1681                                          i4_strd_y, i4_strd_uv, ps_left_mb,
1682                                          pu4_bs_tab, u1_cur_fld);
1683
1684    /*--------------------------------------------------------------------*/
1685    /* Filter wrt Other Vertical Edges                                    */
1686    /*--------------------------------------------------------------------*/
1687    {
1688        WORD32 ofst_a, ofst_b, idx_b_y, idx_b_u,
1689                        idx_b_v;
1690        WORD32 qp_avg, qp_avg_u, qp_avg_v;
1691        ofst_a = ps_cur_mb->i1_slice_alpha_c0_offset;
1692        ofst_b = ps_cur_mb->i1_slice_beta_offset;
1693        qp_avg = ps_cur_mb->u1_mb_qp;
1694        idx_a_y = qp_avg + ofst_a;
1695        alpha = gau1_ih264d_alpha_table[12 + idx_a_y];
1696        idx_b_y = qp_avg + ofst_b;
1697        beta = gau1_ih264d_beta_table[12 + idx_b_y];
1698
1699        /* CHROMA Cb values */
1700        qp_avg_u = (qp_avg + i1_cb_qp_idx_ofst);
1701        qp_avg_u = gau1_ih264d_qp_scale_cr[12 + qp_avg_u];
1702        idx_a_u = qp_avg_u + ofst_a;
1703        alpha_u = gau1_ih264d_alpha_table[12 + idx_a_u];
1704        idx_b_u = qp_avg_u + ofst_b;
1705        beta_u = gau1_ih264d_beta_table[12 + idx_b_u];
1706        /* CHROMA Cr values */
1707        qp_avg_v = (qp_avg + i1_cr_qp_idx_ofst);
1708        qp_avg_v = gau1_ih264d_qp_scale_cr[12 + qp_avg_v];
1709        idx_a_v = qp_avg_v + ofst_a;
1710        alpha_v = gau1_ih264d_alpha_table[12 + idx_a_v];
1711        idx_b_v = qp_avg_v + ofst_b;
1712        beta_v = gau1_ih264d_beta_table[12 + idx_b_v];
1713    }
1714
1715    //STARTL4_FILTER_VERT;
1716
1717    pu1_cliptab_y = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_y]; //this for Luma
1718    pu1_cliptab_u = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_u]; //this for chroma
1719    pu1_cliptab_v = (UWORD8 *)&gau1_ih264d_clip_table[12 + idx_a_v]; //this for chroma
1720
1721    //edge=1
1722
1723
1724    u4_bs = pu4_bs_tab[5];
1725    pu1_y = ps_tfr_cxt->pu1_mb_y;
1726    pu1_u = ps_tfr_cxt->pu1_mb_u;
1727
1728    if(u4_bs)
1729    {
1730
1731        ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 4, i4_strd_y, alpha, beta,
1732                                         u4_bs, pu1_cliptab_y);
1733
1734    }
1735    //edge=2
1736
1737    u4_bs = pu4_bs_tab[6];
1738    if(u4_bs)
1739    {
1740
1741        ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 8, i4_strd_y, alpha, beta,
1742                                         u4_bs, pu1_cliptab_y);
1743        ps_dec->pf_deblk_chroma_vert_bslt4(pu1_u + 4 * YUV420SP_FACTOR,
1744                                           i4_strd_uv, alpha_u, beta_u,
1745                                           alpha_v, beta_v, u4_bs,
1746                                           pu1_cliptab_u, pu1_cliptab_v);
1747    }
1748    //edge=3
1749
1750    u4_bs = pu4_bs_tab[7];
1751    if(u4_bs)
1752    {
1753
1754        ps_dec->pf_deblk_luma_vert_bslt4(pu1_y + 12, i4_strd_y, alpha, beta,
1755                                         u4_bs, pu1_cliptab_y);
1756
1757    }
1758
1759    /*--------------------------------------------------------------------*/
1760    /* Filter wrt Top edge                                                */
1761    /* except                                                             */
1762    /*      - Top Egde is Picture Boundary                                */
1763    /*      - Top Egde is part of Slice Boundary and Deblocking           */
1764    /*        parameters of slice disable Filtering of Slice Boundary Edges*/
1765    /*--------------------------------------------------------------------*/
1766    if(ps_top_mb)
1767    {
1768        /** if top MB and MB AFF and cur MB is frame and top is field then  */
1769        /*  one extra top edge needs to be deblocked                        */
1770        if(u1_extra_top_edge)
1771        {
1772            ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
1773                                            i1_cb_qp_idx_ofst,
1774                                            i1_cr_qp_idx_ofst, ps_cur_mb,
1775                                            (UWORD16)(i4_strd_y << 1),
1776                                            (UWORD16)(i4_strd_uv << 1),
1777                                            ps_top_mb - 1, pu4_bs_tab[8]);
1778            ps_tfr_cxt->pu1_mb_y += i4_strd_y;
1779            ps_tfr_cxt->pu1_mb_u += i4_strd_uv;
1780            ps_tfr_cxt->pu1_mb_v += i4_strd_uv;
1781
1782            ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
1783                                            i1_cb_qp_idx_ofst,
1784                                            i1_cr_qp_idx_ofst, ps_cur_mb,
1785                                            (UWORD16)(i4_strd_y << 1),
1786                                            (UWORD16)(i4_strd_uv << 1),
1787                                            ps_top_mb, pu4_bs_tab[0]);
1788            ps_tfr_cxt->pu1_mb_y -= i4_strd_y;
1789            ps_tfr_cxt->pu1_mb_u -= i4_strd_uv;
1790            ps_tfr_cxt->pu1_mb_v -= i4_strd_uv;
1791        }
1792        else
1793        {
1794            ih264d_filter_boundary_topmbaff(ps_dec, ps_tfr_cxt,
1795                                            i1_cb_qp_idx_ofst,
1796                                            i1_cr_qp_idx_ofst, ps_cur_mb,
1797                                            i4_strd_y, i4_strd_uv, ps_top_mb,
1798                                            pu4_bs_tab[0]);
1799        }
1800    }
1801
1802    /*--------------------------------------------------------------------*/
1803    /* Filter wrt Other Horizontal Edges                                  */
1804    /*--------------------------------------------------------------------*/
1805
1806    //edge1
1807    u4_bs = pu4_bs_tab[1];
1808
1809    if(u4_bs)
1810    {
1811        ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 2), i4_strd_y,
1812                                         alpha, beta, u4_bs, pu1_cliptab_y);
1813
1814    }
1815    //edge2
1816    u4_bs = pu4_bs_tab[2];
1817
1818    if(u4_bs)
1819    {
1820
1821        ps_dec->pf_deblk_luma_horz_bslt4(pu1_y + (i4_strd_y << 3), i4_strd_y,
1822                                         alpha, beta, u4_bs, pu1_cliptab_y);
1823        ps_dec->pf_deblk_chroma_horz_bslt4(pu1_u + (i4_strd_uv << 2),
1824                                           i4_strd_uv, alpha_u, beta_u,
1825                                           alpha_v, beta_v, u4_bs,
1826                                           pu1_cliptab_u, pu1_cliptab_v);
1827
1828    }
1829    //edge3
1830    u4_bs = pu4_bs_tab[3];
1831    if(u4_bs)
1832    {
1833
1834        ps_dec->pf_deblk_luma_horz_bslt4(
1835                        (pu1_y + (i4_strd_y << 3) + (i4_strd_y << 2)),
1836                        i4_strd_y, alpha, beta, u4_bs, pu1_cliptab_y);
1837
1838    }
1839
1840}
1841
1842