change au_ready status and check au number

This commit is contained in:
huili2
2014-12-14 18:36:27 -08:00
parent 93265d7a44
commit c20e1c6795
3 changed files with 43 additions and 29 deletions

View File

@@ -271,7 +271,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
if (uiAvailNalNum > 1) { if (uiAvailNalNum > 1) {
pCurAu->uiEndPos = uiAvailNalNum - 2; pCurAu->uiEndPos = uiAvailNalNum - 2;
pCtx->bAuReadyFlag = true; if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) {
pCtx->bAuReadyFlag = true;
}
} }
pCtx->iErrorCode |= dsBitstreamError; pCtx->iErrorCode |= dsBitstreamError;
return NULL; return NULL;
@@ -291,7 +293,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
if (uiAvailNalNum > 1) { if (uiAvailNalNum > 1) {
pCurAu->uiEndPos = uiAvailNalNum - 2; pCurAu->uiEndPos = uiAvailNalNum - 2;
pCtx->bAuReadyFlag = true; if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) {
pCtx->bAuReadyFlag = true;
}
} }
pCtx->iErrorCode |= dsBitstreamError; pCtx->iErrorCode |= dsBitstreamError;
return NULL; return NULL;
@@ -340,7 +344,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
ForceClearCurrentNal (pCurAu); ForceClearCurrentNal (pCurAu);
if (uiAvailNalNum > 1) { if (uiAvailNalNum > 1) {
pCurAu->uiEndPos = uiAvailNalNum - 2; 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."); WelsLog (pLogCtx, WELS_LOG_ERROR, "NAL_UNIT_CODED_SLICE: InitBits() fail due invalid access.");
pCtx->iErrorCode |= dsBitstreamError; pCtx->iErrorCode |= dsBitstreamError;
@@ -357,7 +363,9 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
if (uiAvailNalNum > 1) { if (uiAvailNalNum > 1) {
pCurAu->uiEndPos = uiAvailNalNum - 2; pCurAu->uiEndPos = uiAvailNalNum - 2;
pCtx->bAuReadyFlag = true; if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) {
pCtx->bAuReadyFlag = true;
}
} }
pCtx->iErrorCode |= dsBitstreamError; pCtx->iErrorCode |= dsBitstreamError;
return NULL; return NULL;

View File

@@ -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] = pDstNal[iDstIdx] = pDstNal[iDstIdx + 1] = pDstNal[iDstIdx + 2] = pDstNal[iDstIdx + 3] =
0; // set 4 reserved bytes to zero 0; // set 4 reserved bytes to zero
pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes); pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes);
if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { if (pNalPayload) { //parse correct
CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); 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 (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 (pCtx->bAuReadyFlag) {
ConstructAccessUnit (pCtx, ppDst, pDstBufInfo);
if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) {
#ifdef LONG_TERM_REF #ifdef LONG_TERM_REF
pCtx->bParamSetsLostFlag = true; pCtx->bParamSetsLostFlag = true;
#else #else
pCtx->bReferenceLostAtT0Flag = true; pCtx->bReferenceLostAtT0Flag = true;
#endif #endif
if (dsOutOfMemory & pCtx->iErrorCode) { if (dsOutOfMemory & pCtx->iErrorCode) {
return 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] = pDstNal[iDstIdx] = pDstNal[iDstIdx + 1] = pDstNal[iDstIdx + 2] = pDstNal[iDstIdx + 3] =
0; // set 4 reserved bytes to zero 0; // set 4 reserved bytes to zero
pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes); pNalPayload = ParseNalHeader (pCtx, &pCtx->sCurNalHead, pDstNal, iDstIdx, pSrcNal - 3, iSrcIdx + 3, &iConsumedBytes);
if (IS_VCL_NAL (pCtx->sCurNalHead.eNalUnitType, 1)) { if (pNalPayload) { //parse correct
CheckAndFinishLastPic (pCtx, ppDst, pDstBufInfo); 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 (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 (pCtx->bAuReadyFlag) {
ConstructAccessUnit (pCtx, ppDst, pDstBufInfo);
if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) { if ((dsOutOfMemory | dsNoParamSets) & pCtx->iErrorCode) {
#ifdef LONG_TERM_REF #ifdef LONG_TERM_REF
pCtx->bParamSetsLostFlag = true; pCtx->bParamSetsLostFlag = true;
#else #else
pCtx->bReferenceLostAtT0Flag = true; pCtx->bReferenceLostAtT0Flag = true;
#endif #endif
return pCtx->iErrorCode; return pCtx->iErrorCode;
}
} }
} }
if (iRet) { if (iRet) {

View File

@@ -2140,6 +2140,8 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBuf
bool CheckAndFinishLastPic (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferInfo* pDstInfo) { bool CheckAndFinishLastPic (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferInfo* pDstInfo) {
PAccessUnit pAu = pCtx->pAccessUnitList; PAccessUnit pAu = pCtx->pAccessUnitList;
if (pAu->uiAvailUnitsNum == 0)
return true;
PNalUnit pCurNal = pAu->pNalUnitsList[pAu->uiEndPos]; PNalUnit pCurNal = pAu->pNalUnitsList[pAu->uiEndPos];
if ((pCtx->iTotalNumMbRec != 0) if ((pCtx->iTotalNumMbRec != 0)
&& (CheckAccessUnitBoundaryExt (&pCtx->sLastNalHdrExt, &pCurNal->sNalHeaderExt, &pCtx->sLastSliceHeader, && (CheckAccessUnitBoundaryExt (&pCtx->sLastNalHdrExt, &pCurNal->sNalHeaderExt, &pCtx->sLastSliceHeader,