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
6262 ( WELS_ABS( iMotionVector[iMbXy][iIndex][1] - iMotionVector[iMbBn][iNeighIndex][1] ) >= 4 )\
6363 )
6464
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+
6589 #if defined(SAME_MB_DIFF_REFIDX)
6690 #define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \
6791 (\
@@ -76,9 +100,40 @@ namespace WelsDec { · 8 unmodified lines
76100 )
77101 #endif
78102
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+
79129 #define BS_EDGE(bsx1, pRefPics, iMotionVector, iIndex, iNeighIndex) \
80130 ( (bsx1|SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex))<<((uint8_t)(!!bsx1)))
81131
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+
82137 #define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \
83138 {\
84139 iIndex = (iQp + iAlphaOffset);\
@@ -319,51 +374,23 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 234 unmodified lines
319374 //vertical
320375 int8_t iIndex = g_kuiMbCountScan4Idx[1 << 2];
321376 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);
331379 iIndex = g_kuiMbCountScan4Idx[3 << 2];
332380 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);
342383
343384 //horizontal
344385 iIndex = g_kuiMbCountScan4Idx[2 << 2];
345386 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);
355389
356390 iIndex = g_kuiMbCountScan4Idx[3 << 2];
357391 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);
367394 } else {
368395 uiNnz32b0 = * (uint32_t*) (pNnzTab + 0);
369396 uiNnz32b1 = * (uint32_t*) (pNnzTab + 4);
@@ -372,190 +399,51 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, · 2 unmodified lines
372399
373400 for (int i = 0; i < 3; i++)
374401 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);
396405
397406 for (int i = 0; i < 3; i++)
398407 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);
420411
421412 for (int i = 0; i < 3; i++)
422413 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);
444417
445418 for (int i = 0; i < 3; i++)
446419 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);
468423
469424 // horizontal
470425 * (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);
499430
500431 * (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);
529436
530437 * (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];
559447 }
560448 }
561449
@@ -662,7 +550,9 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 100 unmodified lines
662550 const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4];
663551 const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0];
664552 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];
666556
667557 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) {
668558 for (i = 0; i < 2; i++) {
@@ -674,16 +564,19 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 5 unmodified lines
674564 pBS[i << 1] = pBS[1 + (i << 1)] = 2;
675565 } else {
676566 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);
687580 }
688581 }
689582 pB8x8Idx += 4;
@@ -700,16 +593,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 10 unmodified lines
700593 pBS[j + (i << 1)] = 2;
701594 } else {
702595 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);
713608 }
714609 }
715610 pBnIdx++;
@@ -727,15 +622,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 11 unmodified lines
727622 pBS[j + (i << 1)] = 2;
728623 } else {
729624 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);
739637 }
740638 }
741639 pBIdx++;
@@ -749,15 +647,18 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLay · 7 unmodified lines
749647 pBS[i] = 2;
750648 } else {
751649 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);
761662 }
762663 }
763664 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