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