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  */
ih264d_filter_boundary_left_nonmbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,deblk_mb_t * ps_cur_mb,WORD32 i4_strd_y,WORD32 i4_strd_uv,deblk_mb_t * ps_left_mb,UWORD32 pu4_bs_tab[],UWORD8 u1_cur_fld)77 void 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 
ih264d_filter_boundary_top_nonmbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,deblk_mb_t * ps_cur_mb,WORD32 i4_strd_y,WORD32 i4_strd_uv,deblk_mb_t * ps_top_mb,UWORD32 u4_bs)301 void 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 
ih264d_deblock_mb_nonmbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,WORD32 i4_strd_y,WORD32 i4_strd_uv)393 void 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  **************************************************************************/
ih264d_init_deblk_tfr_ctxt(dec_struct_t * ps_dec,pad_mgr_t * ps_pad_mgr,tfr_ctxt_t * ps_tfr_cxt,UWORD16 u2_image_wd_mb,UWORD8 u1_mbaff)629 void 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 
ih264d_deblock_picture_mbaff(dec_struct_t * ps_dec)697 void 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 
ih264d_deblock_picture_non_mbaff(dec_struct_t * ps_dec)985 void 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 
ih264d_deblock_picture_progressive(dec_struct_t * ps_dec)1102 void 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 
ih264d_set_deblocking_parameters(deblk_mb_t * ps_cur_mb,dec_slice_params_t * ps_slice,UWORD8 u1_mb_ngbr_availablity,UWORD8 u1_mb_field_decoding_flag)1233 WORD8 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 
ih264d_copy_intra_pred_line(dec_struct_t * ps_dec,dec_mb_info_t * ps_cur_mb_info,UWORD32 nmb_index)1267 void 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 
ih264d_filter_boundary_left_mbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,deblk_mb_t * ps_cur_mb,WORD32 i4_strd_y,WORD32 i4_strd_uv,deblk_mb_t * ps_left_mb,UWORD32 pu4_bs_tab[],UWORD8 u1_cur_fld)1338 void 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 
ih264d_filter_boundary_topmbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,deblk_mb_t * ps_cur_mb,WORD32 i4_strd_y,WORD32 i4_strd_uv,deblk_mb_t * ps_top_mb,UWORD32 u4_bs)1552 void 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 
ih264d_deblock_mb_mbaff(dec_struct_t * ps_dec,tfr_ctxt_t * ps_tfr_cxt,WORD8 i1_cb_qp_idx_ofst,WORD8 i1_cr_qp_idx_ofst,deblk_mb_t * ps_cur_mb,WORD32 i4_strd_y,WORD32 i4_strd_uv,deblk_mb_t * ps_top_mb,deblk_mb_t * ps_left_mb,UWORD8 u1_cur_fld,UWORD8 u1_extra_top_edge)1643 void 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