ref: d58f90947c58a84bc6c6b9ae047bc873584f64ea
parent: 82b70b34fe3ca03af1e7f79aa92d85e6917454d1
author: dongzha <dongzha@DONGZHA-WS04.cisco.com>
date: Thu Nov 27 10:25:21 EST 2014
avoid using the same picture buff for prev pic and curr pic
--- a/codec/decoder/core/src/decoder.cpp
+++ b/codec/decoder/core/src/decoder.cpp
@@ -178,10 +178,11 @@
*/
static inline int32_t GetTargetRefListSize (PWelsDecoderContext pCtx) {
int32_t iNumRefFrames = 0;
+ // +2 for EC MV Copy buffer exchange
if ((pCtx == NULL) || (pCtx->pSps == NULL)) {
- iNumRefFrames = MAX_REF_PIC_COUNT;
+ iNumRefFrames = MAX_REF_PIC_COUNT + 2;
} else {
- iNumRefFrames = pCtx->pSps->iNumRefFrames + 1;
+ iNumRefFrames = pCtx->pSps->iNumRefFrames + 2;
}
#ifdef LONG_TERM_REF
--- a/codec/decoder/core/src/decoder_core.cpp
+++ b/codec/decoder/core/src/decoder_core.cpp
@@ -2152,6 +2152,7 @@
} else if (pCtx->eErrorConMethod == ERROR_CON_SLICE_MV_COPY_CROSS_IDR
|| pCtx->eErrorConMethod == ERROR_CON_SLICE_MV_COPY_CROSS_IDR_FREEZE_RES_CHANGE) {
pCtx->pPreviousDecodedPictureInDpb = pCtx->pDec; //save ECed pic for future MV Copy use
+ pCtx->pDec = NULL;
}
} else {
if (DecodeFrameConstruction (pCtx, ppDst, pDstInfo))
--- a/codec/decoder/core/src/error_concealment.cpp
+++ b/codec/decoder/core/src/error_concealment.cpp
@@ -164,6 +164,9 @@
//Do error concealment using slice MV copy method
void DoMbECMvCopy (PWelsDecoderContext pCtx, PPicture pDec, PPicture pRef, int32_t iMbXy, int32_t iMbX, int32_t iMbY,
sMCRefMember* pMCRefMem) {
+ if (pDec == pRef) {
+ return; // for protection, shall never go into this logic, error info printed outside.
+ }
int16_t iMVs[2];
int32_t iMbXInPix = iMbX << 4;
int32_t iMbYInPix = iMbY << 4;
@@ -381,6 +384,10 @@
sMCRefMem.iDstLineChroma = pDstPic->iLinesize[1];
sMCRefMem.iPicWidth = pDstPic->iWidthInPixel;
sMCRefMem.iPicHeight = pDstPic->iHeightInPixel;
+ if (pDstPic == pSrcPic) {
+ // output error info, EC will be ignored in DoMbECMvCopy
+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "DoErrorConSliceMVCopy()::pPreviousPic and pDec use same buffer, ignored.");
+ }
}
for (int32_t iMbY = 0; iMbY < iMbHeight; ++iMbY) {