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 */ 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 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 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 **************************************************************************/ 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 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 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 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 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 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 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 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 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