ref: b1653b36995241e5a7b557d68db403d8ec671de9
parent: 51a68875cde2fcbc2bc22349768aa852e0b5c2ff
parent: e89f8a51b25fbe2ef5bba781b26236a53d09bc37
author: huili2 <[email protected]>
date: Tue Aug 21 10:06:54 EDT 2018
Merge pull request #3011 from xiaotiansf/master Fix Bugzillia reported Bug-1479669, Bug-1479670 and Bug-1479831. fix null pointers for some test cases when specific error conditions.
--- a/codec/decoder/core/inc/mv_pred.h
+++ b/codec/decoder/core/inc/mv_pred.h
@@ -98,7 +98,8 @@
* \param
* \param output iMvp[] and ref
*/
-SubMbType PredMvBDirectSpatial (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]);
+int32_t PredMvBDirectSpatial (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A],
+ SubMbType& subMbType);
/*!
* \brief get Colocated MB for both Spatial and Temporal Direct Mode
@@ -110,7 +111,7 @@
/*!
* \brief get the motion predictor for B-slice temporal direct mode 16x16
*/
-void PredBDirectTemporal (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]);
+int32_t PredBDirectTemporal (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]);
/*!
* \brief get the motion params for B-slice spatial direct mode
--- a/codec/decoder/core/src/decode_slice.cpp
+++ b/codec/decoder/core/src/decode_slice.cpp
@@ -52,6 +52,8 @@
namespace WelsDec {
+extern void FreePicture (PPicture pPic, CMemoryAlign* pMa);
+
static inline int32_t iAbs (int32_t x) {
static const int32_t INT_BITS = (sizeof (int) * CHAR_BIT) - 1;
int32_t y = x >> INT_BITS;
@@ -208,6 +210,12 @@
} else {
if (pCtx->pTempDec == NULL)
pCtx->pTempDec = AllocPicture (pCtx, pCtx->pSps->iMbWidth << 4, pCtx->pSps->iMbHeight << 4);
+ else {
+ if (pCtx->pTempDec->iLinesize[0] != pCtx->pDec->iLinesize[0]) {
+ FreePicture (pCtx->pTempDec, pCtx->pMemAlign);
+ pCtx->pTempDec = AllocPicture (pCtx, pCtx->pSps->iMbWidth << 4, pCtx->pSps->iMbHeight << 4);
+ }
+ }
uint8_t* pTempDstYCbCr[3];
uint8_t* pDstYCbCr[3];
pTempDstYCbCr[0] = pCtx->pTempDec->pData[0] + ((iMbY * iLumaStride + iMbX) << 4);
@@ -1415,15 +1423,24 @@
pCtx->bMbRefConcealed = pCtx->bRPLRError || pCtx->bMbRefConcealed || ! (ppRefPicL0[0] && ppRefPicL0[0]->bIsComplete)
|| ! (ppRefPicL1[0] && ppRefPicL1[0]->bIsComplete);
+
if (pSliceHeader->iDirectSpatialMvPredFlag) {
//predict direct spatial mv
- PredMvBDirectSpatial (pCtx, pMv, ref);
+ SubMbType subMbType;
+ int32_t ret = PredMvBDirectSpatial (pCtx, pMv, ref, subMbType);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
} else {
//temporal direct mode
ComputeColocated (pCtx);
- PredBDirectTemporal (pCtx, pMv, ref);
+ int32_t ret = PredBDirectTemporal (pCtx, pMv, ref);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
}
+
//reset rS
pCurLayer->pLumaQp[iMbXy] = pSlice->iLastMbQp; //??????????????? dqaunt of previous mb
--- a/codec/decoder/core/src/decoder_core.cpp
+++ b/codec/decoder/core/src/decoder_core.cpp
@@ -526,7 +526,9 @@
pCtx->iPrevPicOrderCntLsb = 0;
pCtx->iPrevPicOrderCntMsb = 0;
- pCtx->pSliceHeader->iPicOrderCntLsb = 0;
+ pSh->iPicOrderCntLsb = 0;
+ if (pCtx->pSliceHeader)
+ pCtx->pSliceHeader->iPicOrderCntLsb = 0;
}
++ iIdx;
--- a/codec/decoder/core/src/mv_pred.cpp
+++ b/codec/decoder/core/src/mv_pred.cpp
@@ -313,6 +313,12 @@
PPicture colocPic = pCtx->sRefPic.pRefList[LIST_1][0];
+ if (colocPic == NULL) {
+ SLogContext* pLogCtx = & (pCtx->sLogCtx);
+ WelsLog (pLogCtx, WELS_LOG_ERROR, "Colocated Ref Picture for B-Slice is lost, B-Slice decoding cannot be continued!");
+ return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_DATA, ERR_INFO_REFERENCE_PIC_LOST);
+ }
+
MbType coloc_mbType = colocPic->pMbType[iMbXy];
if (IS_Inter_8x8 (coloc_mbType) && !pCtx->pSps->bDirect8x8InferenceFlag) {
@@ -328,7 +334,7 @@
if (IS_INTRA (coloc_mbType)) {
SetRectBlock (pCurLayer->iColocIntra, 4, 4, 4 * sizeof (int8_t), 1, sizeof (int8_t));
- return 1;
+ return ERR_NONE;
}
SetRectBlock (pCurLayer->iColocIntra, 4, 4, 4 * sizeof (int8_t), 0, sizeof (int8_t));
@@ -366,18 +372,22 @@
SetRectBlock (&pCurLayer->iColocRefIndex[1][0], 4, 4, 4, (uint8_t)REF_NOT_IN_LIST, 1);
}
}
- return 1;
+ return ERR_NONE;
}
-SubMbType PredMvBDirectSpatial (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]) {
+int32_t PredMvBDirectSpatial (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A],
+ SubMbType& subMbType) {
+ int32_t ret = ERR_NONE;
PDqLayer pCurLayer = pCtx->pCurDqLayer;
int32_t iMbXy = pCurLayer->iMbXyIndex;
bool bSkipOrDirect = (IS_SKIP (pCurLayer->pMbType[iMbXy]) | IS_DIRECT (pCurLayer->pMbType[iMbXy])) > 0;
MbType mbType;
- SubMbType subMbType;
- GetColocatedMb (pCtx, mbType, subMbType);
+ ret = GetColocatedMb (pCtx, mbType, subMbType);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
bool bTopAvail, bLeftTopAvail, bRightTopAvail, bLeftAvail;
int32_t iLeftTopType, iRightTopType, iTopType, iLeftType;
@@ -494,7 +504,7 @@
iDiagonalRef[listIdx] = iRightTopRef[listIdx];
if (REF_NOT_AVAIL == iDiagonalRef[listIdx]) {
iDiagonalRef[listIdx] = iLeftTopRef[listIdx];
- * (int32_t*)iMvC[listIdx] = * (int32_t*)iMvD[listIdx];
+ ST32 (iMvC[listIdx], LD32 (iMvD[listIdx]));
}
int8_t ref_temp = WELS_MIN_POSITIVE (iTopRef[listIdx], iDiagonalRef[listIdx]);
@@ -643,16 +653,20 @@
}
}
}
- return subMbType;
+ return ret;
}
-void PredBDirectTemporal (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]) {
+int32_t PredBDirectTemporal (PWelsDecoderContext pCtx, int16_t iMvp[LIST_A][2], int8_t ref[LIST_A]) {
+ int32_t ret = ERR_NONE;
PDqLayer pCurLayer = pCtx->pCurDqLayer;
int32_t iMbXy = pCurLayer->iMbXyIndex;
bool bSkipOrDirect = (IS_SKIP (pCurLayer->pMbType[iMbXy]) | IS_DIRECT (pCurLayer->pMbType[iMbXy])) > 0;
MbType mbType;
SubMbType subMbType;
- GetColocatedMb (pCtx, mbType, subMbType);
+ ret = GetColocatedMb (pCtx, mbType, subMbType);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
PSlice pSlice = &pCurLayer->sLayerInfo.sSliceInLayer;
if (IS_INTER_16x16 (mbType)) {
ref[LIST_0] = 0;
@@ -664,7 +678,8 @@
UpdateP16x16MotionOnly (pCurLayer, LIST_1, iMvp[LIST_1]);
UpdateP16x16RefIdx (pCurLayer, LIST_0, ref[LIST_0]);
} else {
- ref[LIST_0] = pCurLayer->iColocRefIndex[LIST_0][0];
+ ref[LIST_0] = pCurLayer->iColocRefIndex[LIST_0][0] >= 0 ? pCurLayer->iColocRefIndex[LIST_0][0] :
+ pCurLayer->iColocRefIndex[LIST_1][0];
const int16_t (*mvColoc)[2] = 0 == ref[LIST_0] ? pCurLayer->iColocMv[LIST_0] : pCurLayer->iColocMv[LIST_1];
const int16_t* mv = mvColoc[0];
UpdateP16x16RefIdx (pCurLayer, LIST_0, ref[LIST_0]);
@@ -748,6 +763,7 @@
}
}
}
+ return ret;
}
//basic iMVs prediction unit for iMVs partition width (4, 2, 1)
--- a/codec/decoder/core/src/parse_mb_syn_cabac.cpp
+++ b/codec/decoder/core/src/parse_mb_syn_cabac.cpp
@@ -80,7 +80,7 @@
return 0; /* I4x4 */
}
- DecodeTerminateCabac (pCabacDecEngine, uiCode);
+ WELS_READ_VERIFY (DecodeTerminateCabac (pCabacDecEngine, uiCode));
if (uiCode) {
return 25; /* PCM */
}
@@ -741,11 +741,18 @@
int16_t pMvDirect[LIST_A][2] = { { 0, 0 }, { 0, 0 } };
if (pSliceHeader->iDirectSpatialMvPredFlag) {
//predict direct spatial mv
- PredMvBDirectSpatial (pCtx, pMvDirect, iRef);
+ SubMbType subMbType;
+ int32_t ret = PredMvBDirectSpatial (pCtx, pMvDirect, iRef, subMbType);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
} else {
//temporal direct 16x16 mode
ComputeColocated (pCtx);
- PredBDirectTemporal (pCtx, pMvDirect, iRef);
+ int32_t ret = PredBDirectTemporal (pCtx, pMvDirect, iRef);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
}
} else if (IS_INTER_16x16 (mbType)) {
iPartIdx = 0;
@@ -894,11 +901,18 @@
if (IS_DIRECT (g_ksInterBSubMbTypeInfo[uiSubMbType].iType)) {
if (!has_direct_called) {
if (pSliceHeader->iDirectSpatialMvPredFlag) {
- directSubMbType = PredMvBDirectSpatial (pCtx, pMvDirect, iRef);
+ int32_t ret = PredMvBDirectSpatial (pCtx, pMvDirect, iRef, directSubMbType);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
+
} else {
//temporal direct mode
ComputeColocated (pCtx);
- PredBDirectTemporal (pCtx, pMvDirect, iRef);
+ int32_t ret = PredBDirectTemporal (pCtx, pMvDirect, iRef);
+ if (ret != ERR_NONE) {
+ return ret;
+ }
}
has_direct_called = true;
}