History

second commit for threaded decoding support: Add function WelsDecodeAndConstructSlice (and add associted functions) which combines decoding->reconstructing->deblocking in single MB loop so that it allows multile frames to decode MBs in parallel.

xiaotiansf committed 7 years ago

Commit fd42f041 parent 2f5ecec22 files · +924 −190Browse files

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

Unified · Split

codec/decoder/core/src/decode_slice.cpp+202−35
@@ -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 on163 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->uiDisableDeblockingFilterIdc166 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_IDX168 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 DC744 //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 mv1371 //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 mb1383 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 usage1389 //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 mb1467 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 usage1473 //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
1620int32_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
1616int32_t WelsActualDecodeMbCavlcISlice (PWelsDecoderContext pCtx) {1775int32_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;//abnormal2041 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;//abnormal2418 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 iMv2473 //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;//abnormal2962 return iRet;//abnormal
2796 }2963 }

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