Showing the changes to codec/decoder/core/src/decode_slice.cpp (1 of 22 files). Show all
Unified · Split
| @@ -93,7 +93,7 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 92 unmodified lines | |||
| 93 | 93 | ||
| 94 | int32_t iTotalNumMb = pCurSlice->iTotalMbInCurSlice; | 94 | int32_t iTotalNumMb = pCurSlice->iTotalMbInCurSlice; |
| 95 | int32_t iCountNumMb = 0; | 95 | int32_t iCountNumMb = 0; |
| 96 | PDeblockingFilterMbFunc pDeblockMb; | 96 | PDeblockingFilterMbFunc pDeblockMb = WelsDeblockingMb; |
| 97 | 97 | ||
| 98 | if (!pCtx->sSpsPpsCtx.bAvcBasedFlag && iCurLayerWidth != pCtx->iCurSeqIntervalMaxPicWidth) { | 98 | if (!pCtx->sSpsPpsCtx.bAvcBasedFlag && iCurLayerWidth != pCtx->iCurSeqIntervalMaxPicWidth) { |
| 99 | return ERR_INFO_WIDTH_MISMATCH; | 99 | return ERR_INFO_WIDTH_MISMATCH; |
| @@ -163,8 +163,6 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) { · 63 unmodified lines | |||
| 163 | if (pCtx->pParam->bParseOnly) //for parse only, deblocking should not go on | 163 | if (pCtx->pParam->bParseOnly) //for parse only, deblocking should not go on |
| 164 | return ERR_NONE; | 164 | return ERR_NONE; |
| 165 | 165 | ||
| 166 | pDeblockMb = WelsDeblockingMb; | ||
| 167 | |||
| 168 | if (1 == pSliceHeader->uiDisableDeblockingFilterIdc | 166 | if (1 == pSliceHeader->uiDisableDeblockingFilterIdc |
| 169 | || pCtx->pCurDqLayer->sLayerInfo.sSliceInLayer.iTotalMbInCurSlice <= 0) { | 167 | || pCtx->pCurDqLayer->sLayerInfo.sSliceInLayer.iTotalMbInCurSlice <= 0) { |
| 170 | return ERR_NONE;//NO_SUPPORTED_FILTER_IDX | 168 | return ERR_NONE;//NO_SUPPORTED_FILTER_IDX |
| @@ -238,8 +236,10 @@ int32_t WelsMbInterConstruction (PWelsDecoderContext pCtx, PDqLayer pCurDqLayer) · 67 unmodified lines | |||
| 238 | } | 236 | } |
| 239 | WelsMbInterSampleConstruction (pCtx, pCurDqLayer, pDstY, pDstCb, pDstCr, iLumaStride, iChromaStride); | 237 | WelsMbInterSampleConstruction (pCtx, pCurDqLayer, pDstY, pDstCb, pDstCr, iLumaStride, iChromaStride); |
| 240 | 238 | ||
| 241 | pCtx->sBlockFunc.pWelsSetNonZeroCountFunc ( | 239 | if (pCtx->pThreadCtx == NULL) { |
| 242 | pCurDqLayer->pNzc[pCurDqLayer->iMbXyIndex]); // set all none-zero nzc to 1; dbk can be opti! | 240 | pCtx->sBlockFunc.pWelsSetNonZeroCountFunc ( |
| 241 | pCurDqLayer->pNzc[pCurDqLayer->iMbXyIndex]); // set all none-zero nzc to 1; dbk can be opti! | ||
| 242 | } | ||
| 243 | return ERR_NONE; | 243 | return ERR_NONE; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| @@ -723,7 +723,7 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 477 unmodified lines | |||
| 723 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 723 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 724 | for (i = 0; i < 2; i++) { | 724 | for (i = 0; i < 2; i++) { |
| 725 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pCurDqLayer->pLumaQp[iMbXy] + | 725 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pCurDqLayer->pLumaQp[iMbXy] + |
| 726 | pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)]; | 726 | pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)]; |
| 727 | } | 727 | } |
| 728 | } | 728 | } |
| 729 | 729 | ||
| @@ -738,7 +738,7 @@ int32_t WelsDecodeMbCabacISliceBaseMode0 (PWelsDecoderContext pCtx, uint32_t& ui · 8 unmodified lines | |||
| 738 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 738 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 739 | for (i = 0; i < 2; i++) { | 739 | for (i = 0; i < 2; i++) { |
| 740 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pSlice->iLastMbQp + | 740 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 ((pSlice->iLastMbQp + |
| 741 | pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)]; | 741 | pSliceHeader->pPps->iChromaQpIndexOffset[i]), 0, 51)]; |
| 742 | } | 742 | } |
| 743 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { | 743 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { |
| 744 | //step1: Luma DC | 744 | //step1: Luma DC |
| @@ -973,7 +973,7 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 228 unmodified lines | |||
| 973 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 973 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 974 | for (i = 0; i < 2; i++) { | 974 | for (i = 0; i < 2; i++) { |
| 975 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + | 975 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + |
| 976 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 976 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 977 | } | 977 | } |
| 978 | 978 | ||
| 979 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { | 979 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { |
| @@ -1080,7 +1080,7 @@ int32_t WelsDecodeMbCabacPSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 100 unmodified lines | |||
| 1080 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 1080 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 1081 | for (i = 0; i < 2; i++) { | 1081 | for (i = 0; i < 2; i++) { |
| 1082 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 1082 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 1083 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1083 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1084 | } | 1084 | } |
| 1085 | } | 1085 | } |
| 1086 | 1086 | ||
| @@ -1214,7 +1214,7 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 127 unmodified lines | |||
| 1214 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 1214 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 1215 | for (i = 0; i < 2; i++) { | 1215 | for (i = 0; i < 2; i++) { |
| 1216 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + | 1216 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + |
| 1217 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1217 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1218 | } | 1218 | } |
| 1219 | 1219 | ||
| 1220 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { | 1220 | if (MB_TYPE_INTRA16x16 == pCurDqLayer->pDec->pMbType[iMbXy]) { |
| @@ -1321,7 +1321,7 @@ int32_t WelsDecodeMbCabacBSliceBaseMode0 (PWelsDecoderContext pCtx, PWelsNeighAv · 100 unmodified lines | |||
| 1321 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 1321 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 1322 | for (i = 0; i < 2; i++) { | 1322 | for (i = 0; i < 2; i++) { |
| 1323 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 1323 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 1324 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1324 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1325 | } | 1325 | } |
| 1326 | } | 1326 | } |
| 1327 | 1327 | ||
| @@ -1365,7 +1365,9 @@ int32_t WelsDecodeMbCabacPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 37 unmodified lines | |||
| 1365 | 1365 | ||
| 1366 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; | 1366 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; |
| 1367 | memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16); | 1367 | memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16); |
| 1368 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && ppRefPic[0]->bIsComplete); | 1368 | bool bIsPending = pCtx->pThreadCtx != NULL; |
| 1369 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && (ppRefPic[0]->bIsComplete | ||
| 1370 | || bIsPending)); | ||
| 1369 | //predict mv | 1371 | //predict mv |
| 1370 | PredPSkipMvFromNeighbor (pCurDqLayer, pMv); | 1372 | PredPSkipMvFromNeighbor (pCurDqLayer, pMv); |
| 1371 | for (i = 0; i < 16; i++) { | 1373 | for (i = 0; i < 16; i++) { |
| @@ -1381,7 +1383,7 @@ int32_t WelsDecodeMbCabacPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 9 unmodified lines | |||
| 1381 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb | 1383 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb |
| 1382 | for (i = 0; i < 2; i++) { | 1384 | for (i = 0; i < 2; i++) { |
| 1383 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 1385 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 1384 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1386 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1385 | } | 1387 | } |
| 1386 | 1388 | ||
| 1387 | //for neighboring CABAC usage | 1389 | //for neighboring CABAC usage |
| @@ -1419,6 +1421,8 @@ int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 31 unmodified lines | |||
| 1419 | 1421 | ||
| 1420 | memset (pCurDqLayer->pDirect[iMbXy], 0, sizeof (int8_t) * 16); | 1422 | memset (pCurDqLayer->pDirect[iMbXy], 0, sizeof (int8_t) * 16); |
| 1421 | 1423 | ||
| 1424 | bool bIsPending = pCtx->pThreadCtx != NULL; | ||
| 1425 | |||
| 1422 | if (uiCode) { | 1426 | if (uiCode) { |
| 1423 | int16_t pMv[LIST_A][2] = { {0, 0}, { 0, 0 } }; | 1427 | int16_t pMv[LIST_A][2] = { {0, 0}, { 0, 0 } }; |
| 1424 | int8_t ref[LIST_A] = { 0 }; | 1428 | int8_t ref[LIST_A] = { 0 }; |
| @@ -1433,8 +1437,8 @@ int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 8 unmodified lines | |||
| 1433 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; | 1437 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; |
| 1434 | memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16); | 1438 | memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16); |
| 1435 | memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16); | 1439 | memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16); |
| 1436 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete) | 1440 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && (ppRefPicL0[0]->bIsComplete |
| 1437 | || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete); | 1441 | || bIsPending)) || ! (ppRefPicL1[0] && (ppRefPicL1[0]->bIsComplete || bIsPending)); |
| 1438 | 1442 | ||
| 1439 | if (pCtx->bMbRefConcealed) { | 1443 | if (pCtx->bMbRefConcealed) { |
| 1440 | SLogContext* pLogCtx = & (pCtx->sLogCtx); | 1444 | SLogContext* pLogCtx = & (pCtx->sLogCtx); |
| @@ -1463,7 +1467,7 @@ int32_t WelsDecodeMbCabacBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 22 unmodified lines | |||
| 1463 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb | 1467 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb |
| 1464 | for (i = 0; i < 2; i++) { | 1468 | for (i = 0; i < 2; i++) { |
| 1465 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 1469 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 1466 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1470 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1467 | } | 1471 | } |
| 1468 | 1472 | ||
| 1469 | //for neighboring CABAC usage | 1473 | //for neighboring CABAC usage |
| @@ -1613,6 +1617,161 @@ int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNal · 143 unmodified lines | |||
| 1613 | return ERR_NONE; | 1617 | return ERR_NONE; |
| 1614 | } | 1618 | } |
| 1615 | 1619 | ||
| 1620 | int32_t WelsDecodeAndConstructSlice (PWelsDecoderContext pCtx) { | ||
| 1621 | PNalUnit pNalCur = pCtx->pNalCur; | ||
| 1622 | PDqLayer pCurDqLayer = pCtx->pCurDqLayer; | ||
| 1623 | PFmo pFmo = pCtx->pFmo; | ||
| 1624 | int32_t iRet; | ||
| 1625 | int32_t iNextMbXyIndex, iSliceIdc; | ||
| 1626 | |||
| 1627 | PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer; | ||
| 1628 | PSliceHeaderExt pSliceHeaderExt = &pSlice->sSliceHeaderExt; | ||
| 1629 | PSliceHeader pSliceHeader = &pSliceHeaderExt->sSliceHeader; | ||
| 1630 | int32_t iMbX, iMbY; | ||
| 1631 | const int32_t kiCountNumMb = pSliceHeader->pSps->uiTotalMbCount; //need to be correct when fmo or multi slice | ||
| 1632 | int32_t iTotalMbTargetLayer = kiCountNumMb; | ||
| 1633 | uint32_t uiEosFlag = 0; | ||
| 1634 | PWelsDecMbFunc pDecMbFunc; | ||
| 1635 | |||
| 1636 | pSlice->iTotalMbInCurSlice = 0; //initialize at the starting of slice decoding. | ||
| 1637 | |||
| 1638 | if (pCtx->pPps->bEntropyCodingModeFlag) { | ||
| 1639 | if (pSlice->sSliceHeaderExt.bAdaptiveMotionPredFlag || | ||
| 1640 | pSlice->sSliceHeaderExt.bAdaptiveBaseModeFlag || | ||
| 1641 | pSlice->sSliceHeaderExt.bAdaptiveResidualPredFlag) { | ||
| 1642 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, | ||
| 1643 | "WelsDecodeSlice()::::ILP flag exist, not supported with CABAC enabled!"); | ||
| 1644 | pCtx->iErrorCode |= dsBitstreamError; | ||
| 1645 | return dsBitstreamError; | ||
| 1646 | } | ||
| 1647 | if (P_SLICE == pSliceHeader->eSliceType) | ||
| 1648 | pDecMbFunc = WelsDecodeMbCabacPSlice; | ||
| 1649 | else if (B_SLICE == pSliceHeader->eSliceType) | ||
| 1650 | pDecMbFunc = WelsDecodeMbCabacBSlice; | ||
| 1651 | else //I_SLICE. B_SLICE is being supported | ||
| 1652 | pDecMbFunc = WelsDecodeMbCabacISlice; | ||
| 1653 | } else { | ||
| 1654 | if (P_SLICE == pSliceHeader->eSliceType) { | ||
| 1655 | pDecMbFunc = WelsDecodeMbCavlcPSlice; | ||
| 1656 | } else if (B_SLICE == pSliceHeader->eSliceType) { | ||
| 1657 | pDecMbFunc = WelsDecodeMbCavlcBSlice; | ||
| 1658 | } else { //I_SLICE | ||
| 1659 | pDecMbFunc = WelsDecodeMbCavlcISlice; | ||
| 1660 | } | ||
| 1661 | } | ||
| 1662 | |||
| 1663 | if (pSliceHeader->pPps->bConstainedIntraPredFlag) { | ||
| 1664 | pCtx->pFillInfoCacheIntraNxNFunc = WelsFillCacheConstrain1IntraNxN; | ||
| 1665 | pCtx->pMapNxNNeighToSampleFunc = WelsMapNxNNeighToSampleConstrain1; | ||
| 1666 | pCtx->pMap16x16NeighToSampleFunc = WelsMap16x16NeighToSampleConstrain1; | ||
| 1667 | } else { | ||
| 1668 | pCtx->pFillInfoCacheIntraNxNFunc = WelsFillCacheConstrain0IntraNxN; | ||
| 1669 | pCtx->pMapNxNNeighToSampleFunc = WelsMapNxNNeighToSampleNormal; | ||
| 1670 | pCtx->pMap16x16NeighToSampleFunc = WelsMap16x16NeighToSampleNormal; | ||
| 1671 | } | ||
| 1672 | |||
| 1673 | pCtx->eSliceType = pSliceHeader->eSliceType; | ||
| 1674 | if (pCurDqLayer->sLayerInfo.pPps->bEntropyCodingModeFlag == 1) { | ||
| 1675 | int32_t iQp = pSlice->sSliceHeaderExt.sSliceHeader.iSliceQp; | ||
| 1676 | int32_t iCabacInitIdc = pSlice->sSliceHeaderExt.sSliceHeader.iCabacInitIdc; | ||
| 1677 | WelsCabacContextInit (pCtx, pSlice->eSliceType, iCabacInitIdc, iQp); | ||
| 1678 | //InitCabacCtx (pCtx->pCabacCtx, pSlice->eSliceType, iCabacInitIdc, iQp); | ||
| 1679 | pSlice->iLastDeltaQp = 0; | ||
| 1680 | WELS_READ_VERIFY (InitCabacDecEngineFromBS (pCtx->pCabacDecEngine, pCtx->pCurDqLayer->pBitStringAux)); | ||
| 1681 | } | ||
| 1682 | //try to calculate the dequant_coeff | ||
| 1683 | WelsCalcDeqCoeffScalingList (pCtx); | ||
| 1684 | |||
| 1685 | iNextMbXyIndex = pSliceHeader->iFirstMbInSlice; | ||
| 1686 | iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth; | ||
| 1687 | iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth; // error is introduced by multiple slices case, 11/23/2009 | ||
| 1688 | pSlice->iMbSkipRun = -1; | ||
| 1689 | iSliceIdc = (pSliceHeader->iFirstMbInSlice << 7) + pCurDqLayer->uiLayerDqId; | ||
| 1690 | |||
| 1691 | pCurDqLayer->iMbX = iMbX; | ||
| 1692 | pCurDqLayer->iMbY = iMbY; | ||
| 1693 | pCurDqLayer->iMbXyIndex = iNextMbXyIndex; | ||
| 1694 | |||
| 1695 | PDeblockingFilterMbFunc pDeblockMb = WelsDeblockingMb; | ||
| 1696 | |||
| 1697 | SDeblockingFilter pFilter; | ||
| 1698 | int32_t iFilterIdc = 1; | ||
| 1699 | if (pCtx->pThreadCtx && pSliceHeader->uiDisableDeblockingFilterIdc != 1) { | ||
| 1700 | WelsDeblockingInitFilter (pCtx, pFilter, iFilterIdc); | ||
| 1701 | } | ||
| 1702 | |||
| 1703 | do { | ||
| 1704 | if ((-1 == iNextMbXyIndex) || (iNextMbXyIndex >= kiCountNumMb)) { // slice group boundary or end of a frame | ||
| 1705 | break; | ||
| 1706 | } | ||
| 1707 | |||
| 1708 | pCurDqLayer->pSliceIdc[iNextMbXyIndex] = iSliceIdc; | ||
| 1709 | pCtx->bMbRefConcealed = false; | ||
| 1710 | iRet = pDecMbFunc (pCtx, pNalCur, uiEosFlag); | ||
| 1711 | pCurDqLayer->pMbRefConcealedFlag[iNextMbXyIndex] = pCtx->bMbRefConcealed; | ||
| 1712 | if (iRet != ERR_NONE) { | ||
| 1713 | return iRet; | ||
| 1714 | } | ||
| 1715 | if (WelsTargetMbConstruction (pCtx)) { | ||
| 1716 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, | ||
| 1717 | "WelsTargetSliceConstruction():::MB(%d, %d) construction error. pCurSlice_type:%d", | ||
| 1718 | pCurDqLayer->iMbX, pCurDqLayer->iMbY, pSlice->eSliceType); | ||
| 1719 | |||
| 1720 | return ERR_INFO_MB_RECON_FAIL; | ||
| 1721 | } | ||
| 1722 | WelsDeblockingFilterMB (pCurDqLayer, pFilter, iFilterIdc, pDeblockMb); | ||
| 1723 | if (pCtx->uiNalRefIdc > 0) { | ||
| 1724 | if (pCurDqLayer->iMbX == 0 || pCurDqLayer->iMbX == pCurDqLayer->iMbWidth - 1 || pCurDqLayer->iMbY == 0 | ||
| 1725 | || pCurDqLayer->iMbY == pCurDqLayer->iMbHeight - 1) { | ||
| 1726 | PadMBLuma_c (pCurDqLayer->pDec->pData[0], pCurDqLayer->pDec->iLinesize[0], pCurDqLayer->pDec->iWidthInPixel, | ||
| 1727 | pCurDqLayer->pDec->iHeightInPixel, pCurDqLayer->iMbX, pCurDqLayer->iMbY, pCurDqLayer->iMbWidth, pCurDqLayer->iMbHeight); | ||
| 1728 | PadMBChroma_c (pCurDqLayer->pDec->pData[1], pCurDqLayer->pDec->iLinesize[1], pCurDqLayer->pDec->iWidthInPixel / 2, | ||
| 1729 | pCurDqLayer->pDec->iHeightInPixel / 2, pCurDqLayer->iMbX, pCurDqLayer->iMbY, pCurDqLayer->iMbWidth, | ||
| 1730 | pCurDqLayer->iMbHeight); | ||
| 1731 | PadMBChroma_c (pCurDqLayer->pDec->pData[2], pCurDqLayer->pDec->iLinesize[2], pCurDqLayer->pDec->iWidthInPixel / 2, | ||
| 1732 | pCurDqLayer->pDec->iHeightInPixel / 2, pCurDqLayer->iMbX, pCurDqLayer->iMbY, pCurDqLayer->iMbWidth, | ||
| 1733 | pCurDqLayer->iMbHeight); | ||
| 1734 | } | ||
| 1735 | } | ||
| 1736 | if (!pCurDqLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex]) { //already con-ed, overwrite | ||
| 1737 | pCurDqLayer->pMbCorrectlyDecodedFlag[iNextMbXyIndex] = true; | ||
| 1738 | pCtx->pDec->iMbEcedPropNum += (pCurDqLayer->pMbRefConcealedFlag[iNextMbXyIndex] ? 1 : 0); | ||
| 1739 | ++pCtx->iTotalNumMbRec; | ||
| 1740 | } | ||
| 1741 | |||
| 1742 | if (pCtx->iTotalNumMbRec > iTotalMbTargetLayer) { | ||
| 1743 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, | ||
| 1744 | "WelsTargetSliceConstruction():::pCtx->iTotalNumMbRec:%d, iTotalMbTargetLayer:%d", | ||
| 1745 | pCtx->iTotalNumMbRec, iTotalMbTargetLayer); | ||
| 1746 | |||
| 1747 | return ERR_INFO_MB_NUM_EXCEED_FAIL; | ||
| 1748 | } | ||
| 1749 | |||
| 1750 | ++pSlice->iTotalMbInCurSlice; | ||
| 1751 | if (uiEosFlag) { //end of slice | ||
| 1752 | SET_EVENT (&pCtx->pDec->pReadyEvent[pCurDqLayer->iMbY]); | ||
| 1753 | break; | ||
| 1754 | } | ||
| 1755 | if (pSliceHeader->pPps->uiNumSliceGroups > 1) { | ||
| 1756 | iNextMbXyIndex = FmoNextMb (pFmo, iNextMbXyIndex); | ||
| 1757 | } else { | ||
| 1758 | ++iNextMbXyIndex; | ||
| 1759 | } | ||
| 1760 | int32_t iLastMby = iMbY; | ||
| 1761 | int32_t iLastMbx = iMbX; | ||
| 1762 | iMbX = iNextMbXyIndex % pCurDqLayer->iMbWidth; | ||
| 1763 | iMbY = iNextMbXyIndex / pCurDqLayer->iMbWidth; | ||
| 1764 | pCurDqLayer->iMbX = iMbX; | ||
| 1765 | pCurDqLayer->iMbY = iMbY; | ||
| 1766 | pCurDqLayer->iMbXyIndex = iNextMbXyIndex; | ||
| 1767 | if ((iMbY > iLastMby) && (iLastMbx == pCurDqLayer->iMbWidth - 1)) { | ||
| 1768 | SET_EVENT (&pCtx->pDec->pReadyEvent[iLastMby]); | ||
| 1769 | } | ||
| 1770 | } while (1); | ||
| 1771 | SET_EVENT (&pCtx->pDec->pReadyEvent[pCurDqLayer->iMbY]); | ||
| 1772 | return ERR_NONE; | ||
| 1773 | } | ||
| 1774 | |||
| 1616 | int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { | 1775 | int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { |
| 1617 | SVlcTable* pVlcTable = pCtx->pVlcTable; | 1776 | SVlcTable* pVlcTable = pCtx->pVlcTable; |
| 1618 | PDqLayer pCurDqLayer = pCtx->pCurDqLayer; | 1777 | PDqLayer pCurDqLayer = pCtx->pCurDqLayer; |
| @@ -1762,7 +1921,7 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 143 unmodified lines | |||
| 1762 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 1921 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 1763 | for (i = 0; i < 2; i++) { | 1922 | for (i = 0; i < 2; i++) { |
| 1764 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 1923 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 1765 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 1924 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 1766 | } | 1925 | } |
| 1767 | 1926 | ||
| 1768 | } | 1927 | } |
| @@ -1782,8 +1941,8 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 13 unmodified lines | |||
| 1782 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 1941 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 1783 | for (i = 0; i < 2; i++) { | 1942 | for (i = 0; i < 2; i++) { |
| 1784 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + | 1943 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + |
| 1785 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, | 1944 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, |
| 1786 | 51)]; | 1945 | 51)]; |
| 1787 | } | 1946 | } |
| 1788 | 1947 | ||
| 1789 | 1948 | ||
| @@ -1876,7 +2035,8 @@ int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) { · 86 unmodified lines | |||
| 1876 | int32_t iIndex = 16 + (i << 2); | 2035 | int32_t iIndex = 16 + (i << 2); |
| 1877 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { | 2036 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { |
| 1878 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, | 2037 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, |
| 1879 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | 2038 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, |
| 2039 | pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | ||
| 1880 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { | 2040 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { |
| 1881 | return iRet;//abnormal | 2041 | return iRet;//abnormal |
| 1882 | } | 2042 | } |
| @@ -2126,11 +2286,12 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 243 unmodified lines | |||
| 2126 | ST32A4 (&pNzc[12], 0); | 2286 | ST32A4 (&pNzc[12], 0); |
| 2127 | ST32A4 (&pNzc[16], 0); | 2287 | ST32A4 (&pNzc[16], 0); |
| 2128 | ST32A4 (&pNzc[20], 0); | 2288 | ST32A4 (&pNzc[20], 0); |
| 2129 | if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) { | 2289 | if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) |
| 2290 | && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) { | ||
| 2130 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 2291 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 2131 | for (i = 0; i < 2; i++) { | 2292 | for (i = 0; i < 2; i++) { |
| 2132 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 2293 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 2133 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 2294 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 2134 | } | 2295 | } |
| 2135 | } | 2296 | } |
| 2136 | 2297 | ||
| @@ -2148,8 +2309,8 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 11 unmodified lines | |||
| 2148 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 2309 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 2149 | for (i = 0; i < 2; i++) { | 2310 | for (i = 0; i < 2; i++) { |
| 2150 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + | 2311 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + |
| 2151 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, | 2312 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, |
| 2152 | 51)]; | 2313 | 51)]; |
| 2153 | } | 2314 | } |
| 2154 | 2315 | ||
| 2155 | BsStartCavlc (pBs); | 2316 | BsStartCavlc (pBs); |
| @@ -2251,7 +2412,8 @@ int32_t WelsActualDecodeMbCavlcPSlice (PWelsDecoderContext pCtx) { · 95 unmodified lines | |||
| 2251 | int32_t iIndex = 16 + (i << 2); | 2412 | int32_t iIndex = 16 + (i << 2); |
| 2252 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { | 2413 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { |
| 2253 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, | 2414 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, |
| 2254 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | 2415 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, |
| 2416 | pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | ||
| 2255 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { | 2417 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { |
| 2256 | return iRet;//abnormal | 2418 | return iRet;//abnormal |
| 2257 | } | 2419 | } |
| @@ -2305,7 +2467,9 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 47 unmodified lines | |||
| 2305 | 2467 | ||
| 2306 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; | 2468 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; |
| 2307 | memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16); | 2469 | memset (pCurDqLayer->pDec->pRefIndex[0][iMbXy], 0, sizeof (int8_t) * 16); |
| 2308 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && ppRefPic[0]->bIsComplete); | 2470 | bool bIsPending = pCtx->pThreadCtx != NULL; |
| 2471 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPic[0] && (ppRefPic[0]->bIsComplete | ||
| 2472 | || bIsPending)); | ||
| 2309 | //predict iMv | 2473 | //predict iMv |
| 2310 | PredPSkipMvFromNeighbor (pCurDqLayer, iMv); | 2474 | PredPSkipMvFromNeighbor (pCurDqLayer, iMv); |
| 2311 | for (i = 0; i < 16; i++) { | 2475 | for (i = 0; i < 16; i++) { |
| @@ -2322,7 +2486,7 @@ int32_t WelsDecodeMbCavlcPSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 10 unmodified lines | |||
| 2322 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 2486 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 2323 | for (i = 0; i < 2; i++) { | 2487 | for (i = 0; i < 2; i++) { |
| 2324 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 2488 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 2325 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 2489 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 2326 | } | 2490 | } |
| 2327 | } | 2491 | } |
| 2328 | 2492 | ||
| @@ -2400,8 +2564,9 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 71 unmodified lines | |||
| 2400 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; | 2564 | pCurDqLayer->pInterPredictionDoneFlag[iMbXy] = 0; |
| 2401 | memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16); | 2565 | memset (pCurDqLayer->pDec->pRefIndex[LIST_0][iMbXy], 0, sizeof (int8_t) * 16); |
| 2402 | memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16); | 2566 | memset (pCurDqLayer->pDec->pRefIndex[LIST_1][iMbXy], 0, sizeof (int8_t) * 16); |
| 2403 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete) | 2567 | bool bIsPending = pCtx->pThreadCtx != NULL; |
| 2404 | || ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete); | 2568 | pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && (ppRefPicL0[0]->bIsComplete |
| 2569 | || bIsPending)) || ! (ppRefPicL1[0] && (ppRefPicL1[0]->bIsComplete || bIsPending)); | ||
| 2405 | 2570 | ||
| 2406 | /*if (pCtx->bMbRefConcealed) { | 2571 | /*if (pCtx->bMbRefConcealed) { |
| 2407 | SLogContext* pLogCtx = & (pCtx->sLogCtx); | 2572 | SLogContext* pLogCtx = & (pCtx->sLogCtx); |
| @@ -2435,7 +2600,7 @@ int32_t WelsDecodeMbCavlcBSlice (PWelsDecoderContext pCtx, PNalUnit pNalCur, uin · 27 unmodified lines | |||
| 2435 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 2600 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 2436 | for (i = 0; i < 2; i++) { | 2601 | for (i = 0; i < 2; i++) { |
| 2437 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 2602 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 2438 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 2603 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 2439 | } | 2604 | } |
| 2440 | } | 2605 | } |
| 2441 | 2606 | ||
| @@ -2665,11 +2830,12 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 223 unmodified lines | |||
| 2665 | ST32A4 (&pNzc[12], 0); | 2830 | ST32A4 (&pNzc[12], 0); |
| 2666 | ST32A4 (&pNzc[16], 0); | 2831 | ST32A4 (&pNzc[16], 0); |
| 2667 | ST32A4 (&pNzc[20], 0); | 2832 | ST32A4 (&pNzc[20], 0); |
| 2668 | if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) { | 2833 | if (pCurDqLayer->pCbp[iMbXy] == 0 && !IS_INTRA16x16 (pCurDqLayer->pDec->pMbType[iMbXy]) |
| 2834 | && !IS_I_BL (pCurDqLayer->pDec->pMbType[iMbXy])) { | ||
| 2669 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; | 2835 | pCurDqLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; |
| 2670 | for (i = 0; i < 2; i++) { | 2836 | for (i = 0; i < 2; i++) { |
| 2671 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + | 2837 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pCurDqLayer->pLumaQp[iMbXy] + |
| 2672 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; | 2838 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, 51)]; |
| 2673 | } | 2839 | } |
| 2674 | } | 2840 | } |
| 2675 | 2841 | ||
| @@ -2687,8 +2853,8 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 11 unmodified lines | |||
| 2687 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; | 2853 | pSlice->iLastMbQp = pCurDqLayer->pLumaQp[iMbXy]; |
| 2688 | for (i = 0; i < 2; i++) { | 2854 | for (i = 0; i < 2; i++) { |
| 2689 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + | 2855 | pCurDqLayer->pChromaQp[iMbXy][i] = g_kuiChromaQpTable[WELS_CLIP3 (pSlice->iLastMbQp + |
| 2690 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, | 2856 | pSliceHeader->pPps->iChromaQpIndexOffset[i], 0, |
| 2691 | 51)]; | 2857 | 51)]; |
| 2692 | } | 2858 | } |
| 2693 | 2859 | ||
| 2694 | BsStartCavlc (pBs); | 2860 | BsStartCavlc (pBs); |
| @@ -2790,7 +2956,8 @@ int32_t WelsActualDecodeMbCavlcBSlice (PWelsDecoderContext pCtx) { · 95 unmodified lines | |||
| 2790 | int32_t iIndex = 16 + (i << 2); | 2956 | int32_t iIndex = 16 + (i << 2); |
| 2791 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { | 2957 | for (iId4x4 = 0; iId4x4 < 4; iId4x4++) { |
| 2792 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, | 2958 | if ((iRet = WelsResidualBlockCavlc (pVlcTable, pNonZeroCount, pBs, iIndex, iScanIdxEnd - WELS_MAX (iScanIdxStart, |
| 2793 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | 2959 | 1) + 1, g_kuiZigzagScan + WELS_MAX (iScanIdxStart, 1), iMbResProperty, |
| 2960 | pCurDqLayer->pScaledTCoeff[iMbXy] + (iIndex << 4), | ||
| 2794 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { | 2961 | pCurDqLayer->pChromaQp[iMbXy][i], pCtx)) != ERR_NONE) { |
| 2795 | return iRet;//abnormal | 2962 | return iRet;//abnormal |
| 2796 | } | 2963 | } |