| 1618 | } |
| 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); |
no test coverage detected