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 "ih264_typedefs.h" 22 #include "ih264_macros.h" 23 #include "ih264_platform_macros.h" 24 #include "ih264d_structs.h" 25 #include "ih264d_defs.h" 26 #include "ih264d_deblocking.h" 27 #include "string.h" 28 #include "ih264d_debug.h" 29 #include "ih264d_tables.h" 30 31 UWORD16 ih264d_update_csbp_8x8(UWORD16 u2_luma_csbp) 32 { 33 UWORD16 u2_mod_csbp; 34 35 u2_mod_csbp = u2_luma_csbp; 36 37 if(u2_mod_csbp & 0x0033) 38 { 39 u2_mod_csbp |= 0x0033; 40 } 41 42 if(u2_mod_csbp & 0x00CC) 43 { 44 u2_mod_csbp |= 0x00CC; 45 } 46 47 if(u2_mod_csbp & 0x3300) 48 { 49 u2_mod_csbp |= 0x3300; 50 } 51 52 if(u2_mod_csbp & 0xCC00) 53 { 54 u2_mod_csbp |= 0xCC00; 55 } 56 57 return u2_mod_csbp; 58 } 59 60 /*****************************************************************************/ 61 /* */ 62 /* Function Name : ih264d_fill_bs2_horz_vert */ 63 /* */ 64 /* Description : This function fills boundray strength (=2) for all horz */ 65 /* and vert edges of current mb based on coded sub block */ 66 /* pattern of current, top and left mb */ 67 /* Inputs : */ 68 /* pu4_bs : Base pointer of BS table which gets updated */ 69 /* u4_left_mb_csbp : left mb's coded sub block pattern */ 70 /* u4_top_mb_csbp : top mb's coded sub block pattern */ 71 /* u4_cur_mb_csbp : current mb's coded sub block pattern */ 72 /* */ 73 /* Globals : <Does it use any global variables?> */ 74 /* Processing : */ 75 /* */ 76 /* csbp for each 4x4 block in a mb is bit packet in reverse */ 77 /* raster scan order for each mb as shown below: */ 78 /* 15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0. */ 79 /* */ 80 /* BS=2 for a 4x4 edge if any of adjacent blocks forming edge */ 81 /* are coded. Keeping this in mind, bs=2 for all horz and vert */ 82 /* edges can be derived using a lookup table for each edge */ 83 /* after "ORing" the csbp values as follows: */ 84 /* (C means current Mb, T means top mb and L means left mb) */ 85 /* */ 86 /* All Horz edges: */ 87 /* 15C|14C|13C|12C|11C|10C|9C|8C|7C|6C|5C|4C|3C |2C |1C |0C */ 88 /* (or with) 11C|10C| 9C| 8C| 7C|6C |5C|4C|3C|2C|1C|0C|15T|14T|13T|12T */ 89 /* -----BS[3]-----|----BS[2]----|---BS[1]---|----BS[0]-----| */ 90 /* */ 91 /* All Vert edges: */ 92 /* 15C|14C|13C|12C|11C|10C|9C| 8C|7C|6C|5C|4C|3C |2C |1C |0C */ 93 /* (or with) 14C|13C|12C|15L|10C| 9C|8C|11L|6C|5C|4C|7L|2C |1C |0C |3L */ 94 /* Do 4x4 transpose of resulting pattern to get vertBS[4]-BS[7] */ 95 /* */ 96 /* Outputs : <What does the function produce?> */ 97 /* Returns : <What does the function return?> */ 98 /* */ 99 /* Issues : <List any issues or problems with this function> */ 100 /* */ 101 /* Revision History: */ 102 /* */ 103 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 104 /* 16 10 2008 Jay Draft */ 105 /* */ 106 /*****************************************************************************/ 107 #define CSBP_LEFT_BLOCK_MASK 0x1111 108 #define CSBP_RIGHT_BLOCK_MASK 0x8888 109 110 void ih264d_fill_bs2_horz_vert(UWORD32 *pu4_bs, /* Base pointer of BS table */ 111 WORD32 u4_left_mb_csbp, /* csbp of left mb */ 112 WORD32 u4_top_mb_csbp, /* csbp of top mb */ 113 WORD32 u4_cur_mb_csbp, /* csbp of current mb */ 114 const UWORD32 *pu4_packed_bs2, const UWORD16 *pu2_4x4_v2h_reorder) 115 { 116 /*************************************************************************/ 117 /*u4_nbr_horz_csbp=11C|10C|9C|8C|7C|6C|5C|4C|3C|2C|1C|0C|15T|14T|13T|12T */ 118 /*************************************************************************/ 119 UWORD32 u4_nbr_horz_csbp = (u4_cur_mb_csbp << 4) | (u4_top_mb_csbp >> 12); 120 UWORD32 u4_horz_bs2_dec = u4_cur_mb_csbp | u4_nbr_horz_csbp; 121 122 /*************************************************************************/ 123 /*u4_left_mb_masked_csbp = 15L|0|0|0|11L|0|0|0|7L|0|0|0|3L|0|0|0 */ 124 /*************************************************************************/ 125 UWORD32 u4_left_mb_masked_csbp = u4_left_mb_csbp & CSBP_RIGHT_BLOCK_MASK; 126 127 /*************************************************************************/ 128 /*u4_cur_mb_masked_csbp =14C|13C|12C|x|10C|9C|8C|x|6C|5C|4C|x|2C|1C|0C|x */ 129 /*************************************************************************/ 130 UWORD32 u4_cur_mb_masked_csbp = (u4_cur_mb_csbp << 1) 131 & (~CSBP_LEFT_BLOCK_MASK); 132 133 /*************************************************************************/ 134 /*u4_nbr_vert_csbp=14C|13C|12C|15L|10C|9C|8C|11L|6C|5C|4C|7L|2C|1C|0C|3L */ 135 /*************************************************************************/ 136 UWORD32 u4_nbr_vert_csbp = (u4_cur_mb_masked_csbp) 137 | (u4_left_mb_masked_csbp >> 3); 138 139 UWORD32 u4_vert_bs2_dec = u4_cur_mb_csbp | u4_nbr_vert_csbp; 140 141 UWORD32 u4_reordered_vert_bs2_dec, u4_temp; 142 143 PROFILE_DISABLE_BOUNDARY_STRENGTH() 144 145 /*************************************************************************/ 146 /* Fill horz edges (0,1,2,3) boundary strengths 2 using look up table */ 147 /*************************************************************************/ 148 pu4_bs[0] = pu4_packed_bs2[u4_horz_bs2_dec & 0xF]; 149 pu4_bs[1] = pu4_packed_bs2[(u4_horz_bs2_dec >> 4) & 0xF]; 150 pu4_bs[2] = pu4_packed_bs2[(u4_horz_bs2_dec >> 8) & 0xF]; 151 pu4_bs[3] = pu4_packed_bs2[(u4_horz_bs2_dec >> 12) & 0xF]; 152 153 /*************************************************************************/ 154 /* Do 4x4 tranpose of u4_vert_bs2_dec by using look up table for reorder */ 155 /*************************************************************************/ 156 u4_reordered_vert_bs2_dec = pu2_4x4_v2h_reorder[u4_vert_bs2_dec & 0xF]; 157 u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 4) & 0xF]; 158 u4_reordered_vert_bs2_dec |= (u4_temp << 1); 159 u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 8) & 0xF]; 160 u4_reordered_vert_bs2_dec |= (u4_temp << 2); 161 u4_temp = pu2_4x4_v2h_reorder[(u4_vert_bs2_dec >> 12) & 0xF]; 162 u4_reordered_vert_bs2_dec |= (u4_temp << 3); 163 164 /*************************************************************************/ 165 /* Fill vert edges (4,5,6,7) boundary strengths 2 using look up table */ 166 /*************************************************************************/ 167 pu4_bs[4] = pu4_packed_bs2[u4_reordered_vert_bs2_dec & 0xF]; 168 pu4_bs[5] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 4) & 0xF]; 169 pu4_bs[6] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 8) & 0xF]; 170 pu4_bs[7] = pu4_packed_bs2[(u4_reordered_vert_bs2_dec >> 12) & 0xF]; 171 } 172 173 /*****************************************************************************/ 174 /* */ 175 /* Function Name : ih264d_fill_bs1_16x16mb_pslice */ 176 /* */ 177 /* Description : This function fills boundray strength (=1) for those */ 178 /* horz and vert mb edges of 16x16mb which are set to 0 by */ 179 /* ih264d_fill_bs2_horz_vert. This function is used for p slices */ 180 /* */ 181 /* Inputs : <What inputs does the function take?> */ 182 /* Globals : <Does it use any global variables?> */ 183 /* Processing : If any motion vector component of adjacent 4x4 blocks */ 184 /* differs by more than 1 integer pel or if reference */ 185 /* pictures are different, Bs is set to 1. */ 186 /* */ 187 /* Outputs : <What does the function produce?> */ 188 /* Returns : <What does the function return?> */ 189 /* */ 190 /* Issues : <List any issues or problems with this function> */ 191 /* */ 192 /* Revision History: */ 193 /* */ 194 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 195 /* 16 10 2008 Jay Draft */ 196 /* */ 197 /*****************************************************************************/ 198 void ih264d_fill_bs1_16x16mb_pslice(mv_pred_t *ps_cur_mv_pred, 199 mv_pred_t *ps_top_mv_pred, 200 void **ppv_map_ref_idx_to_poc, 201 UWORD32 *pu4_bs_table, /* pointer to the BsTable array */ 202 mv_pred_t *ps_leftmost_mv_pred, 203 neighbouradd_t *ps_left_addr, 204 void **u4_pic_addrress, /* picture address for BS calc */ 205 WORD32 i4_ver_mvlimit) 206 { 207 WORD16 i2_q_mv0, i2_q_mv1; 208 WORD16 i2_p_mv0, i2_p_mv1; 209 void *pv_cur_pic_addr0, *pv_cur_pic_addr1; 210 void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1; 211 void **ppv_map_ref_idx_to_poc_l0; //,*ppv_map_ref_idx_to_poc_l1; 212 UWORD32 i; 213 UWORD32 u4_bs_horz = pu4_bs_table[0]; 214 UWORD32 u4_bs_vert = pu4_bs_table[4]; 215 216 PROFILE_DISABLE_BOUNDARY_STRENGTH() 217 218 ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc; 219 220 i2_q_mv0 = ps_cur_mv_pred->i2_mv[0]; 221 i2_q_mv1 = ps_cur_mv_pred->i2_mv[1]; 222 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[ps_cur_mv_pred->i1_ref_frame[0]]; 223 pv_cur_pic_addr1 = 0; 224 225 /*********************************/ 226 /* Computing Bs for the top edge */ 227 /*********************************/ 228 for(i = 0; i < 4; i++, ps_top_mv_pred++) 229 { 230 UWORD32 u4_idx = 24 - (i << 3); 231 232 /*********************************/ 233 /* check if Bs is already set */ 234 /*********************************/ 235 if(!((u4_bs_horz >> u4_idx) & 0xf)) 236 { 237 /************************************************************/ 238 /* If Bs is not set, use left edge and current edge mvs and */ 239 /* reference pictures addresses to evaluate Bs==1 */ 240 /************************************************************/ 241 UWORD32 u4_bs_temp1; 242 UWORD32 u4_bs; 243 244 /*********************************************************/ 245 /* If any motion vector component differs by more than 1 */ 246 /* integer pel or if reference pictures are different Bs */ 247 /* is set to 1. Note that this condition shall be met for*/ 248 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 249 /*********************************************************/ 250 i2_p_mv0 = ps_top_mv_pred->i2_mv[0]; 251 i2_p_mv1 = ps_top_mv_pred->i2_mv[1]; 252 pv_nbr_pic_addr0 = u4_pic_addrress[i & 2]; 253 pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)]; 254 255 u4_bs_temp1 = ((ABS((i2_p_mv0 - i2_q_mv0)) >= 4) || 256 (ABS((i2_p_mv1 - i2_q_mv1)) >= i4_ver_mvlimit)); 257 258 u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0) 259 || (pv_cur_pic_addr1 != pv_nbr_pic_addr1) 260 || u4_bs_temp1); 261 262 u4_bs_horz |= (u4_bs << u4_idx); 263 } 264 } 265 pu4_bs_table[0] = u4_bs_horz; 266 267 /***********************************/ 268 /* Computing Bs for the left edge */ 269 /***********************************/ 270 for(i = 0; i < 4; i++, ps_leftmost_mv_pred += 4) 271 { 272 UWORD32 u4_idx = 24 - (i << 3); 273 274 /*********************************/ 275 /* check if Bs is already set */ 276 /*********************************/ 277 if(!((u4_bs_vert >> u4_idx) & 0xf)) 278 { 279 /****************************************************/ 280 /* If Bs is not set, evalaute conditions for Bs=1 */ 281 /****************************************************/ 282 UWORD32 u4_bs_temp1; 283 UWORD32 u4_bs; 284 /*********************************************************/ 285 /* If any motion vector component differs by more than 1 */ 286 /* integer pel or if reference pictures are different Bs */ 287 /* is set to 1. Note that this condition shall be met for*/ 288 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 289 /*********************************************************/ 290 291 i2_p_mv0 = ps_leftmost_mv_pred->i2_mv[0]; 292 i2_p_mv1 = ps_leftmost_mv_pred->i2_mv[1]; 293 pv_nbr_pic_addr0 = ps_left_addr->u4_add[i & 2]; 294 pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (i & 2)]; 295 296 u4_bs_temp1 = 297 ((ABS((i2_p_mv0 - i2_q_mv0)) 298 >= 4) 299 | (ABS((i2_p_mv1 - i2_q_mv1)) 300 >= i4_ver_mvlimit)); 301 302 u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0) 303 || (pv_cur_pic_addr1 != pv_nbr_pic_addr1) 304 || u4_bs_temp1); 305 306 u4_bs_vert |= (u4_bs << u4_idx); 307 } 308 } 309 pu4_bs_table[4] = u4_bs_vert; 310 311 return; 312 } 313 314 /*****************************************************************************/ 315 /* */ 316 /* Function Name : ih264d_fill_bs1_non16x16mb_pslice */ 317 /* */ 318 /* Description : This function fills boundray strength (=1) for those */ 319 /* horz and vert edges of non16x16mb which are set to 0 by */ 320 /* ih264d_fill_bs2_horz_vert. This function is used for p slices */ 321 /* */ 322 /* Inputs : <What inputs does the function take?> */ 323 /* Globals : <Does it use any global variables?> */ 324 /* Processing : If any motion vector component of adjacent 4x4 blocks */ 325 /* differs by more than 1 integer pel or if reference */ 326 /* pictures are different, Bs is set to 1. */ 327 /* */ 328 /* Outputs : <What does the function produce?> */ 329 /* Returns : <What does the function return?> */ 330 /* */ 331 /* Issues : <List any issues or problems with this function> */ 332 /* */ 333 /* Revision History: */ 334 /* */ 335 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 336 /* 16 10 2008 Jay Draft */ 337 /* */ 338 /*****************************************************************************/ 339 void ih264d_fill_bs1_non16x16mb_pslice(mv_pred_t *ps_cur_mv_pred, 340 mv_pred_t *ps_top_mv_pred, 341 void **ppv_map_ref_idx_to_poc, 342 UWORD32 *pu4_bs_table, /* pointer to the BsTable array */ 343 mv_pred_t *ps_leftmost_mv_pred, 344 neighbouradd_t *ps_left_addr, 345 void **u4_pic_addrress, 346 WORD32 i4_ver_mvlimit) 347 { 348 UWORD32 edge; 349 void **ppv_map_ref_idx_to_poc_l0; //,*ppv_map_ref_idx_to_poc_l1; 350 351 PROFILE_DISABLE_BOUNDARY_STRENGTH() 352 353 ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc; 354 355 356 for(edge = 0; edge < 4; edge++, ps_top_mv_pred = ps_cur_mv_pred - 4) 357 { 358 /*********************************************************************/ 359 /* Each iteration of this loop fills the four BS values of one HORIZ */ 360 /* edge and one BS value for each of the four VERT edges. */ 361 /*********************************************************************/ 362 WORD32 i; 363 UWORD32 u4_vert_idx = 24 - (edge << 3); 364 UWORD32 u4_bs_horz = pu4_bs_table[edge]; 365 mv_pred_t *ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2); 366 367 for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++) 368 { 369 WORD16 i2_cur_mv0, i2_cur_mv1; 370 WORD8 i1_cur_ref0; 371 void *pv_cur_pic_addr0, *pv_cur_pic_addr1 = 0; 372 void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1; 373 374 /******************************************************/ 375 /* Each iteration of this inner loop computes a HORIZ */ 376 /* and a VERT BS value for a 4x4 block */ 377 /******************************************************/ 378 UWORD32 u4_bs_vert = (pu4_bs_table[i + 4] >> u4_vert_idx) & 0xf; 379 UWORD32 u4_horz_idx = 24 - (i << 3); 380 381 /*****************************************************/ 382 /* check if vert Bs for this block is already set */ 383 /*****************************************************/ 384 if(!u4_bs_vert) 385 { 386 WORD16 i2_left_mv0, i2_left_mv1; 387 /************************************************************/ 388 /* If Bs is not set, use left edge and current edge mvs and */ 389 /* reference pictures addresses to evaluate Bs==1 */ 390 /************************************************************/ 391 i2_left_mv0 = ps_left_mv_pred->i2_mv[0]; 392 i2_left_mv1 = ps_left_mv_pred->i2_mv[1]; 393 394 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 395 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 396 397 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 398 399 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 400 if(i) 401 { 402 WORD8 i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0]; 403 pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_left_ref0]; 404 pv_nbr_pic_addr1 = 0; 405 } 406 else 407 { 408 pv_nbr_pic_addr0 = ps_left_addr->u4_add[edge & 2]; 409 pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (edge & 2)]; 410 } 411 412 { 413 UWORD32 u4_bs_temp1; 414 /*********************************************************/ 415 /* If any motion vector component differs by more than 1 */ 416 /* integer pel or if reference pictures are different Bs */ 417 /* is set to 1. Note that this condition shall be met for*/ 418 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 419 /*********************************************************/ 420 421 u4_bs_temp1 = 422 ((ABS((i2_left_mv0 - i2_cur_mv0)) 423 >= 4) 424 | (ABS((i2_left_mv1 425 - i2_cur_mv1)) 426 >= i4_ver_mvlimit)); 427 428 u4_bs_vert = ((pv_nbr_pic_addr0 != pv_cur_pic_addr0) 429 || (pv_nbr_pic_addr1 != pv_cur_pic_addr1) 430 || u4_bs_temp1); 431 432 pu4_bs_table[i + 4] |= (u4_bs_vert << u4_vert_idx); 433 } 434 } 435 436 /*****************************************************/ 437 /* check if horz Bs for this block is already set */ 438 /*****************************************************/ 439 if(!((u4_bs_horz >> u4_horz_idx) & 0xf)) 440 { 441 WORD16 i2_top_mv0, i2_top_mv1; 442 /************************************************************/ 443 /* If Bs is not set, use top edge and current edge mvs and */ 444 /* reference pictures addresses to evaluate Bs==1 */ 445 /************************************************************/ 446 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 447 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 448 449 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 450 451 i2_top_mv0 = ps_top_mv_pred->i2_mv[0]; 452 i2_top_mv1 = ps_top_mv_pred->i2_mv[1]; 453 454 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 455 if(edge) 456 { 457 WORD8 i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0]; 458 pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_top_ref0]; 459 pv_nbr_pic_addr1 = 0; 460 } 461 else 462 { 463 pv_nbr_pic_addr0 = u4_pic_addrress[i & 2]; 464 pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)]; 465 } 466 467 { 468 UWORD32 u4_bs_temp1; 469 UWORD32 u4_bs; 470 /*********************************************************/ 471 /* If any motion vector component differs by more than 1 */ 472 /* integer pel or if reference pictures are different Bs */ 473 /* is set to 1. Note that this condition shall be met for*/ 474 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 475 /*********************************************************/ 476 477 u4_bs_temp1 = 478 ((ABS((i2_top_mv0 - i2_cur_mv0)) 479 >= 4) 480 | (ABS((i2_top_mv1 481 - i2_cur_mv1)) 482 >= i4_ver_mvlimit)); 483 484 u4_bs = ((pv_nbr_pic_addr0 != pv_cur_pic_addr0) 485 || (pv_nbr_pic_addr1 != pv_cur_pic_addr1) 486 || u4_bs_temp1); 487 488 u4_bs_horz |= (u4_bs << u4_horz_idx); 489 } 490 } 491 492 ps_left_mv_pred = ps_cur_mv_pred; 493 } 494 495 pu4_bs_table[edge] = u4_bs_horz; 496 } 497 } 498 499 /*****************************************************************************/ 500 /* */ 501 /* Function Name : ih264d_fill_bs1_16x16mb_bslice */ 502 /* */ 503 /* Description : This function fills boundray strength (=1) for those */ 504 /* horz and vert mb edges of 16x16mb which are set to 0 by */ 505 /* ih264d_fill_bs2_horz_vert. This function is used for b slices */ 506 /* */ 507 /* Inputs : <What inputs does the function take?> */ 508 /* Globals : <Does it use any global variables?> */ 509 /* Processing : If any motion vector component of adjacent 4x4 blocks */ 510 /* differs by more than 1 integer pel or if reference */ 511 /* pictures are different, Bs is set to 1. */ 512 /* */ 513 /* Outputs : <What does the function produce?> */ 514 /* Returns : <What does the function return?> */ 515 /* */ 516 /* Issues : <List any issues or problems with this function> */ 517 /* */ 518 /* Revision History: */ 519 /* */ 520 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 521 /* 16 10 2008 Jay Draft */ 522 /* */ 523 /*****************************************************************************/ 524 void ih264d_fill_bs1_16x16mb_bslice(mv_pred_t *ps_cur_mv_pred, 525 mv_pred_t *ps_top_mv_pred, 526 void **ppv_map_ref_idx_to_poc, 527 UWORD32 *pu4_bs_table, /* pointer to the BsTable array */ 528 mv_pred_t *ps_leftmost_mv_pred, 529 neighbouradd_t *ps_left_addr, 530 void **u4_pic_addrress, 531 WORD32 i4_ver_mvlimit) 532 { 533 WORD16 i2_q_mv0, i2_q_mv1, i2_q_mv2, i2_q_mv3; 534 WORD16 i2_p_mv0, i2_p_mv1, i2_p_mv2, i2_p_mv3; 535 void *pv_cur_pic_addr0, *pv_cur_pic_addr1; 536 void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1; 537 void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1; 538 UWORD32 i; 539 UWORD32 u4_bs_horz = pu4_bs_table[0]; 540 UWORD32 u4_bs_vert = pu4_bs_table[4]; 541 542 PROFILE_DISABLE_BOUNDARY_STRENGTH() 543 544 ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc; 545 ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF; 546 i2_q_mv0 = ps_cur_mv_pred->i2_mv[0]; 547 i2_q_mv1 = ps_cur_mv_pred->i2_mv[1]; 548 i2_q_mv2 = ps_cur_mv_pred->i2_mv[2]; 549 i2_q_mv3 = ps_cur_mv_pred->i2_mv[3]; 550 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[ps_cur_mv_pred->i1_ref_frame[0]]; 551 pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[ps_cur_mv_pred->i1_ref_frame[1]]; 552 553 /*********************************/ 554 /* Computing Bs for the top edge */ 555 /*********************************/ 556 for(i = 0; i < 4; i++, ps_top_mv_pred++) 557 { 558 UWORD32 u4_idx = 24 - (i << 3); 559 560 /*********************************/ 561 /* check if Bs is already set */ 562 /*********************************/ 563 if(!((u4_bs_horz >> u4_idx) & 0xf)) 564 { 565 /************************************************************/ 566 /* If Bs is not set, use left edge and current edge mvs and */ 567 /* reference pictures addresses to evaluate Bs==1 */ 568 /************************************************************/ 569 UWORD32 u4_bs_temp1, u4_bs_temp2; 570 UWORD32 u4_bs; 571 572 /*********************************************************/ 573 /* If any motion vector component differs by more than 1 */ 574 /* integer pel or if reference pictures are different Bs */ 575 /* is set to 1. Note that this condition shall be met for*/ 576 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 577 /*********************************************************/ 578 i2_p_mv0 = ps_top_mv_pred->i2_mv[0]; 579 i2_p_mv1 = ps_top_mv_pred->i2_mv[1]; 580 i2_p_mv2 = ps_top_mv_pred->i2_mv[2]; 581 i2_p_mv3 = ps_top_mv_pred->i2_mv[3]; 582 pv_nbr_pic_addr0 = u4_pic_addrress[i & 2]; 583 pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)]; 584 585 u4_bs_temp1 = 586 ((ABS((i2_p_mv0 - i2_q_mv0)) 587 >= 4) 588 | (ABS((i2_p_mv1 - i2_q_mv1)) 589 >= i4_ver_mvlimit) 590 | (ABS((i2_p_mv2 - i2_q_mv2)) 591 >= 4) 592 | (ABS((i2_p_mv3 - i2_q_mv3)) 593 >= i4_ver_mvlimit)); 594 595 u4_bs_temp2 = 596 ((ABS((i2_p_mv0 - i2_q_mv2)) 597 >= 4) 598 | (ABS((i2_p_mv1 - i2_q_mv3)) 599 >= i4_ver_mvlimit) 600 | (ABS((i2_p_mv2 - i2_q_mv0)) 601 >= 4) 602 | (ABS((i2_p_mv3 - i2_q_mv1)) 603 >= i4_ver_mvlimit)); 604 605 u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0) 606 || (pv_cur_pic_addr1 != pv_nbr_pic_addr1) 607 || u4_bs_temp1) 608 && ((pv_cur_pic_addr0 != pv_nbr_pic_addr1) 609 || (pv_cur_pic_addr1 610 != pv_nbr_pic_addr0) 611 || u4_bs_temp2); 612 613 u4_bs_horz |= (u4_bs << u4_idx); 614 } 615 } 616 pu4_bs_table[0] = u4_bs_horz; 617 618 /***********************************/ 619 /* Computing Bs for the left edge */ 620 /***********************************/ 621 for(i = 0; i < 4; i++, ps_leftmost_mv_pred += 4) 622 { 623 UWORD32 u4_idx = 24 - (i << 3); 624 625 /*********************************/ 626 /* check if Bs is already set */ 627 /*********************************/ 628 if(!((u4_bs_vert >> u4_idx) & 0xf)) 629 { 630 /****************************************************/ 631 /* If Bs is not set, evalaute conditions for Bs=1 */ 632 /****************************************************/ 633 UWORD32 u4_bs_temp1, u4_bs_temp2; 634 UWORD32 u4_bs; 635 /*********************************************************/ 636 /* If any motion vector component differs by more than 1 */ 637 /* integer pel or if reference pictures are different Bs */ 638 /* is set to 1. Note that this condition shall be met for*/ 639 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 640 /*********************************************************/ 641 642 i2_p_mv0 = ps_leftmost_mv_pred->i2_mv[0]; 643 i2_p_mv1 = ps_leftmost_mv_pred->i2_mv[1]; 644 i2_p_mv2 = ps_leftmost_mv_pred->i2_mv[2]; 645 i2_p_mv3 = ps_leftmost_mv_pred->i2_mv[3]; 646 pv_nbr_pic_addr0 = ps_left_addr->u4_add[i & 2]; 647 pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (i & 2)]; 648 649 u4_bs_temp1 = 650 ((ABS((i2_p_mv0 - i2_q_mv0)) 651 >= 4) 652 | (ABS((i2_p_mv1 - i2_q_mv1)) 653 >= i4_ver_mvlimit) 654 | (ABS((i2_p_mv2 - i2_q_mv2)) 655 >= 4) 656 | (ABS((i2_p_mv3 - i2_q_mv3)) 657 >= i4_ver_mvlimit)); 658 659 u4_bs_temp2 = 660 ((ABS((i2_p_mv0 - i2_q_mv2)) 661 >= 4) 662 | (ABS((i2_p_mv1 - i2_q_mv3)) 663 >= i4_ver_mvlimit) 664 | (ABS((i2_p_mv2 - i2_q_mv0)) 665 >= 4) 666 | (ABS((i2_p_mv3 - i2_q_mv1)) 667 >= i4_ver_mvlimit)); 668 669 u4_bs = ((pv_cur_pic_addr0 != pv_nbr_pic_addr0) 670 || (pv_cur_pic_addr1 != pv_nbr_pic_addr1) 671 || u4_bs_temp1) 672 && ((pv_cur_pic_addr0 != pv_nbr_pic_addr1) 673 || (pv_cur_pic_addr1 674 != pv_nbr_pic_addr0) 675 || u4_bs_temp2); 676 677 u4_bs_vert |= (u4_bs << u4_idx); 678 } 679 } 680 pu4_bs_table[4] = u4_bs_vert; 681 682 return; 683 } 684 685 /*****************************************************************************/ 686 /* */ 687 /* Function Name : ih264d_fill_bs1_non16x16mb_bslice */ 688 /* */ 689 /* Description : This function fills boundray strength (=1) for those */ 690 /* horz and vert edges of non16x16mb which are set to 0 by */ 691 /* ih264d_fill_bs2_horz_vert. This function is used for b slices */ 692 /* */ 693 /* Inputs : <What inputs does the function take?> */ 694 /* Globals : <Does it use any global variables?> */ 695 /* Processing : If any motion vector component of adjacent 4x4 blocks */ 696 /* differs by more than 1 integer pel or if reference */ 697 /* pictures are different, Bs is set to 1. */ 698 /* */ 699 /* Outputs : <What does the function produce?> */ 700 /* Returns : <What does the function return?> */ 701 /* */ 702 /* Issues : <List any issues or problems with this function> */ 703 /* */ 704 /* Revision History: */ 705 /* */ 706 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 707 /* 16 10 2008 Jay Draft */ 708 /* */ 709 /*****************************************************************************/ 710 void ih264d_fill_bs1_non16x16mb_bslice(mv_pred_t *ps_cur_mv_pred, 711 mv_pred_t *ps_top_mv_pred, 712 void **ppv_map_ref_idx_to_poc, 713 UWORD32 *pu4_bs_table, /* pointer to the BsTable array */ 714 mv_pred_t *ps_leftmost_mv_pred, 715 neighbouradd_t *ps_left_addr, 716 void **u4_pic_addrress, 717 WORD32 i4_ver_mvlimit) 718 { 719 UWORD32 edge; 720 void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1; 721 ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc; 722 ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF; 723 724 PROFILE_DISABLE_BOUNDARY_STRENGTH() 725 726 for(edge = 0; edge < 4; edge++, ps_top_mv_pred = ps_cur_mv_pred - 4) 727 { 728 /*********************************************************************/ 729 /* Each iteration of this loop fills the four BS values of one HORIZ */ 730 /* edge and one BS value for each of the four VERT edges. */ 731 /*********************************************************************/ 732 WORD32 i; 733 UWORD32 u4_vert_idx = 24 - (edge << 3); 734 UWORD32 u4_bs_horz = pu4_bs_table[edge]; 735 mv_pred_t *ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2); 736 737 for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++) 738 { 739 WORD16 i2_cur_mv0, i2_cur_mv1, i16_curMv2, i16_curMv3; 740 WORD8 i1_cur_ref0, i1_cur_ref1; 741 void *pv_cur_pic_addr0, *pv_cur_pic_addr1; 742 void *pv_nbr_pic_addr0, *pv_nbr_pic_addr1; 743 744 /******************************************************/ 745 /* Each iteration of this inner loop computes a HORIZ */ 746 /* and a VERT BS value for a 4x4 block */ 747 /******************************************************/ 748 UWORD32 u4_bs_vert = (pu4_bs_table[i + 4] >> u4_vert_idx) & 0xf; 749 UWORD32 u4_horz_idx = 24 - (i << 3); 750 751 /*****************************************************/ 752 /* check if vert Bs for this block is already set */ 753 /*****************************************************/ 754 if(!u4_bs_vert) 755 { 756 WORD16 i2_left_mv0, i2_left_mv1, i2_left_mv2, i2_left_mv3; 757 /************************************************************/ 758 /* If Bs is not set, use left edge and current edge mvs and */ 759 /* reference pictures addresses to evaluate Bs==1 */ 760 /************************************************************/ 761 i2_left_mv0 = ps_left_mv_pred->i2_mv[0]; 762 i2_left_mv1 = ps_left_mv_pred->i2_mv[1]; 763 i2_left_mv2 = ps_left_mv_pred->i2_mv[2]; 764 i2_left_mv3 = ps_left_mv_pred->i2_mv[3]; 765 766 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 767 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 768 i16_curMv2 = ps_cur_mv_pred->i2_mv[2]; 769 i16_curMv3 = ps_cur_mv_pred->i2_mv[3]; 770 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 771 i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1]; 772 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 773 pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1]; 774 775 if(i) 776 { 777 WORD8 i1_left_ref0, i1_left_ref1; 778 i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0]; 779 i1_left_ref1 = ps_left_mv_pred->i1_ref_frame[1]; 780 pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_left_ref0]; 781 pv_nbr_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_left_ref1]; 782 } 783 else 784 { 785 pv_nbr_pic_addr0 = ps_left_addr->u4_add[edge & 2]; 786 pv_nbr_pic_addr1 = ps_left_addr->u4_add[1 + (edge & 2)]; 787 } 788 789 { 790 UWORD32 u4_bs_temp1, u4_bs_temp2; 791 /*********************************************************/ 792 /* If any motion vector component differs by more than 1 */ 793 /* integer pel or if reference pictures are different Bs */ 794 /* is set to 1. Note that this condition shall be met for*/ 795 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 796 /*********************************************************/ 797 798 u4_bs_temp1 = 799 ((ABS((i2_left_mv0 - i2_cur_mv0)) 800 >= 4) 801 | (ABS((i2_left_mv1 802 - i2_cur_mv1)) 803 >= i4_ver_mvlimit) 804 | (ABS((i2_left_mv2 805 - i16_curMv2)) 806 >= 4) 807 | (ABS((i2_left_mv3 808 - i16_curMv3)) 809 >= i4_ver_mvlimit)); 810 811 u4_bs_temp2 = 812 ((ABS((i2_left_mv0 - i16_curMv2)) 813 >= 4) 814 | (ABS((i2_left_mv1 815 - i16_curMv3)) 816 >= i4_ver_mvlimit) 817 | (ABS((i2_left_mv2 818 - i2_cur_mv0)) 819 >= 4) 820 | (ABS((i2_left_mv3 821 - i2_cur_mv1)) 822 >= i4_ver_mvlimit)); 823 824 u4_bs_vert = 825 ((pv_nbr_pic_addr0 != pv_cur_pic_addr0) 826 || (pv_nbr_pic_addr1 827 != pv_cur_pic_addr1) 828 || u4_bs_temp1) 829 && ((pv_nbr_pic_addr0 830 != pv_cur_pic_addr1) 831 || (pv_nbr_pic_addr1 832 != pv_cur_pic_addr0) 833 || u4_bs_temp2); 834 835 pu4_bs_table[i + 4] |= (u4_bs_vert << u4_vert_idx); 836 } 837 } 838 839 /*****************************************************/ 840 /* check if horz Bs for this block is already set */ 841 /*****************************************************/ 842 if(!((u4_bs_horz >> u4_horz_idx) & 0xf)) 843 { 844 WORD16 i2_top_mv0, i2_top_mv1, i16_topMv2, i16_topMv3; 845 /************************************************************/ 846 /* If Bs is not set, use top edge and current edge mvs and */ 847 /* reference pictures addresses to evaluate Bs==1 */ 848 /************************************************************/ 849 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 850 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 851 i16_curMv2 = ps_cur_mv_pred->i2_mv[2]; 852 i16_curMv3 = ps_cur_mv_pred->i2_mv[3]; 853 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 854 i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1]; 855 856 i2_top_mv0 = ps_top_mv_pred->i2_mv[0]; 857 i2_top_mv1 = ps_top_mv_pred->i2_mv[1]; 858 i16_topMv2 = ps_top_mv_pred->i2_mv[2]; 859 i16_topMv3 = ps_top_mv_pred->i2_mv[3]; 860 pv_cur_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 861 pv_cur_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1]; 862 if(edge) 863 { 864 WORD8 i1_top_ref0, i1_top_ref1; 865 i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0]; 866 i1_top_ref1 = ps_top_mv_pred->i1_ref_frame[1]; 867 pv_nbr_pic_addr0 = ppv_map_ref_idx_to_poc_l0[i1_top_ref0]; 868 pv_nbr_pic_addr1 = ppv_map_ref_idx_to_poc_l1[i1_top_ref1]; 869 } 870 else 871 { 872 pv_nbr_pic_addr0 = u4_pic_addrress[i & 2]; 873 pv_nbr_pic_addr1 = u4_pic_addrress[1 + (i & 2)]; 874 } 875 876 { 877 UWORD32 u4_bs_temp1, u4_bs_temp2; 878 UWORD32 u4_bs; 879 /*********************************************************/ 880 /* If any motion vector component differs by more than 1 */ 881 /* integer pel or if reference pictures are different Bs */ 882 /* is set to 1. Note that this condition shall be met for*/ 883 /* both (fwd-fwd,bwd-bwd) and (fwd-bwd,bwd-fwd) direction*/ 884 /*********************************************************/ 885 886 u4_bs_temp1 = 887 ((ABS((i2_top_mv0 - i2_cur_mv0)) 888 >= 4) 889 | (ABS((i2_top_mv1 890 - i2_cur_mv1)) 891 >= i4_ver_mvlimit) 892 | (ABS((i16_topMv2 893 - i16_curMv2)) 894 >= 4) 895 | (ABS((i16_topMv3 896 - i16_curMv3)) 897 >= i4_ver_mvlimit)); 898 899 u4_bs_temp2 = 900 ((ABS((i2_top_mv0 - i16_curMv2)) 901 >= 4) 902 | (ABS((i2_top_mv1 903 - i16_curMv3)) 904 >= i4_ver_mvlimit) 905 | (ABS((i16_topMv2 906 - i2_cur_mv0)) 907 >= 4) 908 | (ABS((i16_topMv3 909 - i2_cur_mv1)) 910 >= i4_ver_mvlimit)); 911 912 u4_bs = 913 ((pv_nbr_pic_addr0 != pv_cur_pic_addr0) 914 || (pv_nbr_pic_addr1 915 != pv_cur_pic_addr1) 916 || u4_bs_temp1) 917 && ((pv_nbr_pic_addr0 918 != pv_cur_pic_addr1) 919 || (pv_nbr_pic_addr1 920 != pv_cur_pic_addr0) 921 || u4_bs_temp2); 922 923 u4_bs_horz |= (u4_bs << u4_horz_idx); 924 } 925 } 926 927 ps_left_mv_pred = ps_cur_mv_pred; 928 } 929 930 pu4_bs_table[edge] = u4_bs_horz; 931 } 932 } 933 934 /*****************************************************************************/ 935 /* */ 936 /* Function Name : ih264d_fill_bs_xtra_left_edge_cur_fld */ 937 /* */ 938 /* Description : This function fills boundray strength (= 2 or 1) for */ 939 /* xtra left mb edge when cur mb is field and left mb is */ 940 /* frame. */ 941 /* Inputs : */ 942 /* */ 943 /* Globals : <Does it use any global variables?> */ 944 /* Processing : */ 945 /* */ 946 /* */ 947 /* Outputs : <What does the function produce?> */ 948 /* Returns : <What does the function return?> */ 949 /* */ 950 /* Issues : <List any issues or problems with this function> */ 951 /* */ 952 /* Revision History: */ 953 /* */ 954 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 955 /* 16 10 2008 Jay Draft */ 956 /* */ 957 /*****************************************************************************/ 958 void ih264d_fill_bs_xtra_left_edge_cur_fld(UWORD32 *pu4_bs, /* Base pointer of BS table */ 959 WORD32 u4_left_mb_t_csbp, /* left mbpair's top csbp */ 960 WORD32 u4_left_mb_b_csbp, /* left mbpair's bottom csbp*/ 961 WORD32 u4_cur_mb_csbp, /* csbp of current mb */ 962 UWORD32 u4_cur_mb_top /* is top or bottom mb */ 963 964 ) 965 { 966 const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2; 967 UWORD32 u4_cur, u4_left, u4_or; 968 UNUSED(u4_cur_mb_top); 969 970 PROFILE_DISABLE_BOUNDARY_STRENGTH() 971 972 u4_left_mb_t_csbp = ((u4_left_mb_t_csbp & 0x0008) >> 3) 973 + ((u4_left_mb_t_csbp & 0x0080) >> 6) 974 + ((u4_left_mb_t_csbp & 0x0800) >> 9) 975 + ((u4_left_mb_t_csbp & 0x8000) >> 12); 976 977 u4_left_mb_b_csbp = ((u4_left_mb_b_csbp & 0x0008) << 1) 978 + ((u4_left_mb_b_csbp & 0x0080) >> 2) 979 + ((u4_left_mb_b_csbp & 0x0800) >> 5) 980 + ((u4_left_mb_b_csbp & 0x8000) >> 8); 981 982 /*********************************************************************/ 983 /* u4_cur = 0|0|0|0|0|0|0|0|12C|12C|8C|8C|4C|4C|0C|0C */ 984 /*********************************************************************/ 985 u4_cur = (u4_cur_mb_csbp & 0x0001) + ((u4_cur_mb_csbp & 0x0001) << 1) 986 + ((u4_cur_mb_csbp & 0x0010) >> 2) 987 + ((u4_cur_mb_csbp & 0x0010) >> 1) 988 + ((u4_cur_mb_csbp & 0x0100) >> 4) 989 + ((u4_cur_mb_csbp & 0x0100) >> 3) 990 + ((u4_cur_mb_csbp & 0x1000) >> 6) 991 + ((u4_cur_mb_csbp & 0x1000) >> 5); 992 993 /*********************************************************************/ 994 /* u4_left =0|0|0|0|0|0|0|0|15Lb|11Lb|7Lb|3Lb|15Lt|11Lt|7Lt|3Lt */ 995 /*********************************************************************/ 996 u4_left = u4_left_mb_t_csbp + u4_left_mb_b_csbp; 997 998 u4_or = (u4_cur | u4_left); 999 /*********************************************************************/ 1000 /* Fill vert edges (4,9) boundary strengths using look up table */ 1001 /*********************************************************************/ 1002 pu4_packed_bs += 16; 1003 pu4_bs[4] = pu4_packed_bs[u4_or & 0xF]; 1004 pu4_bs[9] = pu4_packed_bs[(u4_or >> 4)]; 1005 } 1006 1007 /*****************************************************************************/ 1008 /* */ 1009 /* Function Name : ih264d_fill_bs_xtra_left_edge_cur_frm */ 1010 /* */ 1011 /* Description : This function fills boundray strength (= 2 or 1) for */ 1012 /* xtra left mb edge when cur mb is frame and left mb is */ 1013 /* field. */ 1014 /* Inputs : */ 1015 /* */ 1016 /* Globals : <Does it use any global variables?> */ 1017 /* Processing : */ 1018 /* */ 1019 /* */ 1020 /* Outputs : <What does the function produce?> */ 1021 /* Returns : <What does the function return?> */ 1022 /* */ 1023 /* Issues : <List any issues or problems with this function> */ 1024 /* */ 1025 /* Revision History: */ 1026 /* */ 1027 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1028 /* 16 10 2008 Jay Draft */ 1029 /* */ 1030 /*****************************************************************************/ 1031 void ih264d_fill_bs_xtra_left_edge_cur_frm(UWORD32 *pu4_bs, /* Base pointer of BS table */ 1032 WORD32 u4_left_mb_t_csbp, /* left mbpair's top csbp */ 1033 WORD32 u4_left_mb_b_csbp, /* left mbpair's bottom csbp*/ 1034 WORD32 u4_cur_mb_csbp, /* csbp of current mb */ 1035 UWORD32 u4_cur_mb_bot /* is top or bottom mb */ 1036 1037 ) 1038 { 1039 const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2; 1040 UWORD32 u4_cur, u4_left, u4_or; 1041 UWORD32 u4_right_shift = (u4_cur_mb_bot << 3); 1042 1043 PROFILE_DISABLE_BOUNDARY_STRENGTH() 1044 1045 u4_left_mb_t_csbp >>= u4_right_shift; 1046 u4_left_mb_b_csbp >>= u4_right_shift; 1047 1048 u4_left_mb_t_csbp = ((u4_left_mb_t_csbp & 0x08) >> 3) 1049 + ((u4_left_mb_t_csbp & 0x08) >> 2) 1050 + ((u4_left_mb_t_csbp & 0x80) >> 5) 1051 + ((u4_left_mb_t_csbp & 0x80) >> 4); 1052 1053 u4_left_mb_b_csbp = ((u4_left_mb_b_csbp & 0x08) << 1) 1054 + ((u4_left_mb_b_csbp & 0x08) << 2) 1055 + ((u4_left_mb_b_csbp & 0x80) >> 1) 1056 + ((u4_left_mb_b_csbp & 0x80)); 1057 1058 u4_cur = ((u4_cur_mb_csbp & 0x0001)) + ((u4_cur_mb_csbp & 0x0010) >> 3) 1059 + ((u4_cur_mb_csbp & 0x0100) >> 6) 1060 + ((u4_cur_mb_csbp & 0x1000) >> 9); 1061 1062 u4_cur += (u4_cur << 4); 1063 1064 u4_left = u4_left_mb_t_csbp + u4_left_mb_b_csbp; 1065 1066 u4_or = (u4_cur | u4_left); 1067 /*********************************************************************/ 1068 /* Fill vert edges (4,9) boundary strengths using look up table */ 1069 /*********************************************************************/ 1070 pu4_packed_bs += 16; 1071 pu4_bs[4] = pu4_packed_bs[u4_or & 0xF]; 1072 pu4_bs[9] = pu4_packed_bs[(u4_or >> 4)]; 1073 } 1074 1075 /*****************************************************************************/ 1076 /* */ 1077 /* Function Name : ih264d_fill_bs_xtra_top_edge */ 1078 /* */ 1079 /* Description : This function fills boundray strength (= 2 or 1) for */ 1080 /* xtra top mb edge when cur mb is top mb of frame mb pair */ 1081 /* and top mbpair is field coded. */ 1082 /* Inputs : */ 1083 /* */ 1084 /* Globals : <Does it use any global variables?> */ 1085 /* Processing : */ 1086 /* */ 1087 /* */ 1088 /* Outputs : <What does the function produce?> */ 1089 /* Returns : <What does the function return?> */ 1090 /* */ 1091 /* Issues : <List any issues or problems with this function> */ 1092 /* */ 1093 /* Revision History: */ 1094 /* */ 1095 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1096 /* 16 10 2008 Jay Draft */ 1097 /* */ 1098 /*****************************************************************************/ 1099 void ih264d_fill_bs_xtra_top_edge(UWORD32 *pu4_bs, /* Base pointer of BS table */ 1100 WORD32 u4_topmb_t_csbp, /* top mbpair's top csbp */ 1101 WORD32 u4_topmb_b_csbp, /* top mbpair's bottom csbp*/ 1102 WORD32 u4_cur_mb_csbp /* csbp of current mb */ 1103 1104 ) 1105 { 1106 const UWORD32 *pu4_packed_bs = (const UWORD32 *)gau4_ih264d_packed_bs2; 1107 UWORD32 u4_or; 1108 1109 u4_cur_mb_csbp &= 0xf; 1110 u4_topmb_t_csbp >>= 12; 1111 u4_topmb_b_csbp >>= 12; 1112 1113 u4_or = (u4_cur_mb_csbp | u4_topmb_t_csbp); 1114 /*********************************************************************/ 1115 /* Fill vert edges (0,8) boundary strengths using look up table */ 1116 /*********************************************************************/ 1117 pu4_packed_bs += 16; 1118 pu4_bs[8] = pu4_packed_bs[u4_or]; 1119 1120 u4_or = (u4_cur_mb_csbp | u4_topmb_b_csbp); 1121 pu4_bs[0] = pu4_packed_bs[u4_or]; 1122 } 1123 1124 /*****************************************************************************/ 1125 /* */ 1126 /* Function Name : ih264d_compute_bs_non_mbaff */ 1127 /* */ 1128 /* Description : This function computes the pointers of left,top & current*/ 1129 /* : Nnz, MvPred & deblk_mb_t and supplies to FillBs function for*/ 1130 /* : Boundary Strength Calculation */ 1131 /* Inputs : <What inputs does the function take?> */ 1132 /* Processing : This functions calls deblock MB in the MB increment order*/ 1133 /* */ 1134 /* Outputs : Produces the Boundary Strength for Current Mb */ 1135 /* Returns : None */ 1136 /* */ 1137 /* Revision History: */ 1138 /* */ 1139 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1140 /* ITTIAM */ 1141 /*****************************************************************************/ 1142 1143 void ih264d_compute_bs_non_mbaff(dec_struct_t * ps_dec, 1144 dec_mb_info_t * ps_cur_mb_info, 1145 const UWORD16 u2_mbxn_mb) 1146 { 1147 /* Mvpred and Nnz for top and Courrent */ 1148 mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred; 1149 /* deblk_mb_t Params */ 1150 deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */ 1151 deblkmb_neighbour_t *ps_deblk_top_mb; 1152 1153 /* Reference Index to POC mapping*/ 1154 void ** apv_map_ref_idx_to_poc; 1155 UWORD32 u4_leftmbtype; 1156 1157 UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp; 1158 1159 /* Set of flags */ 1160 UWORD32 u4_cur_mb_intra, u1_top_mb_typ, u4_cur_mb_fld; 1161 UWORD32 u1_cur_mb_type; 1162 UWORD32 * pu4_bs_table; 1163 1164 /* Neighbour availability */ 1165 /* Initialization */ 1166 const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx; 1167 const UWORD32 u2_mby = ps_cur_mb_info->u2_mby; 1168 const UWORD32 u1_pingpong = u2_mbx & 0x01; 1169 1170 PROFILE_DISABLE_BOUNDARY_STRENGTH() 1171 1172 ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx; 1173 1174 1175 /* Pointer assignment for Current DeblkMB, Current Mv Pred */ 1176 ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb; 1177 ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 4); 1178 1179 apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1; 1180 u1_cur_mb_type = ps_cur_mb_params->u1_mb_type; 1181 u1_top_mb_typ = ps_deblk_top_mb->u1_mb_type; 1182 ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type; 1183 1184 { 1185 UWORD8 mb_qp_temp; 1186 1187 ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp; 1188 ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 1189 1190 ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp; 1191 ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 1192 1193 } 1194 1195 /* if no deblocking required for current Mb then continue */ 1196 /* Check next Mbs in Mb group */ 1197 if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING) 1198 { 1199 void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + 1200 POC_LIST_L0_TO_L1_DIFF; 1201 { 1202 /* Store Parameter for Top MvPred refernce frame Address */ 1203 1204 void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress; 1205 WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame; 1206 WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame; 1207 1208 /* Store Left addresses for Next Mb */ 1209 void ** ppv_left_mv_pred_addr = 1210 ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add; 1211 WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame; 1212 1213 1214 ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]]; 1215 ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]]; 1216 1217 ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1218 ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1219 ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1220 ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1221 1222 ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]]; 1223 ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]]; 1224 //} 1225 /* Storing the leftMbtype for next Mb */ 1226 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 1227 } 1228 1229 return; 1230 } 1231 1232 /* Flag for extra left Edge */ 1233 ps_cur_mb_params->u1_single_call = 1; 1234 1235 /* Update the Left deblk_mb_t and Left MvPred Parameters */ 1236 if(!u2_mbx) 1237 { 1238 u4_leftmbtype = 0; 1239 1240 /* Initialize the ps_left_mv_pred with Junk but Valid Location */ 1241 /* to avoid invalid memory access */ 1242 /* this is read only pointer */ 1243 ps_left_mv_pred = ps_dec->ps_mv_cur + 3; 1244 } 1245 else 1246 { 1247 u4_leftmbtype = ps_dec->deblk_left_mb[1].u1_mb_type; 1248 1249 /* Come to Left Most Edge of the MB */ 1250 ps_left_mv_pred = (u2_mbxn_mb) ? 1251 ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 4) + 3 : 1252 ps_dec->ps_mv_left + 3; 1253 } 1254 1255 if(!u2_mby) 1256 u1_top_mb_typ = 0; 1257 1258 /* MvPred Pointer Calculation */ 1259 /* CHANGED CODE */ 1260 ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 4) + 12; 1261 1262 u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB; 1263 u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB); 1264 /* Compute BS function */ 1265 pu4_bs_table = ps_cur_mb_params->u4_bs_table; 1266 1267 u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp; 1268 u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp; 1269 u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp; 1270 /* Compute BS function */ 1271 if(ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) 1272 { 1273 if(ps_cur_mb_info->u1_tran_form8x8 == 1) 1274 { 1275 u2_cur_csbp = ih264d_update_csbp_8x8( 1276 ps_cur_mb_info->ps_curmb->u2_luma_csbp); 1277 } 1278 1279 if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1) 1280 { 1281 u2_left_csbp = ih264d_update_csbp_8x8( 1282 ps_cur_mb_info->ps_left_mb->u2_luma_csbp); 1283 } 1284 1285 if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1) 1286 { 1287 u2_top_csbp = ih264d_update_csbp_8x8( 1288 ps_cur_mb_info->ps_top_mb->u2_luma_csbp); 1289 } 1290 } 1291 if(u4_cur_mb_intra) 1292 { 1293 1294 pu4_bs_table[4] = 0x04040404; 1295 pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404; 1296 pu4_bs_table[1] = 0x03030303; 1297 pu4_bs_table[2] = 0x03030303; 1298 pu4_bs_table[3] = 0x03030303; 1299 pu4_bs_table[5] = 0x03030303; 1300 pu4_bs_table[6] = 0x03030303; 1301 pu4_bs_table[7] = 0x03030303; 1302 } 1303 else 1304 { 1305 UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16); 1306 UWORD32 u4_is_b = ps_dec->u1_B; 1307 1308 ih264d_fill_bs2_horz_vert( 1309 pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp, 1310 (const UWORD32 *)(gau4_ih264d_packed_bs2), 1311 (const UWORD16 *)(gau2_ih264d_4x4_v2h_reorder)); 1312 1313 if(u4_leftmbtype & D_INTRA_MB) 1314 pu4_bs_table[4] = 0x04040404; 1315 1316 if(u1_top_mb_typ & D_INTRA_MB) 1317 pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404; 1318 1319 ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16]( 1320 ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc, 1321 pu4_bs_table, ps_left_mv_pred, 1322 &(ps_dec->ps_left_mvpred_addr[u1_pingpong][1]), 1323 ps_cur_mb_info->ps_top_mb->u4_pic_addrress, 1324 (4 >> u4_cur_mb_fld)); 1325 } 1326 1327 { 1328 void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + 1329 POC_LIST_L0_TO_L1_DIFF; 1330 { 1331 /* Store Parameter for Top MvPred refernce frame Address */ 1332 1333 void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress; 1334 WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame; 1335 WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame; 1336 1337 /* Store Left addresses for Next Mb */ 1338 void ** ppv_left_mv_pred_addr = 1339 ps_dec->ps_left_mvpred_addr[!u1_pingpong][1].u4_add; 1340 WORD8 * p1_refleft0 = (ps_cur_mv_pred + 3)->i1_ref_frame; 1341 1342 ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]]; 1343 ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]]; 1344 1345 ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1346 ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1347 ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1348 ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1349 1350 ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refleft0[0]]; 1351 ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refleft0[1]]; 1352 1353 /* Storing the leftMbtype for next Mb */ 1354 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 1355 1356 } 1357 } 1358 1359 /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */ 1360 if(ps_cur_mb_info->u1_tran_form8x8) 1361 { 1362 pu4_bs_table[1] = 0; 1363 pu4_bs_table[3] = 0; 1364 pu4_bs_table[5] = 0; 1365 pu4_bs_table[7] = 0; 1366 } 1367 } 1368 1369 /*****************************************************************************/ 1370 /* */ 1371 /* Function Name : ih264d_compute_bs_mbaff */ 1372 /* */ 1373 /* Description : This function computes the pointers of left,top & current*/ 1374 /* : Nnz, MvPred & deblk_mb_t and supplies to FillBs function for*/ 1375 /* : Boundary Strength Calculation */ 1376 /* Inputs : <What inputs does the function take?> */ 1377 /* Processing : This functions calls deblock MB in the MB increment order*/ 1378 /* */ 1379 /* Outputs : Produces the Boundary Strength for Current Mb */ 1380 /* Returns : None */ 1381 /* */ 1382 /* Revision History: */ 1383 /* */ 1384 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1385 /* ITTIAM */ 1386 /*****************************************************************************/ 1387 1388 void ih264d_compute_bs_mbaff(dec_struct_t * ps_dec, 1389 dec_mb_info_t * ps_cur_mb_info, 1390 const UWORD16 u2_mbxn_mb) 1391 { 1392 /* Mvpred and Nnz for top and Courrent */ 1393 mv_pred_t *ps_cur_mv_pred, *ps_top_mv_pred = NULL, *ps_left_mv_pred; 1394 /* deblk_mb_t Params */ 1395 deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */ 1396 neighbouradd_t * ps_left_ngbr; 1397 deblkmb_neighbour_t *ps_deblk_top_mb; 1398 /* Reference Index to POC mapping*/ 1399 void ** apv_map_ref_idx_to_poc; 1400 1401 UWORD32 u4_leftmbtype; 1402 1403 1404 UWORD16 u2_left_csbp, u2_top_csbp, u2_cur_csbp; 1405 1406 /* Set of flags */ 1407 UWORD32 u4_cur_mb_intra, u4_cur_mb_fld, u4_top_mb_fld, u1_top_mb_typ, u4_left_mb_fld; 1408 UWORD32 u1_cur_mb_type; 1409 UWORD32 * pu4_bs_table; 1410 const UWORD32 u4_bot_mb = (1 - ps_cur_mb_info->u1_topmb); 1411 /* Initialization */ 1412 const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx; 1413 const UWORD32 u2_mby = ps_cur_mb_info->u2_mby; 1414 /* Load From u1_pingpong and Store in !u1_pingpong */ 1415 const UWORD32 u1_pingpong = u2_mbx & 0x01; 1416 1417 PROFILE_DISABLE_BOUNDARY_STRENGTH() 1418 1419 ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + (u2_mbx << 1); 1420 1421 1422 /************************************************/ 1423 /* Initialize the left Mb type */ 1424 /* Left MvPred */ 1425 /************************************************/ 1426 1427 if(!u2_mbx) 1428 { 1429 /************************************************************/ 1430 /* Initialize the ps_left_mv_pred with Junk but Valid Location */ 1431 /* to avoid invalid memory access */ 1432 /* this is read only pointer */ 1433 /************************************************************/ 1434 ps_left_mv_pred = ps_dec->ps_mv_cur + 16; 1435 } 1436 else 1437 { 1438 /* Come to Left Most Edge of the MB */ 1439 ps_left_mv_pred = (u2_mbxn_mb) ? 1440 ps_dec->ps_mv_cur + ((u2_mbxn_mb - 1) << 5) + 3 : 1441 ps_dec->ps_mv_left + 3; 1442 1443 ps_left_mv_pred += (u4_bot_mb << 4); 1444 } 1445 1446 u4_leftmbtype = ps_dec->deblk_left_mb[u4_bot_mb].u1_mb_type; 1447 1448 ps_left_ngbr = &(ps_dec->ps_left_mvpred_addr[u1_pingpong][u4_bot_mb]); 1449 1450 /************************************************/ 1451 /* Pointer Assignment for Current Mb Parameters */ 1452 /* Pointer Assignment for Current MvPred */ 1453 /************************************************/ 1454 ps_cur_mb_params = ps_dec->ps_deblk_mbn + (u2_mbxn_mb << 1) + u4_bot_mb; 1455 u1_cur_mb_type = ps_cur_mb_params->u1_mb_type; 1456 1457 ps_cur_mv_pred = ps_dec->ps_mv_cur + (u2_mbxn_mb << 5); 1458 ps_cur_mv_pred += (u4_bot_mb << 4); 1459 1460 /********************************************/ 1461 /* Pointer Assignment for Top Mb Parameters */ 1462 /* Pointer Assignment for Top MvPred and */ 1463 /* Pointer Assignment for Top Nnz */ 1464 /********************************************/ 1465 1466 /* CHANGED CODE */ 1467 ps_top_mv_pred = ps_cur_mv_pred - (ps_dec->u2_frm_wd_in_mbs << 5) + 12; 1468 1469 u4_cur_mb_fld = !!(u1_cur_mb_type & D_FLD_MB); 1470 u4_left_mb_fld = !!(ps_dec->deblk_left_mb[0].u1_mb_type & D_FLD_MB); 1471 1472 if(u4_left_mb_fld != u4_cur_mb_fld) 1473 { 1474 /* Flag for extra left Edge */ 1475 ps_cur_mb_params->u1_single_call = 0; 1476 1477 if(u4_bot_mb) 1478 { 1479 ps_left_ngbr--; 1480 ps_left_mv_pred -= 16; 1481 } 1482 } 1483 else 1484 ps_cur_mb_params->u1_single_call = 1; 1485 1486 apv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc + 1; 1487 if(u4_cur_mb_fld) 1488 { 1489 if(u4_bot_mb) 1490 { 1491 apv_map_ref_idx_to_poc += BOT_LIST_FLD_L0; 1492 } 1493 else 1494 { 1495 apv_map_ref_idx_to_poc += TOP_LIST_FLD_L0; 1496 } 1497 } 1498 1499 /**********************************************************/ 1500 /* if no deblocking required for current Mb then continue */ 1501 /**********************************************************/ 1502 if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING) 1503 { 1504 void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + 1505 POC_LIST_L0_TO_L1_DIFF; 1506 1507 { 1508 /* Store Parameter for Top MvPred refernce frame Address */ 1509 1510 void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress; 1511 void ** ppv_left_mv_pred_addr = 1512 ps_dec->ps_left_mvpred_addr[!u1_pingpong][u4_bot_mb].u4_add; 1513 WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame; 1514 WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame; 1515 WORD8 * p1_refLeft0 = (ps_cur_mv_pred + 3)->i1_ref_frame; 1516 ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]]; 1517 ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]]; 1518 ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1519 ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1520 ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1521 ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1522 ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refLeft0[0]]; 1523 ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refLeft0[1]]; 1524 } 1525 if(u4_bot_mb) 1526 { 1527 /* store The Left Mb Type*/ 1528 ps_dec->deblk_left_mb[0].u1_mb_type = 1529 (ps_cur_mb_params - 1)->u1_mb_type; 1530 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 1531 1532 } 1533 ps_deblk_top_mb[u4_bot_mb].u1_mb_type = u1_cur_mb_type; 1534 return; 1535 } 1536 1537 if(u2_mby) 1538 { 1539 u1_top_mb_typ = ps_deblk_top_mb[1].u1_mb_type; 1540 u4_top_mb_fld = !!(u1_top_mb_typ & D_FLD_MB); 1541 1542 if(!u4_bot_mb) 1543 { 1544 if(u4_top_mb_fld & u4_cur_mb_fld) 1545 u1_top_mb_typ = ps_deblk_top_mb[0].u1_mb_type; 1546 else 1547 { 1548 ps_top_mv_pred += 16; 1549 } 1550 } 1551 } 1552 else 1553 { 1554 u4_top_mb_fld = u4_cur_mb_fld; 1555 u1_top_mb_typ = 0; 1556 } 1557 1558 if(u4_bot_mb & !u4_cur_mb_fld) 1559 { 1560 u1_top_mb_typ = ps_deblk_top_mb[0].u1_mb_type; 1561 u4_top_mb_fld = u4_cur_mb_fld; 1562 ps_top_mv_pred = ps_cur_mv_pred - 4; 1563 } 1564 1565 pu4_bs_table = ps_cur_mb_params->u4_bs_table; 1566 u4_cur_mb_intra = u1_cur_mb_type & D_INTRA_MB; 1567 1568 u2_cur_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp; 1569 u2_left_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp; 1570 u2_top_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp; 1571 /* Compute BS function */ 1572 if(ps_dec->ps_cur_sps->u1_profile_idc == HIGH_PROFILE_IDC) 1573 { 1574 1575 if(ps_cur_mb_info->u1_tran_form8x8 == 1) 1576 { 1577 u2_cur_csbp = ih264d_update_csbp_8x8( 1578 ps_cur_mb_info->ps_curmb->u2_luma_csbp); 1579 } 1580 1581 if(ps_cur_mb_info->ps_left_mb->u1_tran_form8x8 == 1) 1582 { 1583 u2_left_csbp = ih264d_update_csbp_8x8( 1584 ps_cur_mb_info->ps_left_mb->u2_luma_csbp); 1585 } 1586 1587 if(ps_cur_mb_info->ps_top_mb->u1_tran_form8x8 == 1) 1588 { 1589 u2_top_csbp = ih264d_update_csbp_8x8( 1590 ps_cur_mb_info->ps_top_mb->u2_luma_csbp); 1591 } 1592 } 1593 if(u4_cur_mb_intra) 1594 { 1595 1596 pu4_bs_table[4] = 0x04040404; 1597 if((0 == u4_cur_mb_fld) && (0 == u4_top_mb_fld)) 1598 { 1599 pu4_bs_table[0] = 0x04040404; 1600 } 1601 else 1602 { 1603 pu4_bs_table[0] = 0x03030303; 1604 } 1605 1606 pu4_bs_table[1] = 0x03030303; 1607 pu4_bs_table[2] = 0x03030303; 1608 pu4_bs_table[3] = 0x03030303; 1609 pu4_bs_table[5] = 0x03030303; 1610 pu4_bs_table[6] = 0x03030303; 1611 pu4_bs_table[7] = 0x03030303; 1612 1613 /*********************************************************************/ 1614 /* Fill Bs of xtra top and left edge unconditionally to avoid checks */ 1615 /*********************************************************************/ 1616 pu4_bs_table[8] = 0x03030303; 1617 pu4_bs_table[9] = 0x04040404; 1618 } 1619 else 1620 { 1621 UWORD32 u4_is_non16x16 = !!(u1_cur_mb_type & D_PRED_NON_16x16); 1622 UWORD32 u4_is_b = ps_dec->u1_B; 1623 1624 ih264d_fill_bs2_horz_vert( 1625 pu4_bs_table, u2_left_csbp, u2_top_csbp, u2_cur_csbp, 1626 (const UWORD32 *)(gau4_ih264d_packed_bs2), 1627 (const UWORD16 *)(gau2_ih264d_4x4_v2h_reorder)); 1628 1629 if(u4_leftmbtype & D_INTRA_MB) 1630 pu4_bs_table[4] = 0x04040404; 1631 1632 if(u1_top_mb_typ & D_INTRA_MB) 1633 pu4_bs_table[0] = u4_cur_mb_fld ? 0x03030303 : 0x04040404; 1634 else if(u4_cur_mb_fld != u4_top_mb_fld) 1635 { 1636 /****************************************************/ 1637 /* Setting BS for mixed mode edge=1 when (Bs!=2) */ 1638 /****************************************************/ 1639 pu4_bs_table[0] = (pu4_bs_table[0] >> 1) + 0x01010101; 1640 } 1641 1642 { 1643 /* Call to Compute Boundary Strength for Extra Left Edge */ 1644 if(u2_mbx 1645 && !(ps_cur_mb_params->u1_deblocking_mode 1646 & MB_DISABLE_LEFT_EDGE)) 1647 { 1648 if(u4_cur_mb_fld != u4_left_mb_fld) 1649 { 1650 UWORD32 u4_left_mb_t_csbp = 1651 ps_cur_mb_info->ps_left_mb[0].u2_luma_csbp; 1652 UWORD32 u4_left_mb_b_csbp = 1653 ps_cur_mb_info->ps_left_mb[1].u2_luma_csbp; 1654 if(1 == ps_cur_mb_info->ps_left_mb[0].u1_tran_form8x8) 1655 { 1656 u4_left_mb_t_csbp = (UWORD32)ih264d_update_csbp_8x8( 1657 (UWORD16)u4_left_mb_t_csbp); 1658 } 1659 1660 if(1 == ps_cur_mb_info->ps_left_mb[1].u1_tran_form8x8) 1661 { 1662 u4_left_mb_b_csbp = (UWORD32)ih264d_update_csbp_8x8( 1663 (UWORD16)u4_left_mb_b_csbp); 1664 } 1665 ps_dec->pf_fill_bs_xtra_left_edge[u4_cur_mb_fld]( 1666 pu4_bs_table, u4_left_mb_t_csbp, 1667 u4_left_mb_b_csbp, u2_cur_csbp, u4_bot_mb); 1668 1669 if(ps_dec->deblk_left_mb[0].u1_mb_type & D_INTRA_MB) 1670 pu4_bs_table[4] = 0x04040404; 1671 1672 if(ps_dec->deblk_left_mb[1].u1_mb_type & D_INTRA_MB) 1673 pu4_bs_table[9] = 0x04040404; 1674 1675 } 1676 } 1677 /* Call to Compute Boundary Strength for Extra Top Edge */ 1678 if(u2_mby 1679 && !(ps_cur_mb_params->u1_deblocking_mode 1680 & MB_DISABLE_TOP_EDGE)) 1681 { 1682 if((((!u4_bot_mb) & (!u4_cur_mb_fld)) && u4_top_mb_fld)) 1683 { 1684 UWORD32 u4_topmb_t_csbp = 1685 ps_cur_mb_info->ps_top_mb[-1].u2_luma_csbp; 1686 UWORD32 u4_topmb_b_csbp = 1687 ps_cur_mb_info->ps_top_mb[0].u2_luma_csbp; 1688 if(1 == ps_cur_mb_info->ps_top_mb[-1].u1_tran_form8x8) 1689 { 1690 u4_topmb_t_csbp = (UWORD32)ih264d_update_csbp_8x8( 1691 (UWORD16)u4_topmb_t_csbp); 1692 } 1693 1694 if(1 == ps_cur_mb_info->ps_top_mb[0].u1_tran_form8x8) 1695 { 1696 u4_topmb_b_csbp = (UWORD32)ih264d_update_csbp_8x8( 1697 (UWORD16)u4_topmb_b_csbp); 1698 } 1699 ih264d_fill_bs_xtra_top_edge(pu4_bs_table, u4_topmb_t_csbp, 1700 u4_topmb_b_csbp, u2_cur_csbp); 1701 1702 if(ps_deblk_top_mb[0].u1_mb_type & D_INTRA_MB) 1703 pu4_bs_table[8] = 0x03030303; 1704 1705 if(ps_deblk_top_mb[1].u1_mb_type & D_INTRA_MB) 1706 pu4_bs_table[0] = 0x03030303; 1707 } 1708 } 1709 } 1710 1711 ps_dec->pf_fill_bs1[u4_is_b][u4_is_non16x16]( 1712 ps_cur_mv_pred, ps_top_mv_pred, apv_map_ref_idx_to_poc, 1713 pu4_bs_table, ps_left_mv_pred, ps_left_ngbr, 1714 ps_cur_mb_info->ps_top_mb->u4_pic_addrress, 1715 (4 >> u4_cur_mb_fld)); 1716 } 1717 1718 { 1719 void ** pu4_map_ref_idx_to_poc_l1 = apv_map_ref_idx_to_poc + 1720 POC_LIST_L0_TO_L1_DIFF; 1721 1722 { 1723 /* Store Parameter for Top MvPred refernce frame Address */ 1724 void ** ppv_top_mv_pred_addr = ps_cur_mb_info->ps_curmb->u4_pic_addrress; 1725 void ** ppv_left_mv_pred_addr = 1726 ps_dec->ps_left_mvpred_addr[!u1_pingpong][u4_bot_mb].u4_add; 1727 WORD8 * p1_refTop0 = (ps_cur_mv_pred + 12)->i1_ref_frame; 1728 WORD8 * p1_refTop1 = (ps_cur_mv_pred + 14)->i1_ref_frame; 1729 WORD8 * p1_refLeft0 = (ps_cur_mv_pred + 3)->i1_ref_frame; 1730 ppv_top_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refTop0[0]]; 1731 ppv_top_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refTop0[1]]; 1732 ppv_left_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1733 ppv_top_mv_pred_addr[2] = apv_map_ref_idx_to_poc[p1_refTop1[0]]; 1734 ppv_left_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1735 ppv_top_mv_pred_addr[3] = pu4_map_ref_idx_to_poc_l1[p1_refTop1[1]]; 1736 ppv_left_mv_pred_addr[0] = apv_map_ref_idx_to_poc[p1_refLeft0[0]]; 1737 ppv_left_mv_pred_addr[1] = pu4_map_ref_idx_to_poc_l1[p1_refLeft0[1]]; 1738 } 1739 if(u4_bot_mb) 1740 { 1741 /* store The Left Mb Type*/ 1742 ps_dec->deblk_left_mb[0].u1_mb_type = 1743 (ps_cur_mb_params - 1)->u1_mb_type; 1744 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 1745 1746 } 1747 ps_deblk_top_mb[u4_bot_mb].u1_mb_type = u1_cur_mb_type; 1748 } 1749 /* For transform 8x8 disable deblocking of the intrernal edges of a 8x8 block */ 1750 if(ps_cur_mb_info->u1_tran_form8x8) 1751 { 1752 pu4_bs_table[1] = 0; 1753 pu4_bs_table[3] = 0; 1754 pu4_bs_table[5] = 0; 1755 pu4_bs_table[7] = 0; 1756 } 1757 1758 } 1759 1760 1761 1762 /*! 1763 ************************************************************************** 1764 * \if Function name : ih264d_fill_bs_for_mb \endif 1765 * 1766 * \brief 1767 * Determines the boundary strength (Bs), for the complete MB. Bs is 1768 * determined for each block boundary between two neighbouring 4x4 1769 * luma blocks, then packed in a UWORD32, first Bs placed in MSB and 1770 * so on. Such packed Bs values for all 8 edges are kept in an array. 1771 * 1772 * \return 1773 * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3 1774 * 1775 ************************************************************************** 1776 */ 1777 1778 void ih264d_fill_bs_for_mb(deblk_mb_t * ps_cur_mb_params, 1779 deblk_mb_t * ps_top_mb_params, 1780 deblk_mb_t * ps_left_mb_params, 1781 mv_pred_t *ps_cur_mv_pred, 1782 mv_pred_t *ps_top_mv_pred, 1783 UWORD8 *puc_cur_nnz, 1784 UWORD8 *puc_top_nnz, 1785 void **ppv_map_ref_idx_to_poc, 1786 UWORD32 ui_mbAff, 1787 UWORD32 ui_bs_table[], /* pointer to the BsTable array */ 1788 mv_pred_t *ps_leftmost_mv_pred, 1789 neighbouradd_t *ps_left_addr, 1790 neighbouradd_t *ps_top_add) 1791 { 1792 UWORD32 u4_bs_horz = 0; 1793 UWORD8 edge, u1_top_intra = 0, u1_left_intra = 0; 1794 mv_pred_t *ps_left_mv_pred; 1795 WORD16 i2_cur_mv0, i2_cur_mv1, i16_curMv2, i16_curMv3; 1796 WORD16 i2_left_mv0, i2_left_mv1, i2_left_mv2, i2_left_mv3; 1797 WORD16 i2_top_mv0, i2_top_mv1, i16_topMv2, i16_topMv3; 1798 WORD8 i1_cur_ref0, i1_cur_ref1, i1_left_ref0, i1_left_ref1, i1_top_ref0, i1_top_ref1; 1799 UWORD8 uc_cur_nnz, uc_left_nnz, uc_top_nnz, u1_mb_type, uc_Bslice; 1800 void **ppv_map_ref_idx_to_poc_l0, **ppv_map_ref_idx_to_poc_l1; 1801 UWORD8 uc_temp; 1802 UWORD8 uc_cur_mb_fld, uc_top_mb_fld; 1803 UWORD32 c_mv_limit; 1804 1805 u1_mb_type = ps_cur_mb_params->u1_mb_type; 1806 uc_Bslice = u1_mb_type & D_B_SLICE; 1807 ppv_map_ref_idx_to_poc_l0 = ppv_map_ref_idx_to_poc; 1808 ppv_map_ref_idx_to_poc_l1 = ppv_map_ref_idx_to_poc + POC_LIST_L0_TO_L1_DIFF; 1809 1810 ps_top_mb_params = ps_top_mb_params ? ps_top_mb_params : ps_cur_mb_params; 1811 u1_top_intra = ps_top_mb_params->u1_mb_type & D_INTRA_MB; 1812 u1_left_intra = ps_left_mb_params->u1_mb_type & D_INTRA_MB; 1813 1814 ui_bs_table[4] = 0x04040404; //Default for INTRA MB Boundary edges. 1815 uc_cur_mb_fld = (ps_cur_mb_params->u1_mb_type & D_FLD_MB) >> 7; 1816 uc_top_mb_fld = (ps_top_mb_params->u1_mb_type & D_FLD_MB) >> 7; 1817 1818 c_mv_limit = 4 >> uc_cur_mb_fld; 1819 if((0 == uc_cur_mb_fld) && (0 == uc_top_mb_fld)) 1820 { 1821 ui_bs_table[0] = 0x04040404; 1822 } 1823 else 1824 { 1825 ui_bs_table[0] = 0x03030303; 1826 } 1827 1828 for(edge = 0; edge < 4; 1829 edge++, ps_top_mv_pred = ps_cur_mv_pred - 4, puc_top_nnz = 1830 puc_cur_nnz - 4) 1831 { 1832 //Each iteration of this loop fills the four BS values of one HORIZ edge and 1833 //one BS value for each of the four VERT edges. 1834 WORD8 i = 0; 1835 UWORD8 uc_bs_horiz, uc_bs_vert; 1836 UWORD32 ui_cnd; 1837 void *ui_ref_pic_addr[4]; 1838 UWORD8 uc_mixed_mode_edge; 1839 1840 uc_mixed_mode_edge = 0; 1841 1842 uc_temp = (ui_mbAff << 4) + 13; 1843 1844 uc_cur_nnz = *(puc_cur_nnz - uc_temp); 1845 ps_left_mv_pred = ps_leftmost_mv_pred + (edge << 2); 1846 1847 for(i = 0; i < 4; i++, ps_top_mv_pred++, ps_cur_mv_pred++) 1848 { 1849 //Each iteration of this inner loop computes a HORIZ 1850 //and a VERT BS value for a 4x4 block 1851 1852 uc_left_nnz = uc_cur_nnz; 1853 uc_cur_nnz = *puc_cur_nnz++; 1854 uc_top_nnz = *puc_top_nnz++; 1855 1856 //VERT edge is assigned BS values first 1857 ui_cnd = !(uc_left_nnz || uc_cur_nnz); 1858 uc_bs_vert = 2; 1859 1860 if(ui_cnd) 1861 { 1862 i2_left_mv0 = ps_left_mv_pred->i2_mv[0]; 1863 i2_left_mv1 = ps_left_mv_pred->i2_mv[1]; 1864 i2_left_mv2 = ps_left_mv_pred->i2_mv[2]; 1865 i2_left_mv3 = ps_left_mv_pred->i2_mv[3]; 1866 1867 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 1868 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 1869 i16_curMv2 = ps_cur_mv_pred->i2_mv[2]; 1870 i16_curMv3 = ps_cur_mv_pred->i2_mv[3]; 1871 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 1872 i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1]; 1873 ui_ref_pic_addr[2] = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 1874 ui_ref_pic_addr[3] = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1]; 1875 1876 if(i) 1877 { 1878 i1_left_ref0 = ps_left_mv_pred->i1_ref_frame[0]; 1879 i1_left_ref1 = ps_left_mv_pred->i1_ref_frame[1]; 1880 ui_ref_pic_addr[0] = ppv_map_ref_idx_to_poc_l0[i1_left_ref0]; 1881 ui_ref_pic_addr[1] = ppv_map_ref_idx_to_poc_l1[i1_left_ref1]; 1882 } 1883 else 1884 { 1885 ui_ref_pic_addr[0] = ps_left_addr->u4_add[edge & 2]; 1886 ui_ref_pic_addr[1] = ps_left_addr->u4_add[1 + (edge & 2)]; 1887 } 1888 if(!uc_Bslice) 1889 { 1890 uc_bs_vert = 1891 (ui_ref_pic_addr[0] != ui_ref_pic_addr[2]) 1892 | (ABS((i2_left_mv0 1893 - i2_cur_mv0)) 1894 >= 4) 1895 | (ABS((i2_left_mv1 1896 - i2_cur_mv1)) 1897 >= (UWORD8)c_mv_limit); 1898 } 1899 else 1900 { 1901 UWORD8 uc_bs_temp1, uc_bs_temp2; 1902 1903 uc_bs_vert = 1; 1904 1905 uc_bs_temp1 = 1906 ((ABS((i2_left_mv0 - i2_cur_mv0)) 1907 >= 4) 1908 | (ABS((i2_left_mv1 1909 - i2_cur_mv1)) 1910 >= (UWORD8)c_mv_limit) 1911 | (ABS((i2_left_mv2 1912 - i16_curMv2)) 1913 >= 4) 1914 | (ABS((i2_left_mv3 1915 - i16_curMv3)) 1916 >= (UWORD8)c_mv_limit)); 1917 1918 uc_bs_temp2 = 1919 ((ABS((i2_left_mv0 - i16_curMv2)) 1920 >= 4) 1921 | (ABS((i2_left_mv1 1922 - i16_curMv3)) 1923 >= (UWORD8)c_mv_limit) 1924 | (ABS((i2_left_mv2 1925 - i2_cur_mv0)) 1926 >= 4) 1927 | (ABS((i2_left_mv3 1928 - i2_cur_mv1)) 1929 >= (UWORD8)c_mv_limit)); 1930 1931 uc_bs_vert = 1932 (((ui_ref_pic_addr[0] != ui_ref_pic_addr[2]) 1933 || (ui_ref_pic_addr[1] 1934 != ui_ref_pic_addr[3])) 1935 || (uc_bs_temp1)) 1936 && (((ui_ref_pic_addr[0] 1937 != ui_ref_pic_addr[3]) 1938 || (ui_ref_pic_addr[1] 1939 != ui_ref_pic_addr[2])) 1940 || (uc_bs_temp2)); 1941 1942 } 1943 } 1944 //Fill the VERT BS, only if valid i.e., 1945 //if it is a non-edge OR it is an edge, which is not yet filled 1946 uc_bs_vert = (!i && u1_left_intra) ? 4 : uc_bs_vert; 1947 ui_bs_table[i + 4] = (ui_bs_table[i + 4] << 8) | uc_bs_vert; 1948 1949 //HORIZ edge is assigned BS values next 1950 ui_cnd = !(uc_top_nnz || uc_cur_nnz); 1951 uc_bs_horiz = 2; 1952 1953 if(ui_cnd) 1954 { 1955 uc_mixed_mode_edge = 1956 (0 == edge) ? (uc_top_mb_fld != uc_cur_mb_fld) : 0; 1957 ui_cnd = 1 - uc_mixed_mode_edge; 1958 uc_bs_horiz = uc_mixed_mode_edge; 1959 } 1960 1961 if(ui_cnd) 1962 { 1963 i2_cur_mv0 = ps_cur_mv_pred->i2_mv[0]; 1964 i2_cur_mv1 = ps_cur_mv_pred->i2_mv[1]; 1965 i16_curMv2 = ps_cur_mv_pred->i2_mv[2]; 1966 i16_curMv3 = ps_cur_mv_pred->i2_mv[3]; 1967 i1_cur_ref0 = ps_cur_mv_pred->i1_ref_frame[0]; 1968 i1_cur_ref1 = ps_cur_mv_pred->i1_ref_frame[1]; 1969 1970 i2_top_mv0 = ps_top_mv_pred->i2_mv[0]; 1971 i2_top_mv1 = ps_top_mv_pred->i2_mv[1]; 1972 i16_topMv2 = ps_top_mv_pred->i2_mv[2]; 1973 i16_topMv3 = ps_top_mv_pred->i2_mv[3]; 1974 ui_ref_pic_addr[2] = ppv_map_ref_idx_to_poc_l0[i1_cur_ref0]; 1975 ui_ref_pic_addr[3] = ppv_map_ref_idx_to_poc_l1[i1_cur_ref1]; 1976 if(edge) 1977 { 1978 i1_top_ref0 = ps_top_mv_pred->i1_ref_frame[0]; 1979 i1_top_ref1 = ps_top_mv_pred->i1_ref_frame[1]; 1980 ui_ref_pic_addr[0] = ppv_map_ref_idx_to_poc_l0[i1_top_ref0]; 1981 ui_ref_pic_addr[1] = ppv_map_ref_idx_to_poc_l1[i1_top_ref1]; 1982 } 1983 else 1984 { 1985 ui_ref_pic_addr[0] = ps_top_add->u4_add[i & 2]; 1986 ui_ref_pic_addr[1] = ps_top_add->u4_add[1 + (i & 2)]; 1987 } 1988 if(!uc_Bslice) 1989 { 1990 uc_bs_horiz = 1991 (ui_ref_pic_addr[0] != ui_ref_pic_addr[2]) 1992 | (ABS((i2_top_mv0 1993 - i2_cur_mv0)) 1994 >= 4) 1995 | (ABS((i2_top_mv1 1996 - i2_cur_mv1)) 1997 >= (UWORD8)c_mv_limit); 1998 } 1999 else 2000 { 2001 UWORD8 uc_bs_temp1, uc_bs_temp2; 2002 2003 uc_bs_horiz = 1; 2004 2005 uc_bs_temp1 = 2006 ((ABS((i2_top_mv0 - i2_cur_mv0)) 2007 >= 4) 2008 | (ABS((i2_top_mv1 2009 - i2_cur_mv1)) 2010 >= (UWORD8)c_mv_limit) 2011 | (ABS((i16_topMv2 2012 - i16_curMv2)) 2013 >= 4) 2014 | (ABS((i16_topMv3 2015 - i16_curMv3)) 2016 >= (UWORD8)c_mv_limit)); 2017 2018 uc_bs_temp2 = 2019 ((ABS((i2_top_mv0 - i16_curMv2)) 2020 >= 4) 2021 | (ABS((i2_top_mv1 2022 - i16_curMv3)) 2023 >= (UWORD8)c_mv_limit) 2024 | (ABS((i16_topMv2 2025 - i2_cur_mv0)) 2026 >= 4) 2027 | (ABS((i16_topMv3 2028 - i2_cur_mv1)) 2029 >= (UWORD8)c_mv_limit)); 2030 2031 uc_bs_horiz = 2032 (((ui_ref_pic_addr[0] != ui_ref_pic_addr[2]) 2033 || (ui_ref_pic_addr[1] 2034 != ui_ref_pic_addr[3])) 2035 || (uc_bs_temp1)) 2036 && (((ui_ref_pic_addr[0] 2037 != ui_ref_pic_addr[3]) 2038 || (ui_ref_pic_addr[1] 2039 != ui_ref_pic_addr[2])) 2040 || (uc_bs_temp2)); 2041 2042 } 2043 } 2044 ps_left_mv_pred = ps_cur_mv_pred; 2045 u4_bs_horz = (u4_bs_horz << 8) + uc_bs_horiz; 2046 } 2047 //Fill the HORIZ BS, only if valid i.e., 2048 //if it is a non-edge OR it is an edge, which is not yet filled 2049 if(edge || (!edge && !u1_top_intra)) 2050 ui_bs_table[edge] = u4_bs_horz; 2051 } 2052 } 2053 2054 /*! 2055 ************************************************************************** 2056 * \if Function name : ih264d_fill_bs_for_extra_left_edge \endif 2057 * 2058 * \brief 2059 * Fills the boundary strength (Bs), for the top extra edge. ock 2060 * 2061 * \return 2062 * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3 2063 * 2064 ************************************************************************** 2065 */ 2066 void ih264d_fill_bs_for_extra_left_edge(deblk_mb_t *ps_cur_deblk_mb, 2067 deblk_mb_t *ps_leftDeblkMb, 2068 UWORD8* puc_cur_nnz, 2069 UWORD8 uc_botMb) 2070 { 2071 /* Set the Flag in uc_deblocking_mode variable of current MB*/ 2072 /* for mixed mode edge*/ 2073 ps_cur_deblk_mb->u1_single_call = 0; 2074 2075 if(ps_cur_deblk_mb->u1_mb_type & D_INTRA_MB) 2076 { 2077 ps_cur_deblk_mb->u4_bs_table[4] = 0x04040404; 2078 ps_cur_deblk_mb->u4_bs_table[9] = 0x04040404; 2079 } 2080 else if((ps_leftDeblkMb->u1_mb_type & D_INTRA_MB) 2081 && ((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB)) 2082 { 2083 ps_cur_deblk_mb->u4_bs_table[4] = 0x04040404; 2084 ps_cur_deblk_mb->u4_bs_table[9] = 0x04040404; 2085 } 2086 else 2087 { 2088 /* Get strengths of left MB edge */ 2089 UWORD32 u4_bs; 2090 UWORD8 uc_Bs; 2091 WORD32 i; 2092 UWORD32 ui_curMbFld; 2093 UWORD8 *puc_left_nnz; 2094 UWORD32 ui_bs_left_edge[2]; 2095 2096 ui_curMbFld = (ps_cur_deblk_mb->u1_mb_type & D_FLD_MB) >> 7; 2097 2098 puc_left_nnz = puc_cur_nnz - 29; 2099 if((ui_curMbFld == 0) && uc_botMb) 2100 { 2101 puc_left_nnz -= 8; 2102 } 2103 else if(ui_curMbFld && uc_botMb) 2104 { 2105 puc_left_nnz -= 16; 2106 } 2107 2108 if(ui_curMbFld) 2109 { 2110 if(ps_leftDeblkMb->u1_mb_type & D_INTRA_MB) 2111 { 2112 ui_bs_left_edge[0] = 0x04040404; 2113 puc_left_nnz += 16; 2114 puc_cur_nnz += 8; 2115 } 2116 else 2117 { 2118 u4_bs = 0; 2119 for(i = 4; i > 0; i--) 2120 { 2121 uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1; 2122 u4_bs = (u4_bs << 8) | uc_Bs; 2123 puc_left_nnz += 4; 2124 if(i & 0x01) 2125 puc_cur_nnz += 4; 2126 } 2127 ui_bs_left_edge[0] = u4_bs; 2128 } 2129 2130 if((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB) 2131 { 2132 ui_bs_left_edge[1] = 0x04040404; 2133 } 2134 else 2135 { 2136 u4_bs = 0; 2137 for(i = 4; i > 0; i--) 2138 { 2139 uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1; 2140 u4_bs = (u4_bs << 8) | uc_Bs; 2141 puc_left_nnz += 4; 2142 if(i & 0x01) 2143 puc_cur_nnz += 4; 2144 } 2145 ui_bs_left_edge[1] = u4_bs; 2146 } 2147 } 2148 else 2149 { 2150 UWORD8 *puc_curNnzB, *puc_leftNnzB; 2151 puc_curNnzB = puc_cur_nnz; 2152 puc_leftNnzB = puc_left_nnz + 16; 2153 if(ps_leftDeblkMb->u1_mb_type & D_INTRA_MB) 2154 { 2155 ui_bs_left_edge[0] = 0x04040404; 2156 } 2157 else 2158 { 2159 u4_bs = 0; 2160 for(i = 4; i > 0; i--, puc_cur_nnz += 4) 2161 { 2162 uc_Bs = ((*puc_cur_nnz || *puc_left_nnz)) ? 2 : 1; 2163 u4_bs = (u4_bs << 8) | uc_Bs; 2164 if(i & 0x01) 2165 puc_left_nnz += 4; 2166 } 2167 ui_bs_left_edge[0] = u4_bs; 2168 } 2169 2170 if((ps_leftDeblkMb + 1)->u1_mb_type & D_INTRA_MB) 2171 { 2172 ui_bs_left_edge[1] = 0x04040404; 2173 } 2174 else 2175 { 2176 u4_bs = 0; 2177 for(i = 4; i > 0; i--, puc_curNnzB += 4) 2178 { 2179 uc_Bs = ((*puc_curNnzB || *puc_leftNnzB)) ? 2 : 1; 2180 u4_bs = (u4_bs << 8) | uc_Bs; 2181 if(i & 0x01) 2182 puc_leftNnzB += 4; 2183 } 2184 ui_bs_left_edge[1] = u4_bs; 2185 } 2186 } 2187 /* Copy The Values in Cur Deblk Mb Parameters */ 2188 ps_cur_deblk_mb->u4_bs_table[4] = ui_bs_left_edge[0]; 2189 ps_cur_deblk_mb->u4_bs_table[9] = ui_bs_left_edge[1]; 2190 } 2191 2192 } 2193 2194 /*! 2195 ************************************************************************** 2196 * \if Function name : ih264d_fill_bs_for_extra_top_edge \endif 2197 * 2198 * \brief 2199 * Fills the boundary strength (Bs), for the top extra edge. ock 2200 * 2201 * \return 2202 * Returns the packed boundary strength(Bs) MSB -> LSB Bs0|Bs1|Bs2|Bs3 2203 * 2204 ************************************************************************** 2205 */ 2206 void ih264d_fill_bs_for_extra_top_edge(deblk_mb_t *ps_cur_mb_params, 2207 UWORD8 u1_Edge0_mb_typ, 2208 UWORD8 u1_Edge1_mb_typ, 2209 UWORD8 *pu1_curNnz, 2210 UWORD8 *pu1_topNnz) 2211 { 2212 UWORD32 u4_bs; 2213 UWORD8 uc_Bs; 2214 WORD32 i; 2215 UWORD8 *pu1_cur_nnz_tmp; 2216 UWORD8 *pu1_top_nnz_tmp; 2217 UWORD8 u1_top_edge; 2218 UWORD8 u1_top_mb_type; 2219 for(u1_top_edge = 0; u1_top_edge < 2; u1_top_edge++) 2220 { 2221 u1_top_mb_type = u1_top_edge ? u1_Edge1_mb_typ : u1_Edge0_mb_typ; 2222 pu1_cur_nnz_tmp = pu1_curNnz; 2223 pu1_top_nnz_tmp = pu1_topNnz + (u1_top_edge << 2); 2224 2225 if((ps_cur_mb_params->u1_mb_type & D_INTRA_MB) 2226 + (u1_top_mb_type & D_INTRA_MB)) 2227 { 2228 u4_bs = 0x03030303; 2229 } 2230 else 2231 { 2232 u4_bs = 0; 2233 for(i = 4; i > 0; i--, pu1_cur_nnz_tmp += 1, pu1_top_nnz_tmp += 1) 2234 { 2235 uc_Bs = ((*pu1_cur_nnz_tmp || *pu1_top_nnz_tmp)) ? 2 : 1; 2236 u4_bs = (u4_bs << 8) | uc_Bs; 2237 } 2238 } 2239 if(u1_top_edge) 2240 ps_cur_mb_params->u4_bs_table[0] = u4_bs; 2241 else 2242 ps_cur_mb_params->u4_bs_table[8] = u4_bs; 2243 } 2244 } 2245 2246 2247 void ih264d_fill_bs_mbedge_4(dec_struct_t * ps_dec, 2248 dec_mb_info_t * ps_cur_mb_info, 2249 const UWORD16 u2_mbxn_mb) 2250 { 2251 2252 /* deblk_mb_t Params */ 2253 deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */ 2254 deblkmb_neighbour_t *ps_deblk_top_mb; 2255 UWORD32 * pu4_bs_table; 2256 UWORD8 u1_cur_mb_type; 2257 2258 /* Neighbour availability */ 2259 /* Initialization */ 2260 const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx; 2261 const UWORD32 u2_mby = ps_cur_mb_info->u2_mby; 2262 const UWORD32 u1_pingpong = u2_mbx & 0x01; 2263 ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx; 2264 2265 2266 /* Pointer assignment for Current DeblkMB, Current Mv Pred */ 2267 ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb; 2268 2269 u1_cur_mb_type = ps_cur_mb_params->u1_mb_type; 2270 2271 ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type; 2272 2273 { 2274 UWORD8 mb_qp_temp; 2275 2276 ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp; 2277 ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 2278 2279 ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp; 2280 ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 2281 2282 } 2283 2284 ps_cur_mb_params->u1_single_call = 1; 2285 2286 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 2287 /* if no deblocking required for current Mb then continue */ 2288 /* Check next Mbs in Mb group */ 2289 if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING) 2290 { 2291 /* Storing the leftMbtype for next Mb */ 2292 return; 2293 } 2294 2295 /* Compute BS function */ 2296 pu4_bs_table = ps_cur_mb_params->u4_bs_table; 2297 2298 pu4_bs_table[4] = 0x04040404; 2299 pu4_bs_table[0] = 0x04040404; 2300 pu4_bs_table[1] = 0; 2301 pu4_bs_table[2] = 0; 2302 pu4_bs_table[3] = 0; 2303 pu4_bs_table[5] = 0; 2304 pu4_bs_table[6] = 0; 2305 pu4_bs_table[7] = 0; 2306 2307 } 2308 2309 void ih264d_fill_bs_mbedge_2(dec_struct_t * ps_dec, 2310 dec_mb_info_t * ps_cur_mb_info, 2311 const UWORD16 u2_mbxn_mb) 2312 { 2313 2314 /* deblk_mb_t Params */ 2315 deblk_mb_t *ps_cur_mb_params; /*< Parameters of current MacroBlock */ 2316 deblkmb_neighbour_t *ps_deblk_top_mb; 2317 UWORD32 * pu4_bs_table; 2318 UWORD8 u1_cur_mb_type; 2319 2320 /* Neighbour availability */ 2321 /* Initialization */ 2322 const UWORD32 u2_mbx = ps_cur_mb_info->u2_mbx; 2323 const UWORD32 u2_mby = ps_cur_mb_info->u2_mby; 2324 const UWORD32 u1_pingpong = u2_mbx & 0x01; 2325 ps_deblk_top_mb = ps_dec->ps_deblk_top_mb + u2_mbx; 2326 2327 2328 /* Pointer assignment for Current DeblkMB, Current Mv Pred */ 2329 ps_cur_mb_params = ps_dec->ps_deblk_mbn + u2_mbxn_mb; 2330 2331 u1_cur_mb_type = ps_cur_mb_params->u1_mb_type; 2332 2333 ps_deblk_top_mb->u1_mb_type = u1_cur_mb_type; 2334 2335 { 2336 UWORD8 mb_qp_temp; 2337 2338 ps_cur_mb_params->u1_topmb_qp = ps_deblk_top_mb->u1_mb_qp; 2339 ps_deblk_top_mb->u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 2340 2341 ps_cur_mb_params->u1_left_mb_qp = ps_dec->deblk_left_mb[1].u1_mb_qp; 2342 ps_dec->deblk_left_mb[1].u1_mb_qp = ps_cur_mb_params->u1_mb_qp; 2343 2344 } 2345 2346 ps_cur_mb_params->u1_single_call = 1; 2347 2348 ps_dec->deblk_left_mb[1].u1_mb_type = ps_cur_mb_params->u1_mb_type; 2349 /* if no deblocking required for current Mb then continue */ 2350 /* Check next Mbs in Mb group */ 2351 if(ps_cur_mb_params->u1_deblocking_mode & MB_DISABLE_FILTERING) 2352 { 2353 /* Storing the leftMbtype for next Mb */ 2354 return; 2355 } 2356 2357 /* Compute BS function */ 2358 pu4_bs_table = ps_cur_mb_params->u4_bs_table; 2359 2360 { 2361 UWORD32 top_mb_csbp, left_mb_csbp, cur_mb_csbp; 2362 UWORD32 top_edge, left_edge; 2363 2364 top_mb_csbp = ps_cur_mb_info->ps_top_mb->u2_luma_csbp; 2365 left_mb_csbp = ps_cur_mb_info->ps_left_mb->u2_luma_csbp; 2366 cur_mb_csbp = ps_cur_mb_info->ps_curmb->u2_luma_csbp; 2367 2368 top_mb_csbp = top_mb_csbp >> 12; 2369 top_edge = top_mb_csbp | (cur_mb_csbp & 0xf); 2370 2371 if(top_edge) 2372 pu4_bs_table[0] = 0x02020202; 2373 else 2374 pu4_bs_table[0] = 0; 2375 2376 cur_mb_csbp = cur_mb_csbp & CSBP_LEFT_BLOCK_MASK; 2377 left_mb_csbp = left_mb_csbp & CSBP_RIGHT_BLOCK_MASK; 2378 2379 left_edge = cur_mb_csbp | left_mb_csbp; 2380 2381 if(left_edge) 2382 pu4_bs_table[4] = 0x02020202; 2383 else 2384 pu4_bs_table[4] = 0; 2385 2386 pu4_bs_table[1] = 0; 2387 pu4_bs_table[2] = 0; 2388 pu4_bs_table[3] = 0; 2389 pu4_bs_table[5] = 0; 2390 pu4_bs_table[6] = 0; 2391 pu4_bs_table[7] = 0; 2392 } 2393 2394 } 2395