| 1513 | } |
| 1514 | |
| 1515 | int32_t WelsDecodeSlice (PWelsDecoderContext pCtx, bool bFirstSliceInLayer, PNalUnit pNalCur) { |
| 1516 | PDqLayer pCurDqLayer = pCtx->pCurDqLayer; |
| 1517 | PFmo pFmo = pCtx->pFmo; |
| 1518 | int32_t iRet; |
| 1519 | int32_t iNextMbXyIndex, iSliceIdc; |
| 1520 | |
| 1521 | PSlice pSlice = &pCurDqLayer->sLayerInfo.sSliceInLayer; |
| 1522 | PSliceHeaderExt pSliceHeaderExt = &pSlice->sSliceHeaderExt; |
| 1523 | PSliceHeader pSliceHeader = &pSliceHeaderExt->sSliceHeader; |
| 1524 | int32_t iMbX, iMbY; |
| 1525 | const int32_t kiCountNumMb = pSliceHeader->pSps->uiTotalMbCount; //need to be correct when fmo or multi slice |
| 1526 | uint32_t uiEosFlag = 0; |
| 1527 | PWelsDecMbFunc pDecMbFunc; |
| 1528 | |
| 1529 | pSlice->iTotalMbInCurSlice = 0; //initialize at the starting of slice decoding. |
| 1530 | |
| 1531 | if (pCtx->pPps->bEntropyCodingModeFlag) { |
| 1532 | if (pSlice->sSliceHeaderExt.bAdaptiveMotionPredFlag || |
| 1533 | pSlice->sSliceHeaderExt.bAdaptiveBaseModeFlag || |
| 1534 | pSlice->sSliceHeaderExt.bAdaptiveResidualPredFlag) { |
| 1535 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, |
| 1536 | "WelsDecodeSlice()::::ILP flag exist, not supported with CABAC enabled!"); |
| 1537 | pCtx->iErrorCode |= dsBitstreamError; |
| 1538 | return dsBitstreamError; |
| 1539 | } |
| 1540 | if (P_SLICE == pSliceHeader->eSliceType) |
| 1541 | pDecMbFunc = WelsDecodeMbCabacPSlice; |
| 1542 | else if (B_SLICE == pSliceHeader->eSliceType) |
| 1543 | pDecMbFunc = WelsDecodeMbCabacBSlice; |
| 1544 | else //I_SLICE. B_SLICE is being supported |
| 1545 | pDecMbFunc = WelsDecodeMbCabacISlice; |
| 1546 | } else { |
| 1547 | if (P_SLICE == pSliceHeader->eSliceType) { |
| 1548 | pDecMbFunc = WelsDecodeMbCavlcPSlice; |
| 1549 | } else if (B_SLICE == pSliceHeader->eSliceType) { |
| 1550 | pDecMbFunc = WelsDecodeMbCavlcBSlice; |
| 1551 | } else { //I_SLICE |
| 1552 | pDecMbFunc = WelsDecodeMbCavlcISlice; |
| 1553 | } |
| 1554 | } |
| 1555 | |
| 1556 | if (pSliceHeader->pPps->bConstainedIntraPredFlag) { |
| 1557 | pCtx->pFillInfoCacheIntraNxNFunc = WelsFillCacheConstrain1IntraNxN; |
| 1558 | pCtx->pMapNxNNeighToSampleFunc = WelsMapNxNNeighToSampleConstrain1; |
| 1559 | pCtx->pMap16x16NeighToSampleFunc = WelsMap16x16NeighToSampleConstrain1; |
| 1560 | } else { |
| 1561 | pCtx->pFillInfoCacheIntraNxNFunc = WelsFillCacheConstrain0IntraNxN; |
| 1562 | pCtx->pMapNxNNeighToSampleFunc = WelsMapNxNNeighToSampleNormal; |
| 1563 | pCtx->pMap16x16NeighToSampleFunc = WelsMap16x16NeighToSampleNormal; |
| 1564 | } |
| 1565 | |
| 1566 | pCtx->eSliceType = pSliceHeader->eSliceType; |
| 1567 | if (pCurDqLayer->sLayerInfo.pPps->bEntropyCodingModeFlag == 1) { |
| 1568 | int32_t iQp = pSlice->sSliceHeaderExt.sSliceHeader.iSliceQp; |
| 1569 | int32_t iCabacInitIdc = pSlice->sSliceHeaderExt.sSliceHeader.iCabacInitIdc; |
| 1570 | WelsCabacContextInit (pCtx, pSlice->eSliceType, iCabacInitIdc, iQp); |
| 1571 | //InitCabacCtx (pCtx->pCabacCtx, pSlice->eSliceType, iCabacInitIdc, iQp); |
| 1572 | pSlice->iLastDeltaQp = 0; |
no test coverage detected