Macroblocks can refer to the same reference picture using different indices when the same picture appears in multiple slots in the current reference picture lists. That leads to calculating the wrong loop filter strength for edge processing, and small errors in the conformance suite on (for example) CVWP5_TOSHIBA_E.264 and others. Modify the test-suite and checksums for affected test files where this situation occurs.
Showing the changes to codec/decoder/core/src/deblocking.cpp (1 of 5 files). Show all
Unified · Split
| @@ -55,17 +55,17 @@ namespace WelsDec { · 54 unmodified lines | ||
| 55 | 55 | #define g_kiBetaTable(x) g_kiBetaTable[(x)+12] |
| 56 | 56 | #define g_kiTc0Table(x) g_kiTc0Table[(x)+12] |
| 57 | 57 | |
| 58 | −#define MB_BS_MV(iRefIndex, iMotionVector, iMbXy, iMbBn, iIndex, iNeighIndex) \ | |
| 58 | +#define MB_BS_MV(pRefPic0, pRefPic1, iMotionVector, iMbXy, iMbBn, iIndex, iNeighIndex) \ | |
| 59 | 59 | (\ |
| 60 | − ( iRefIndex[iMbXy][iIndex] - iRefIndex[iMbBn][iNeighIndex] )||\ | |
| 60 | + ( pRefPic0 != pRefPic1) ||\ | |
| 61 | 61 | ( WELS_ABS( iMotionVector[iMbXy][iIndex][0] - iMotionVector[iMbBn][iNeighIndex][0] ) >= 4 ) ||\ |
| 62 | 62 | ( WELS_ABS( iMotionVector[iMbXy][iIndex][1] - iMotionVector[iMbBn][iNeighIndex][1] ) >= 4 )\ |
| 63 | 63 | ) |
| 64 | 64 | |
| 65 | 65 | #if defined(SAME_MB_DIFF_REFIDX) |
| 66 | −#define SMB_EDGE_MV(iRefIndex, iMotionVector, iIndex, iNeighIndex) \ | |
| 66 | +#define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \ | |
| 67 | 67 | (\ |
| 68 | − ( iRefIndex[iIndex] - iRefIndex[iNeighIndex] )||(\ | |
| 68 | + ( pRefPics[iIndex] != pRefPics[iNeighIndex] )||(\ | |
| 69 | 69 | ( WELS_ABS( iMotionVector[iIndex][0] - iMotionVector[iNeighIndex][0] ) &(~3) ) |\ |
| 70 | 70 | ( WELS_ABS( iMotionVector[iIndex][1] - iMotionVector[iNeighIndex][1] ) &(~3) ))\ |
| 71 | 71 | ) |
| @@ -76,8 +76,8 @@ namespace WelsDec { · 4 unmodified lines | ||
| 76 | 76 | ) |
| 77 | 77 | #endif |
| 78 | 78 | |
| 79 | −#define BS_EDGE(bsx1, iRefIndex, iMotionVector, iIndex, iNeighIndex) \ | |
| 80 | −( (bsx1|SMB_EDGE_MV(iRefIndex, iMotionVector, iIndex, iNeighIndex))<<((uint8_t)(!!bsx1))) | |
| 79 | +#define BS_EDGE(bsx1, pRefPics, iMotionVector, iIndex, iNeighIndex) \ | |
| 80 | +( (bsx1|SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex))<<((uint8_t)(!!bsx1))) | |
| 81 | 81 | |
| 82 | 82 | #define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \ |
| 83 | 83 | {\ |
| @@ -201,14 +201,24 @@ void inline DeblockingBSInsideMBAvsbase8x8 (int8_t* pNnzTab, uint8_t nBS[2][4][4 · 117 unmodified lines | ||
| 201 | 201 | nBS[1][2][2] = nBS[1][2][3] = (i8x8NnzTab[1] | i8x8NnzTab[3]) << iLShiftFactor; |
| 202 | 202 | } |
| 203 | 203 | |
| 204 | −void static inline DeblockingBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS[2][4][4], int8_t* pNnzTab, | |
| 204 | +void static inline DeblockingBSInsideMBNormal (PDeblockingFilter pFilter, PDqLayer pCurDqLayer, uint8_t nBS[2][4][4], int8_t* pNnzTab, | |
| 205 | 205 | int32_t iMbXy) { |
| 206 | 206 | uint32_t uiNnz32b0, uiNnz32b1, uiNnz32b2, uiNnz32b3; |
| 207 | − int8_t* iRefIndex = pCurDqLayer->pRefIndex[LIST_0][iMbXy]; | |
| 207 | + int8_t* iRefIdx = pCurDqLayer->pRefIndex[LIST_0][iMbXy]; | |
| 208 | + void *iRefs[MB_BLOCK4x4_NUM]; | |
| 209 | + int i; | |
| 208 | 210 | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBsx4, 4, 4); |
| 209 | 211 | |
| 210 | 212 | int8_t i8x8NnzTab[4]; |
| 211 | 213 | |
| 214 | + /* Look up each reference picture based on indices */ | |
| 215 | + for (i = 0; i < MB_BLOCK4x4_NUM; i++) { | |
| 216 | + if (iRefIdx[i] > REF_NOT_IN_LIST) | |
| 217 | + iRefs[i] = pFilter->pRefPics[LIST_0][iRefIdx[i]]; | |
| 218 | + else | |
| 219 | + iRefs[i] = NULL; | |
| 220 | + } | |
| 221 | + | |
| 212 | 222 | if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) { |
| 213 | 223 | for (int32_t i = 0; i < 4; i++) { |
| 214 | 224 | int32_t iBlkIdx = i << 2; |
| @@ -216,15 +226,15 @@ void static inline DeblockingBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS · 1 unmodified line | ||
| 216 | 226 | pNnzTab[g_kuiMbCountScan4Idx[iBlkIdx + 2]] | pNnzTab[g_kuiMbCountScan4Idx[iBlkIdx + 3]]); |
| 217 | 227 | } |
| 218 | 228 | //vertical |
| 219 | − nBS[0][2][0] = nBS[0][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 229 | + nBS[0][2][0] = nBS[0][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 220 | 230 | g_kuiMbCountScan4Idx[1 << 2], g_kuiMbCountScan4Idx[0]); |
| 221 | − nBS[0][2][2] = nBS[0][2][3] = BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 231 | + nBS[0][2][2] = nBS[0][2][3] = BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 222 | 232 | g_kuiMbCountScan4Idx[3 << 2], g_kuiMbCountScan4Idx[2 << 2]); |
| 223 | 233 | |
| 224 | 234 | //horizontal |
| 225 | − nBS[1][2][0] = nBS[1][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 235 | + nBS[1][2][0] = nBS[1][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 226 | 236 | g_kuiMbCountScan4Idx[2 << 2], g_kuiMbCountScan4Idx[0]); |
| 227 | − nBS[1][2][2] = nBS[1][2][3] = BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 237 | + nBS[1][2][2] = nBS[1][2][3] = BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], | |
| 228 | 238 | g_kuiMbCountScan4Idx[3 << 2], g_kuiMbCountScan4Idx[1 << 2]); |
| 229 | 239 | } else { |
| 230 | 240 | uiNnz32b0 = * (uint32_t*) (pNnzTab + 0); |
| @@ -234,58 +244,69 @@ void static inline DeblockingBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS · 3 unmodified lines | ||
| 234 | 244 | |
| 235 | 245 | for (int i = 0; i < 3; i++) |
| 236 | 246 | uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1]; |
| 237 | − nBS[0][1][0] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 1, 0); | |
| 238 | − nBS[0][2][0] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 2, 1); | |
| 239 | − nBS[0][3][0] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 3, 2); | |
| 247 | + nBS[0][1][0] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 1, 0); | |
| 248 | + nBS[0][2][0] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 2, 1); | |
| 249 | + nBS[0][3][0] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 3, 2); | |
| 240 | 250 | |
| 241 | 251 | for (int i = 0; i < 3; i++) |
| 242 | 252 | uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1]; |
| 243 | − nBS[0][1][1] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 5, 4); | |
| 244 | − nBS[0][2][1] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 6, 5); | |
| 245 | − nBS[0][3][1] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 7, 6); | |
| 253 | + nBS[0][1][1] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 5, 4); | |
| 254 | + nBS[0][2][1] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 6, 5); | |
| 255 | + nBS[0][3][1] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 7, 6); | |
| 246 | 256 | |
| 247 | 257 | for (int i = 0; i < 3; i++) |
| 248 | 258 | uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1]; |
| 249 | − nBS[0][1][2] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 9, 8); | |
| 250 | − nBS[0][2][2] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 10, 9); | |
| 251 | − nBS[0][3][2] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 11, 10); | |
| 259 | + nBS[0][1][2] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 9, 8); | |
| 260 | + nBS[0][2][2] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 10, 9); | |
| 261 | + nBS[0][3][2] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 11, 10); | |
| 252 | 262 | |
| 253 | 263 | for (int i = 0; i < 3; i++) |
| 254 | 264 | uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1]; |
| 255 | − nBS[0][1][3] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 13, 12); | |
| 256 | − nBS[0][2][3] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 14, 13); | |
| 257 | − nBS[0][3][3] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 15, 14); | |
| 265 | + nBS[0][1][3] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 13, 12); | |
| 266 | + nBS[0][2][3] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 14, 13); | |
| 267 | + nBS[0][3][3] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 15, 14); | |
| 258 | 268 | |
| 259 | 269 | // horizontal |
| 260 | 270 | * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1); |
| 261 | − nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 4, 0); | |
| 262 | − nBS[1][1][1] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 5, 1); | |
| 263 | − nBS[1][1][2] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 6, 2); | |
| 264 | − nBS[1][1][3] = BS_EDGE (uiBsx4[3], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 7, 3); | |
| 271 | + nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 4, 0); | |
| 272 | + nBS[1][1][1] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 5, 1); | |
| 273 | + nBS[1][1][2] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 6, 2); | |
| 274 | + nBS[1][1][3] = BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 7, 3); | |
| 265 | 275 | |
| 266 | 276 | * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2); |
| 267 | − nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 8, 4); | |
| 268 | − nBS[1][2][1] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 9, 5); | |
| 269 | − nBS[1][2][2] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 10, 6); | |
| 270 | − nBS[1][2][3] = BS_EDGE (uiBsx4[3], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 11, 7); | |
| 277 | + nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 8, 4); | |
| 278 | + nBS[1][2][1] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 9, 5); | |
| 279 | + nBS[1][2][2] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 10, 6); | |
| 280 | + nBS[1][2][3] = BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 11, 7); | |
| 271 | 281 | |
| 272 | 282 | * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3); |
| 273 | − nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 12, 8); | |
| 274 | − nBS[1][3][1] = BS_EDGE (uiBsx4[1], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 13, 9); | |
| 275 | − nBS[1][3][2] = BS_EDGE (uiBsx4[2], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 14, 10); | |
| 276 | − nBS[1][3][3] = BS_EDGE (uiBsx4[3], iRefIndex, pCurDqLayer->pMv[LIST_0][iMbXy], 15, 11); | |
| 283 | + nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 12, 8); | |
| 284 | + nBS[1][3][1] = BS_EDGE (uiBsx4[1], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 13, 9); | |
| 285 | + nBS[1][3][2] = BS_EDGE (uiBsx4[2], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 14, 10); | |
| 286 | + nBS[1][3][3] = BS_EDGE (uiBsx4[3], iRefs, pCurDqLayer->pMv[LIST_0][iMbXy], 15, 11); | |
| 277 | 287 | } |
| 278 | 288 | } |
| 279 | 289 | |
| 280 | −void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS[2][4][4], int8_t* pNnzTab, | |
| 290 | +void static inline DeblockingBSliceBSInsideMBNormal (PDeblockingFilter pFilter, PDqLayer pCurDqLayer, uint8_t nBS[2][4][4], int8_t* pNnzTab, | |
| 281 | 291 | int32_t iMbXy) { |
| 282 | 292 | uint32_t uiNnz32b0, uiNnz32b1, uiNnz32b2, uiNnz32b3; |
| 283 | − int8_t* iRefIndex[LIST_A]; | |
| 284 | − iRefIndex[LIST_0] = pCurDqLayer->pRefIndex[LIST_0][iMbXy]; | |
| 285 | − iRefIndex[LIST_1] = pCurDqLayer->pRefIndex[LIST_1][iMbXy]; | |
| 286 | − ENFORCE_STACK_ALIGN_1D (uint8_t, uiBsx4, 4, 4); | |
| 293 | + void *iRefs[LIST_A][MB_BLOCK4x4_NUM]; | |
| 287 | 294 | |
| 295 | + ENFORCE_STACK_ALIGN_1D (uint8_t, uiBsx4, 4, 4); | |
| 288 | 296 | int8_t i8x8NnzTab[4]; |
| 297 | + int l; | |
| 298 | + | |
| 299 | + for (l = 0; l < LIST_A; l++) { | |
| 300 | + int8_t* iRefIdx = pCurDqLayer->pRefIndex[l][iMbXy]; | |
| 301 | + int i; | |
| 302 | + /* Look up each reference picture based on indices */ | |
| 303 | + for (i = 0; i < MB_BLOCK4x4_NUM; i++) { | |
| 304 | + if (iRefIdx[i] > REF_NOT_IN_LIST) | |
| 305 | + iRefs[l][i] = pFilter->pRefPics[l][iRefIdx[i]]; | |
| 306 | + else | |
| 307 | + iRefs[l][i] = NULL; | |
| 308 | + } | |
| 309 | + } | |
| 289 | 310 | |
| 290 | 311 | if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) { |
| 291 | 312 | for (int32_t i = 0; i < 4; i++) { |
| @@ -298,8 +319,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 6 unmodified lines | ||
| 298 | 319 | int8_t iNeigborIndex = g_kuiMbCountScan4Idx[0]; |
| 299 | 320 | nBS[0][2][0] = nBS[0][2][1] = 1; |
| 300 | 321 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 301 | − if (iRefIndex[listIdx][iIndex] > REF_NOT_IN_LIST && iRefIndex[listIdx][iNeigborIndex] > REF_NOT_IN_LIST) { | |
| 302 | − nBS[0][2][0] = nBS[0][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefIndex[listIdx], | |
| 322 | + if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 323 | + nBS[0][2][0] = nBS[0][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[1]), iRefs[listIdx], | |
| 303 | 324 | pCurDqLayer->pMv[listIdx][iMbXy], |
| 304 | 325 | iIndex, iNeigborIndex); |
| 305 | 326 | break; |
| @@ -309,8 +330,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 3 unmodified lines | ||
| 309 | 330 | iNeigborIndex = g_kuiMbCountScan4Idx[2 << 2]; |
| 310 | 331 | nBS[0][2][2] = nBS[0][2][3] = 1; |
| 311 | 332 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 312 | − if (iRefIndex[listIdx][iIndex] > REF_NOT_IN_LIST && iRefIndex[listIdx][iNeigborIndex] > REF_NOT_IN_LIST) { | |
| 313 | − nBS[0][2][2] = nBS[0][2][3] = BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefIndex[listIdx], | |
| 333 | + if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 334 | + nBS[0][2][2] = nBS[0][2][3] = BS_EDGE ((i8x8NnzTab[2] | i8x8NnzTab[3]), iRefs[listIdx], | |
| 314 | 335 | pCurDqLayer->pMv[listIdx][iMbXy], |
| 315 | 336 | iIndex, iNeigborIndex); |
| 316 | 337 | break; |
| @@ -322,8 +343,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 5 unmodified lines | ||
| 322 | 343 | iNeigborIndex = g_kuiMbCountScan4Idx[0]; |
| 323 | 344 | nBS[1][2][0] = nBS[1][2][1] = 1; |
| 324 | 345 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 325 | − if (iRefIndex[listIdx][iIndex] > REF_NOT_IN_LIST && iRefIndex[listIdx][iNeigborIndex] > REF_NOT_IN_LIST) { | |
| 326 | − nBS[1][2][0] = nBS[1][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefIndex[listIdx], | |
| 346 | + if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 347 | + nBS[1][2][0] = nBS[1][2][1] = BS_EDGE ((i8x8NnzTab[0] | i8x8NnzTab[2]), iRefs[listIdx], | |
| 327 | 348 | pCurDqLayer->pMv[listIdx][iMbXy], |
| 328 | 349 | iIndex, iNeigborIndex); |
| 329 | 350 | break; |
| @@ -334,8 +355,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 4 unmodified lines | ||
| 334 | 355 | iNeigborIndex = g_kuiMbCountScan4Idx[1 << 2]; |
| 335 | 356 | nBS[1][2][2] = nBS[1][2][3] = 1; |
| 336 | 357 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 337 | − if (iRefIndex[listIdx][iIndex] > REF_NOT_IN_LIST && iRefIndex[listIdx][iNeigborIndex] > REF_NOT_IN_LIST) { | |
| 338 | − nBS[1][2][2] = nBS[1][2][3] = BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefIndex[listIdx], | |
| 358 | + if (iRefs[listIdx][iIndex] && iRefs[listIdx][iNeigborIndex]) { | |
| 359 | + nBS[1][2][2] = nBS[1][2][3] = BS_EDGE ((i8x8NnzTab[1] | i8x8NnzTab[3]), iRefs[listIdx], | |
| 339 | 360 | pCurDqLayer->pMv[listIdx][iMbXy], |
| 340 | 361 | iIndex, iNeigborIndex); |
| 341 | 362 | break; |
| @@ -351,22 +372,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 9 unmodified lines | ||
| 351 | 372 | uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1]; |
| 352 | 373 | nBS[0][1][0] = 1; |
| 353 | 374 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 354 | − if (iRefIndex[listIdx][1] > REF_NOT_IN_LIST && iRefIndex[listIdx][0] > REF_NOT_IN_LIST) { | |
| 355 | − nBS[0][1][0] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 1, 0); | |
| 375 | + if (iRefs[listIdx][1] && iRefs[listIdx][0]) { | |
| 376 | + nBS[0][1][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 1, 0); | |
| 356 | 377 | break; |
| 357 | 378 | } |
| 358 | 379 | } |
| 359 | 380 | nBS[0][2][0] = 1; |
| 360 | 381 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 361 | − if (iRefIndex[listIdx][2] > REF_NOT_IN_LIST && iRefIndex[listIdx][1] > REF_NOT_IN_LIST) { | |
| 362 | − nBS[0][2][0] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 2, 1); | |
| 382 | + if (iRefs[listIdx][2] && iRefs[listIdx][1]) { | |
| 383 | + nBS[0][2][0] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 2, 1); | |
| 363 | 384 | break; |
| 364 | 385 | } |
| 365 | 386 | } |
| 366 | 387 | nBS[0][3][0] = 1; |
| 367 | 388 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 368 | − if (iRefIndex[listIdx][3] > REF_NOT_IN_LIST && iRefIndex[listIdx][2] > REF_NOT_IN_LIST) { | |
| 369 | − nBS[0][3][0] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 3, 2); | |
| 389 | + if (iRefs[listIdx][3] && iRefs[listIdx][2]) { | |
| 390 | + nBS[0][3][0] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 3, 2); | |
| 370 | 391 | break; |
| 371 | 392 | } |
| 372 | 393 | } |
| @@ -375,22 +396,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines | ||
| 375 | 396 | uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1]; |
| 376 | 397 | nBS[0][1][1] = 1; |
| 377 | 398 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 378 | − if (iRefIndex[listIdx][5] > REF_NOT_IN_LIST && iRefIndex[listIdx][4] > REF_NOT_IN_LIST) { | |
| 379 | − nBS[0][1][1] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 5, 4); | |
| 399 | + if (iRefs[listIdx][5] && iRefs[listIdx][4]) { | |
| 400 | + nBS[0][1][1] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 5, 4); | |
| 380 | 401 | break; |
| 381 | 402 | } |
| 382 | 403 | } |
| 383 | 404 | nBS[0][2][1] = 1; |
| 384 | 405 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 385 | − if (iRefIndex[listIdx][6] > REF_NOT_IN_LIST && iRefIndex[listIdx][5] > REF_NOT_IN_LIST) { | |
| 386 | − nBS[0][2][1] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 6, 5); | |
| 406 | + if (iRefs[listIdx][6] && iRefs[listIdx][5]) { | |
| 407 | + nBS[0][2][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 6, 5); | |
| 387 | 408 | break; |
| 388 | 409 | } |
| 389 | 410 | } |
| 390 | 411 | nBS[0][3][1] = 1; |
| 391 | 412 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 392 | − if (iRefIndex[listIdx][7] > REF_NOT_IN_LIST && iRefIndex[listIdx][6] > REF_NOT_IN_LIST) { | |
| 393 | − nBS[0][3][1] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 7, 6); | |
| 413 | + if (iRefs[listIdx][7] && iRefs[listIdx][6]) { | |
| 414 | + nBS[0][3][1] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 7, 6); | |
| 394 | 415 | break; |
| 395 | 416 | } |
| 396 | 417 | } |
| @@ -399,22 +420,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines | ||
| 399 | 420 | uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1]; |
| 400 | 421 | nBS[0][1][2] = 1; |
| 401 | 422 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 402 | − if (iRefIndex[listIdx][9] > REF_NOT_IN_LIST && iRefIndex[listIdx][8] > REF_NOT_IN_LIST) { | |
| 403 | − nBS[0][1][2] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 9, 8); | |
| 423 | + if (iRefs[listIdx][9] && iRefs[listIdx][8]) { | |
| 424 | + nBS[0][1][2] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 9, 8); | |
| 404 | 425 | break; |
| 405 | 426 | } |
| 406 | 427 | } |
| 407 | 428 | nBS[0][2][2] = 1; |
| 408 | 429 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 409 | − if (iRefIndex[listIdx][10] > REF_NOT_IN_LIST && iRefIndex[listIdx][9] > REF_NOT_IN_LIST) { | |
| 410 | − nBS[0][2][2] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 10, 9); | |
| 430 | + if (iRefs[listIdx][10] && iRefs[listIdx][9]) { | |
| 431 | + nBS[0][2][2] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 10, 9); | |
| 411 | 432 | break; |
| 412 | 433 | } |
| 413 | 434 | } |
| 414 | 435 | nBS[0][3][2] = 1; |
| 415 | 436 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 416 | − if (iRefIndex[listIdx][11] > REF_NOT_IN_LIST && iRefIndex[listIdx][10] > REF_NOT_IN_LIST) { | |
| 417 | − nBS[0][3][2] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 11, 10); | |
| 437 | + if (iRefs[listIdx][11] && iRefs[listIdx][10]) { | |
| 438 | + nBS[0][3][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 11, 10); | |
| 418 | 439 | break; |
| 419 | 440 | } |
| 420 | 441 | } |
| @@ -423,22 +444,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines | ||
| 423 | 444 | uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1]; |
| 424 | 445 | nBS[0][1][3] = 1; |
| 425 | 446 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 426 | − if (iRefIndex[listIdx][13] > REF_NOT_IN_LIST && iRefIndex[listIdx][12] > REF_NOT_IN_LIST) { | |
| 427 | − nBS[0][1][3] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 13, 12); | |
| 447 | + if (iRefs[listIdx][13] && iRefs[listIdx][12]) { | |
| 448 | + nBS[0][1][3] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 13, 12); | |
| 428 | 449 | break; |
| 429 | 450 | } |
| 430 | 451 | } |
| 431 | 452 | nBS[0][2][3] = 1; |
| 432 | 453 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 433 | − if (iRefIndex[listIdx][14] > REF_NOT_IN_LIST && iRefIndex[listIdx][13] > REF_NOT_IN_LIST) { | |
| 434 | − nBS[0][2][3] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 14, 13); | |
| 454 | + if (iRefs[listIdx][14] && iRefs[listIdx][13]) { | |
| 455 | + nBS[0][2][3] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 14, 13); | |
| 435 | 456 | break; |
| 436 | 457 | } |
| 437 | 458 | } |
| 438 | 459 | nBS[0][3][3] = 1; |
| 439 | 460 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 440 | − if (iRefIndex[listIdx][15] > REF_NOT_IN_LIST && iRefIndex[listIdx][14] > REF_NOT_IN_LIST) { | |
| 441 | − nBS[0][3][3] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 15, 14); | |
| 461 | + if (iRefs[listIdx][15] && iRefs[listIdx][14]) { | |
| 462 | + nBS[0][3][3] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 15, 14); | |
| 442 | 463 | break; |
| 443 | 464 | } |
| 444 | 465 | } |
| @@ -447,29 +468,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines | ||
| 447 | 468 | * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1); |
| 448 | 469 | nBS[1][1][0] = 1; |
| 449 | 470 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 450 | − if (iRefIndex[listIdx][4] > REF_NOT_IN_LIST && iRefIndex[listIdx][0] > REF_NOT_IN_LIST) { | |
| 451 | − nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 4, 0); | |
| 471 | + if (iRefs[listIdx][4] && iRefs[listIdx][0]) { | |
| 472 | + nBS[1][1][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 4, 0); | |
| 452 | 473 | break; |
| 453 | 474 | } |
| 454 | 475 | } |
| 455 | 476 | nBS[1][1][1] = 1; |
| 456 | 477 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 457 | − if (iRefIndex[listIdx][5] > REF_NOT_IN_LIST && iRefIndex[listIdx][1] > REF_NOT_IN_LIST) { | |
| 458 | − nBS[1][1][1] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 5, 1); | |
| 478 | + if (iRefs[listIdx][5] && iRefs[listIdx][1]) { | |
| 479 | + nBS[1][1][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 5, 1); | |
| 459 | 480 | break; |
| 460 | 481 | } |
| 461 | 482 | } |
| 462 | 483 | nBS[1][1][2] = 1; |
| 463 | 484 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 464 | − if (iRefIndex[listIdx][6] > REF_NOT_IN_LIST && iRefIndex[listIdx][2] > REF_NOT_IN_LIST) { | |
| 465 | − nBS[1][1][2] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 6, 2); | |
| 485 | + if (iRefs[listIdx][6] && iRefs[listIdx][2]) { | |
| 486 | + nBS[1][1][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 6, 2); | |
| 466 | 487 | break; |
| 467 | 488 | } |
| 468 | 489 | } |
| 469 | 490 | nBS[1][1][3] = 1; |
| 470 | 491 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 471 | − if (iRefIndex[listIdx][7] > REF_NOT_IN_LIST && iRefIndex[listIdx][3] > REF_NOT_IN_LIST) { | |
| 472 | − nBS[1][1][3] = BS_EDGE (uiBsx4[3], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 7, 3); | |
| 492 | + if (iRefs[listIdx][7] && iRefs[listIdx][3]) { | |
| 493 | + nBS[1][1][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 7, 3); | |
| 473 | 494 | break; |
| 474 | 495 | } |
| 475 | 496 | } |
| @@ -477,29 +498,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line | ||
| 477 | 498 | * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2); |
| 478 | 499 | nBS[1][2][0] = 1; |
| 479 | 500 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 480 | − if (iRefIndex[listIdx][8] > REF_NOT_IN_LIST && iRefIndex[listIdx][4] > REF_NOT_IN_LIST) { | |
| 481 | − nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 8, 4); | |
| 501 | + if (iRefs[listIdx][8] && iRefs[listIdx][4]) { | |
| 502 | + nBS[1][2][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 8, 4); | |
| 482 | 503 | break; |
| 483 | 504 | } |
| 484 | 505 | } |
| 485 | 506 | nBS[1][2][1] = 1; |
| 486 | 507 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 487 | − if (iRefIndex[listIdx][9] > REF_NOT_IN_LIST && iRefIndex[listIdx][5] > REF_NOT_IN_LIST) { | |
| 488 | − nBS[1][2][1] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 9, 5); | |
| 508 | + if (iRefs[listIdx][9] && iRefs[listIdx][5]) { | |
| 509 | + nBS[1][2][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 9, 5); | |
| 489 | 510 | break; |
| 490 | 511 | } |
| 491 | 512 | } |
| 492 | 513 | nBS[1][2][2] = 1; |
| 493 | 514 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 494 | − if (iRefIndex[listIdx][10] > REF_NOT_IN_LIST && iRefIndex[listIdx][6] > REF_NOT_IN_LIST) { | |
| 495 | − nBS[1][2][2] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 10, 6); | |
| 515 | + if (iRefs[listIdx][10] && iRefs[listIdx][6]) { | |
| 516 | + nBS[1][2][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 10, 6); | |
| 496 | 517 | break; |
| 497 | 518 | } |
| 498 | 519 | } |
| 499 | 520 | nBS[1][2][3] = 1; |
| 500 | 521 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 501 | − if (iRefIndex[listIdx][11] > REF_NOT_IN_LIST && iRefIndex[listIdx][7] > REF_NOT_IN_LIST) { | |
| 502 | − nBS[1][2][3] = BS_EDGE (uiBsx4[3], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 11, 7); | |
| 522 | + if (iRefs[listIdx][11] && iRefs[listIdx][7]) { | |
| 523 | + nBS[1][2][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 11, 7); | |
| 503 | 524 | break; |
| 504 | 525 | } |
| 505 | 526 | } |
| @@ -507,29 +528,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line | ||
| 507 | 528 | * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3); |
| 508 | 529 | nBS[1][3][0] = 1; |
| 509 | 530 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 510 | − if (iRefIndex[listIdx][12] > REF_NOT_IN_LIST && iRefIndex[listIdx][8] > REF_NOT_IN_LIST) { | |
| 511 | − nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 12, 8); | |
| 531 | + if (iRefs[listIdx][12] && iRefs[listIdx][8]) { | |
| 532 | + nBS[1][3][0] = BS_EDGE (uiBsx4[0], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 12, 8); | |
| 512 | 533 | break; |
| 513 | 534 | } |
| 514 | 535 | } |
| 515 | 536 | nBS[1][3][1] = 1; |
| 516 | 537 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 517 | − if (iRefIndex[listIdx][13] > REF_NOT_IN_LIST && iRefIndex[listIdx][9] > REF_NOT_IN_LIST) { | |
| 518 | − nBS[1][3][1] = BS_EDGE (uiBsx4[1], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 13, 9); | |
| 538 | + if (iRefs[listIdx][13] && iRefs[listIdx][9]) { | |
| 539 | + nBS[1][3][1] = BS_EDGE (uiBsx4[1], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 13, 9); | |
| 519 | 540 | break; |
| 520 | 541 | } |
| 521 | 542 | } |
| 522 | 543 | nBS[1][3][2] = 1; |
| 523 | 544 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 524 | − if (iRefIndex[listIdx][14] > REF_NOT_IN_LIST && iRefIndex[listIdx][10] > REF_NOT_IN_LIST) { | |
| 525 | − nBS[1][3][2] = BS_EDGE (uiBsx4[2], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 14, 10); | |
| 545 | + if (iRefs[listIdx][14] && iRefs[listIdx][10]) { | |
| 546 | + nBS[1][3][2] = BS_EDGE (uiBsx4[2], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 14, 10); | |
| 526 | 547 | break; |
| 527 | 548 | } |
| 528 | 549 | } |
| 529 | 550 | nBS[1][3][3] = 1; |
| 530 | 551 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 531 | − if (iRefIndex[listIdx][15] > REF_NOT_IN_LIST && iRefIndex[listIdx][11] > REF_NOT_IN_LIST) { | |
| 532 | − nBS[1][3][3] = BS_EDGE (uiBsx4[3], iRefIndex[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 15, 11); | |
| 552 | + if (iRefs[listIdx][15] && iRefs[listIdx][11]) { | |
| 553 | + nBS[1][3][3] = BS_EDGE (uiBsx4[3], iRefs[listIdx], pCurDqLayer->pMv[listIdx][iMbXy], 15, 11); | |
| 533 | 554 | break; |
| 534 | 555 | } |
| 535 | 556 | } |
| @@ -537,7 +558,7 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line | ||
| 537 | 558 | } |
| 538 | 559 | |
| 539 | 560 | |
| 540 | −uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int32_t iNeighMb, int32_t iMbXy) { | |
| 561 | +uint32_t DeblockingBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLayer pCurDqLayer, int32_t iEdge, int32_t iNeighMb, int32_t iMbXy) { | |
| 541 | 562 | int32_t i, j; |
| 542 | 563 | uint32_t uiBSx4; |
| 543 | 564 | uint8_t* pBS = (uint8_t*) (&uiBSx4); |
| @@ -545,6 +566,7 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 1 unmodified line | ||
| 545 | 566 | const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4]; |
| 546 | 567 | const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0]; |
| 547 | 568 | const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8]; |
| 569 | + int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[LIST_0]; | |
| 548 | 570 | |
| 549 | 571 | if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) { |
| 550 | 572 | for (i = 0; i < 2; i++) { |
| @@ -555,7 +577,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 4 unmodified lines | ||
| 555 | 577 | if (uiNzc) { |
| 556 | 578 | pBS[i << 1] = pBS[1 + (i << 1)] = 2; |
| 557 | 579 | } else { |
| 558 | − pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[LIST_0], pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, | |
| 580 | + PPicture ref0, ref1; | |
| 581 | + ref0 = (iRefIdx[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iMbXy][*pB8x8Idx]] : NULL; | |
| 582 | + ref1 = (iRefIdx[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iNeighMb][*pBn8x8Idx]] : NULL; | |
| 583 | + pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, | |
| 559 | 584 | *pB8x8Idx, *pBn8x8Idx); |
| 560 | 585 | } |
| 561 | 586 | pB8x8Idx += 4; |
| @@ -571,7 +596,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 9 unmodified lines | ||
| 571 | 596 | if (uiNzc | pCurDqLayer->pNzc[iNeighMb][*pBnIdx]) { |
| 572 | 597 | pBS[j + (i << 1)] = 2; |
| 573 | 598 | } else { |
| 574 | − pBS[j + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[LIST_0], pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pB8x8Idx, | |
| 599 | + PPicture ref0, ref1; | |
| 600 | + ref0 = (iRefIdx[iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iMbXy][*pB8x8Idx]] : NULL; | |
| 601 | + ref1 = (iRefIdx[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iNeighMb][*pBnIdx]] : NULL; | |
| 602 | + pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pB8x8Idx, | |
| 575 | 603 | *pBnIdx); |
| 576 | 604 | } |
| 577 | 605 | pBnIdx++; |
| @@ -588,7 +616,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 10 unmodified lines | ||
| 588 | 616 | if (uiNzc | pCurDqLayer->pNzc[iMbXy][*pBIdx]) { |
| 589 | 617 | pBS[j + (i << 1)] = 2; |
| 590 | 618 | } else { |
| 591 | − pBS[j + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[LIST_0], pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pBIdx, | |
| 619 | + PPicture ref0, ref1; | |
| 620 | + ref0 = (iRefIdx[iMbXy][*pBIdx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iMbXy][*pBIdx]] : NULL; | |
| 621 | + ref1 = (iRefIdx[iNeighMb][*pBn8x8Idx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iNeighMb][*pBn8x8Idx]] : NULL; | |
| 622 | + pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pBIdx, | |
| 592 | 623 | *pBn8x8Idx); |
| 593 | 624 | } |
| 594 | 625 | pBIdx++; |
| @@ -601,8 +632,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 6 unmodified lines | ||
| 601 | 632 | if (pCurDqLayer->pNzc[iMbXy][*pBIdx] | pCurDqLayer->pNzc[iNeighMb][*pBnIdx]) { |
| 602 | 633 | pBS[i] = 2; |
| 603 | 634 | } else { |
| 604 | − pBS[i] = MB_BS_MV (pCurDqLayer->pRefIndex[LIST_0], pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pBIdx, | |
| 605 | − *pBnIdx); | |
| 635 | + PPicture ref0, ref1; | |
| 636 | + ref0 = (iRefIdx[iMbXy][*pBIdx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iMbXy][*pBIdx]] : NULL; | |
| 637 | + ref1 = (iRefIdx[iNeighMb][*pBnIdx] > REF_NOT_IN_LIST) ? pFilter->pRefPics[LIST_0][iRefIdx[iNeighMb][*pBnIdx]] : NULL; | |
| 638 | + pBS[i] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[LIST_0], iMbXy, iNeighMb, *pBIdx, *pBnIdx); | |
| 606 | 639 | } |
| 607 | 640 | pBIdx++; |
| 608 | 641 | pBnIdx++; |
| @@ -611,7 +644,7 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 2 unmodified lines | ||
| 611 | 644 | |
| 612 | 645 | return uiBSx4; |
| 613 | 646 | } |
| 614 | −uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int32_t iNeighMb, int32_t iMbXy) { | |
| 647 | +uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDeblockingFilter pFilter, PDqLayer pCurDqLayer, int32_t iEdge, int32_t iNeighMb, int32_t iMbXy) { | |
| 615 | 648 | int32_t i, j; |
| 616 | 649 | uint32_t uiBSx4; |
| 617 | 650 | uint8_t* pBS = (uint8_t*) (&uiBSx4); |
| @@ -619,6 +652,7 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 1 unmodified line | ||
| 619 | 652 | const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4]; |
| 620 | 653 | const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0]; |
| 621 | 654 | const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8]; |
| 655 | + PPicture ref0, ref1; | |
| 622 | 656 | |
| 623 | 657 | if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) { |
| 624 | 658 | for (i = 0; i < 2; i++) { |
| @@ -633,7 +667,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 8 unmodified lines | ||
| 633 | 667 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 634 | 668 | if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST |
| 635 | 669 | && pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) { |
| 636 | − pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[listIdx], pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, | |
| 670 | + int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[listIdx]; | |
| 671 | + ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]]; | |
| 672 | + ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]]; | |
| 673 | + pBS[i << 1] = pBS[1 + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, | |
| 637 | 674 | *pB8x8Idx, *pBn8x8Idx); |
| 638 | 675 | break; |
| 639 | 676 | } |
| @@ -656,7 +693,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 16 unmodified lines | ||
| 656 | 693 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 657 | 694 | if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST |
| 658 | 695 | && pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) { |
| 659 | − pBS[j + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[listIdx], pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pB8x8Idx, | |
| 696 | + int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[listIdx]; | |
| 697 | + ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pB8x8Idx]]; | |
| 698 | + ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]]; | |
| 699 | + pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pB8x8Idx, | |
| 660 | 700 | *pBnIdx); |
| 661 | 701 | break; |
| 662 | 702 | } |
| @@ -680,8 +720,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 17 unmodified lines | ||
| 680 | 720 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 681 | 721 | if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST |
| 682 | 722 | && pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBn8x8Idx] > REF_NOT_IN_LIST) { |
| 683 | − pBS[j + (i << 1)] = MB_BS_MV (pCurDqLayer->pRefIndex[listIdx], pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, | |
| 684 | − *pBn8x8Idx); | |
| 723 | + int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[listIdx]; | |
| 724 | + ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]]; | |
| 725 | + ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBn8x8Idx]]; | |
| 726 | + pBS[j + (i << 1)] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBn8x8Idx); | |
| 685 | 727 | break; |
| 686 | 728 | } |
| 687 | 729 | } |
| @@ -700,7 +742,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 12 unmodified lines | ||
| 700 | 742 | for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) { |
| 701 | 743 | if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST |
| 702 | 744 | && pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBnIdx] > REF_NOT_IN_LIST) { |
| 703 | − pBS[i] = MB_BS_MV (pCurDqLayer->pRefIndex[listIdx], pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBnIdx); | |
| 745 | + int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[listIdx]; | |
| 746 | + ref0 = pFilter->pRefPics[listIdx][iRefIdx[iMbXy][*pBIdx]]; | |
| 747 | + ref1 = pFilter->pRefPics[listIdx][iRefIdx[iNeighMb][*pBnIdx]]; | |
| 748 | + pBS[i] = MB_BS_MV (ref0, ref1, pCurDqLayer->pMv[listIdx], iMbXy, iNeighMb, *pBIdx, *pBnIdx); | |
| 704 | 749 | break; |
| 705 | 750 | } |
| 706 | 751 | } |
| @@ -943,7 +988,7 @@ void DeblockingInterMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, uint8_ · 236 unmodified lines | ||
| 943 | 988 | pDestCb = pFilter->pCsData[1] + ((iMbY * iLineSizeUV + iMbX) << 3); |
| 944 | 989 | pDestCr = pFilter->pCsData[2] + ((iMbY * iLineSizeUV + iMbX) << 3); |
| 945 | 990 | |
| 946 | −//Vertical margrin | |
| 991 | + //Vertical margin | |
| 947 | 992 | if (iBoundryFlag & LEFT_FLAG_MASK) { |
| 948 | 993 | int32_t iLeftXyIndex = iMbXyIndex - 1; |
| 949 | 994 | pFilter->iLumaQP = (iCurLumaQp + pCurDqLayer->pLumaQp[iLeftXyIndex] + 1) >> 1; |
| @@ -1199,10 +1244,10 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 249 unmodified lines | ||
| 1199 | 1244 | iMbNb = iMbXyIndex - 1; |
| 1200 | 1245 | if (bBSlice) { |
| 1201 | 1246 | * (uint32_t*)nBS[0][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBSliceBsMarginalMBAvcbase ( |
| 1202 | − pCurDqLayer, 0, iMbNb, iMbXyIndex); | |
| 1247 | + pFilter, pCurDqLayer, 0, iMbNb, iMbXyIndex); | |
| 1203 | 1248 | } else { |
| 1204 | 1249 | * (uint32_t*)nBS[0][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBsMarginalMBAvcbase ( |
| 1205 | − pCurDqLayer, 0, iMbNb, iMbXyIndex); | |
| 1250 | + pFilter, pCurDqLayer, 0, iMbNb, iMbXyIndex); | |
| 1206 | 1251 | } |
| 1207 | 1252 | } else { |
| 1208 | 1253 | * (uint32_t*)nBS[0][0] = 0; |
| @@ -1211,10 +1256,10 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 2 unmodified lines | ||
| 1211 | 1256 | iMbNb = iMbXyIndex - pCurDqLayer->iMbWidth; |
| 1212 | 1257 | if (bBSlice) { |
| 1213 | 1258 | * (uint32_t*)nBS[1][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBSliceBsMarginalMBAvcbase ( |
| 1214 | − pCurDqLayer, 1, iMbNb, iMbXyIndex); | |
| 1259 | + pFilter, pCurDqLayer, 1, iMbNb, iMbXyIndex); | |
| 1215 | 1260 | } else { |
| 1216 | 1261 | * (uint32_t*)nBS[1][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBsMarginalMBAvcbase ( |
| 1217 | − pCurDqLayer, 1, iMbNb, iMbXyIndex); | |
| 1262 | + pFilter, pCurDqLayer, 1, iMbNb, iMbXyIndex); | |
| 1218 | 1263 | } |
| 1219 | 1264 | } else { |
| 1220 | 1265 | * (uint32_t*)nBS[1][0] = 0; |
| @@ -1233,9 +1278,9 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 12 unmodified lines | ||
| 1233 | 1278 | } else { |
| 1234 | 1279 | |
| 1235 | 1280 | if (bBSlice) { |
| 1236 | − DeblockingBSliceBSInsideMBNormal (pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex); | |
| 1281 | + DeblockingBSliceBSInsideMBNormal (pFilter, pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex); | |
| 1237 | 1282 | } else { |
| 1238 | − DeblockingBSInsideMBNormal (pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex); | |
| 1283 | + DeblockingBSInsideMBNormal (pFilter, pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex); | |
| 1239 | 1284 | } |
| 1240 | 1285 | } |
| 1241 | 1286 | } |
| @@ -1280,6 +1325,8 @@ void WelsDeblockingFilterSlice (PWelsDecoderContext pCtx, PDeblockingFilterMbFun · 38 unmodified lines | ||
| 1280 | 1325 | pFilter.iSliceBetaOffset = pSliceHeaderExt->sSliceHeader.iSliceBetaOffset; |
| 1281 | 1326 | |
| 1282 | 1327 | pFilter.pLoopf = &pCtx->sDeblockingFunc; |
| 1328 | + pFilter.pRefPics[0] = pCtx->sRefPic.pRefList[0]; | |
| 1329 | + pFilter.pRefPics[1] = pCtx->sRefPic.pRefList[1]; | |
| 1283 | 1330 | |
| 1284 | 1331 | /* Step2: macroblock deblocking */ |
| 1285 | 1332 | if (0 == iFilterIdc || 2 == iFilterIdc) { |