fix bNewSeqBegin logic
This commit is contained in:
@@ -92,7 +92,7 @@ int32_t ParseRefBasePicMarking (PBitStringAux pBs, PRefBasePicMarking pRefBasePi
|
|||||||
|
|
||||||
int32_t ParsePrefixNalUnit (PWelsDecoderContext pCtx, PBitStringAux pBs);
|
int32_t ParsePrefixNalUnit (PWelsDecoderContext pCtx, PBitStringAux pBs);
|
||||||
|
|
||||||
bool CheckAccessUnitBoundary (const PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PNalUnit kpLastNal, const PSps kpSps);
|
bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PNalUnit kpLastNal, const PSps kpSps);
|
||||||
bool CheckAccessUnitBoundaryExt (PNalUnitHeaderExt pLastNalHdrExt, PNalUnitHeaderExt pCurNalHeaderExt,
|
bool CheckAccessUnitBoundaryExt (PNalUnitHeaderExt pLastNalHdrExt, PNalUnitHeaderExt pCurNalHeaderExt,
|
||||||
PSliceHeader pLastSliceHeader, PSliceHeader pCurSliceHeader);
|
PSliceHeader pLastSliceHeader, PSliceHeader pCurSliceHeader);
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -286,6 +286,7 @@ typedef struct TagWelsDecoderContext {
|
|||||||
uint16_t uiCurIdrPicId;
|
uint16_t uiCurIdrPicId;
|
||||||
#endif
|
#endif
|
||||||
bool bNewSeqBegin;
|
bool bNewSeqBegin;
|
||||||
|
bool bNextNewSeqBegin;
|
||||||
int iOverwriteFlags;
|
int iOverwriteFlags;
|
||||||
int32_t iErrorConMethod; //
|
int32_t iErrorConMethod; //
|
||||||
PPicture pPreviousDecodedPictureInDpb; //pointer to previously decoded picture in DPB for error concealment
|
PPicture pPreviousDecodedPictureInDpb; //pointer to previously decoded picture in DPB for error concealment
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ bool CheckAccessUnitBoundaryExt (PNalUnitHeaderExt pLastNalHdrExt, PNalUnitHeade
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CheckAccessUnitBoundary (const PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PNalUnit kpLastNal, const PSps kpSps) {
|
bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PNalUnit kpLastNal, const PSps kpSps) {
|
||||||
const PNalUnitHeaderExt kpLastNalHeaderExt = &kpLastNal->sNalHeaderExt;
|
const PNalUnitHeaderExt kpLastNalHeaderExt = &kpLastNal->sNalHeaderExt;
|
||||||
const PNalUnitHeaderExt kpCurNalHeaderExt = &kpCurNal->sNalHeaderExt;
|
const PNalUnitHeaderExt kpCurNalHeaderExt = &kpCurNal->sNalHeaderExt;
|
||||||
const SSliceHeader* kpLastSliceHeader = &kpLastNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader;
|
const SSliceHeader* kpLastSliceHeader = &kpLastNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader;
|
||||||
@@ -405,6 +405,7 @@ bool CheckAccessUnitBoundary (const PWelsDecoderContext pCtx, const PNalUnit kpC
|
|||||||
if (kpLastSliceHeader->iFrameNum != kpCurSliceHeader->iFrameNum)
|
if (kpLastSliceHeader->iFrameNum != kpCurSliceHeader->iFrameNum)
|
||||||
return true;
|
return true;
|
||||||
if (pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != NULL && pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != kpSps) {
|
if (pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != NULL && pCtx->pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != kpSps) {
|
||||||
|
pCtx->bNextNewSeqBegin = true;
|
||||||
return true; // the active sps changed, new sequence begins, so the current au is ready
|
return true; // the active sps changed, new sequence begins, so the current au is ready
|
||||||
}
|
}
|
||||||
// Subclause 7.4.1.2.5
|
// Subclause 7.4.1.2.5
|
||||||
|
|||||||
@@ -295,6 +295,7 @@ void WelsOpenDecoder (PWelsDecoderContext pCtx) {
|
|||||||
#else
|
#else
|
||||||
pCtx->bReferenceLostAtT0Flag = true; // should be true to waiting IDR at incoming AU bits following, 6/4/2010
|
pCtx->bReferenceLostAtT0Flag = true; // should be true to waiting IDR at incoming AU bits following, 6/4/2010
|
||||||
#endif //LONG_TERM_REF
|
#endif //LONG_TERM_REF
|
||||||
|
pCtx->bNewSeqBegin = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -1534,7 +1534,6 @@ static bool CheckNewSeqBeginAndUpdateActiveLayerSps(PWelsDecoderContext pCtx) {
|
|||||||
static void WriteBackActiveParameters(PWelsDecoderContext pCtx) {
|
static void WriteBackActiveParameters(PWelsDecoderContext pCtx) {
|
||||||
if (pCtx->iOverwriteFlags & OVERWRITE_PPS) {
|
if (pCtx->iOverwriteFlags & OVERWRITE_PPS) {
|
||||||
memcpy(&pCtx->sPpsBuffer[pCtx->sPpsBuffer[MAX_PPS_COUNT].iPpsId], &pCtx->sPpsBuffer[MAX_PPS_COUNT], sizeof(SPps));
|
memcpy(&pCtx->sPpsBuffer[pCtx->sPpsBuffer[MAX_PPS_COUNT].iPpsId], &pCtx->sPpsBuffer[MAX_PPS_COUNT], sizeof(SPps));
|
||||||
pCtx->bNewSeqBegin = true;
|
|
||||||
}
|
}
|
||||||
if (pCtx->iOverwriteFlags & OVERWRITE_SPS) {
|
if (pCtx->iOverwriteFlags & OVERWRITE_SPS) {
|
||||||
memcpy(&pCtx->sSpsBuffer[pCtx->sSpsBuffer[MAX_SPS_COUNT].iSpsId], &pCtx->sSpsBuffer[MAX_SPS_COUNT], sizeof(SSps));
|
memcpy(&pCtx->sSpsBuffer[pCtx->sSpsBuffer[MAX_SPS_COUNT].iSpsId], &pCtx->sSpsBuffer[MAX_SPS_COUNT], sizeof(SSps));
|
||||||
@@ -1542,6 +1541,7 @@ static void WriteBackActiveParameters(PWelsDecoderContext pCtx) {
|
|||||||
}
|
}
|
||||||
if (pCtx->iOverwriteFlags & OVERWRITE_SUBSETSPS) {
|
if (pCtx->iOverwriteFlags & OVERWRITE_SUBSETSPS) {
|
||||||
memcpy(&pCtx->sSubsetSpsBuffer[pCtx->sSubsetSpsBuffer[MAX_SPS_COUNT].sSps.iSpsId], &pCtx->sSubsetSpsBuffer[MAX_SPS_COUNT], sizeof(SSubsetSps));
|
memcpy(&pCtx->sSubsetSpsBuffer[pCtx->sSubsetSpsBuffer[MAX_SPS_COUNT].sSps.iSpsId], &pCtx->sSubsetSpsBuffer[MAX_SPS_COUNT], sizeof(SSubsetSps));
|
||||||
|
pCtx->bNewSeqBegin = true;
|
||||||
}
|
}
|
||||||
pCtx->iOverwriteFlags = OVERWRITE_NONE;
|
pCtx->iOverwriteFlags = OVERWRITE_NONE;
|
||||||
}
|
}
|
||||||
@@ -1567,7 +1567,7 @@ int32_t ConstructAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferI
|
|||||||
pCtx->bAuReadyFlag = false;
|
pCtx->bAuReadyFlag = false;
|
||||||
pCtx->bLastHasMmco5 = false;
|
pCtx->bLastHasMmco5 = false;
|
||||||
bool bTmpNewSeqBegin = CheckNewSeqBeginAndUpdateActiveLayerSps(pCtx);
|
bool bTmpNewSeqBegin = CheckNewSeqBeginAndUpdateActiveLayerSps(pCtx);
|
||||||
pCtx->bNewSeqBegin = pCtx->bNewSeqBegin && bTmpNewSeqBegin;
|
pCtx->bNewSeqBegin = pCtx->bNewSeqBegin || bTmpNewSeqBegin;
|
||||||
iErr = WelsDecodeAccessUnitStart (pCtx);
|
iErr = WelsDecodeAccessUnitStart (pCtx);
|
||||||
GetVclNalTemporalId (pCtx);
|
GetVclNalTemporalId (pCtx);
|
||||||
|
|
||||||
@@ -1599,6 +1599,10 @@ int32_t ConstructAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferI
|
|||||||
WelsDecodeAccessUnitEnd (pCtx);
|
WelsDecodeAccessUnitEnd (pCtx);
|
||||||
pCtx->bNewSeqBegin = false;
|
pCtx->bNewSeqBegin = false;
|
||||||
WriteBackActiveParameters(pCtx);
|
WriteBackActiveParameters(pCtx);
|
||||||
|
pCtx->bNewSeqBegin = pCtx->bNewSeqBegin || pCtx->bNextNewSeqBegin;
|
||||||
|
pCtx->bNextNewSeqBegin = false; // reset it
|
||||||
|
if (pCtx->bNewSeqBegin)
|
||||||
|
ResetActiveSPSForEachLayer(pCtx);
|
||||||
if (ERR_NONE != iErr) {
|
if (ERR_NONE != iErr) {
|
||||||
WelsLog (pCtx, WELS_LOG_INFO, "returned error from decoding:[0x%x]\n", iErr);
|
WelsLog (pCtx, WELS_LOG_INFO, "returned error from decoding:[0x%x]\n", iErr);
|
||||||
return iErr;
|
return iErr;
|
||||||
|
|||||||
Reference in New Issue
Block a user