Showing the changes to codec/decoder/core/src/deblocking.cpp (1 of 2 files). Show all
Unified · Split
| @@ -62,6 +62,30 @@ namespace WelsDec { · 61 unmodified lines | ||
| 62 | 62 | ( WELS_ABS( iMotionVector[iMbXy][iIndex][1] - iMotionVector[iMbBn][iNeighIndex][1] ) >= 4 )\ |
| 63 | 63 | ) |
| 64 | 64 | |
| 65 | +#define ON_MB_BS_MV_DIFF(iMV_A, iMV_B, iMbXy, iMbBn, iIndex, iNeighIndex) \ | |
| 66 | +(\ | |
| 67 | + (( WELS_ABS( iMV_A[iMbXy][iIndex][0] - iMV_B[iMbBn][iNeighIndex][0] ) >= 4 ) || \ | |
| 68 | + ( WELS_ABS( iMV_A[iMbXy][iIndex][1] - iMV_B[iMbBn][iNeighIndex][1] ) >= 4 ))\ | |
| 69 | +) | |
| 70 | + | |
| 71 | +#define IN_MB_BS_MV_DIFF(iMV_A, iMV_B, iMbXy, iIndex, iNeighIndex) \ | |
| 72 | +(\ | |
| 73 | + (( WELS_ABS( iMV_A[iMbXy][iIndex][0] - iMV_B[iMbXy][iNeighIndex][0] ) >= 4 ) | \ | |
| 74 | + ( WELS_ABS( iMV_A[iMbXy][iIndex][1] - iMV_B[iMbXy][iNeighIndex][1] ) >= 4 )) \ | |
| 75 | +) | |
| 76 | + | |
| 77 | +//On MB Boundary strength | |
| 78 | +//Apply for B_SLICE | |
| 79 | +#define ON_MB_BS(ref_p0, ref_q0, ref_p1, ref_q1, mv0, mv1, iMbXy, iMbBn, iIndex, iNeighIndex) \ | |
| 80 | +(\ | |
| 81 | + (ref_p0 != ref_p1) ? \ | |
| 82 | + ((ref_p0 == ref_q0) ? \ | |
| 83 | + (ON_MB_BS_MV_DIFF (mv0, mv0, iMbXy, iMbBn, iIndex, iNeighIndex) || ON_MB_BS_MV_DIFF (mv1, mv1, iMbXy, iMbBn, iIndex, iNeighIndex)) : \ | |
| 84 | + (ON_MB_BS_MV_DIFF (mv0, mv1, iMbXy, iMbBn, iIndex, iNeighIndex) || ON_MB_BS_MV_DIFF (mv1, mv0, iMbXy, iMbBn, iIndex, iNeighIndex))) : \ | |
| 85 | + ((ON_MB_BS_MV_DIFF (mv0, mv0, iMbXy, iMbBn, iIndex, iNeighIndex) || ON_MB_BS_MV_DIFF (mv1, mv1, iMbXy, iMbBn, iIndex, iNeighIndex)) && \ | |
| 86 | + (ON_MB_BS_MV_DIFF (mv0, mv1, iMbXy, iMbBn, iIndex, iNeighIndex) || ON_MB_BS_MV_DIFF (mv1, mv0, iMbXy, iMbBn, iIndex, iNeighIndex))) \ | |
| 87 | +) | |
| 88 | + | |
| 65 | 89 | #if defined(SAME_MB_DIFF_REFIDX) |
| 66 | 90 | #define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \ |
| 67 | 91 | (\ |
| @@ -76,9 +100,40 @@ namespace WelsDec { · 8 unmodified lines | ||
| 76 | 100 | ) |
| 77 | 101 | #endif |
| 78 | 102 | |
| 103 | +#if defined(SAME_MB_DIFF_REFIDX) | |
| 104 | +#define IN_SMB_EDGE_MV(refs, mv, iMbXy, iIndex, iNeigborIndex) \ | |
| 105 | +(\ | |
| 106 | + (((refs[LIST_0][iIndex] == refs[LIST_0][iNeigborIndex]) && (refs[LIST_1][iIndex] == refs[LIST_1][iNeigborIndex])) || \ | |
| 107 | + ((refs[LIST_0][iIndex] == refs[LIST_1][iNeigborIndex]) && (refs[LIST_1][iIndex] == refs[LIST_0][iNeigborIndex]))) ? \ | |
| 108 | + ((refs[LIST_0][iIndex] != refs[LIST_1][iIndex]) ? \ | |
| 109 | + ((refs[LIST_0][iIndex] == refs[LIST_0][iNeigborIndex]) ? \ | |
| 110 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_0], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_1], iMbXy, iIndex, iNeigborIndex)) : \ | |
| 111 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_1], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_0], iMbXy, iIndex, iNeigborIndex))) : \ | |
| 112 | + ((IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_0], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_1], iMbXy, iIndex, iNeigborIndex)) && \ | |
| 113 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_1], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_0], iMbXy, iIndex, iNeigborIndex)))) : 1 \ | |
| 114 | +) | |
| 115 | +#else | |
| 116 | +#define IN_SMB_EDGE_MV(refs, mv, iMbXy, iIndex, iNeigborIndex) \ | |
| 117 | +(\ | |
| 118 | + !!(((refs[LIST_0][iIndex] == refs[LIST_0][iNeigborIndex]) && (refs[LIST_1][iIndex] == refs[LIST_1][iNeigborIndex])) || \ | |
| 119 | + ((refs[LIST_0][iIndex] == refs[LIST_1][iNeigborIndex]) && (refs[LIST_1][iIndex] == refs[LIST_0][iNeigborIndex]))) ? \ | |
| 120 | + ((refs[LIST_0][iIndex] != refs[LIST_1][iIndex]) ? \ | |
| 121 | + ((refs[LIST_0][iIndex] == refs[LIST_0][iNeigborIndex]) ? \ | |
| 122 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_0], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_1], iMbXy, iIndex, iNeigborIndex)) : \ | |
| 123 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_1], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_0], iMbXy, iIndex, iNeigborIndex))) : \ | |
| 124 | + ((IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_0], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_1], iMbXy, iIndex, iNeigborIndex)) && \ | |
| 125 | + (IN_MB_BS_MV_DIFF (mv[LIST_0], mv[LIST_1], iMbXy, iIndex, iNeigborIndex) | IN_MB_BS_MV_DIFF (mv[LIST_1], mv[LIST_0], iMbXy, iIndex, iNeigborIndex)))) : 1 \ | |
| 126 | +) | |
| 127 | +#endif | |
| 128 | + | |
| 79 | 129 | #define BS_EDGE(bsx1, pRefPics, iMotionVector, iIndex, iNeighIndex) \ |
| 80 | 130 | ( (bsx1|SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex))<<((uint8_t)(!!bsx1))) |
| 81 | 131 | |
| 132 | +//Inside MB Boundary strength | |
| 133 | +//Apply for B_SLICE | |
| 134 | +#define IN_BS_EDGE(bsx1, refs, mv, iMbXy, iIndex, iNeigborIndex) \ | |
| 135 | +( (bsx1|IN_SMB_EDGE_MV(refs, mv, iMbXy, iIndex, iNeigborIndex))<<((uint8_t)(!!bsx1))) | |
| 136 | + | |
| 82 | 137 | #define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \ |
| 83 | 138 | {\ |
| 84 | 139 | iIndex = (iQp + iAlphaOffset);\ |
| @@ -319,51 +374,23 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 234 unmodified lines | ||
| 319 | 374 | //vertical |
| 320 | 375 | int8_t iIndex = g_kuiMbCountScan4Idx[1 << 2]; |
| 321 | 376 | int8_t iNeigborIndex = g_kuiMbCountScan4Idx[0]; |
| 322 | − nBS[0][2][0] = nBS[0][2][1] = 1; | |
| 323 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 324 | − if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 325 | − nBS[0][2][0] = nBS[0][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefs[listIdx], | |
| 326 | − pCurDqLayer->pDec->pMv[listIdx][iMbXy], | |
| 327 | − iIndex, iNeigborIndex); | |
| 328 | − break; | |
| 329 | − } | |
| 330 | − } | |
| 377 | + nBS[0][2][0] = nBS[0][2][1] = IN_BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefs, pCurDqLayer->pDec->pMv, iMbXy, | |
| 378 | + iIndex, iNeigborIndex); | |
| 331 | 379 | iIndex = g_kuiMbCountScan4Idx[3 << 2]; |
| 332 | 380 | iNeigborIndex = g_kuiMbCountScan4Idx[2 << 2]; |
| 333 | − nBS[0][2][2] = nBS[0][2][3] = 1; | |
| 334 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 335 | − if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 336 | − nBS[0][2][2] = nBS[0][2][3] = BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefs[listIdx], | |
| 337 | − pCurDqLayer->pDec->pMv[listIdx][iMbXy], | |
| 338 | − iIndex, iNeigborIndex); | |
| 339 | − break; | |
| 340 | − } | |
| 341 | − } | |
| 381 | + nBS[0][2][2] = nBS[0][2][3] = IN_BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pDec->pMv, iMbXy, | |
| 382 | + iIndex, iNeigborIndex); | |
| 342 | 383 | |
| 343 | 384 | //horizontal |
| 344 | 385 | iIndex = g_kuiMbCountScan4Idx[2 << 2]; |
| 345 | 386 | iNeigborIndex = g_kuiMbCountScan4Idx[0]; |
| 346 | − nBS[1][2][0] = nBS[1][2][1] = 1; | |
| 347 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 348 | − if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 349 | − nBS[1][2][0] = nBS[1][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefs[listIdx], | |
| 350 | − pCurDqLayer->pDec->pMv[listIdx][iMbXy], | |
| 351 | − iIndex, iNeigborIndex); | |
| 352 | − break; | |
| 353 | − } | |
| 354 | − } | |
| 387 | + nBS[1][2][0] = nBS[1][2][1] = IN_BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefs, pCurDqLayer->pDec->pMv, iMbXy, | |
| 388 | + iIndex, iNeigborIndex); | |
| 355 | 389 | |
| 356 | 390 | iIndex = g_kuiMbCountScan4Idx[3 << 2]; |
| 357 | 391 | iNeigborIndex = g_kuiMbCountScan4Idx[1 << 2]; |
| 358 | − nBS[1][2][2] = nBS[1][2][3] = 1; | |
| 359 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 360 | − if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 361 | − nBS[1][2][2] = nBS[1][2][3] = BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefs[listIdx], | |
| 362 | − pCurDqLayer->pDec->pMv[listIdx][iMbXy], | |
| 363 | − iIndex, iNeigborIndex); | |
| 364 | − break; | |
| 365 | − } | |
| 366 | − } | |
| 392 | + nBS[1][2][2] = nBS[1][2][3] = IN_BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pDec->pMv, iMbXy, | |
| 393 | + iIndex, iNeigborIndex); | |
| 367 | 394 | } else { |
| 368 | 395 | uiNnz32b0 = * (uint32_t*) (pNnzTab + 0); |
| 369 | 396 | uiNnz32b1 = * (uint32_t*) (pNnzTab + 4); |
| @@ -372,190 +399,51 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 2 unmodified lines | ||
| 372 | 399 | |
| 373 | 400 | for (int i = 0; i < 3; i++) |
| 374 | 401 | uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1]; |
| 375 | − nBS[0][1][0] = 1; | |
| 376 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 377 | − if (iRefs[listIdx][1] && iRefs[listIdx][0]) { | |
| 378 | − nBS[0][1][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 1, 0); | |
| 379 | − break; | |
| 380 | − } | |
| 381 | − } | |
| 382 | − nBS[0][2][0] = 1; | |
| 383 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 384 | − if (iRefs[listIdx][2] && iRefs[listIdx][1]) { | |
| 385 | − nBS[0][2][0] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 2, 1); | |
| 386 | − break; | |
| 387 | − } | |
| 388 | − } | |
| 389 | − nBS[0][3][0] = 1; | |
| 390 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 391 | − if (iRefs[listIdx][3] && iRefs[listIdx][2]) { | |
| 392 | − nBS[0][3][0] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 3, 2); | |
| 393 | − break; | |
| 394 | − } | |
| 395 | − } | |
| 402 | + nBS[0][1][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 1, 0); | |
| 403 | + nBS[0][2][0] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 2, 1); | |
| 404 | + nBS[0][3][0] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 3, 2); | |
| 396 | 405 | |
| 397 | 406 | for (int i = 0; i < 3; i++) |
| 398 | 407 | uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1]; |
| 399 | − nBS[0][1][1] = 1; | |
| 400 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 401 | − if (iRefs[listIdx][5] && iRefs[listIdx][4]) { | |
| 402 | − nBS[0][1][1] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 5, 4); | |
| 403 | − break; | |
| 404 | − } | |
| 405 | − } | |
| 406 | − nBS[0][2][1] = 1; | |
| 407 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 408 | − if (iRefs[listIdx][6] && iRefs[listIdx][5]) { | |
| 409 | − nBS[0][2][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 6, 5); | |
| 410 | − break; | |
| 411 | − } | |
| 412 | − } | |
| 413 | − nBS[0][3][1] = 1; | |
| 414 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 415 | − if (iRefs[listIdx][7] && iRefs[listIdx][6]) { | |
| 416 | − nBS[0][3][1] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 7, 6); | |
| 417 | − break; | |
| 418 | − } | |
| 419 | − } | |
| 408 | + nBS[0][1][1] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 5, 4); | |
| 409 | + nBS[0][2][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 6, 5); | |
| 410 | + nBS[0][3][1] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 7, 6); | |
| 420 | 411 | |
| 421 | 412 | for (int i = 0; i < 3; i++) |
| 422 | 413 | uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1]; |
| 423 | − nBS[0][1][2] = 1; | |
| 424 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 425 | − if (iRefs[listIdx][9] && iRefs[listIdx][8]) { | |
| 426 | − nBS[0][1][2] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 9, 8); | |
| 427 | − break; | |
| 428 | − } | |
| 429 | − } | |
| 430 | − nBS[0][2][2] = 1; | |
| 431 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 432 | − if (iRefs[listIdx][10] && iRefs[listIdx][9]) { | |
| 433 | − nBS[0][2][2] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 10, 9); | |
| 434 | − break; | |
| 435 | − } | |
| 436 | − } | |
| 437 | − nBS[0][3][2] = 1; | |
| 438 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 439 | − if (iRefs[listIdx][11] && iRefs[listIdx][10]) { | |
| 440 | − nBS[0][3][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 11, 10); | |
| 441 | − break; | |
| 442 | − } | |
| 443 | − } | |
| 414 | + nBS[0][1][2] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 9, 8); | |
| 415 | + nBS[0][2][2] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 10, 9); | |
| 416 | + nBS[0][3][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 11, 10); | |
| 444 | 417 | |
| 445 | 418 | for (int i = 0; i < 3; i++) |
| 446 | 419 | uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1]; |
| 447 | − nBS[0][1][3] = 1; | |
| 448 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 449 | − if (iRefs[listIdx][13] && iRefs[listIdx][12]) { | |
| 450 | − nBS[0][1][3] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 13, 12); | |
| 451 | − break; | |
| 452 | − } | |
| 453 | − } | |
| 454 | − nBS[0][2][3] = 1; | |
| 455 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 456 | − if (iRefs[listIdx][14] && iRefs[listIdx][13]) { | |
| 457 | − nBS[0][2][3] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 14, 13); | |
| 458 | − break; | |
| 459 | − } | |
| 460 | − } | |
| 461 | − nBS[0][3][3] = 1; | |
| 462 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 463 | − if (iRefs[listIdx][15] && iRefs[listIdx][14]) { | |
| 464 | − nBS[0][3][3] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 15, 14); | |
| 465 | − break; | |
| 466 | − } | |
| 467 | − } | |
| 420 | + nBS[0][1][3] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 13, 12); | |
| 421 | + nBS[0][2][3] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 14, 13); | |
| 422 | + nBS[0][3][3] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 15, 14); | |
| 468 | 423 | |
| 469 | 424 | // horizontal |
| 470 | 425 | * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1); |
| 471 | − nBS[1][1][0] = 1; | |
| 472 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 473 | − if (iRefs[listIdx][4] && iRefs[listIdx][0]) { | |
| 474 | − nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 4, 0); | |
| 475 | − break; | |
| 476 | − } | |
| 477 | − } | |
| 478 | − nBS[1][1][1] = 1; | |
| 479 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 480 | − if (iRefs[listIdx][5] && iRefs[listIdx][1]) { | |
| 481 | − nBS[1][1][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 5, 1); | |
| 482 | − break; | |
| 483 | − } | |
| 484 | − } | |
| 485 | − nBS[1][1][2] = 1; | |
| 486 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 487 | − if (iRefs[listIdx][6] && iRefs[listIdx][2]) { | |
| 488 | − nBS[1][1][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 6, 2); | |
| 489 | − break; | |
| 490 | − } | |
| 491 | − } | |
| 492 | − nBS[1][1][3] = 1; | |
| 493 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 494 | − if (iRefs[listIdx][7] && iRefs[listIdx][3]) { | |
| 495 | − nBS[1][1][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 7, 3); | |
| 496 | − break; | |
| 497 | − } | |
| 498 | − } | |
| 426 | + nBS[1][1][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 4, 0); | |
| 427 | + nBS[1][1][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 5, 1); | |
| 428 | + nBS[1][1][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 6, 2); | |
| 429 | + nBS[1][1][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 7, 3); | |
| 499 | 430 | |
| 500 | 431 | * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2); |
| 501 | − nBS[1][2][0] = 1; | |
| 502 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 503 | − if (iRefs[listIdx][8] && iRefs[listIdx][4]) { | |
| 504 | − nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 8, 4); | |
| 505 | − break; | |
| 506 | − } | |
| 507 | − } | |
| 508 | − nBS[1][2][1] = 1; | |
| 509 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 510 | − if (iRefs[listIdx][9] && iRefs[listIdx][5]) { | |
| 511 | − nBS[1][2][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 9, 5); | |
| 512 | − break; | |
| 513 | − } | |
| 514 | − } | |
| 515 | − nBS[1][2][2] = 1; | |
| 516 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 517 | − if (iRefs[listIdx][10] && iRefs[listIdx][6]) { | |
| 518 | − nBS[1][2][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 10, 6); | |
| 519 | − break; | |
| 520 | − } | |
| 521 | − } | |
| 522 | − nBS[1][2][3] = 1; | |
| 523 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 524 | − if (iRefs[listIdx][11] && iRefs[listIdx][7]) { | |
| 525 | − nBS[1][2][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 11, 7); | |
| 526 | − break; | |
| 527 | − } | |
| 528 | − } | |
| 432 | + nBS[1][2][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 8, 4); | |
| 433 | + nBS[1][2][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 9, 5); | |
| 434 | + nBS[1][2][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 10, 6); | |
| 435 | + nBS[1][2][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 11, 7); | |
| 529 | 436 | |
| 530 | 437 | * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3); |
| 531 | − nBS[1][3][0] = 1; | |
| 532 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 533 | − if (iRefs[listIdx][12] && iRefs[listIdx][8]) { | |
| 534 | − nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 12, 8); | |
| 535 | − break; | |
| 536 | − } | |
| 537 | − } | |
| 538 | − nBS[1][3][1] = 1; | |
| 539 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 540 | − if (iRefs[listIdx][13] && iRefs[listIdx][9]) { | |
| 541 | − nBS[1][3][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 13, 9); | |
| 542 | − break; | |
| 543 | − } | |
| 544 | − } | |
| 545 | − nBS[1][3][2] = 1; | |
| 546 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 547 | − if (iRefs[listIdx][14] && iRefs[listIdx][10]) { | |
| 548 | − nBS[1][3][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 14, 10); | |
| 549 | − break; | |
| 550 | − } | |
| 551 | − } | |
| 552 | − nBS[1][3][3] = 1; | |
| 553 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 554 | − if (iRefs[listIdx][15] && iRefs[listIdx][11]) { | |
| 555 | − nBS[1][3][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 15, 11); | |
| 556 | − break; | |
| 557 | − } | |
| 558 | − } | |
| 438 | + nBS[1][3][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 12, 8); | |
| 439 | + nBS[1][3][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 13, 9); | |
| 440 | + nBS[1][3][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 14, 10); | |
| 441 | + nBS[1][3][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 15, 11); | |
| 442 | + for (int ii = 0; ii < 2; ii++) | |
| 443 | + for (int jj = 1; jj < 4; jj++) | |
| 444 | + for (int kk = 0; kk < 4; kk++) | |
| 445 | + if (nBS[ii][jj][kk] > 1) | |
| 446 | + nBS[ii][jj][kk] = nBS[ii][jj][kk]; | |
| 559 | 447 | } |
| 560 | 448 | } |
| 561 | 449 | |
| @@ -662,7 +550,9 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 100 unmodified lines | ||
| 662 | 550 | const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4]; |
| 663 | 551 | const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0]; |
| 664 | 552 | const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8]; |
| 665 | − PPicture ref0, ref1; | |
| 553 | + PPicture ref_p0, ref_p1, ref_q0, ref_q1; | |
| 554 | + int8_t (*iRefIdx0)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[LIST_0]; | |
| 555 | + int8_t (*iRefIdx1)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[LIST_1]; | |
| 666 | 556 | |
| 667 | 557 | if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) { |
| 668 | 558 | for (i = 0; i < 2; i++) { |
| @@ -674,16 +564,19 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 5 unmodified lines | ||
| 674 | 564 | pBS[i << 1] = pBS[1 + (i << 1)] = 2; |
| 675 | 565 | } else { |
| 676 | 566 | pBS[i << 1] = pBS[1 + (i << 1)] = 1; |
| 677 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 678 | − if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST | |
| 679 | − && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) { | |
| 680 | − int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx]; | |
| 681 | − ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]]; | |
| 682 | − ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]]; | |
| 683 | − pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, | |
| 684 | − *pB8x8Idx, *pBn8x8Idx); | |
| 685 | − break; | |
| 686 | − } | |
| 567 | + ref_p0 = iRefIdx0[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pB8x8Idx]] : NULL; | |
| 568 | + ref_q0 = iRefIdx0[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBn8x8Idx]] : | |
| 569 | + NULL; | |
| 570 | + ref_p1 = iRefIdx1[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pB8x8Idx]] : NULL; | |
| 571 | + ref_q1 = iRefIdx1[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBn8x8Idx]] : | |
| 572 | + NULL; | |
| 573 | + if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) { | |
| 574 | + int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] : | |
| 575 | + pCurDqLayer->pMv[LIST_0]; | |
| 576 | + int16_t (*pMv1)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_1] : | |
| 577 | + pCurDqLayer->pMv[LIST_1]; | |
| 578 | + pBS[i << 1] = pBS[1 + (i << 1)] = ON_MB_BS (ref_p0, ref_q0, ref_p1, ref_q1, pMv0, pMv1, iMbXy, iNeighMb, *pB8x8Idx, | |
| 579 | + *pBn8x8Idx); | |
| 687 | 580 | } |
| 688 | 581 | } |
| 689 | 582 | pB8x8Idx += 4; |
| @@ -700,16 +593,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 10 unmodified lines | ||
| 700 | 593 | pBS[j + (i << 1)] = 2; |
| 701 | 594 | } else { |
| 702 | 595 | pBS[j + (i << 1)] = 1; |
| 703 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 704 | − if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST | |
| 705 | − && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) { | |
| 706 | − int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx]; | |
| 707 | − ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]]; | |
| 708 | − ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]]; | |
| 709 | − pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pB8x8Idx, | |
| 710 | − *pBnIdx); | |
| 711 | − break; | |
| 712 | − } | |
| 596 | + ref_p0 = iRefIdx0[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pB8x8Idx]] : NULL; | |
| 597 | + ref_q0 = iRefIdx0[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBnIdx]] : | |
| 598 | + NULL; | |
| 599 | + ref_p1 = iRefIdx1[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pB8x8Idx]] : NULL; | |
| 600 | + ref_q1 = iRefIdx1[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBnIdx]] : | |
| 601 | + NULL; | |
| 602 | + if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) { | |
| 603 | + int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] : | |
| 604 | + pCurDqLayer->pMv[LIST_0]; | |
| 605 | + int16_t (*pMv1)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_1] : | |
| 606 | + pCurDqLayer->pMv[LIST_1]; | |
| 607 | + pBS[j + (i << 1)] = ON_MB_BS (ref_p0, ref_q0, ref_p1, ref_q1, pMv0, pMv1, iMbXy, iNeighMb, *pB8x8Idx, *pBnIdx); | |
| 713 | 608 | } |
| 714 | 609 | } |
| 715 | 610 | pBnIdx++; |
| @@ -727,15 +622,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 11 unmodified lines | ||
| 727 | 622 | pBS[j + (i << 1)] = 2; |
| 728 | 623 | } else { |
| 729 | 624 | pBS[j + (i << 1)] = 1; |
| 730 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 731 | − if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST | |
| 732 | − && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) { | |
| 733 | − int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx]; | |
| 734 | − ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]]; | |
| 735 | − ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]]; | |
| 736 | − pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBn8x8Idx); | |
| 737 | − break; | |
| 738 | − } | |
| 625 | + ref_p0 = iRefIdx0[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pBIdx]] : NULL; | |
| 626 | + ref_q0 = iRefIdx0[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBn8x8Idx]] : | |
| 627 | + NULL; | |
| 628 | + ref_p1 = iRefIdx1[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pBIdx]] : NULL; | |
| 629 | + ref_q1 = iRefIdx1[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBn8x8Idx]] : | |
| 630 | + NULL; | |
| 631 | + if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) { | |
| 632 | + int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] : | |
| 633 | + pCurDqLayer->pMv[LIST_0]; | |
| 634 | + int16_t (*pMv1)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_1] : | |
| 635 | + pCurDqLayer->pMv[LIST_1]; | |
| 636 | + pBS[j + (i << 1)] = ON_MB_BS (ref_p0, ref_q0, ref_p1, ref_q1, pMv0, pMv1, iMbXy, iNeighMb, *pBIdx, *pBn8x8Idx); | |
| 739 | 637 | } |
| 740 | 638 | } |
| 741 | 639 | pBIdx++; |
| @@ -749,15 +647,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 7 unmodified lines | ||
| 749 | 647 | pBS[i] = 2; |
| 750 | 648 | } else { |
| 751 | 649 | pBS[i] = 1; |
| 752 | − for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { | |
| 753 | − if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST | |
| 754 | − && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) { | |
| 755 | − int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx]; | |
| 756 | − ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]]; | |
| 757 | − ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]]; | |
| 758 | − pBS[i] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBnIdx); | |
| 759 | − break; | |
| 760 | − } | |
| 650 | + ref_p0 = iRefIdx0[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pBIdx]] : NULL; | |
| 651 | + ref_q0 = iRefIdx0[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBnIdx]] : | |
| 652 | + NULL; | |
| 653 | + ref_p1 = iRefIdx1[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pBIdx]] : NULL; | |
| 654 | + ref_q1 = iRefIdx1[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBnIdx]] : | |
| 655 | + NULL; | |
| 656 | + if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) { | |
| 657 | + int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] : | |
| 658 | + pCurDqLayer->pMv[LIST_0]; | |
| 659 | + int16_t (*pMv1)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_1] : | |
| 660 | + pCurDqLayer->pMv[LIST_1]; | |
| 661 | + pBS[i] = ON_MB_BS (ref_p0, ref_q0, ref_p1, ref_q1, pMv0, pMv1, iMbXy, iNeighMb, *pBIdx, *pBnIdx); | |
| 761 | 662 | } |
| 762 | 663 | } |
| 763 | 664 | pBIdx++; |