History

fix issue 3269: Boundary strength is incorrect for P16x16 in B-Frame.

xiaotianshi2 committed 6 years ago

Commit 4f0b2d11 parent 87471b62 files · +155 −254Browse files

Showing the changes to codec/decoder/core/src/deblocking.cpp (1 of 2 files). Show all

Unified · Split

codec/decoder/core/src/deblocking.cpp+144−243
@@ -62,6 +62,30 @@ namespace WelsDec { · 61 unmodified lines
62 ( WELS_ABS( iMotionVector[iMbXy][iIndex][1] - iMotionVector[iMbBn][iNeighIndex][1] ) >= 4 )\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#if defined(SAME_MB_DIFF_REFIDX)89#if defined(SAME_MB_DIFF_REFIDX)
66#define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \90#define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \
67(\91(\
@@ -76,9 +100,40 @@ namespace WelsDec { · 8 unmodified lines
76)100)
77#endif101#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#define BS_EDGE(bsx1, pRefPics, iMotionVector, iIndex, iNeighIndex) \129#define BS_EDGE(bsx1, pRefPics, iMotionVector, iIndex, iNeighIndex) \
80( (bsx1|SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex))<<((uint8_t)(!!bsx1)))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#define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \137#define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \
83{\138{\
84 iIndex = (iQp + iAlphaOffset);\139 iIndex = (iQp + iAlphaOffset);\
@@ -319,51 +374,23 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 234 unmodified lines
319 //vertical374 //vertical
320 int8_t iIndex = g_kuiMbCountScan4Idx[1 << 2];375 int8_t iIndex = g_kuiMbCountScan4Idx[1 << 2];
321 int8_t iNeigborIndex = g_kuiMbCountScan4Idx[0];376 int8_t iNeigborIndex = g_kuiMbCountScan4Idx[0];
322 nBS[0][2][0] = nBS[0][2][1] = 1;377 nBS[0][2][0] = nBS[0][2][1] = IN_BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefs, pCurDqLayer->pDec->pMv, iMbXy,
323 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {378 iIndex, iNeigborIndex);
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 }
331 iIndex = g_kuiMbCountScan4Idx[3 << 2];379 iIndex = g_kuiMbCountScan4Idx[3 << 2];
332 iNeigborIndex = g_kuiMbCountScan4Idx[2 << 2];380 iNeigborIndex = g_kuiMbCountScan4Idx[2 << 2];
333 nBS[0][2][2] = nBS[0][2][3] = 1;381 nBS[0][2][2] = nBS[0][2][3] = IN_BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pDec->pMv, iMbXy,
334 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {382 iIndex, iNeigborIndex);
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 }
342 383
343 //horizontal384 //horizontal
344 iIndex = g_kuiMbCountScan4Idx[2 << 2];385 iIndex = g_kuiMbCountScan4Idx[2 << 2];
345 iNeigborIndex = g_kuiMbCountScan4Idx[0];386 iNeigborIndex = g_kuiMbCountScan4Idx[0];
346 nBS[1][2][0] = nBS[1][2][1] = 1;387 nBS[1][2][0] = nBS[1][2][1] = IN_BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefs, pCurDqLayer->pDec->pMv, iMbXy,
347 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {388 iIndex, iNeigborIndex);
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 }
355 389
356 iIndex = g_kuiMbCountScan4Idx[3 << 2];390 iIndex = g_kuiMbCountScan4Idx[3 << 2];
357 iNeigborIndex = g_kuiMbCountScan4Idx[1 << 2];391 iNeigborIndex = g_kuiMbCountScan4Idx[1 << 2];
358 nBS[1][2][2] = nBS[1][2][3] = 1;392 nBS[1][2][2] = nBS[1][2][3] = IN_BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pDec->pMv, iMbXy,
359 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {393 iIndex, iNeigborIndex);
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 }
367 } else {394 } else {
368 uiNnz32b0 = * (uint32_t*) (pNnzTab + 0);395 uiNnz32b0 = * (uint32_t*) (pNnzTab + 0);
369 uiNnz32b1 = * (uint32_t*) (pNnzTab + 4);396 uiNnz32b1 = * (uint32_t*) (pNnzTab + 4);
@@ -372,190 +399,51 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 2 unmodified lines
372 399
373 for (int i = 0; i < 3; i++)400 for (int i = 0; i < 3; i++)
374 uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1];401 uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1];
375 nBS[0][1][0] = 1;402 nBS[0][1][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 1, 0);
376 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {403 nBS[0][2][0] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 2, 1);
377 if (iRefs[listIdx][1] && iRefs[listIdx][0]) {404 nBS[0][3][0] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 3, 2);
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 }
396 405
397 for (int i = 0; i < 3; i++)406 for (int i = 0; i < 3; i++)
398 uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1];407 uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1];
399 nBS[0][1][1] = 1;408 nBS[0][1][1] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 5, 4);
400 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {409 nBS[0][2][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 6, 5);
401 if (iRefs[listIdx][5] && iRefs[listIdx][4]) {410 nBS[0][3][1] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 7, 6);
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 }
420 411
421 for (int i = 0; i < 3; i++)412 for (int i = 0; i < 3; i++)
422 uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1];413 uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1];
423 nBS[0][1][2] = 1;414 nBS[0][1][2] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 9, 8);
424 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {415 nBS[0][2][2] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 10, 9);
425 if (iRefs[listIdx][9] && iRefs[listIdx][8]) {416 nBS[0][3][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 11, 10);
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 }
444 417
445 for (int i = 0; i < 3; i++)418 for (int i = 0; i < 3; i++)
446 uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1];419 uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1];
447 nBS[0][1][3] = 1;420 nBS[0][1][3] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 13, 12);
448 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {421 nBS[0][2][3] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 14, 13);
449 if (iRefs[listIdx][13] && iRefs[listIdx][12]) {422 nBS[0][3][3] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 15, 14);
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 }
468 423
469 // horizontal424 // horizontal
470 * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1);425 * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1);
471 nBS[1][1][0] = 1;426 nBS[1][1][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 4, 0);
472 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {427 nBS[1][1][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 5, 1);
473 if (iRefs[listIdx][4] && iRefs[listIdx][0]) {428 nBS[1][1][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 6, 2);
474 nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 4, 0);429 nBS[1][1][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 7, 3);
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 }
499 430
500 * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2);431 * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2);
501 nBS[1][2][0] = 1;432 nBS[1][2][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 8, 4);
502 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {433 nBS[1][2][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 9, 5);
503 if (iRefs[listIdx][8] && iRefs[listIdx][4]) {434 nBS[1][2][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 10, 6);
504 nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 8, 4);435 nBS[1][2][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 11, 7);
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 }
529 436
530 * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3);437 * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3);
531 nBS[1][3][0] = 1;438 nBS[1][3][0] = IN_BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 12, 8);
532 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {439 nBS[1][3][1] = IN_BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 13, 9);
533 if (iRefs[listIdx][12] && iRefs[listIdx][8]) {440 nBS[1][3][2] = IN_BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 14, 10);
534 nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pDec->pMv[listIdx][iMbXy], 12, 8);441 nBS[1][3][3] = IN_BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pDec->pMv, iMbXy, 15, 11);
535 break;442 for (int ii = 0; ii < 2; ii++)
536 }443 for (int jj = 1; jj < 4; jj++)
537 }444 for (int kk = 0; kk < 4; kk++)
538 nBS[1][3][1] = 1;445 if (nBS[ii][jj][kk] > 1)
539 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {446 nBS[ii][jj][kk] = nBS[ii][jj][kk];
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 }
559 }447 }
560}448}
561 449
@@ -662,7 +550,9 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 100 unmodified lines
662 const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4];550 const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4];
663 const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0];551 const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0];
664 const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8];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 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) {557 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) {
668 for (i = 0; i < 2; i++) {558 for (i = 0; i < 2; i++) {
@@ -674,16 +564,19 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 5 unmodified lines
674 pBS[i << 1] = pBS[1 + (i << 1)] = 2;564 pBS[i << 1] = pBS[1 + (i << 1)] = 2;
675 } else {565 } else {
676 pBS[i << 1] = pBS[1 + (i << 1)] = 1;566 pBS[i << 1] = pBS[1 + (i << 1)] = 1;
677 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {567 ref_p0 = iRefIdx0[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pB8x8Idx]] : NULL;
678 if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST568 ref_q0 = iRefIdx0[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBn8x8Idx]] :
679 && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) {569 NULL;
680 int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx];570 ref_p1 = iRefIdx1[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pB8x8Idx]] : NULL;
681 ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]];571 ref_q1 = iRefIdx1[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBn8x8Idx]] :
682 ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]];572 NULL;
683 pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb,573 if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) {
684 *pB8x8Idx, *pBn8x8Idx);574 int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] :
685 break;575 pCurDqLayer->pMv[LIST_0];
686 }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 pB8x8Idx += 4;582 pB8x8Idx += 4;
@@ -700,16 +593,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 10 unmodified lines
700 pBS[j + (i << 1)] = 2;593 pBS[j + (i << 1)] = 2;
701 } else {594 } else {
702 pBS[j + (i << 1)] = 1;595 pBS[j + (i << 1)] = 1;
703 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {596 ref_p0 = iRefIdx0[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pB8x8Idx]] : NULL;
704 if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST597 ref_q0 = iRefIdx0[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBnIdx]] :
705 && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) {598 NULL;
706 int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx];599 ref_p1 = iRefIdx1[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pB8x8Idx]] : NULL;
707 ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]];600 ref_q1 = iRefIdx1[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBnIdx]] :
708 ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]];601 NULL;
709 pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pB8x8Idx,602 if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) {
710 *pBnIdx);603 int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] :
711 break;604 pCurDqLayer->pMv[LIST_0];
712 }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 pBnIdx++;610 pBnIdx++;
@@ -727,15 +622,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 11 unmodified lines
727 pBS[j + (i << 1)] = 2;622 pBS[j + (i << 1)] = 2;
728 } else {623 } else {
729 pBS[j + (i << 1)] = 1;624 pBS[j + (i << 1)] = 1;
730 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {625 ref_p0 = iRefIdx0[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pBIdx]] : NULL;
731 if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST626 ref_q0 = iRefIdx0[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBn8x8Idx]] :
732 && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) {627 NULL;
733 int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx];628 ref_p1 = iRefIdx1[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pBIdx]] : NULL;
734 ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]];629 ref_q1 = iRefIdx1[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBn8x8Idx]] :
735 ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]];630 NULL;
736 pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBn8x8Idx);631 if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) {
737 break;632 int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] :
738 }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 pBIdx++;639 pBIdx++;
@@ -749,15 +647,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 7 unmodified lines
749 pBS[i] = 2;647 pBS[i] = 2;
750 } else {648 } else {
751 pBS[i] = 1;649 pBS[i] = 1;
752 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {650 ref_p0 = iRefIdx0[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iMbXy][*pBIdx]] : NULL;
753 if (pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST651 ref_q0 = iRefIdx0[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_0][iRefIdx0[iNeighMb][*pBnIdx]] :
754 && pCurDqLayer->pDec->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) {652 NULL;
755 int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pDec->pRefIndex[listIdx];653 ref_p1 = iRefIdx1[iMbXy][*pBIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iMbXy][*pBIdx]] : NULL;
756 ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]];654 ref_q1 = iRefIdx1[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST ? pFilter->pRefPics[LIST_1][iRefIdx1[iNeighMb][*pBnIdx]] :
757 ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]];655 NULL;
758 pBS[i] = MB_BS_MV (ref0, ref1, pCurDqLayer->pDec->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBnIdx);656 if (((ref_p0 == ref_q0) && (ref_p1 == ref_q1)) || ((ref_p0 == ref_q1) && (ref_p1 == ref_q0))) {
759 break;657 int16_t (*pMv0)[MB_BLOCK4x4_NUM][MV_A] = pCurDqLayer->pDec != NULL ? pCurDqLayer->pDec->pMv[LIST_0] :
760 }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 pBIdx++;664 pBIdx++;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t