diff --git a/codec/decoder/core/src/au_parser.cpp b/codec/decoder/core/src/au_parser.cpp index 09cdaed4..5912d25a 100644 --- a/codec/decoder/core/src/au_parser.cpp +++ b/codec/decoder/core/src/au_parser.cpp @@ -271,7 +271,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade if (uiAvailNalNum > 1) { pCurAu->uiEndPos = uiAvailNalNum - 2; - pCtx->bAuReadyFlag = true; + if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) { + pCtx->bAuReadyFlag = true; + } } pCtx->iErrorCode |= dsBitstreamError; return NULL; @@ -291,7 +293,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade if (uiAvailNalNum > 1) { pCurAu->uiEndPos = uiAvailNalNum - 2; - pCtx->bAuReadyFlag = true; + if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) { + pCtx->bAuReadyFlag = true; + } } pCtx->iErrorCode |= dsBitstreamError; return NULL; @@ -340,7 +344,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade ForceClearCurrentNal (pCurAu); if (uiAvailNalNum > 1) { pCurAu->uiEndPos = uiAvailNalNum - 2; - pCtx->bAuReadyFlag = true; + if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) { + pCtx->bAuReadyFlag = true; + } } WelsLog (pLogCtx, WELS_LOG_ERROR, "NAL_UNIT_CODED_SLICE: InitBits() fail due invalid access."); pCtx->iErrorCode |= dsBitstreamError; @@ -357,7 +363,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade if (uiAvailNalNum > 1) { pCurAu->uiEndPos = uiAvailNalNum - 2; - pCtx->bAuReadyFlag = true; + if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) { + pCtx->bAuReadyFlag = true; + } } pCtx->iErrorCode |= dsBitstreamError; return NULL; diff --git a/codec/decoder/core/src/decoder.cpp b/codec/decoder/core/src/decoder.cpp index 208ef57b..5fe6d1b6 100644 --- a/codec/decoder/core/src/decoder.cpp +++ b/codec/decoder/core/src/decoder.cpp @@ -626,23 +626,25 @@ int32_t WelsDecodeBs (PWelsDecoderContext pCtx, const uint8_t* kpBsBuf, const in pDstNal[iDstIdx] = pDstNal[iDstIdx + 1] = pDstNal[iDstIdx + 2] = pDstNal[iDstIdx + 3] = 0; // set 4 reserved bytes to zero pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes); - if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { - CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); - } - if (IS_PARAM_SETS_NALS (pCtx->sCurNalHead.eNalUnitType) && pNalPayload) { - iRet = ParseNonVclNal (pCtx, pNalPayload, iDstIdx - iConsumedBytes, pSrcNal - 3, iSrcIdx + 3); - } - if (pCtx->bAuReadyFlag) { - ConstructAccessUnit (pCtx, ppDst, pDstBufInfo); + if (pNalPayload) { //parse correct + if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { + CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); + } + if (IS_PARAM_SETS_NALS (pCtx->sCurNalHead.eNalUnitType)) { + iRet = ParseNonVclNal (pCtx, pNalPayload, iDstIdx - iConsumedBytes, pSrcNal - 3, iSrcIdx + 3); + } + if (pCtx->bAuReadyFlag) { + ConstructAccessUnit (pCtx, ppDst, pDstBufInfo); - if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { + if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { #ifdef LONG_TERM_REF - pCtx->bParamSetsLostFlag = true; + pCtx->bParamSetsLostFlag = true; #else - pCtx->bReferenceLostAtT0Flag = true; + pCtx->bReferenceLostAtT0Flag = true; #endif - if (dsOutOfMemory & pCtx->iErrorCode) { - return pCtx->iErrorCode; + if (dsOutOfMemory & pCtx->iErrorCode) { + return pCtx->iErrorCode; + } } } } @@ -682,22 +684,24 @@ int32_t WelsDecodeBs (PWelsDecoderContext pCtx, const uint8_t* kpBsBuf, const in pDstNal[iDstIdx] = pDstNal[iDstIdx + 1] = pDstNal[iDstIdx + 2] = pDstNal[iDstIdx + 3] = 0; // set 4 reserved bytes to zero pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes); - if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { - CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); - } - if (IS_PARAM_SETS_NALS (pCtx->sCurNalHead.eNalUnitType) && pNalPayload) { - iRet = ParseNonVclNal (pCtx, pNalPayload, iDstIdx - iConsumedBytes, pSrcNal - 3, iSrcIdx + 3); - } - if (pCtx->bAuReadyFlag) { - ConstructAccessUnit (pCtx, ppDst, pDstBufInfo); + if (pNalPayload) { //parse correct + if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { + CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); + } + if (IS_PARAM_SETS_NALS (pCtx->sCurNalHead.eNalUnitType)) { + iRet = ParseNonVclNal (pCtx, pNalPayload, iDstIdx - iConsumedBytes, pSrcNal - 3, iSrcIdx + 3); + } + if (pCtx->bAuReadyFlag) { + ConstructAccessUnit (pCtx, ppDst, pDstBufInfo); - if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { + if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { #ifdef LONG_TERM_REF - pCtx->bParamSetsLostFlag = true; + pCtx->bParamSetsLostFlag = true; #else - pCtx->bReferenceLostAtT0Flag = true; + pCtx->bReferenceLostAtT0Flag = true; #endif - return pCtx->iErrorCode; + return pCtx->iErrorCode; + } } } if (iRet) { diff --git a/codec/decoder/core/src/decoder_core.cpp b/codec/decoder/core/src/decoder_core.cpp index 6332f83d..69b8884b 100644 --- a/codec/decoder/core/src/decoder_core.cpp +++ b/codec/decoder/core/src/decoder_core.cpp @@ -2140,6 +2140,8 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBuf bool CheckAndFinishLastPic (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferInfo* pDstInfo) { PAccessUnit pAu = pCtx->pAccessUnitList; + if (pAu->uiAvailUnitsNum == 0) + return true; PNalUnit pCurNal = pAu->pNalUnitsList[pAu->uiEndPos]; if ((pCtx->iTotalNumMbRec != 0) && (CheckAccessUnitBoundaryExt (&pCtx->sLastNalHdrExt, &pCurNal->sNalHeaderExt, &pCtx->sLastSliceHeader,