ref: a26955e4445917a7a38d4a29c752e2d6c76055a4
parent: 6cf240237ba4a214ca5649cdfcbf7cf960127a89
parent: 2b9a250fbda09220e480898421926d8ebdb498fd
author: ruil2 <ruil2@cisco.com>
date: Tue Feb 16 05:47:23 EST 2016
Merge pull request #2358 from sijchen/fix_free2 [Encoder] avoid memory problem if mem alloc failed in the middle of InitDqLayer
--- a/codec/encoder/core/inc/svc_enc_frame.h
+++ b/codec/encoder/core/inc/svc_enc_frame.h
@@ -105,6 +105,7 @@
SPicture* pDecPic; // reconstruction picture pointer for layer
SPicture* pRefOri[MAX_REF_PIC_COUNT];
+int32_t iMaxSliceNum;
int32_t* pNumSliceCodedOfPartition; // for dynamic slicing mode
int32_t* pLastCodedMbIdxOfPartition; // for dynamic slicing mode
int32_t* pLastMbIdxOfPartition; // for dynamic slicing mode
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -952,6 +952,56 @@
}
}
+void FreeDqLayer (SDqLayer*& pDq, CMemoryAlign* pMa) {
+ if (NULL == pDq) {
+ return;
+ }
+
+ if (NULL != pDq->sLayerInfo.pSliceInLayer) {
+ int32_t iSliceIdx = 0;
+ while (iSliceIdx < pDq->iMaxSliceNum) {
+ SSlice* pSlice = &pDq->sLayerInfo.pSliceInLayer[iSliceIdx];
+ FreeMbCache (&pSlice->sMbCacheInfo, pMa);
+
+ //slice bs buffer
+ if (NULL != pSlice->sSliceBs.pBs) {
+ pMa->WelsFree (pSlice->sSliceBs.pBs, "sSliceBs.pBs");
+ pSlice->sSliceBs.pBs = NULL;
+ }
+ ++ iSliceIdx;
+ }
+ pMa->WelsFree (pDq->sLayerInfo.pSliceInLayer, "pSliceInLayer");
+ pDq->sLayerInfo.pSliceInLayer = NULL;
+ }
+
+ if (pDq->pNumSliceCodedOfPartition) {
+ pMa->WelsFree (pDq->pNumSliceCodedOfPartition, "pNumSliceCodedOfPartition");
+ pDq->pNumSliceCodedOfPartition = NULL;
+ }
+
+ if (pDq->pLastCodedMbIdxOfPartition) {
+ pMa->WelsFree (pDq->pLastCodedMbIdxOfPartition, "pLastCodedMbIdxOfPartition");
+ pDq->pLastCodedMbIdxOfPartition = NULL;
+ }
+ if (pDq->pLastMbIdxOfPartition) {
+ pMa->WelsFree (pDq->pLastMbIdxOfPartition, "pLastMbIdxOfPartition");
+ pDq->pLastMbIdxOfPartition = NULL;
+ }
+
+ if (pDq->pFeatureSearchPreparation) {
+ ReleaseFeatureSearchPreparation (pMa, pDq->pFeatureSearchPreparation->pFeatureOfBlock);
+ pMa->WelsFree (pDq->pFeatureSearchPreparation, "pFeatureSearchPreparation");
+ pDq->pFeatureSearchPreparation = NULL;
+ }
+
+ UninitSlicePEncCtx (pDq, pMa);
+ pDq->iMaxSliceNum = 0;
+
+ pMa->WelsFree (pDq, "pDqLayer");
+ pDq = NULL;
+}
+
+
static int32_t WelsGenerateNewSps (sWelsEncCtx* pCtx, const bool kbUseSubsetSps, const int32_t iDlayerIndex,
const int32_t iDlayerCount, const int32_t kiSpsId,
SWelsSPS*& pSps, SSubsetSps*& pSubsetSps, bool bSVCBaselayer) {
@@ -1209,10 +1259,6 @@
SSpatialLayerInternal* pParamInternal = &pParam->sDependencyLayers[iDlayerIndex];
const int32_t kiMbW = (pDlayer->iVideoWidth + 0x0f) >> 4;
const int32_t kiMbH = (pDlayer->iVideoHeight + 0x0f) >> 4;
- int32_t iMaxSliceNum = 1;
- const int32_t kiSliceNum = GetInitialSliceNum (kiMbW, kiMbH, &pDlayer->sSliceArgument);
- if (iMaxSliceNum < kiSliceNum)
- iMaxSliceNum = kiSliceNum;
pParamInternal->iSkipFrameFlag = 0;
pParamInternal->iCodingIndex = 0;
@@ -1222,7 +1268,7 @@
pParamInternal->bEncCurFrmAsIdrFlag = true; // make sure first frame is IDR
// pDq layers list
pDqLayer = (SDqLayer*)pMa->WelsMallocz (sizeof (SDqLayer), "pDqLayer");
- WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pDqLayer), FreeMemorySvc (ppCtx))
+ WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pDqLayer), FreeDqLayer (pDqLayer, pMa))
// for dynamic slicing mode
if (SM_SIZELIMITED_SLICE == pDlayer->sSliceArgument.uiSliceMode) {
@@ -1231,23 +1277,28 @@
pDqLayer->pNumSliceCodedOfPartition = (int32_t*)pMa->WelsMallocz (iSize, "pNumSliceCodedOfPartition");
pDqLayer->pLastCodedMbIdxOfPartition = (int32_t*)pMa->WelsMallocz (iSize, "pLastCodedMbIdxOfPartition");
pDqLayer->pLastMbIdxOfPartition = (int32_t*)pMa->WelsMallocz (iSize, "pLastMbIdxOfPartition");
-
WELS_VERIFY_RETURN_PROC_IF (1,
(NULL == pDqLayer->pNumSliceCodedOfPartition ||
NULL == pDqLayer->pLastCodedMbIdxOfPartition ||
NULL == pDqLayer->pLastMbIdxOfPartition),
- FreeMemorySvc (ppCtx))
+ FreeDqLayer (pDqLayer, pMa))
}
pDqLayer->bNeedAdjustingSlicing = false;
pDqLayer->iMbWidth = kiMbW;
pDqLayer->iMbHeight = kiMbH;
+
+ int32_t iMaxSliceNum = 1;
+ const int32_t kiSliceNum = GetInitialSliceNum (kiMbW, kiMbH, &pDlayer->sSliceArgument);
+ if (iMaxSliceNum < kiSliceNum)
+ iMaxSliceNum = kiSliceNum;
+ pDqLayer->iMaxSliceNum = iMaxSliceNum;
{
pDqLayer->sLayerInfo.pSliceInLayer = (SSlice*)pMa->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "pSliceInLayer");
- WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pDqLayer->sLayerInfo.pSliceInLayer), FreeMemorySvc (ppCtx))
+ WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pDqLayer->sLayerInfo.pSliceInLayer), FreeDqLayer (pDqLayer, pMa))
int32_t iReturn = InitpSliceInLayer (ppCtx, pDqLayer, pMa, iMaxSliceNum, iDlayerIndex);
- WELS_VERIFY_RETURN_PROC_IF (1, (ENC_RETURN_SUCCESS != iReturn), FreeMemorySvc (ppCtx))
+ WELS_VERIFY_RETURN_PROC_IF (1, (ENC_RETURN_SUCCESS != iReturn), FreeDqLayer (pDqLayer, pMa))
}
//deblocking parameters initialization
@@ -1916,12 +1967,6 @@
ResetLtrState (& (*ppCtx)->pLtr[i]);
}
- (*ppCtx)->ppRefPicListExt = (SRefList**)pMa->WelsMalloc (kiNumDependencyLayers * sizeof (SRefList*), "ppRefPicListExt");
- WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppRefPicListExt), FreeMemorySvc (ppCtx))
-
- (*ppCtx)->ppDqLayerList = (SDqLayer**)pMa->WelsMalloc (kiNumDependencyLayers * sizeof (SDqLayer*), "ppDqLayerList");
- WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppDqLayerList), FreeMemorySvc (ppCtx))
-
// stride tables
if (AllocStrideTables (ppCtx, kiNumDependencyLayers)) {
WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), AllocStrideTables failed!");
@@ -1987,6 +2032,12 @@
//End of pVaa memory allocation
+ (*ppCtx)->ppRefPicListExt = (SRefList**)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SRefList*), "ppRefPicListExt");
+ WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppRefPicListExt), FreeMemorySvc (ppCtx))
+
+ (*ppCtx)->ppDqLayerList = (SDqLayer**)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SDqLayer*), "ppDqLayerList");
+ WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppDqLayerList), FreeMemorySvc (ppCtx))
+
iResult = InitDqLayers (ppCtx, pExistingParasetList);
if (iResult) {
WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), InitDqLayers failed(%d)!", iResult);
@@ -2141,57 +2192,9 @@
if (NULL != pCtx->ppDqLayerList && pParam != NULL) {
while (ilayer < pParam->iSpatialLayerNum) {
SDqLayer* pDq = pCtx->ppDqLayerList[ilayer];
- SSpatialLayerConfig* pDlp = &pCtx->pSvcParam->sSpatialLayers[ilayer];
-
- const bool kbIsDynamicSlicing = (SM_SIZELIMITED_SLICE == pDlp->sSliceArgument.uiSliceMode);
-
// pDq layers
if (NULL != pDq) {
- if (NULL != pDq->sLayerInfo.pSliceInLayer) {
- int32_t iSliceIdx = 0;
- int32_t iSliceNum = GetInitialSliceNum (pDq->iMbWidth, pDq->iMbHeight, &pDlp->sSliceArgument);
- if (pDlp->sSliceArgument.uiSliceMode == SM_SIZELIMITED_SLICE && pCtx->iActiveThreadsNum == 1) {
- if (iSliceNum < pDq->sSliceEncCtx.iMaxSliceNumConstraint) {
- iSliceNum = pDq->sSliceEncCtx.iMaxSliceNumConstraint;
- }
- }
- if (iSliceNum < 1)
- iSliceNum = 1;
- while (iSliceIdx < iSliceNum) {
- SSlice* pSlice = &pDq->sLayerInfo.pSliceInLayer[iSliceIdx];
- FreeMbCache (&pSlice->sMbCacheInfo, pMa);
-
- //slice bs buffer
- if (NULL != pSlice->sSliceBs.pBs) {
- pMa->WelsFree (pSlice->sSliceBs.pBs, "sSliceBs.pBs");
- pSlice->sSliceBs.pBs = NULL;
- }
- ++ iSliceIdx;
- }
- pMa->WelsFree (pDq->sLayerInfo.pSliceInLayer, "pSliceInLayer");
- pDq->sLayerInfo.pSliceInLayer = NULL;
- }
- if (kbIsDynamicSlicing) {
- pMa->WelsFree (pDq->pNumSliceCodedOfPartition, "pNumSliceCodedOfPartition");
- pDq->pNumSliceCodedOfPartition = NULL;
- pMa->WelsFree (pDq->pLastCodedMbIdxOfPartition, "pLastCodedMbIdxOfPartition");
- pDq->pLastCodedMbIdxOfPartition = NULL;
- pMa->WelsFree (pDq->pLastMbIdxOfPartition, "pLastMbIdxOfPartition");
- pDq->pLastMbIdxOfPartition = NULL;
- }
-
- if (pDq->pFeatureSearchPreparation) {
- ReleaseFeatureSearchPreparation (pMa, pDq->pFeatureSearchPreparation->pFeatureOfBlock);
- pMa->WelsFree (pDq->pFeatureSearchPreparation, "pFeatureSearchPreparation");
- pDq->pFeatureSearchPreparation = NULL;
- }
-
- if (NULL != pDq) {
- UninitSlicePEncCtx (pDq, pMa);
- }
-
- pMa->WelsFree (pDq, "pDq");
- pDq = NULL;
+ FreeDqLayer (pDq, pMa);
pCtx->ppDqLayerList[ilayer] = NULL;
}
++ ilayer;
@@ -4888,6 +4891,7 @@
if (pCtx->iMaxSliceCount < iMaxSliceNum)
pCtx->iMaxSliceCount = iMaxSliceNum;
pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint = iMaxSliceNum;
+ pCurLayer->iMaxSliceNum = iMaxSliceNum;
return ENC_RETURN_SUCCESS;
}
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -469,11 +469,13 @@
pSliceSeg->pOverallMbMap = NULL;
}
- pSliceSeg->iMbNumInFrame = 0;
+ pSliceSeg->uiSliceMode = SM_SINGLE_SLICE; // single in default
pSliceSeg->iMbWidth = 0;
pSliceSeg->iMbHeight = 0;
- pSliceSeg->uiSliceMode = SM_SINGLE_SLICE; // single in default
pSliceSeg->iSliceNumInFrame = 0;
+ pSliceSeg->iMbNumInFrame = 0;
+ pSliceSeg->uiSliceSizeConstraint = 0;
+ pSliceSeg->iMaxSliceNumConstraint = 0;
}
}