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 /* */ 22 /* File Name : ih264_deblk_edge_filters.c */ 23 /* */ 24 /* Description : Contains function definitions for deblocking */ 25 /* */ 26 /* List of Functions : ih264_deblk_luma_vert_bs4() */ 27 /* ih264_deblk_luma_horz_bs4() */ 28 /* ih264_deblk_luma_vert_bslt4() */ 29 /* ih264_deblk_luma_horz_bslt4() */ 30 /* ih264_deblk_luma_vert_bs4_mbaff() */ 31 /* ih264_deblk_luma_vert_bslt4_mbaff() */ 32 /* ih264_deblk_chroma_vert_bs4_bp() */ 33 /* ih264_deblk_chroma_horz_bs4_bp() */ 34 /* ih264_deblk_chroma_vert_bslt4_bp() */ 35 /* ih264_deblk_chroma_horz_bslt4_bp() */ 36 /* ih264_deblk_chroma_vert_bs4_mbaff_bp() */ 37 /* ih264_deblk_chroma_vert_bslt4_mbaff_bp() */ 38 /* ih264_deblk_chroma_vert_bs4() */ 39 /* ih264_deblk_chroma_horz_bs4() */ 40 /* ih264_deblk_chroma_vert_bslt4() */ 41 /* ih264_deblk_chroma_horz_bslt4() */ 42 /* ih264_deblk_chroma_vert_bs4_mbaff() */ 43 /* ih264_deblk_chroma_vert_bslt4_mbaff() */ 44 /* */ 45 /* Issues / Problems : None */ 46 /* */ 47 /* Revision History : */ 48 /* */ 49 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 50 /* 28 11 2013 Ittiam Draft */ 51 /* 29 12 2014 Kaushik Added double-call vertical */ 52 /* Senthoor deblocking and high profile */ 53 /* deblocking functions */ 54 /* */ 55 /******************************************************************************/ 56 57 /*****************************************************************************/ 58 /* File Includes */ 59 /*****************************************************************************/ 60 61 /* System include files */ 62 #include <stdio.h> 63 64 /* User include files */ 65 #include "ih264_typedefs.h" 66 #include "ih264_platform_macros.h" 67 #include "ih264_deblk_edge_filters.h" 68 #include "ih264_macros.h" 69 70 /*****************************************************************************/ 71 /* Function Definitions */ 72 /*****************************************************************************/ 73 74 /*****************************************************************************/ 75 /* */ 76 /* Function Name : ih264_deblk_luma_vert_bs4() */ 77 /* */ 78 /* Description : This function performs filtering of a luma block */ 79 /* vertical edge when the boundary strength is set to 4. */ 80 /* */ 81 /* Inputs : pu1_src - pointer to the src sample q0 */ 82 /* src_strd - source stride */ 83 /* alpha - alpha value for the boundary */ 84 /* beta - beta value for the boundary */ 85 /* */ 86 /* Globals : None */ 87 /* */ 88 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 89 /* title "Filtering process for edges for bS equal to 4" in */ 90 /* ITU T Rec H.264. */ 91 /* */ 92 /* Outputs : None */ 93 /* */ 94 /* Returns : None */ 95 /* */ 96 /* Issues : None */ 97 /* */ 98 /* Revision History: */ 99 /* */ 100 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 101 /* 28 11 2013 Ittiam Draft */ 102 /* */ 103 /*****************************************************************************/ 104 void ih264_deblk_luma_vert_bs4(UWORD8 *pu1_src, 105 WORD32 src_strd, 106 WORD32 alpha, 107 WORD32 beta) 108 { 109 UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; 110 WORD32 pos_p3, pos_p2, pos_p1, pos_p0; 111 WORD32 pos_q0, pos_q1, pos_q2,pos_q3; 112 UWORD8 a_p, a_q; /* threshold variables */ 113 WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */ 114 UWORD8 *pu1_src_temp; 115 WORD8 i = 0, edge; 116 117 pos_q0 = 0; 118 pos_q1 = 1; 119 pos_q2 = 2; 120 pos_q3 = 3; 121 pos_p0 = -1; 122 pos_p1 = -2; 123 pos_p2 = -3; 124 pos_p3 = -4; 125 126 for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) 127 { 128 pu1_src_temp = pu1_src; 129 for(i = 0; i < 4; ++i, pu1_src_temp += src_strd) 130 { 131 q0 = pu1_src_temp[pos_q0]; 132 q1 = pu1_src_temp[pos_q1]; 133 p0 = pu1_src_temp[pos_p0]; 134 p1 = pu1_src_temp[pos_p1]; 135 136 /* Filter Decision */ 137 if((ABS(p0 - q0) >= alpha) || 138 (ABS(q1 - q0) >= beta) || 139 (ABS(p1 - p0) >= beta)) 140 continue; 141 142 p2 = pu1_src_temp[pos_p2]; 143 p3 = pu1_src_temp[pos_p3]; 144 q2 = pu1_src_temp[pos_q2]; 145 q3 = pu1_src_temp[pos_q3]; 146 147 if(ABS(p0 - q0) < ((alpha >> 2) + 2)) 148 { 149 /* Threshold Variables */ 150 a_p = (UWORD8)ABS(p2 - p0); 151 a_q = (UWORD8)ABS(q2 - q0); 152 153 if(a_p < beta) 154 { 155 /* p0', p1', p2' */ 156 pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1 157 + 4) >> 3); 158 pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2); 159 pu1_src_temp[pos_p2] = 160 ((X2(p3) + X3(p2) + p1 + p0 + q0 161 + 4) >> 3); 162 } 163 else 164 { 165 /* p0'*/ 166 pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); 167 } 168 169 if(a_q < beta) 170 { 171 /* q0', q1', q2' */ 172 pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2 173 + 4) >> 3; 174 pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; 175 pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4) 176 >> 3; 177 } 178 else 179 { 180 /* q0'*/ 181 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 182 } 183 } 184 else 185 { 186 /* p0', q0'*/ 187 pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); 188 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 189 } 190 } 191 } 192 } 193 194 /*****************************************************************************/ 195 /* */ 196 /* Function Name : ih264_deblk_luma_horz_bs4() */ 197 /* */ 198 /* Description : This function performs filtering of a luma block */ 199 /* horizontal edge when the boundary strength is set to 4. */ 200 /* */ 201 /* Inputs : pu1_src - pointer to the src sample q0 */ 202 /* src_strd - source stride */ 203 /* alpha - alpha value for the boundary */ 204 /* beta - beta value for the boundary */ 205 /* */ 206 /* Globals : None */ 207 /* */ 208 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 209 /* title "Filtering process for edges for bS equal to 4" in */ 210 /* ITU T Rec H.264. */ 211 /* */ 212 /* Outputs : None */ 213 /* */ 214 /* Returns : None */ 215 /* */ 216 /* Issues : None */ 217 /* */ 218 /* Revision History: */ 219 /* */ 220 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 221 /* 28 11 2013 Ittiam Draft */ 222 /* */ 223 /*****************************************************************************/ 224 void ih264_deblk_luma_horz_bs4(UWORD8 *pu1_src, 225 WORD32 src_strd, 226 WORD32 alpha, 227 WORD32 beta) 228 { 229 UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; 230 WORD32 pos_p3, pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, 231 pos_q2, pos_q3; 232 UWORD8 a_p, a_q; /* threshold variables */ 233 UWORD8 *pu1_p3; /* pointer to the src sample p3 */ 234 UWORD8 *pu1_p3_temp; 235 UWORD8 *pu1_src_temp; 236 WORD8 i = 0, edge; 237 238 pu1_p3 = pu1_src - (src_strd << 2); 239 pos_q0 = 0; 240 pos_q1 = src_strd; 241 pos_q2 = X2(src_strd); 242 pos_q3 = X3(src_strd); 243 pos_p0 = X3(src_strd); 244 pos_p1 = X2(src_strd); 245 pos_p2 = src_strd; 246 pos_p3 = 0; 247 248 for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p3 += 4) 249 { 250 pu1_src_temp = pu1_src; 251 pu1_p3_temp = pu1_p3; 252 for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p3_temp++) 253 { 254 q0 = pu1_src_temp[pos_q0]; 255 q1 = pu1_src_temp[pos_q1]; 256 p0 = pu1_p3_temp[pos_p0]; 257 p1 = pu1_p3_temp[pos_p1]; 258 259 /* Filter Decision */ 260 if((ABS(p0 - q0) >= alpha) || 261 (ABS(q1 - q0) >= beta) || 262 (ABS(p1 - p0) >= beta)) 263 continue; 264 265 p2 = pu1_p3_temp[pos_p2]; 266 p3 = pu1_p3_temp[pos_p3]; 267 q2 = pu1_src_temp[pos_q2]; 268 q3 = pu1_src_temp[pos_q3]; 269 270 if(ABS(p0 - q0) < ((alpha >> 2) + 2)) 271 { 272 /* Threshold Variables */ 273 a_p = ABS(p2 - p0); 274 a_q = ABS(q2 - q0); 275 276 if((a_p < beta)) 277 { 278 /* p0', p1', p2' */ 279 pu1_p3_temp[pos_p0] = (p2 + X2(p1) + X2(p0) + X2(q0) + q1 280 + 4) >> 3; 281 pu1_p3_temp[pos_p1] = (p2 + p1 + p0 + q0 + 2) >> 2; 282 pu1_p3_temp[pos_p2] = 283 (X2(p3) + X3(p2) + p1 + p0 + q0 284 + 4) >> 3; 285 } 286 else 287 { 288 /* p0'*/ 289 pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2; 290 } 291 292 if(a_q < beta) 293 { 294 /* q0', q1', q2' */ 295 pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) 296 + q2 + 4) >> 3; 297 pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; 298 pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 299 + 4) >> 3; 300 } 301 else 302 { 303 /* q0'*/ 304 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 305 } 306 } 307 else 308 { 309 /* p0', q0'*/ 310 pu1_p3_temp[pos_p0] = (X2(p1) + p0 + q1 + 2) >> 2; 311 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 312 } 313 } 314 } 315 } 316 317 /*****************************************************************************/ 318 /* */ 319 /* Function Name : ih264_deblk_chroma_vert_bs4_bp() */ 320 /* */ 321 /* Description : This function performs filtering of a chroma block */ 322 /* vertical edge when the boundary strength is set to 4. */ 323 /* */ 324 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 325 /* src_strd - source stride */ 326 /* alpha - alpha value for the boundary */ 327 /* beta - beta value for the boundary */ 328 /* */ 329 /* Globals : None */ 330 /* */ 331 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 332 /* title "Filtering process for edges for bS equal to 4" in */ 333 /* ITU T Rec H.264. */ 334 /* */ 335 /* Outputs : None */ 336 /* */ 337 /* Returns : None */ 338 /* */ 339 /* Issues : None */ 340 /* */ 341 /* Revision History: */ 342 /* */ 343 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 344 /* 28 11 2013 Ittiam Draft */ 345 /* */ 346 /*****************************************************************************/ 347 void ih264_deblk_chroma_vert_bs4_bp(UWORD8 *pu1_src, 348 WORD32 src_strd, 349 WORD32 alpha, 350 WORD32 beta) 351 { 352 UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */ 353 UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */ 354 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 355 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ 356 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 357 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 358 WORD8 i = 0, edge; 359 360 pos_q0 = 0; 361 pos_q1 = 2; 362 pos_p0 = -2; 363 pos_p1 = -4; 364 365 for(edge = 0; edge < 4; 366 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 367 { 368 pu1_src_temp_u = pu1_src_u; 369 pu1_src_temp_v = pu1_src_v; 370 for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += 371 src_strd) 372 { 373 q0_u = pu1_src_temp_u[pos_q0]; 374 q1_u = pu1_src_temp_u[pos_q1]; 375 p0_u = pu1_src_temp_u[pos_p0]; 376 p1_u = pu1_src_temp_u[pos_p1]; 377 q0_v = pu1_src_temp_v[pos_q0]; 378 q1_v = pu1_src_temp_v[pos_q1]; 379 p0_v = pu1_src_temp_v[pos_p0]; 380 p1_v = pu1_src_temp_v[pos_p1]; 381 382 /* Filter Decision */ 383 if((ABS(p0_u - q0_u) < alpha) && 384 (ABS(q1_u - q0_u) < beta) && 385 (ABS(p1_u - p0_u) < beta)) 386 { 387 /* p0' */ 388 pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); 389 /* q0' */ 390 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 391 } 392 393 /* Filter Decision */ 394 if((ABS(p0_v - q0_v) < alpha) && 395 (ABS(q1_v - q0_v) < beta) && 396 (ABS(p1_v - p0_v) < beta)) 397 { 398 /* p0' */ 399 pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); 400 /* q0' */ 401 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 402 } 403 } 404 } 405 } 406 407 /*****************************************************************************/ 408 /* */ 409 /* Function Name : ih264_deblk_chroma_horz_bs4_bp() */ 410 /* */ 411 /* Description : This function performs filtering of a chroma block */ 412 /* horizontal edge when the boundary strength is set to 4. */ 413 /* */ 414 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 415 /* src_strd - source stride */ 416 /* alpha - alpha value for the boundary */ 417 /* beta - beta value for the boundary */ 418 /* */ 419 /* Globals : None */ 420 /* */ 421 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 422 /* title "Filtering process for edges for bS equal to 4" in */ 423 /* ITU T Rec H.264. */ 424 /* */ 425 /* Outputs : None */ 426 /* */ 427 /* Returns : None */ 428 /* */ 429 /* Issues : None */ 430 /* */ 431 /* Revision History: */ 432 /* */ 433 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 434 /* 28 11 2013 Ittiam Draft */ 435 /* */ 436 /*****************************************************************************/ 437 void ih264_deblk_chroma_horz_bs4_bp(UWORD8 *pu1_src, 438 WORD32 src_strd, 439 WORD32 alpha, 440 WORD32 beta) 441 { 442 UWORD8 *pu1_src_u = pu1_src; /* pointer to the src sample q0 of U */ 443 UWORD8 *pu1_src_v = pu1_src + 1; /* pointer to the src sample q0 of V */ 444 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 445 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 446 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 447 UWORD8 *pu1_p1_u; /* pointer to the src sample p1 of U */ 448 UWORD8 *pu1_p1_v; /* pointer to the src sample p1 of U */ 449 UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; 450 WORD8 i = 0, edge; 451 452 pu1_p1_u = pu1_src_u - (src_strd << 1); 453 pu1_p1_v = pu1_src_v - (src_strd << 1); 454 pos_q0 = 0; 455 pos_q1 = src_strd; 456 pos_p0 = src_strd; 457 pos_p1 = 0; 458 459 for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, 460 pu1_src_v += 4, pu1_p1_v += 4) 461 { 462 pu1_src_temp_u = pu1_src_u; 463 pu1_p1_temp_u = pu1_p1_u; 464 pu1_src_temp_v = pu1_src_v; 465 pu1_p1_temp_v = pu1_p1_v; 466 for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, 467 pu1_src_temp_v += 2, pu1_p1_temp_v += 2) 468 { 469 q0_u = pu1_src_temp_u[pos_q0]; 470 q1_u = pu1_src_temp_u[pos_q1]; 471 p0_u = pu1_p1_temp_u[pos_p0]; 472 p1_u = pu1_p1_temp_u[pos_p1]; 473 474 q0_v = pu1_src_temp_v[pos_q0]; 475 q1_v = pu1_src_temp_v[pos_q1]; 476 p0_v = pu1_p1_temp_v[pos_p0]; 477 p1_v = pu1_p1_temp_v[pos_p1]; 478 479 /* Filter Decision */ 480 if((ABS(p0_u - q0_u) < alpha) && 481 (ABS(q1_u - q0_u) < beta) && 482 (ABS(p1_u - p0_u) < beta)) 483 { 484 /* p0' */ 485 pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2; 486 /* q0' */ 487 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 488 } 489 490 /* Filter Decision */ 491 if((ABS(p0_v - q0_v) < alpha) && 492 (ABS(q1_v - q0_v) < beta) && 493 (ABS(p1_v - p0_v) < beta)) 494 { 495 /* p0' */ 496 pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2; 497 /* q0' */ 498 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 499 } 500 } 501 } 502 } 503 504 /*****************************************************************************/ 505 /* */ 506 /* Function Name : ih264_deblk_luma_vert_bslt4() */ 507 /* */ 508 /* Description : This function performs filtering of a luma block */ 509 /* vertical edge when the boundary strength is less than 4. */ 510 /* */ 511 /* Inputs : pu1_src - pointer to the src sample q0 */ 512 /* src_strd - source stride */ 513 /* alpha - alpha value for the boundary */ 514 /* beta - beta value for the boundary */ 515 /* u4_bs - packed Boundary strength array */ 516 /* pu1_cliptab - tc0_table */ 517 /* */ 518 /* Globals : None */ 519 /* */ 520 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 521 /* title "Filtering process for edges for bS less than 4" */ 522 /* in ITU T Rec H.264. */ 523 /* */ 524 /* Outputs : None */ 525 /* */ 526 /* Returns : None */ 527 /* */ 528 /* Issues : None */ 529 /* */ 530 /* Revision History: */ 531 /* */ 532 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 533 /* 28 11 2013 Ittiam Draft */ 534 /* */ 535 /*****************************************************************************/ 536 void ih264_deblk_luma_vert_bslt4(UWORD8 *pu1_src, 537 WORD32 src_strd, 538 WORD32 alpha, 539 WORD32 beta, 540 UWORD32 u4_bs, 541 const UWORD8 *pu1_cliptab) 542 { 543 WORD8 i = 0, edge; 544 UWORD8 p2, p1, p0, q0, q1, q2; 545 WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; 546 UWORD8 a_p, a_q; /* threshold variables */ 547 WORD32 blk_strd = src_strd << 2; /* block_increment = src_strd * 4 */ 548 UWORD8 *pu1_src_temp; 549 WORD8 delta; 550 WORD8 tc; 551 WORD16 val; 552 UWORD8 tc0, u1_bs; 553 554 pos_q0 = 0; 555 pos_q1 = 1; 556 pos_q2 = 2; 557 pos_p0 = -1; 558 pos_p1 = -2; 559 pos_p2 = -3; 560 561 for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) 562 { 563 pu1_src_temp = pu1_src; 564 /* Filter Decision */ 565 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 566 if(!u1_bs) 567 continue; 568 /* tc0 */ 569 tc0 = pu1_cliptab[u1_bs]; 570 for(i = 0; i < 4; ++i, pu1_src_temp += src_strd) 571 { 572 q0 = pu1_src_temp[pos_q0]; 573 q1 = pu1_src_temp[pos_q1]; 574 p0 = pu1_src_temp[pos_p0]; 575 p1 = pu1_src_temp[pos_p1]; 576 577 /* Filter Decision */ 578 if((ABS(p0 - q0) >= alpha) || 579 (ABS(q1 - q0) >= beta) || 580 (ABS(p1 - p0) >= beta)) 581 continue; 582 583 q2 = pu1_src_temp[pos_q2]; 584 p2 = pu1_src_temp[pos_p2]; 585 586 a_p = ABS(p2 - p0); 587 a_q = ABS(q2 - q0); 588 589 /* tc */ 590 tc = tc0 + (a_p < beta) + (a_q < beta); 591 592 val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); 593 delta = CLIP3(-tc, tc, val); 594 595 /* p0' */ 596 val = p0 + delta; 597 pu1_src_temp[pos_p0] = CLIP_U8(val); 598 /* q0' */ 599 val = q0 - delta; 600 pu1_src_temp[pos_q0] = CLIP_U8(val); 601 602 /* Luma only */ 603 if(a_p < beta) 604 { 605 /* p1' */ 606 val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); 607 pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val); 608 } 609 610 if(a_q < beta) 611 { 612 /* q1' */ 613 val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); 614 pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); 615 } 616 } 617 } 618 } 619 620 /*****************************************************************************/ 621 /* */ 622 /* Function Name : ih264_deblk_chroma_vert_bslt4_bp() */ 623 /* */ 624 /* Description : This function performs filtering of a chroma block */ 625 /* vertical edge when the boundary strength is less than 4. */ 626 /* */ 627 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 628 /* src_strd - source stride */ 629 /* alpha - alpha value for the boundary */ 630 /* beta - beta value for the boundary */ 631 /* u4_bs - packed Boundary strength array */ 632 /* pu1_cliptab - tc0_table */ 633 /* */ 634 /* Globals : None */ 635 /* */ 636 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 637 /* title "Filtering process for edges for bS less than 4" */ 638 /* in ITU T Rec H.264. */ 639 /* */ 640 /* Outputs : None */ 641 /* */ 642 /* Returns : None */ 643 /* */ 644 /* Issues : None */ 645 /* */ 646 /* Revision History: */ 647 /* */ 648 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 649 /* 28 11 2013 Ittiam Draft */ 650 /* */ 651 /*****************************************************************************/ 652 void ih264_deblk_chroma_vert_bslt4_bp(UWORD8 *pu1_src, 653 WORD32 src_strd, 654 WORD32 alpha, 655 WORD32 beta, 656 UWORD32 u4_bs, 657 const UWORD8 *pu1_cliptab) 658 { 659 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 660 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 661 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 662 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * (4 >> 1)*/ 663 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 664 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 665 WORD8 i = 0, edge; 666 WORD8 delta; 667 WORD8 tc; 668 WORD16 val; 669 UWORD8 tc0, u1_bs; 670 671 pos_q0 = 0; 672 pos_q1 = 2; 673 pos_p0 = -2; 674 pos_p1 = -4; 675 676 for(edge = 0; edge < 4; 677 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 678 { 679 pu1_src_temp_u = pu1_src_u; 680 pu1_src_temp_v = pu1_src_v; 681 /* Filter Decision */ 682 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 683 if(!u1_bs) 684 continue; 685 /* tc0 */ 686 tc0 = pu1_cliptab[u1_bs]; 687 tc = tc0 + 1; 688 for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += 689 src_strd) 690 { 691 q0_u = pu1_src_temp_u[pos_q0]; 692 q1_u = pu1_src_temp_u[pos_q1]; 693 p0_u = pu1_src_temp_u[pos_p0]; 694 p1_u = pu1_src_temp_u[pos_p1]; 695 696 q0_v = pu1_src_temp_v[pos_q0]; 697 q1_v = pu1_src_temp_v[pos_q1]; 698 p0_v = pu1_src_temp_v[pos_p0]; 699 p1_v = pu1_src_temp_v[pos_p1]; 700 701 /* Filter Decision */ 702 if((ABS(p0_u - q0_u) < alpha) && 703 (ABS(q1_u - q0_u) < beta) && 704 (ABS(p1_u - p0_u) < beta)) 705 { 706 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 707 delta = CLIP3(-tc, tc, val); 708 /* p0' */ 709 val = p0_u + delta; 710 pu1_src_temp_u[pos_p0] = CLIP_U8(val); 711 /* q0' */ 712 val = q0_u - delta; 713 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 714 } 715 716 /* Filter Decision */ 717 if((ABS(p0_v - q0_v) < alpha) && 718 (ABS(q1_v - q0_v) < beta) && 719 (ABS(p1_v - p0_v) < beta)) 720 { 721 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 722 delta = CLIP3(-tc, tc, val); 723 /* p0' */ 724 val = p0_v + delta; 725 pu1_src_temp_v[pos_p0] = CLIP_U8(val); 726 /* q0' */ 727 val = q0_v - delta; 728 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 729 } 730 } 731 } 732 } 733 734 /*****************************************************************************/ 735 /* */ 736 /* Function Name : ih264_deblk_luma_horz_bslt4() */ 737 /* */ 738 /* Description : This function performs filtering of a luma block */ 739 /* horizontal edge when boundary strength is less than 4. */ 740 /* */ 741 /* Inputs : pu1_src - pointer to the src sample q0 */ 742 /* src_strd - source stride */ 743 /* alpha - alpha value for the boundary */ 744 /* beta - beta value for the boundary */ 745 /* u4_bs - packed Boundary strength array */ 746 /* pu1_cliptab - tc0_table */ 747 /* */ 748 /* Globals : None */ 749 /* */ 750 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 751 /* title "Filtering process for edges for bS less than 4" */ 752 /* in ITU T Rec H.264. */ 753 /* */ 754 /* Outputs : None */ 755 /* */ 756 /* Returns : None */ 757 /* */ 758 /* Issues : None */ 759 /* */ 760 /* Revision History: */ 761 /* */ 762 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 763 /* 28 11 2013 Ittiam Draft */ 764 /* */ 765 /*****************************************************************************/ 766 void ih264_deblk_luma_horz_bslt4(UWORD8 *pu1_src, 767 WORD32 src_strd, 768 WORD32 alpha, 769 WORD32 beta, 770 UWORD32 u4_bs, 771 const UWORD8 *pu1_cliptab) 772 { 773 UWORD8 p2, p1, p0, q0, q1, q2; 774 WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; 775 UWORD8 a_p, a_q; /* Threshold variables */ 776 UWORD8 *pu1_p2; /* Pointer to the src sample p2 */ 777 UWORD8 *pu1_p2_temp; 778 UWORD8 *pu1_src_temp; 779 WORD8 i = 0, edge; 780 WORD8 delta; 781 WORD8 tc; 782 WORD16 val; 783 UWORD8 tc0, u1_bs; 784 785 pu1_p2 = pu1_src - (src_strd << 2); 786 pos_q0 = 0; 787 pos_q1 = src_strd; 788 pos_q2 = X2(src_strd); 789 pos_p0 = X3(src_strd); 790 pos_p1 = X2(src_strd); 791 pos_p2 = src_strd; 792 793 for(edge = 0; edge < 4; edge++, pu1_src += 4, pu1_p2 += 4) 794 { 795 pu1_src_temp = pu1_src; 796 pu1_p2_temp = pu1_p2; 797 798 /* Filter Decision */ 799 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 800 if(!u1_bs) 801 continue; 802 /* tc0 */ 803 tc0 = pu1_cliptab[u1_bs]; 804 805 for(i = 0; i < 4; ++i, pu1_src_temp++, pu1_p2_temp++) 806 { 807 q0 = pu1_src_temp[pos_q0]; 808 q1 = pu1_src_temp[pos_q1]; 809 p0 = pu1_p2_temp[pos_p0]; 810 p1 = pu1_p2_temp[pos_p1]; 811 812 /* Filter Decision */ 813 if((ABS(p0 - q0) >= alpha) || 814 (ABS(q1 - q0) >= beta) || 815 (ABS(p1 - p0) >= beta)) 816 continue; 817 818 q2 = pu1_src_temp[pos_q2]; 819 p2 = pu1_p2_temp[pos_p2]; 820 821 a_p = ABS(p2 - p0); 822 a_q = ABS(q2 - q0); 823 824 /* tc */ 825 tc = tc0 + (a_p < beta) + (a_q < beta); 826 val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); 827 delta = CLIP3(-tc, tc, val); 828 /* p0' */ 829 val = p0 + delta; 830 pu1_p2_temp[pos_p0] = CLIP_U8(val); 831 /* q0' */ 832 val = q0 - delta; 833 pu1_src_temp[pos_q0] = CLIP_U8(val); 834 835 /* Luma */ 836 if(a_p < beta) 837 { 838 /* p1' */ 839 val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); 840 pu1_p2_temp[pos_p1] += CLIP3(-tc0, tc0, val); 841 } 842 843 if(a_q < beta) 844 { 845 /* q1' */ 846 val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); 847 pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); 848 } 849 } 850 } 851 } 852 853 /*****************************************************************************/ 854 /* */ 855 /* Function Name : ih264_deblk_chroma_horz_bslt4_bp() */ 856 /* */ 857 /* Description : This function performs filtering of a chroma block */ 858 /* horizontal edge when boundary strength is less than 4. */ 859 /* */ 860 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 861 /* src_strd - source stride */ 862 /* alpha - alpha value for the boundary */ 863 /* beta - beta value for the boundary */ 864 /* u4_bs - packed Boundary strength array */ 865 /* pu1_cliptab - tc0_table */ 866 /* */ 867 /* Globals : None */ 868 /* */ 869 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 870 /* title "Filtering process for edges for bS less than 4" */ 871 /* in ITU T Rec H.264. */ 872 /* */ 873 /* Outputs : None */ 874 /* */ 875 /* Returns : None */ 876 /* */ 877 /* Issues : None */ 878 /* */ 879 /* Revision History: */ 880 /* */ 881 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 882 /* 28 11 2013 Ittiam Draft */ 883 /* */ 884 /*****************************************************************************/ 885 void ih264_deblk_chroma_horz_bslt4_bp(UWORD8 *pu1_src, 886 WORD32 src_strd, 887 WORD32 alpha, 888 WORD32 beta, 889 UWORD32 u4_bs, 890 const UWORD8 *pu1_cliptab) 891 { 892 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 893 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 894 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 895 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 896 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 897 UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/ 898 UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/ 899 UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; 900 WORD8 i = 0, edge; 901 WORD8 delta; 902 WORD8 tc; 903 WORD16 val; 904 UWORD8 u1_bs; 905 UWORD8 tc0; 906 907 pu1_p1_u = pu1_src_u - (src_strd << 1); 908 pu1_p1_v = pu1_src_v - (src_strd << 1); 909 pos_q0 = 0; 910 pos_q1 = src_strd; 911 pos_p0 = src_strd; 912 pos_p1 = 0; 913 914 for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, 915 pu1_src_v += 4, pu1_p1_v += 4) 916 { 917 pu1_src_temp_u = pu1_src_u; 918 pu1_p1_temp_u = pu1_p1_u; 919 pu1_src_temp_v = pu1_src_v; 920 pu1_p1_temp_v = pu1_p1_v; 921 922 /* Filter Decision */ 923 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 924 if(!u1_bs) 925 continue; 926 /* tc0 */ 927 tc0 = pu1_cliptab[u1_bs]; 928 929 for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, 930 pu1_src_temp_v += 2, pu1_p1_temp_v += 2) 931 { 932 q0_u = pu1_src_temp_u[pos_q0]; 933 q1_u = pu1_src_temp_u[pos_q1]; 934 p0_u = pu1_p1_temp_u[pos_p0]; 935 p1_u = pu1_p1_temp_u[pos_p1]; 936 937 q0_v = pu1_src_temp_v[pos_q0]; 938 q1_v = pu1_src_temp_v[pos_q1]; 939 p0_v = pu1_p1_temp_v[pos_p0]; 940 p1_v = pu1_p1_temp_v[pos_p1]; 941 942 /* tc */ 943 tc = tc0 + 1; 944 /* Filter Decision */ 945 if(ABS(p0_u - q0_u) < alpha && ABS(q1_u - q0_u) < beta 946 && ABS(p1_u - p0_u) < beta) 947 { 948 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 949 delta = CLIP3(-tc, tc, val); 950 /* p0' */ 951 val = p0_u + delta; 952 pu1_p1_temp_u[pos_p0] = CLIP_U8(val); 953 /* q0' */ 954 val = q0_u - delta; 955 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 956 } 957 /* Filter Decision */ 958 if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta 959 && ABS(p1_v - p0_v) < beta) 960 { 961 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 962 delta = CLIP3(-tc, tc, val); 963 /* p0' */ 964 val = p0_v + delta; 965 pu1_p1_temp_v[pos_p0] = CLIP_U8(val); 966 /* q0' */ 967 val = q0_v - delta; 968 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 969 } 970 } 971 } 972 } 973 974 /*****************************************************************************/ 975 /* Function Definitions for vertical edge deblocking for double-call */ 976 /*****************************************************************************/ 977 978 /*****************************************************************************/ 979 /* */ 980 /* Function Name : ih264_deblk_luma_vert_bs4_mbaff() */ 981 /* */ 982 /* Description : This function performs filtering of a luma block */ 983 /* vertical edge when boundary strength is set to 4. */ 984 /* */ 985 /* Inputs : pu1_src - pointer to the src sample q0 */ 986 /* src_strd - source stride */ 987 /* alpha - alpha value for the boundary */ 988 /* beta - beta value for the boundary */ 989 /* */ 990 /* Globals : None */ 991 /* */ 992 /* Processing : When the function is called twice, this operation is as */ 993 /* described in Sec. 8.7.2.3 under the title "Filtering */ 994 /* process for edges for bS equal to 4" in ITU T Rec H.264. */ 995 /* */ 996 /* Outputs : None */ 997 /* */ 998 /* Returns : None */ 999 /* */ 1000 /* Issues : None */ 1001 /* */ 1002 /* Revision History: */ 1003 /* */ 1004 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1005 /* 29 12 2014 Kaushik Draft */ 1006 /* Senthoor */ 1007 /* */ 1008 /*****************************************************************************/ 1009 void ih264_deblk_luma_vert_bs4_mbaff(UWORD8 *pu1_src, 1010 WORD32 src_strd, 1011 WORD32 alpha, 1012 WORD32 beta) 1013 { 1014 UWORD8 p3, p2, p1, p0, q0, q1, q2, q3; 1015 WORD32 pos_p3, pos_p2, pos_p1, pos_p0; 1016 WORD32 pos_q0, pos_q1, pos_q2, pos_q3; 1017 UWORD8 a_p, a_q; /* threshold variables */ 1018 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ 1019 UWORD8 *pu1_src_temp; 1020 WORD8 i = 0, edge; 1021 1022 pos_q0 = 0; 1023 pos_q1 = 1; 1024 pos_q2 = 2; 1025 pos_q3 = 3; 1026 pos_p0 = -1; 1027 pos_p1 = -2; 1028 pos_p2 = -3; 1029 pos_p3 = -4; 1030 1031 for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) 1032 { 1033 pu1_src_temp = pu1_src; 1034 for(i = 0; i < 2; ++i, pu1_src_temp += src_strd) 1035 { 1036 q0 = pu1_src_temp[pos_q0]; 1037 q1 = pu1_src_temp[pos_q1]; 1038 p0 = pu1_src_temp[pos_p0]; 1039 p1 = pu1_src_temp[pos_p1]; 1040 1041 /* Filter Decision */ 1042 if((ABS(p0 - q0) >= alpha) || 1043 (ABS(q1 - q0) >= beta) || 1044 (ABS(p1 - p0) >= beta)) 1045 continue; 1046 1047 p2 = pu1_src_temp[pos_p2]; 1048 p3 = pu1_src_temp[pos_p3]; 1049 q2 = pu1_src_temp[pos_q2]; 1050 q3 = pu1_src_temp[pos_q3]; 1051 1052 if(ABS(p0 - q0) < ((alpha >> 2) + 2)) 1053 { 1054 /* Threshold Variables */ 1055 a_p = (UWORD8)ABS(p2 - p0); 1056 a_q = (UWORD8)ABS(q2 - q0); 1057 1058 if(a_p < beta) 1059 { 1060 /* p0', p1', p2' */ 1061 pu1_src_temp[pos_p0] = ((p2 + X2(p1) + X2(p0) + X2(q0) + q1 1062 + 4) >> 3); 1063 pu1_src_temp[pos_p1] = ((p2 + p1 + p0 + q0 + 2) >> 2); 1064 pu1_src_temp[pos_p2] = 1065 ((X2(p3) + X3(p2) + p1 + p0 + q0 1066 + 4) >> 3); 1067 } 1068 else 1069 { 1070 /* p0'*/ 1071 pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); 1072 } 1073 1074 if(a_q < beta) 1075 { 1076 /* q0', q1', q2' */ 1077 pu1_src_temp[pos_q0] = (p1 + X2(p0) + X2(q0) + X2(q1) + q2 1078 + 4) >> 3; 1079 pu1_src_temp[pos_q1] = (p0 + q0 + q1 + q2 + 2) >> 2; 1080 pu1_src_temp[pos_q2] = (X2(q3) + X3(q2) + q1 + q0 + p0 + 4) 1081 >> 3; 1082 } 1083 else 1084 { 1085 /* q0'*/ 1086 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 1087 } 1088 } 1089 else 1090 { 1091 /* p0', q0'*/ 1092 pu1_src_temp[pos_p0] = ((X2(p1) + p0 + q1 + 2) >> 2); 1093 pu1_src_temp[pos_q0] = (X2(q1) + q0 + p1 + 2) >> 2; 1094 } 1095 } 1096 } 1097 } 1098 1099 /*****************************************************************************/ 1100 /* */ 1101 /* Function Name : ih264_deblk_chroma_vert_bs4_mbaff_bp() */ 1102 /* */ 1103 /* Description : This function performs filtering of a chroma block */ 1104 /* vertical edge when boundary strength is set to 4. */ 1105 /* */ 1106 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1107 /* src_strd - source stride */ 1108 /* alpha - alpha value for the boundary */ 1109 /* beta - beta value for the boundary */ 1110 /* */ 1111 /* Globals : None */ 1112 /* */ 1113 /* Processing : When the function is called twice, this operation is as */ 1114 /* described in Sec. 8.7.2.3 under the title "Filtering */ 1115 /* process for edges for bS equal to 4" in ITU T Rec H.264. */ 1116 /* */ 1117 /* Outputs : None */ 1118 /* */ 1119 /* Returns : None */ 1120 /* */ 1121 /* Issues : None */ 1122 /* */ 1123 /* Revision History: */ 1124 /* */ 1125 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1126 /* 29 12 2014 Kaushik Draft */ 1127 /* Senthoor */ 1128 /* */ 1129 /*****************************************************************************/ 1130 void ih264_deblk_chroma_vert_bs4_mbaff_bp(UWORD8 *pu1_src, 1131 WORD32 src_strd, 1132 WORD32 alpha, 1133 WORD32 beta) 1134 { 1135 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ 1136 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ 1137 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1138 WORD32 blk_strd = src_strd; 1139 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1140 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1141 WORD8 edge; 1142 1143 pos_q0 = 0; 1144 pos_q1 = 2; 1145 pos_p0 = -2; 1146 pos_p1 = -4; 1147 1148 for(edge = 0; edge < 4; 1149 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 1150 { 1151 pu1_src_temp_u = pu1_src_u; 1152 pu1_src_temp_v = pu1_src_v; 1153 1154 q0_u = pu1_src_temp_u[pos_q0]; 1155 q1_u = pu1_src_temp_u[pos_q1]; 1156 p0_u = pu1_src_temp_u[pos_p0]; 1157 p1_u = pu1_src_temp_u[pos_p1]; 1158 q0_v = pu1_src_temp_v[pos_q0]; 1159 q1_v = pu1_src_temp_v[pos_q1]; 1160 p0_v = pu1_src_temp_v[pos_p0]; 1161 p1_v = pu1_src_temp_v[pos_p1]; 1162 1163 /* Filter Decision */ 1164 if((ABS(p0_u - q0_u) < alpha) && 1165 (ABS(q1_u - q0_u) < beta) && 1166 (ABS(p1_u - p0_u) < beta)) 1167 { 1168 /* p0' */ 1169 pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); 1170 /* q0' */ 1171 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 1172 } 1173 1174 /* Filter Decision */ 1175 if(ABS(p0_v - q0_v) < alpha && ABS(q1_v - q0_v) < beta 1176 && ABS(p1_v - p0_v) < beta) 1177 { 1178 /* p0' */ 1179 pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); 1180 /* q0' */ 1181 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 1182 } 1183 } 1184 } 1185 1186 /*****************************************************************************/ 1187 /* */ 1188 /* Function Name : ih264_deblk_luma_vert_bslt4_mbaff() */ 1189 /* */ 1190 /* Description : This function performs filtering of a luma block */ 1191 /* vertical edge when boundary strength is less than 4. */ 1192 /* */ 1193 /* Inputs : pu1_src - pointer to the src sample q0 */ 1194 /* src_strd - source stride */ 1195 /* alpha - alpha value for the boundary */ 1196 /* beta - beta value for the boundary */ 1197 /* u4_bs - packed Boundary strength array */ 1198 /* pu1_cliptab - tc0_table */ 1199 /* */ 1200 /* Globals : None */ 1201 /* */ 1202 /* Processing : When the function is called twice, this operation is as */ 1203 /* described in Sec. 8.7.2.3 under the title "Filtering */ 1204 /* process for edges for bS less than 4" in ITU T Rec H.264.*/ 1205 /* */ 1206 /* Outputs : None */ 1207 /* */ 1208 /* Returns : None */ 1209 /* */ 1210 /* Issues : None */ 1211 /* */ 1212 /* Revision History: */ 1213 /* */ 1214 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1215 /* 29 12 2014 Kaushik Draft */ 1216 /* Senthoor */ 1217 /* */ 1218 /*****************************************************************************/ 1219 void ih264_deblk_luma_vert_bslt4_mbaff(UWORD8 *pu1_src, 1220 WORD32 src_strd, 1221 WORD32 alpha, 1222 WORD32 beta, 1223 UWORD32 u4_bs, 1224 const UWORD8 *pu1_cliptab) 1225 { 1226 WORD8 i = 0, edge; 1227 UWORD8 p2, p1, p0, q0, q1, q2; 1228 WORD32 pos_p2, pos_p1, pos_p0, pos_q0, pos_q1, pos_q2; 1229 UWORD8 a_p, a_q; /* Threshold variables */ 1230 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ 1231 UWORD8 *pu1_src_temp; 1232 WORD8 delta; 1233 WORD8 tc; 1234 WORD16 val; 1235 UWORD8 tc0, u1_bs; 1236 1237 pos_q0 = 0; 1238 pos_q1 = 1; 1239 pos_q2 = 2; 1240 pos_p0 = -1; 1241 pos_p1 = -2; 1242 pos_p2 = -3; 1243 1244 for(edge = 0; edge < 4; edge++, pu1_src += blk_strd) 1245 { 1246 pu1_src_temp = pu1_src; 1247 /* Filter Decision */ 1248 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 1249 if(!u1_bs) 1250 continue; 1251 /* tc0 */ 1252 tc0 = pu1_cliptab[u1_bs]; 1253 for(i = 0; i < 2; ++i, pu1_src_temp += src_strd) 1254 { 1255 q0 = pu1_src_temp[pos_q0]; 1256 q1 = pu1_src_temp[pos_q1]; 1257 p0 = pu1_src_temp[pos_p0]; 1258 p1 = pu1_src_temp[pos_p1]; 1259 1260 /* Filter Decision */ 1261 if((ABS(p0 - q0) >= alpha) || 1262 (ABS(q1 - q0) >= beta) || 1263 (ABS(p1 - p0) >= beta)) 1264 continue; 1265 1266 q2 = pu1_src_temp[pos_q2]; 1267 p2 = pu1_src_temp[pos_p2]; 1268 1269 a_p = ABS(p2 - p0); 1270 a_q = ABS(q2 - q0); 1271 1272 /* tc */ 1273 tc = tc0 + (a_p < beta) + (a_q < beta); 1274 1275 val = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); 1276 delta = CLIP3(-tc, tc, val); 1277 /* p0' */ 1278 val = p0 + delta; 1279 pu1_src_temp[pos_p0] = CLIP_U8(val); 1280 /* q0' */ 1281 val = q0 - delta; 1282 pu1_src_temp[pos_q0] = CLIP_U8(val); 1283 1284 /* Luma only */ 1285 if(a_p < beta) 1286 { 1287 /* p1' */ 1288 val = ((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1); 1289 pu1_src_temp[pos_p1] += CLIP3(-tc0, tc0, val); 1290 } 1291 1292 if(a_q < beta) 1293 { 1294 /* q1' */ 1295 val = ((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1); 1296 pu1_src_temp[pos_q1] += CLIP3(-tc0, tc0, val); 1297 } 1298 } 1299 } 1300 } 1301 1302 /*****************************************************************************/ 1303 /* */ 1304 /* Function Name : ih264_deblk_chroma_vert_bslt4_mbaff_bp() */ 1305 /* */ 1306 /* Description : This function performs filtering of a chroma block */ 1307 /* vertical edge when boundary strength is less than 4. */ 1308 /* */ 1309 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1310 /* src_strd - source stride */ 1311 /* alpha - alpha value for the boundary */ 1312 /* beta - beta value for the boundary */ 1313 /* u4_bs - packed Boundary strength array */ 1314 /* pu1_cliptab - tc0_table */ 1315 /* */ 1316 /* Globals : None */ 1317 /* */ 1318 /* Processing : When the function is called twice, this operation is as */ 1319 /* described in Sec. 8.7.2.3 under the title "Filtering */ 1320 /* process for edges for bS less than 4" in ITU T Rec H.264.*/ 1321 /* */ 1322 /* Outputs : None */ 1323 /* */ 1324 /* Returns : None */ 1325 /* */ 1326 /* Issues : None */ 1327 /* */ 1328 /* Revision History: */ 1329 /* */ 1330 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1331 /* 29 12 2014 Kaushik Draft */ 1332 /* Senthoor */ 1333 /* */ 1334 /*****************************************************************************/ 1335 void ih264_deblk_chroma_vert_bslt4_mbaff_bp(UWORD8 *pu1_src, 1336 WORD32 src_strd, 1337 WORD32 alpha, 1338 WORD32 beta, 1339 UWORD32 u4_bs, 1340 const UWORD8 *pu1_cliptab) 1341 { 1342 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 1343 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 1344 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1345 WORD32 blk_strd = src_strd; 1346 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1347 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1348 WORD8 edge; 1349 WORD8 delta; 1350 WORD8 tc; 1351 WORD16 val; 1352 UWORD8 tc0, u1_bs; 1353 1354 pos_q0 = 0; 1355 pos_q1 = 2; 1356 pos_p0 = -2; 1357 pos_p1 = -4; 1358 1359 for(edge = 0; edge < 4; 1360 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 1361 { 1362 pu1_src_temp_u = pu1_src_u; 1363 pu1_src_temp_v = pu1_src_v; 1364 /* Filter Decision */ 1365 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 1366 if(!u1_bs) 1367 continue; 1368 /* tc0 */ 1369 tc0 = pu1_cliptab[u1_bs]; 1370 tc = tc0 + 1; 1371 1372 q0_u = pu1_src_temp_u[pos_q0]; 1373 q1_u = pu1_src_temp_u[pos_q1]; 1374 p0_u = pu1_src_temp_u[pos_p0]; 1375 p1_u = pu1_src_temp_u[pos_p1]; 1376 1377 q0_v = pu1_src_temp_v[pos_q0]; 1378 q1_v = pu1_src_temp_v[pos_q1]; 1379 p0_v = pu1_src_temp_v[pos_p0]; 1380 p1_v = pu1_src_temp_v[pos_p1]; 1381 1382 /* Filter Decision */ 1383 if((ABS(p0_u - q0_u) < alpha) && 1384 (ABS(q1_u - q0_u) < beta) && 1385 (ABS(p1_u - p0_u) < beta)) 1386 { 1387 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 1388 delta = CLIP3(-tc, tc, val); 1389 /* p0' */ 1390 val = p0_u + delta; 1391 pu1_src_temp_u[pos_p0] = CLIP_U8(val); 1392 /* q0' */ 1393 val = q0_u - delta; 1394 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 1395 } 1396 1397 /* Filter Decision */ 1398 if((ABS(p0_v - q0_v) < alpha) && 1399 (ABS(q1_v - q0_v) < beta) && 1400 (ABS(p1_v - p0_v) < beta)) 1401 { 1402 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 1403 delta = CLIP3(-tc, tc, val); 1404 /* p0' */ 1405 val = p0_v + delta; 1406 pu1_src_temp_v[pos_p0] = CLIP_U8(val); 1407 /* q0' */ 1408 val = q0_v - delta; 1409 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 1410 } 1411 } 1412 } 1413 1414 /*****************************************************************************/ 1415 /* Function Definitions for chroma deblocking in high profile */ 1416 /*****************************************************************************/ 1417 1418 /*****************************************************************************/ 1419 /* */ 1420 /* Function Name : ih264_deblk_chroma_vert_bs4() */ 1421 /* */ 1422 /* Description : This function performs filtering of a chroma block */ 1423 /* vertical edge when the boundary strength is set to 4 in */ 1424 /* high profile. */ 1425 /* */ 1426 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1427 /* src_strd - source stride */ 1428 /* alpha_cb - alpha value for the boundary in U */ 1429 /* beta_cb - beta value for the boundary in U */ 1430 /* alpha_cr - alpha value for the boundary in V */ 1431 /* beta_cr - beta value for the boundary in V */ 1432 /* */ 1433 /* Globals : None */ 1434 /* */ 1435 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 1436 /* title "Filtering process for edges for bS equal to 4" in */ 1437 /* ITU T Rec H.264 with alpha and beta values different in */ 1438 /* U and V. */ 1439 /* */ 1440 /* Outputs : None */ 1441 /* */ 1442 /* Returns : None */ 1443 /* */ 1444 /* Issues : None */ 1445 /* */ 1446 /* Revision History: */ 1447 /* */ 1448 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1449 /* 29 12 2014 Kaushik Draft */ 1450 /* Senthoor */ 1451 /* */ 1452 /*****************************************************************************/ 1453 void ih264_deblk_chroma_vert_bs4(UWORD8 *pu1_src, 1454 WORD32 src_strd, 1455 WORD32 alpha_cb, 1456 WORD32 beta_cb, 1457 WORD32 alpha_cr, 1458 WORD32 beta_cr) 1459 { 1460 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ 1461 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ 1462 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1463 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2*/ 1464 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1465 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1466 WORD8 i = 0, edge; 1467 1468 pos_q0 = 0; 1469 pos_q1 = 2; 1470 pos_p0 = -2; 1471 pos_p1 = -4; 1472 1473 for(edge = 0; edge < 4; 1474 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 1475 { 1476 pu1_src_temp_u = pu1_src_u; 1477 pu1_src_temp_v = pu1_src_v; 1478 for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += 1479 src_strd) 1480 { 1481 q0_u = pu1_src_temp_u[pos_q0]; 1482 q1_u = pu1_src_temp_u[pos_q1]; 1483 p0_u = pu1_src_temp_u[pos_p0]; 1484 p1_u = pu1_src_temp_u[pos_p1]; 1485 q0_v = pu1_src_temp_v[pos_q0]; 1486 q1_v = pu1_src_temp_v[pos_q1]; 1487 p0_v = pu1_src_temp_v[pos_p0]; 1488 p1_v = pu1_src_temp_v[pos_p1]; 1489 1490 /* Filter Decision */ 1491 if((ABS(p0_u - q0_u) < alpha_cb) && 1492 (ABS(q1_u - q0_u) < beta_cb) && 1493 (ABS(p1_u - p0_u) < beta_cb)) 1494 { 1495 /* p0' */ 1496 pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); 1497 /* q0' */ 1498 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 1499 } 1500 1501 /* Filter Decision */ 1502 if((ABS(p0_v - q0_v) < alpha_cr) && 1503 (ABS(q1_v - q0_v) < beta_cr) && 1504 (ABS(p1_v - p0_v) < beta_cr)) 1505 { 1506 /* p0' */ 1507 pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); 1508 /* q0' */ 1509 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 1510 } 1511 } 1512 } 1513 } 1514 1515 /*****************************************************************************/ 1516 /* */ 1517 /* Function Name : ih264_deblk_chroma_horz_bs4() */ 1518 /* */ 1519 /* Description : This function performs filtering of a chroma block */ 1520 /* horizontal edge when the boundary strength is set to 4 */ 1521 /* in high profile. */ 1522 /* */ 1523 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1524 /* src_strd - source stride */ 1525 /* alpha_cb - alpha value for the boundary in U */ 1526 /* beta_cb - beta value for the boundary in U */ 1527 /* alpha_cr - alpha value for the boundary in V */ 1528 /* beta_cr - beta value for the boundary in V */ 1529 /* */ 1530 /* Globals : None */ 1531 /* */ 1532 /* Processing : This operation is described in Sec. 8.7.2.4 under the */ 1533 /* title "Filtering process for edges for bS equal to 4" in */ 1534 /* ITU T Rec H.264 with alpha and beta values different in */ 1535 /* U and V. */ 1536 /* */ 1537 /* Outputs : None */ 1538 /* */ 1539 /* Returns : None */ 1540 /* */ 1541 /* Issues : None */ 1542 /* */ 1543 /* Revision History: */ 1544 /* */ 1545 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1546 /* 29 12 2014 Kaushik Draft */ 1547 /* Senthoor */ 1548 /* */ 1549 /*****************************************************************************/ 1550 void ih264_deblk_chroma_horz_bs4(UWORD8 *pu1_src, 1551 WORD32 src_strd, 1552 WORD32 alpha_cb, 1553 WORD32 beta_cb, 1554 WORD32 alpha_cr, 1555 WORD32 beta_cr) 1556 { 1557 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ 1558 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ 1559 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1560 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1561 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1562 UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of U */ 1563 UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of U */ 1564 UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; 1565 WORD8 i = 0, edge; 1566 1567 pu1_p1_u = pu1_src_u - (src_strd << 1); 1568 pu1_p1_v = pu1_src_v - (src_strd << 1); 1569 pos_q0 = 0; 1570 pos_q1 = src_strd; 1571 pos_p0 = src_strd; 1572 pos_p1 = 0; 1573 1574 for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, pu1_src_v += 1575 4, pu1_p1_v += 4) 1576 { 1577 pu1_src_temp_u = pu1_src_u; 1578 pu1_p1_temp_u = pu1_p1_u; 1579 pu1_src_temp_v = pu1_src_v; 1580 pu1_p1_temp_v = pu1_p1_v; 1581 for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, 1582 pu1_src_temp_v += 2, pu1_p1_temp_v += 2) 1583 { 1584 q0_u = pu1_src_temp_u[pos_q0]; 1585 q1_u = pu1_src_temp_u[pos_q1]; 1586 p0_u = pu1_p1_temp_u[pos_p0]; 1587 p1_u = pu1_p1_temp_u[pos_p1]; 1588 1589 q0_v = pu1_src_temp_v[pos_q0]; 1590 q1_v = pu1_src_temp_v[pos_q1]; 1591 p0_v = pu1_p1_temp_v[pos_p0]; 1592 p1_v = pu1_p1_temp_v[pos_p1]; 1593 1594 /* Filter Decision */ 1595 if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb 1596 && ABS(p1_u - p0_u) < beta_cb) 1597 { 1598 /* p0' */ 1599 pu1_p1_temp_u[pos_p0] = (X2(p1_u) + p0_u + q1_u + 2) >> 2; 1600 /* q0' */ 1601 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 1602 } 1603 1604 /* Filter Decision */ 1605 if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr 1606 && ABS(p1_v - p0_v) < beta_cr) 1607 { 1608 /* p0' */ 1609 pu1_p1_temp_v[pos_p0] = (X2(p1_v) + p0_v + q1_v + 2) >> 2; 1610 /* q0' */ 1611 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 1612 } 1613 } 1614 } 1615 } 1616 1617 /*****************************************************************************/ 1618 /* */ 1619 /* Function Name : ih264_deblk_chroma_vert_bslt4() */ 1620 /* */ 1621 /* Description : This function performs filtering of a chroma block */ 1622 /* vertical edge when the boundary strength is less than 4 */ 1623 /* in high profile. */ 1624 /* */ 1625 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1626 /* src_strd - source stride */ 1627 /* alpha_cb - alpha value for the boundary in U */ 1628 /* beta_cb - beta value for the boundary in U */ 1629 /* alpha_cr - alpha value for the boundary in V */ 1630 /* beta_cr - beta value for the boundary in V */ 1631 /* u4_bs - packed Boundary strength array */ 1632 /* pu1_cliptab_cb - tc0_table for U */ 1633 /* pu1_cliptab_cr - tc0_table for V */ 1634 /* */ 1635 /* Globals : None */ 1636 /* */ 1637 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 1638 /* title "Filtering process for edges for bS less than 4" */ 1639 /* in ITU T Rec H.264 with alpha and beta values different */ 1640 /* in U and V. */ 1641 /* */ 1642 /* Outputs : None */ 1643 /* */ 1644 /* Returns : None */ 1645 /* */ 1646 /* Issues : None */ 1647 /* */ 1648 /* Revision History: */ 1649 /* */ 1650 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1651 /* 29 12 2014 Kaushik Draft */ 1652 /* Senthoor */ 1653 /* */ 1654 /*****************************************************************************/ 1655 void ih264_deblk_chroma_vert_bslt4(UWORD8 *pu1_src, 1656 WORD32 src_strd, 1657 WORD32 alpha_cb, 1658 WORD32 beta_cb, 1659 WORD32 alpha_cr, 1660 WORD32 beta_cr, 1661 UWORD32 u4_bs, 1662 const UWORD8 *pu1_cliptab_cb, 1663 const UWORD8 *pu1_cliptab_cr) 1664 { 1665 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 1666 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 1667 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1668 WORD32 blk_strd = src_strd << 1; /* block_increment = src_strd * 2 */ 1669 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1670 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1671 WORD8 i = 0, edge; 1672 WORD8 delta; 1673 WORD8 tcb, tcr; 1674 WORD16 val; 1675 UWORD8 tcb0, tcr0, u1_bs; 1676 1677 pos_q0 = 0; 1678 pos_q1 = 2; 1679 pos_p0 = -2; 1680 pos_p1 = -4; 1681 1682 for(edge = 0; edge < 4; 1683 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 1684 { 1685 pu1_src_temp_u = pu1_src_u; 1686 pu1_src_temp_v = pu1_src_v; 1687 /* Filter Decision */ 1688 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 1689 if(!u1_bs) 1690 continue; 1691 /* tc0 */ 1692 tcb0 = pu1_cliptab_cb[u1_bs]; 1693 tcr0 = pu1_cliptab_cr[u1_bs]; 1694 tcb = tcb0 + 1; 1695 tcr = tcr0 + 1; 1696 for(i = 0; i < 2; ++i, pu1_src_temp_u += src_strd, pu1_src_temp_v += 1697 src_strd) 1698 { 1699 q0_u = pu1_src_temp_u[pos_q0]; 1700 q1_u = pu1_src_temp_u[pos_q1]; 1701 p0_u = pu1_src_temp_u[pos_p0]; 1702 p1_u = pu1_src_temp_u[pos_p1]; 1703 1704 q0_v = pu1_src_temp_v[pos_q0]; 1705 q1_v = pu1_src_temp_v[pos_q1]; 1706 p0_v = pu1_src_temp_v[pos_p0]; 1707 p1_v = pu1_src_temp_v[pos_p1]; 1708 1709 /* Filter Decision */ 1710 if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb 1711 && ABS(p1_u - p0_u) < beta_cb) 1712 { 1713 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 1714 delta = CLIP3(-tcb, tcb, val); 1715 /* p0' */ 1716 val = p0_u + delta; 1717 pu1_src_temp_u[pos_p0] = CLIP_U8(val); 1718 /* q0' */ 1719 val = q0_u - delta; 1720 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 1721 } 1722 1723 /* Filter Decision */ 1724 if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr 1725 && ABS(p1_v - p0_v) < beta_cr) 1726 { 1727 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 1728 delta = CLIP3(-tcr, tcr, val); 1729 /* p0' */ 1730 val = p0_v + delta; 1731 pu1_src_temp_v[pos_p0] = CLIP_U8(val); 1732 /* q0' */ 1733 val = q0_v - delta; 1734 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 1735 } 1736 } 1737 } 1738 } 1739 1740 /*****************************************************************************/ 1741 /* */ 1742 /* Function Name : ih264_deblk_chroma_horz_bslt4() */ 1743 /* */ 1744 /* Description : This function performs filtering of a chroma block */ 1745 /* horizontal edge when the boundary strength is less than */ 1746 /* 4 in high profile. */ 1747 /* */ 1748 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1749 /* src_strd - source stride */ 1750 /* alpha_cb - alpha value for the boundary in U */ 1751 /* beta_cb - beta value for the boundary in U */ 1752 /* alpha_cr - alpha value for the boundary in V */ 1753 /* beta_cr - beta value for the boundary in V */ 1754 /* u4_bs - packed Boundary strength array */ 1755 /* pu1_cliptab_cb - tc0_table for U */ 1756 /* pu1_cliptab_cr - tc0_table for V */ 1757 /* */ 1758 /* Globals : None */ 1759 /* */ 1760 /* Processing : This operation is described in Sec. 8.7.2.3 under the */ 1761 /* title "Filtering process for edges for bS less than 4" */ 1762 /* in ITU T Rec H.264 with alpha and beta values different */ 1763 /* in U and V. */ 1764 /* */ 1765 /* Outputs : None */ 1766 /* */ 1767 /* Returns : None */ 1768 /* */ 1769 /* Issues : None */ 1770 /* */ 1771 /* Revision History: */ 1772 /* */ 1773 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1774 /* 29 12 2014 Kaushik Draft */ 1775 /* Senthoor */ 1776 /* */ 1777 /*****************************************************************************/ 1778 void ih264_deblk_chroma_horz_bslt4(UWORD8 *pu1_src, 1779 WORD32 src_strd, 1780 WORD32 alpha_cb, 1781 WORD32 beta_cb, 1782 WORD32 alpha_cr, 1783 WORD32 beta_cr, 1784 UWORD32 u4_bs, 1785 const UWORD8 *pu1_cliptab_cb, 1786 const UWORD8 *pu1_cliptab_cr) 1787 { 1788 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 1789 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 1790 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1791 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1792 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1793 UWORD8 *pu1_p1_u; /* Pointer to the src sample p1 of plane U*/ 1794 UWORD8 *pu1_p1_v; /* Pointer to the src sample p1 of plane V*/ 1795 UWORD8 *pu1_p1_temp_u, *pu1_p1_temp_v; 1796 WORD8 i = 0, edge; 1797 WORD8 delta; 1798 WORD8 tcb, tcr; 1799 WORD16 val; 1800 UWORD8 u1_bs; 1801 UWORD8 tcb0, tcr0; 1802 1803 pu1_p1_u = pu1_src_u - (src_strd << 1); 1804 pu1_p1_v = pu1_src_v - (src_strd << 1); 1805 pos_q0 = 0; 1806 pos_q1 = src_strd; 1807 pos_p0 = src_strd; 1808 pos_p1 = 0; 1809 1810 for(edge = 0; edge < 4; edge++, pu1_src_u += 4, pu1_p1_u += 4, 1811 pu1_src_v += 4, pu1_p1_v += 4) 1812 { 1813 pu1_src_temp_u = pu1_src_u; 1814 pu1_p1_temp_u = pu1_p1_u; 1815 pu1_src_temp_v = pu1_src_v; 1816 pu1_p1_temp_v = pu1_p1_v; 1817 1818 /* Filter Decision */ 1819 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 1820 if(!u1_bs) 1821 continue; 1822 /* tc0 */ 1823 tcb0 = pu1_cliptab_cb[u1_bs]; 1824 tcr0 = pu1_cliptab_cr[u1_bs]; 1825 1826 for(i = 0; i < 2; ++i, pu1_src_temp_u += 2, pu1_p1_temp_u += 2, 1827 pu1_src_temp_v += 2, pu1_p1_temp_v += 2) 1828 { 1829 q0_u = pu1_src_temp_u[pos_q0]; 1830 q1_u = pu1_src_temp_u[pos_q1]; 1831 p0_u = pu1_p1_temp_u[pos_p0]; 1832 p1_u = pu1_p1_temp_u[pos_p1]; 1833 1834 q0_v = pu1_src_temp_v[pos_q0]; 1835 q1_v = pu1_src_temp_v[pos_q1]; 1836 p0_v = pu1_p1_temp_v[pos_p0]; 1837 p1_v = pu1_p1_temp_v[pos_p1]; 1838 1839 /* tc */ 1840 tcb = tcb0 + 1; 1841 tcr = tcr0 + 1; 1842 /* Filter Decision */ 1843 if(ABS(p0_u - q0_u) < alpha_cb && ABS(q1_u - q0_u) < beta_cb 1844 && ABS(p1_u - p0_u) < beta_cb) 1845 { 1846 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 1847 delta = CLIP3(-tcb, tcb, val); 1848 /* p0' */ 1849 val = p0_u + delta; 1850 pu1_p1_temp_u[pos_p0] = CLIP_U8(val); 1851 /* q0' */ 1852 val = q0_u - delta; 1853 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 1854 } 1855 /* Filter Decision */ 1856 if(ABS(p0_v - q0_v) < alpha_cr && ABS(q1_v - q0_v) < beta_cr 1857 && ABS(p1_v - p0_v) < beta_cr) 1858 { 1859 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 1860 delta = CLIP3(-tcr, tcr, val); 1861 /* p0' */ 1862 val = p0_v + delta; 1863 pu1_p1_temp_v[pos_p0] = CLIP_U8(val); 1864 /* q0' */ 1865 val = q0_v - delta; 1866 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 1867 } 1868 } 1869 } 1870 } 1871 1872 /*****************************************************************************/ 1873 /* */ 1874 /* Function Name : ih264_deblk_chroma_vert_bs4_mbaff() */ 1875 /* */ 1876 /* Description : This function performs filtering of a chroma block */ 1877 /* vertical edge when boundary strength is set to 4 in high */ 1878 /* profile. */ 1879 /* */ 1880 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1881 /* src_strd - source stride */ 1882 /* alpha_cb - alpha value for the boundary in U */ 1883 /* beta_cb - beta value for the boundary in U */ 1884 /* alpha_cr - alpha value for the boundary in V */ 1885 /* beta_cr - beta value for the boundary in V */ 1886 /* u4_bs - packed Boundary strength array */ 1887 /* pu1_cliptab_cb - tc0_table for U */ 1888 /* pu1_cliptab_cr - tc0_table for V */ 1889 /* */ 1890 /* Globals : None */ 1891 /* */ 1892 /* Processing : When the function is called twice, this operation is as */ 1893 /* described in Sec. 8.7.2.4 under the title "Filtering */ 1894 /* process for edges for bS equal to 4" in ITU T Rec H.264 */ 1895 /* with alpha and beta values different in U and V. */ 1896 /* */ 1897 /* Outputs : None */ 1898 /* */ 1899 /* Returns : None */ 1900 /* */ 1901 /* Issues : None */ 1902 /* */ 1903 /* Revision History: */ 1904 /* */ 1905 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1906 /* 29 12 2014 Kaushik Draft */ 1907 /* Senthoor */ 1908 /* */ 1909 /*****************************************************************************/ 1910 void ih264_deblk_chroma_vert_bs4_mbaff(UWORD8 *pu1_src, 1911 WORD32 src_strd, 1912 WORD32 alpha_cb, 1913 WORD32 beta_cb, 1914 WORD32 alpha_cr, 1915 WORD32 beta_cr) 1916 { 1917 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of U */ 1918 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of V */ 1919 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 1920 WORD32 blk_strd = src_strd; 1921 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 1922 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 1923 WORD8 edge; 1924 1925 pos_q0 = 0; 1926 pos_q1 = 2; 1927 pos_p0 = -2; 1928 pos_p1 = -4; 1929 1930 for(edge = 0; edge < 4; 1931 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 1932 { 1933 pu1_src_temp_u = pu1_src_u; 1934 pu1_src_temp_v = pu1_src_v; 1935 q0_u = pu1_src_temp_u[pos_q0]; 1936 q1_u = pu1_src_temp_u[pos_q1]; 1937 p0_u = pu1_src_temp_u[pos_p0]; 1938 p1_u = pu1_src_temp_u[pos_p1]; 1939 q0_v = pu1_src_temp_v[pos_q0]; 1940 q1_v = pu1_src_temp_v[pos_q1]; 1941 p0_v = pu1_src_temp_v[pos_p0]; 1942 p1_v = pu1_src_temp_v[pos_p1]; 1943 1944 /* Filter Decision */ 1945 if((ABS(p0_u - q0_u) < alpha_cb) && 1946 (ABS(q1_u - q0_u) < beta_cb) && 1947 (ABS(p1_u - p0_u) < beta_cb)) 1948 { 1949 /* p0' */ 1950 pu1_src_temp_u[pos_p0] = ((X2(p1_u) + p0_u + q1_u + 2) >> 2); 1951 /* q0' */ 1952 pu1_src_temp_u[pos_q0] = (X2(q1_u) + q0_u + p1_u + 2) >> 2; 1953 } 1954 1955 /* Filter Decision */ 1956 if((ABS(p0_v - q0_v) < alpha_cr) && 1957 (ABS(q1_v - q0_v) < beta_cr) && 1958 (ABS(p1_v - p0_v) < beta_cr)) 1959 { 1960 /* p0' */ 1961 pu1_src_temp_v[pos_p0] = ((X2(p1_v) + p0_v + q1_v + 2) >> 2); 1962 /* q0' */ 1963 pu1_src_temp_v[pos_q0] = (X2(q1_v) + q0_v + p1_v + 2) >> 2; 1964 } 1965 } 1966 } 1967 1968 /*****************************************************************************/ 1969 /* */ 1970 /* Function Name : ih264_deblk_chroma_vert_bslt4_mbaff() */ 1971 /* */ 1972 /* Description : This function performs filtering of a chroma block */ 1973 /* vertical edge when boundary strength is less than 4 in */ 1974 /* high profile. */ 1975 /* */ 1976 /* Inputs : pu1_src - pointer to the src sample q0 of U */ 1977 /* src_strd - source stride */ 1978 /* alpha_cb - alpha value for the boundary in U */ 1979 /* beta_cb - beta value for the boundary in U */ 1980 /* alpha_cr - alpha value for the boundary in V */ 1981 /* beta_cr - beta value for the boundary in V */ 1982 /* u4_bs - packed Boundary strength array */ 1983 /* pu1_cliptab_cb - tc0_table for U */ 1984 /* pu1_cliptab_cr - tc0_table for V */ 1985 /* */ 1986 /* Globals : None */ 1987 /* */ 1988 /* Processing : When the function is called twice, this operation is as */ 1989 /* described in Sec. 8.7.2.4 under the title "Filtering */ 1990 /* process for edges for bS less than 4" in ITU T Rec H.264 */ 1991 /* with alpha and beta values different in U and V. */ 1992 /* */ 1993 /* Outputs : None */ 1994 /* */ 1995 /* Returns : None */ 1996 /* */ 1997 /* Issues : None */ 1998 /* */ 1999 /* Revision History: */ 2000 /* */ 2001 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 2002 /* 29 12 2014 Kaushik Draft */ 2003 /* Senthoor */ 2004 /* */ 2005 /*****************************************************************************/ 2006 void ih264_deblk_chroma_vert_bslt4_mbaff(UWORD8 *pu1_src, 2007 WORD32 src_strd, 2008 WORD32 alpha_cb, 2009 WORD32 beta_cb, 2010 WORD32 alpha_cr, 2011 WORD32 beta_cr, 2012 UWORD32 u4_bs, 2013 const UWORD8 *pu1_cliptab_cb, 2014 const UWORD8 *pu1_cliptab_cr) 2015 { 2016 UWORD8 *pu1_src_u = pu1_src; /* Pointer to the src sample q0 of plane U*/ 2017 UWORD8 *pu1_src_v = pu1_src + 1; /* Pointer to the src sample q0 of plane V*/ 2018 UWORD8 p1_u, p0_u, q0_u, q1_u, p1_v, p0_v, q0_v, q1_v; 2019 WORD32 blk_strd = src_strd; 2020 WORD32 pos_p1, pos_p0, pos_q0, pos_q1; 2021 UWORD8 *pu1_src_temp_u, *pu1_src_temp_v; 2022 WORD8 edge; 2023 WORD8 delta; 2024 WORD8 tcb, tcr; 2025 WORD16 val; 2026 UWORD8 tcb0, tcr0, u1_bs; 2027 2028 pos_q0 = 0; 2029 pos_q1 = 2; 2030 pos_p0 = -2; 2031 pos_p1 = -4; 2032 2033 for(edge = 0; edge < 4; 2034 edge++, pu1_src_u += blk_strd, pu1_src_v += blk_strd) 2035 { 2036 pu1_src_temp_u = pu1_src_u; 2037 pu1_src_temp_v = pu1_src_v; 2038 /* Filter Decision */ 2039 u1_bs = (UWORD8)((u4_bs >> ((3 - edge) << 3)) & 0x0ff); 2040 if(!u1_bs) 2041 continue; 2042 /* tc0 */ 2043 tcb0 = pu1_cliptab_cb[u1_bs]; 2044 tcr0 = pu1_cliptab_cr[u1_bs]; 2045 tcb = tcb0 + 1; 2046 tcr = tcr0 + 1; 2047 q0_u = pu1_src_temp_u[pos_q0]; 2048 q1_u = pu1_src_temp_u[pos_q1]; 2049 p0_u = pu1_src_temp_u[pos_p0]; 2050 p1_u = pu1_src_temp_u[pos_p1]; 2051 2052 q0_v = pu1_src_temp_v[pos_q0]; 2053 q1_v = pu1_src_temp_v[pos_q1]; 2054 p0_v = pu1_src_temp_v[pos_p0]; 2055 p1_v = pu1_src_temp_v[pos_p1]; 2056 2057 /* Filter Decision */ 2058 if((ABS(p0_u - q0_u) < alpha_cb) && 2059 (ABS(q1_u - q0_u) < beta_cb) && 2060 (ABS(p1_u - p0_u) < beta_cb)) 2061 { 2062 val = ((((q0_u - p0_u) << 2) + (p1_u - q1_u) + 4) >> 3); 2063 delta = CLIP3(-tcb, tcb, val); 2064 /* p0' */ 2065 val = p0_u + delta; 2066 pu1_src_temp_u[pos_p0] = CLIP_U8(val); 2067 /* q0' */ 2068 val = q0_u - delta; 2069 pu1_src_temp_u[pos_q0] = CLIP_U8(val); 2070 } 2071 2072 /* Filter Decision */ 2073 if((ABS(p0_v - q0_v) < alpha_cr) && 2074 (ABS(q1_v - q0_v) < beta_cr) && 2075 (ABS(p1_v - p0_v) < beta_cr)) 2076 { 2077 val = ((((q0_v - p0_v) << 2) + (p1_v - q1_v) + 4) >> 3); 2078 delta = CLIP3(-tcr, tcr, val); 2079 /* p0' */ 2080 val = p0_v + delta; 2081 pu1_src_temp_v[pos_p0] = CLIP_U8(val); 2082 /* q0' */ 2083 val = q0_v - delta; 2084 pu1_src_temp_v[pos_q0] = CLIP_U8(val); 2085 } 2086 } 2087 } 2088