History

deblocking: Disambiguate reference pictures

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.

Jan Schmidt committed 7 years ago

Commit 398da801 parent 579a5bc5 files · +197 −137Browse files

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

Unified · Split

codec/decoder/core/src/deblocking.cpp+163−116
@@ -55,17 +55,17 @@ namespace WelsDec { · 54 unmodified lines
5555 #define g_kiBetaTable(x) g_kiBetaTable[(x)+12]
5656 #define g_kiTc0Table(x) g_kiTc0Table[(x)+12]
5757
58−#define MB_BS_MV(iRefIndex, iMotionVector, iMbXy, iMbBn, iIndex, iNeighIndex) \
58+#define MB_BS_MV(pRefPic0, pRefPic1, iMotionVector, iMbXy, iMbBn, iIndex, iNeighIndex) \
5959 (\
60− ( iRefIndex[iMbXy][iIndex] - iRefIndex[iMbBn][iNeighIndex] )||\
60+ ( pRefPic0 != pRefPic1) ||\
6161 ( WELS_ABS( iMotionVector[iMbXy][iIndex][0] - iMotionVector[iMbBn][iNeighIndex][0] ) >= 4 ) ||\
6262 ( WELS_ABS( iMotionVector[iMbXy][iIndex][1] - iMotionVector[iMbBn][iNeighIndex][1] ) >= 4 )\
6363 )
6464
6565 #if defined(SAME_MB_DIFF_REFIDX)
66−#define SMB_EDGE_MV(iRefIndex, iMotionVector, iIndex, iNeighIndex) \
66+#define SMB_EDGE_MV(pRefPics, iMotionVector, iIndex, iNeighIndex) \
6767 (\
68− ( iRefIndex[iIndex] - iRefIndex[iNeighIndex] )||(\
68+ ( pRefPics[iIndex] != pRefPics[iNeighIndex] )||(\
6969 ( WELS_ABS( iMotionVector[iIndex][0] - iMotionVector[iNeighIndex][0] ) &(~3) ) |\
7070 ( WELS_ABS( iMotionVector[iIndex][1] - iMotionVector[iNeighIndex][1] ) &(~3) ))\
7171 )
@@ -76,8 +76,8 @@ namespace WelsDec { · 4 unmodified lines
7676 )
7777 #endif
7878
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)))
8181
8282 #define GET_ALPHA_BETA_FROM_QP(iQp, iAlphaOffset, iBetaOffset, iIndex, iAlpha, iBeta) \
8383 {\
@@ -201,14 +201,24 @@ void inline DeblockingBSInsideMBAvsbase8x8 (int8_t* pNnzTab, uint8_t nBS[2][4][4 · 117 unmodified lines
201201 nBS[1][2][2] = nBS[1][2][3] = (i8x8NnzTab[1] | i8x8NnzTab[3]) << iLShiftFactor;
202202 }
203203
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,
205205 int32_t iMbXy) {
206206 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;
208210 ENFORCE_STACK_ALIGN_1D (uint8_t, uiBsx4, 4, 4);
209211
210212 int8_t i8x8NnzTab[4];
211213
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+
212222 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
213223 for (int32_t i = 0; i < 4; i++) {
214224 int32_t iBlkIdx = i << 2;
@@ -216,15 +226,15 @@ void static inline DeblockingBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS · 1 unmodified line
216226 pNnzTab[g_kuiMbCountScan4Idx[iBlkIdx + 2]] | pNnzTab[g_kuiMbCountScan4Idx[iBlkIdx + 3]]);
217227 }
218228 //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],
220230 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],
222232 g_kuiMbCountScan4Idx[3 << 2], g_kuiMbCountScan4Idx[2 << 2]);
223233
224234 //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],
226236 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],
228238 g_kuiMbCountScan4Idx[3 << 2], g_kuiMbCountScan4Idx[1 << 2]);
229239 } else {
230240 uiNnz32b0 = * (uint32_t*) (pNnzTab + 0);
@@ -234,58 +244,69 @@ void static inline DeblockingBSInsideMBNormal (PDqLayer pCurDqLayer, uint8_t nBS · 3 unmodified lines
234244
235245 for (int i = 0; i < 3; i++)
236246 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);
240250
241251 for (int i = 0; i < 3; i++)
242252 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);
246256
247257 for (int i = 0; i < 3; i++)
248258 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);
252262
253263 for (int i = 0; i < 3; i++)
254264 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);
258268
259269 // horizontal
260270 * (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);
265275
266276 * (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);
271281
272282 * (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);
277287 }
278288 }
279289
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,
281291 int32_t iMbXy) {
282292 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];
287294
295+ ENFORCE_STACK_ALIGN_1D (uint8_t, uiBsx4, 4, 4);
288296 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+ }
289310
290311 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy]) {
291312 for (int32_t i = 0; i < 4; i++) {
@@ -298,8 +319,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 6 unmodified lines
298319 int8_t iNeigborIndex = g_kuiMbCountScan4Idx[0];
299320 nBS[0][2][0] = nBS[0][2][1] = 1;
300321 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],
303324 pCurDqLayer->pMv[listIdx][iMbXy],
304325 iIndex, iNeigborIndex);
305326 break;
@@ -309,8 +330,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 3 unmodified lines
309330 iNeigborIndex = g_kuiMbCountScan4Idx[2 << 2];
310331 nBS[0][2][2] = nBS[0][2][3] = 1;
311332 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],
314335 pCurDqLayer->pMv[listIdx][iMbXy],
315336 iIndex, iNeigborIndex);
316337 break;
@@ -322,8 +343,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 5 unmodified lines
322343 iNeigborIndex = g_kuiMbCountScan4Idx[0];
323344 nBS[1][2][0] = nBS[1][2][1] = 1;
324345 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],
327348 pCurDqLayer->pMv[listIdx][iMbXy],
328349 iIndex, iNeigborIndex);
329350 break;
@@ -334,8 +355,8 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 4 unmodified lines
334355 iNeigborIndex = g_kuiMbCountScan4Idx[1 << 2];
335356 nBS[1][2][2] = nBS[1][2][3] = 1;
336357 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],
339360 pCurDqLayer->pMv[listIdx][iMbXy],
340361 iIndex, iNeigborIndex);
341362 break;
@@ -351,22 +372,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 9 unmodified lines
351372 uiBsx4[i] = pNnzTab[i] | pNnzTab[i + 1];
352373 nBS[0][1][0] = 1;
353374 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);
356377 break;
357378 }
358379 }
359380 nBS[0][2][0] = 1;
360381 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);
363384 break;
364385 }
365386 }
366387 nBS[0][3][0] = 1;
367388 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);
370391 break;
371392 }
372393 }
@@ -375,22 +396,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines
375396 uiBsx4[i] = pNnzTab[4 + i] | pNnzTab[4 + i + 1];
376397 nBS[0][1][1] = 1;
377398 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);
380401 break;
381402 }
382403 }
383404 nBS[0][2][1] = 1;
384405 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);
387408 break;
388409 }
389410 }
390411 nBS[0][3][1] = 1;
391412 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);
394415 break;
395416 }
396417 }
@@ -399,22 +420,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines
399420 uiBsx4[i] = pNnzTab[8 + i] | pNnzTab[8 + i + 1];
400421 nBS[0][1][2] = 1;
401422 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);
404425 break;
405426 }
406427 }
407428 nBS[0][2][2] = 1;
408429 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);
411432 break;
412433 }
413434 }
414435 nBS[0][3][2] = 1;
415436 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);
418439 break;
419440 }
420441 }
@@ -423,22 +444,22 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines
423444 uiBsx4[i] = pNnzTab[12 + i] | pNnzTab[12 + i + 1];
424445 nBS[0][1][3] = 1;
425446 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);
428449 break;
429450 }
430451 }
431452 nBS[0][2][3] = 1;
432453 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);
435456 break;
436457 }
437458 }
438459 nBS[0][3][3] = 1;
439460 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);
442463 break;
443464 }
444465 }
@@ -447,29 +468,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 2 unmodified lines
447468 * (uint32_t*)uiBsx4 = (uiNnz32b0 | uiNnz32b1);
448469 nBS[1][1][0] = 1;
449470 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);
452473 break;
453474 }
454475 }
455476 nBS[1][1][1] = 1;
456477 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);
459480 break;
460481 }
461482 }
462483 nBS[1][1][2] = 1;
463484 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);
466487 break;
467488 }
468489 }
469490 nBS[1][1][3] = 1;
470491 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);
473494 break;
474495 }
475496 }
@@ -477,29 +498,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line
477498 * (uint32_t*)uiBsx4 = (uiNnz32b1 | uiNnz32b2);
478499 nBS[1][2][0] = 1;
479500 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);
482503 break;
483504 }
484505 }
485506 nBS[1][2][1] = 1;
486507 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);
489510 break;
490511 }
491512 }
492513 nBS[1][2][2] = 1;
493514 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);
496517 break;
497518 }
498519 }
499520 nBS[1][2][3] = 1;
500521 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);
503524 break;
504525 }
505526 }
@@ -507,29 +528,29 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line
507528 * (uint32_t*)uiBsx4 = (uiNnz32b2 | uiNnz32b3);
508529 nBS[1][3][0] = 1;
509530 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);
512533 break;
513534 }
514535 }
515536 nBS[1][3][1] = 1;
516537 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);
519540 break;
520541 }
521542 }
522543 nBS[1][3][2] = 1;
523544 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);
526547 break;
527548 }
528549 }
529550 nBS[1][3][3] = 1;
530551 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);
533554 break;
534555 }
535556 }
@@ -537,7 +558,7 @@ void static inline DeblockingBSliceBSInsideMBNormal (PDqLayer pCurDqLayer, uint8 · 1 unmodified line
537558 }
538559
539560
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) {
541562 int32_t i, j;
542563 uint32_t uiBSx4;
543564 uint8_t* pBS = (uint8_t*) (&uiBSx4);
@@ -545,6 +566,7 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 1 unmodified line
545566 const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4];
546567 const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0];
547568 const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8];
569+ int8_t (*iRefIdx)[MB_BLOCK4x4_NUM] = pCurDqLayer->pRefIndex[LIST_0];
548570
549571 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) {
550572 for (i = 0; i < 2; i++) {
@@ -555,7 +577,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 4 unmodified lines
555577 if (uiNzc) {
556578 pBS[i << 1] = pBS[1 + (i << 1)] = 2;
557579 } 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,
559584 *pB8x8Idx, *pBn8x8Idx);
560585 }
561586 pB8x8Idx += 4;
@@ -571,7 +596,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 9 unmodified lines
571596 if (uiNzc | pCurDqLayer->pNzc[iNeighMb][*pBnIdx]) {
572597 pBS[j + (i << 1)] = 2;
573598 } 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,
575603 *pBnIdx);
576604 }
577605 pBnIdx++;
@@ -588,7 +616,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 10 unmodified lines
588616 if (uiNzc | pCurDqLayer->pNzc[iMbXy][*pBIdx]) {
589617 pBS[j + (i << 1)] = 2;
590618 } 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,
592623 *pBn8x8Idx);
593624 }
594625 pBIdx++;
@@ -601,8 +632,10 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 6 unmodified lines
601632 if (pCurDqLayer->pNzc[iMbXy][*pBIdx] | pCurDqLayer->pNzc[iNeighMb][*pBnIdx]) {
602633 pBS[i] = 2;
603634 } 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);
606639 }
607640 pBIdx++;
608641 pBnIdx++;
@@ -611,7 +644,7 @@ uint32_t DeblockingBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdge, int · 2 unmodified lines
611644
612645 return uiBSx4;
613646 }
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) {
615648 int32_t i, j;
616649 uint32_t uiBSx4;
617650 uint8_t* pBS = (uint8_t*) (&uiBSx4);
@@ -619,6 +652,7 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 1 unmodified line
619652 const uint8_t* pBnIdx = &g_kuiTableBIdx[iEdge][4];
620653 const uint8_t* pB8x8Idx = &g_kuiTableB8x8Idx[iEdge][0];
621654 const uint8_t* pBn8x8Idx = &g_kuiTableB8x8Idx[iEdge][8];
655+ PPicture ref0, ref1;
622656
623657 if (pCurDqLayer->pTransformSize8x8Flag[iMbXy] && pCurDqLayer->pTransformSize8x8Flag[iNeighMb]) {
624658 for (i = 0; i < 2; i++) {
@@ -633,7 +667,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 8 unmodified lines
633667 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {
634668 if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST
635669 && 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,
637674 *pB8x8Idx, *pBn8x8Idx);
638675 break;
639676 }
@@ -656,7 +693,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 16 unmodified lines
656693 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {
657694 if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pB8x8Idx] > REF_NOT_IN_LIST
658695 && 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,
660700 *pBnIdx);
661701 break;
662702 }
@@ -680,8 +720,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 17 unmodified lines
680720 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {
681721 if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST
682722 && 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);
685727 break;
686728 }
687729 }
@@ -700,7 +742,10 @@ uint32_t DeblockingBSliceBsMarginalMBAvcbase (PDqLayer pCurDqLayer, int32_t iEdg · 12 unmodified lines
700742 for (int32_t listIdx = LIST_0; listIdx < LIST_A; ++listIdx) {
701743 if (pCurDqLayer->pRefIndex[listIdx][iMbXy][*pBIdx] > REF_NOT_IN_LIST
702744 && 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);
704749 break;
705750 }
706751 }
@@ -943,7 +988,7 @@ void DeblockingInterMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, uint8_ · 236 unmodified lines
943988 pDestCb = pFilter->pCsData[1] + ((iMbY * iLineSizeUV + iMbX) << 3);
944989 pDestCr = pFilter->pCsData[2] + ((iMbY * iLineSizeUV + iMbX) << 3);
945990
946−//Vertical margrin
991+ //Vertical margin
947992 if (iBoundryFlag & LEFT_FLAG_MASK) {
948993 int32_t iLeftXyIndex = iMbXyIndex - 1;
949994 pFilter->iLumaQP = (iCurLumaQp + pCurDqLayer->pLumaQp[iLeftXyIndex] + 1) >> 1;
@@ -1199,10 +1244,10 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 249 unmodified lines
11991244 iMbNb = iMbXyIndex - 1;
12001245 if (bBSlice) {
12011246 * (uint32_t*)nBS[0][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBSliceBsMarginalMBAvcbase (
1202− pCurDqLayer, 0, iMbNb, iMbXyIndex);
1247+ pFilter, pCurDqLayer, 0, iMbNb, iMbXyIndex);
12031248 } else {
12041249 * (uint32_t*)nBS[0][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBsMarginalMBAvcbase (
1205− pCurDqLayer, 0, iMbNb, iMbXyIndex);
1250+ pFilter, pCurDqLayer, 0, iMbNb, iMbXyIndex);
12061251 }
12071252 } else {
12081253 * (uint32_t*)nBS[0][0] = 0;
@@ -1211,10 +1256,10 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 2 unmodified lines
12111256 iMbNb = iMbXyIndex - pCurDqLayer->iMbWidth;
12121257 if (bBSlice) {
12131258 * (uint32_t*)nBS[1][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBSliceBsMarginalMBAvcbase (
1214− pCurDqLayer, 1, iMbNb, iMbXyIndex);
1259+ pFilter, pCurDqLayer, 1, iMbNb, iMbXyIndex);
12151260 } else {
12161261 * (uint32_t*)nBS[1][0] = IS_INTRA (pCurDqLayer->pMbType[iMbNb]) ? 0x04040404 : DeblockingBsMarginalMBAvcbase (
1217− pCurDqLayer, 1, iMbNb, iMbXyIndex);
1262+ pFilter, pCurDqLayer, 1, iMbNb, iMbXyIndex);
12181263 }
12191264 } else {
12201265 * (uint32_t*)nBS[1][0] = 0;
@@ -1233,9 +1278,9 @@ void WelsDeblockingMb (PDqLayer pCurDqLayer, PDeblockingFilter pFilter, int32_t · 12 unmodified lines
12331278 } else {
12341279
12351280 if (bBSlice) {
1236− DeblockingBSliceBSInsideMBNormal (pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex);
1281+ DeblockingBSliceBSInsideMBNormal (pFilter, pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex);
12371282 } else {
1238− DeblockingBSInsideMBNormal (pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex);
1283+ DeblockingBSInsideMBNormal (pFilter, pCurDqLayer, nBS, pCurDqLayer->pNzc[iMbXyIndex], iMbXyIndex);
12391284 }
12401285 }
12411286 }
@@ -1280,6 +1325,8 @@ void WelsDeblockingFilterSlice (PWelsDecoderContext pCtx, PDeblockingFilterMbFun · 38 unmodified lines
12801325 pFilter.iSliceBetaOffset = pSliceHeaderExt->sSliceHeader.iSliceBetaOffset;
12811326
12821327 pFilter.pLoopf = &pCtx->sDeblockingFunc;
1328+ pFilter.pRefPics[0] = pCtx->sRefPic.pRefList[0];
1329+ pFilter.pRefPics[1] = pCtx->sRefPic.pRefList[1];
12831330
12841331 /* Step2: macroblock deblocking */
12851332 if (0 == iFilterIdc || 2 == iFilterIdc) {

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