ref: f40452d3cbe241a990c57b59a166736c02a88aee
parent: ff5976515f5dbc4fbf48d6e56832866211e46468
parent: 6814f504f637cd257709fd92418848f94ad80f29
author: sijchen <[email protected]>
date: Thu Mar 23 17:27:47 EDT 2017
Merge pull request #2699 from shihuade/MultiThread_V10.1#1687#1691 Slice buffer reallocate design::PR02::refactoring for some basic function
--- a/codec/encoder/core/inc/svc_enc_slice_segment.h
+++ b/codec/encoder/core/inc/svc_enc_slice_segment.h
@@ -180,11 +180,12 @@
* \brief Get number of mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
* \param pCurDq current layer info
+ * \param pSlice slice which request slice num
* \param kiSliceIdc slice/slice_group idc
*
* \return count_num_of_mb - successful; -1 - failed;
*/
-int32_t WelsGetNumMbInSlice (SDqLayer* pCurDq, const int32_t kiSliceIdc);
+int32_t WelsGetNumMbInSlice (SDqLayer* pCurDq, SSlice* pSlice, const int32_t kuiSliceIdc);
/*!
* Get slice count for multiple slice segment
--- a/codec/encoder/core/inc/svc_encode_slice.h
+++ b/codec/encoder/core/inc/svc_encode_slice.h
@@ -102,6 +102,10 @@
CMemoryAlign* pMa,
const char* kpTag);
+void InitSliceHeadWithBase (SSlice* pSlice, SSlice* pBaseSlice);
+
+void InitSliceRefInfoWithBase (SSlice* pSlice, SSlice* pBaseSlice, const uint8_t kuiRefCount);
+
int32_t InitSliceList (sWelsEncCtx* pCtx,
SDqLayer* pDqLayer,
SSlice*& pSliceList,
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2519,7 +2519,6 @@
SPicture* pDecPic = pCtx->pDecPic;
SDqLayer* pCurDq = pCtx->pCurDqLayer;
SSlice* pBaseSlice = pCurDq->ppSliceInLayer[0];
- SSlice* pSlice = NULL;
const uint8_t kiCurDid = pCtx->uiDependencyId;
const bool kbUseSubsetSpsFlag = (!pParam->bSimulcastAVC) && (kiCurDid > BASE_DEPENDENCY_ID);
SSpatialLayerConfig* fDlp = &pParam->sSpatialLayers[kiCurDid];
@@ -2529,7 +2528,7 @@
int32_t iIdx = 0;
int32_t iSliceCount = 0;
SSpatialLayerInternal* pParamInternal = &pParam->sDependencyLayers[kiCurDid];
- if (NULL == pCurDq)
+ if (NULL == pCurDq || NULL == pBaseSlice)
return;
pCurDq->pDecPic = pDecPic;
@@ -2565,13 +2564,7 @@
iIdx = 1;
while (iIdx < iSliceCount) {
- pSlice = pCurDq->ppSliceInLayer[iIdx];
-
- pSlice->sSliceHeaderExt.sSliceHeader.iPpsId = pBaseSlice->sSliceHeaderExt.sSliceHeader.iPpsId;
- pSlice->sSliceHeaderExt.sSliceHeader.pPps = pBaseSlice->sSliceHeaderExt.sSliceHeader.pPps;
- pSlice->sSliceHeaderExt.sSliceHeader.iSpsId = pBaseSlice->sSliceHeaderExt.sSliceHeader.iSpsId;
- pSlice->sSliceHeaderExt.sSliceHeader.pSps = pBaseSlice->sSliceHeaderExt.sSliceHeader.pSps;
- pSlice->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
+ InitSliceHeadWithBase (pCurDq->ppSliceInLayer[iIdx], pBaseSlice);
++ iIdx;
}
@@ -3780,9 +3773,6 @@
pParam->sSliceArgument.uiSliceMode, pCtx->iEncoderError);
return pCtx->iEncoderError;
}
-
- //TO DO: add update ppSliceInLayer module based on pSliceInThread[ThreadNum]
- // UpdateSliceInLayerInfo(); // reordering
//TO DO: add update ppSliceInLayer module based on pSliceInThread[ThreadNum]
// UpdateSliceInLayerInfo(); // reordering
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -626,10 +626,9 @@
memset (pWelsSvcRc->pGomCost, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
}
-void RcCalculateMbQp (sWelsEncCtx* pEncCtx, SMB* pCurMb, const int32_t kiSliceId) {
- SSlice** ppSliceInLayer = pEncCtx->pCurDqLayer->ppSliceInLayer;
+void RcCalculateMbQp (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &ppSliceInLayer[kiSliceId]->sSlicingOverRc;
+ SRCSlicing* pSOverRc = &pSlice->sSlicingOverRc;
int32_t iLumaQp = pSOverRc->iCalculatedQpSlice;
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
@@ -666,11 +665,10 @@
return NULL;
}
-void RcGomTargetBits (sWelsEncCtx* pEncCtx, const int32_t kiSliceId) {
- SSlice** ppSliceInLayer = pEncCtx->pCurDqLayer->ppSliceInLayer;
+void RcGomTargetBits (sWelsEncCtx* pEncCtx, SSlice* pSlice) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
SWelsSvcRc* pWelsSvcRc_Base = NULL;
- SRCSlicing* pSOverRc = &ppSliceInLayer[kiSliceId]->sSlicingOverRc;
+ SRCSlicing* pSOverRc = &pSlice->sSlicingOverRc;
int32_t iAllocateBits = 0;
int32_t iSumSad = 0;
@@ -702,12 +700,9 @@
pSOverRc->iGomTargetBits = iAllocateBits;
}
-
-
-void RcCalculateGomQp (sWelsEncCtx* pEncCtx, SMB* pCurMb, int32_t iSliceId) {
- SSlice** ppSliceInLayer = pEncCtx->pCurDqLayer->ppSliceInLayer;
+void RcCalculateGomQp (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &ppSliceInLayer[iSliceId]->sSlicingOverRc;
+ SRCSlicing* pSOverRc = &pSlice->sSlicingOverRc;
int64_t iBitsRatio = 1;
int64_t iLeftBits = pSOverRc->iTargetBitsSlice - pSOverRc->iFrameBitsSlice;
@@ -1204,12 +1199,12 @@
if (0 == (pCurMb->iMbXY % pWelsSvcRc->iNumberMbGom)) {
if (pCurMb->iMbXY != pSOverRc->iStartMbSlice) {
pSOverRc->iComplexityIndexSlice++;
- RcCalculateGomQp (pEncCtx, pCurMb, kiSliceId);
+ RcCalculateGomQp (pEncCtx, pSlice, pCurMb);
}
- RcGomTargetBits (pEncCtx, kiSliceId);
+ RcGomTargetBits (pEncCtx, pSlice);
}
- RcCalculateMbQp (pEncCtx, pCurMb, kiSliceId);
+ RcCalculateMbQp (pEncCtx, pSlice, pCurMb);
} else {
pCurMb->uiLumaQp = pEncCtx->iGlobalQp;
pCurMb->uiChromaQp = g_kuiChromaQpTable[CLIP3_QP_0_51 (pCurMb->uiLumaQp + kuiChromaQpIndexOffset)];
--- a/codec/encoder/core/src/ref_list_mgr_svc.cpp
+++ b/codec/encoder/core/src/ref_list_mgr_svc.cpp
@@ -449,41 +449,51 @@
return true;
}
-void WlesMarkMMCORefInfo (sWelsEncCtx* pCtx, SLTRState* pLtr,
- SSlice** ppSliceList, const int32_t kiCountSliceNum) {
+
+static inline void WlesMarkMMCORefInfoWithBase(SSlice** ppSliceList,
+ SSlice* pBaseSlice,
+ const int32_t kiCountSliceNum) {
int32_t iSliceIdx = 0;
- int32_t iGoPFrameNumInterval = ((pCtx->pSvcParam->uiGopSize >> 1) > 1) ? (pCtx->pSvcParam->uiGopSize >> 1) : (1);
+ SSliceHeaderExt* pSliceHdrExt = NULL;
+ SSliceHeaderExt* pBaseSHExt = &pBaseSlice->sSliceHeaderExt;
for (iSliceIdx = 0; iSliceIdx < kiCountSliceNum; iSliceIdx++) {
- SSliceHeaderExt* pSliceHdrExt = &ppSliceList[iSliceIdx]->sSliceHeaderExt;
- SSliceHeader* pSliceHdr = &pSliceHdrExt->sSliceHeader;
- SRefPicMarking* pRefPicMark = &pSliceHdr->sRefMarking;
+ pSliceHdrExt = &ppSliceList[iSliceIdx]->sSliceHeaderExt;
+ memcpy (&pSliceHdrExt->sSliceHeader.sRefMarking, &pBaseSHExt->sSliceHeader.sRefMarking, sizeof (SRefPicMarking));
+ }
+}
- memset (pRefPicMark, 0, sizeof (SRefPicMarking));
+void WlesMarkMMCORefInfo (sWelsEncCtx* pCtx, SLTRState* pLtr,
+ SSlice** ppSliceList, const int32_t kiCountSliceNum) {
+ SSlice* pBaseSlice = ppSliceList[0];
+ SRefPicMarking* pRefPicMark = &pBaseSlice->sSliceHeaderExt.sSliceHeader.sRefMarking;
+ int32_t iGoPFrameNumInterval = ((pCtx->pSvcParam->uiGopSize >> 1) > 1) ? (pCtx->pSvcParam->uiGopSize >> 1) : (1);
- if (pCtx->pSvcParam->bEnableLongTermReference && pLtr->bLTRMarkingFlag) {
- if (pLtr->iLTRMarkMode == LTR_DIRECT_MARK) {
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iMaxLongTermFrameIdx = LONG_TERM_REF_NUM - 1;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SET_MAX_LONG;
+ memset (pRefPicMark, 0, sizeof (SRefPicMarking));
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iDiffOfPicNum = iGoPFrameNumInterval;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SHORT2UNUSED;
+ if (pCtx->pSvcParam->bEnableLongTermReference && pLtr->bLTRMarkingFlag) {
+ if (pLtr->iLTRMarkMode == LTR_DIRECT_MARK) {
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iMaxLongTermFrameIdx = LONG_TERM_REF_NUM - 1;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SET_MAX_LONG;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_LONG;
- } else if (pLtr->iLTRMarkMode == LTR_DELAY_MARK) {
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iDiffOfPicNum = iGoPFrameNumInterval;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SHORT2LONG;
- }
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iDiffOfPicNum = iGoPFrameNumInterval;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SHORT2UNUSED;
+
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_LONG;
+ } else if (pLtr->iLTRMarkMode == LTR_DELAY_MARK) {
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iDiffOfPicNum = iGoPFrameNumInterval;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SHORT2LONG;
}
}
+ WlesMarkMMCORefInfoWithBase(ppSliceList, pBaseSlice, kiCountSliceNum);
}
+
void WelsMarkPic (sWelsEncCtx* pCtx) {
SLTRState* pLtr = &pCtx->pLtr[pCtx->uiDependencyId];
const int32_t kiCountSliceNum = GetCurrentSliceNum (pCtx->pCurDqLayer);
- SSlice** ppSliceList = NULL;
if (pCtx->pSvcParam->bEnableLongTermReference && pLtr->bLTRMarkEnable && pCtx->uiTemporalId == 0) {
if (!pLtr->bReceivedT0LostFlag && pLtr->uiLtrMarkInterval > pCtx->pSvcParam->iLtrMarkPeriod
@@ -501,8 +511,7 @@
}
}
- ppSliceList = pCtx->pCurDqLayer->ppSliceInLayer;
- WlesMarkMMCORefInfo (pCtx, pLtr, ppSliceList, kiCountSliceNum);
+ WlesMarkMMCORefInfo (pCtx, pLtr, pCtx->pCurDqLayer->ppSliceInLayer, kiCountSliceNum);
}
int32_t FilterLTRRecoveryRequest (sWelsEncCtx* pCtx, SLTRRecoverRequest* pLTRRecoverRequest) {
@@ -699,9 +708,8 @@
*/
void WelsUpdateRefSyntax (sWelsEncCtx* pCtx, const int32_t iPOC, const int32_t uiFrameType) {
- int32_t iAbsDiffPicNumMinus1 = -1;
- SSlice** ppSliceList = NULL;
- SSpatialLayerInternal* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
+ int32_t iAbsDiffPicNumMinus1 = -1;
+ SSpatialLayerInternal* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
/*syntax for ref_pic_list_reordering()*/
if (pCtx->iNumRef0 > 0) {
iAbsDiffPicNumMinus1 = pParamD->iFrameNum - (pCtx->pRefList0[0]->iFrameNum) - 1;
@@ -714,8 +722,7 @@
}
}
- ppSliceList = pCtx->pCurDqLayer->ppSliceInLayer;
- WelsUpdateSliceHeaderSyntax (pCtx, iAbsDiffPicNumMinus1, ppSliceList, uiFrameType);
+ WelsUpdateSliceHeaderSyntax (pCtx, iAbsDiffPicNumMinus1, pCtx->pCurDqLayer->ppSliceInLayer, uiFrameType);
}
static inline void UpdateOriginalPicInfo (SPicture* pOrigPic, SPicture* pReconPic) {
@@ -885,22 +892,20 @@
void WlesMarkMMCORefInfoScreen (sWelsEncCtx* pCtx, SLTRState* pLtr,
SSlice** ppSliceList, const int32_t kiCountSliceNum) {
+ SSlice* pBaseSlice = ppSliceList[0];
+ SRefPicMarking* pRefPicMark = &pBaseSlice->sSliceHeaderExt.sSliceHeader.sRefMarking;
const int32_t iMaxLtrIdx = pCtx->pSvcParam->iNumRefFrame - STR_ROOM - 1;
- for (int32_t iSliceIdx = 0; iSliceIdx < kiCountSliceNum; iSliceIdx++) {
- SSliceHeaderExt* pSliceHdrExt = &ppSliceList[iSliceIdx]->sSliceHeaderExt;
- SSliceHeader* pSliceHdr = &pSliceHdrExt->sSliceHeader;
- SRefPicMarking* pRefPicMark = &pSliceHdr->sRefMarking;
+ memset (pRefPicMark, 0, sizeof (SRefPicMarking));
+ if (pCtx->pSvcParam->bEnableLongTermReference) {
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iMaxLongTermFrameIdx = iMaxLtrIdx;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SET_MAX_LONG;
- memset (pRefPicMark, 0, sizeof (SRefPicMarking));
- if (pCtx->pSvcParam->bEnableLongTermReference) {
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iMaxLongTermFrameIdx = iMaxLtrIdx;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_SET_MAX_LONG;
-
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
- pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_LONG;
- }
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount].iLongTermFrameIdx = pLtr->iCurLtrIdx;
+ pRefPicMark->SMmcoRef[pRefPicMark->uiMmcoCount++].iMmcoType = MMCO_LONG;
}
+
+ WlesMarkMMCORefInfoWithBase(ppSliceList, pBaseSlice, kiCountSliceNum);
}
void WelsMarkPicScreen (sWelsEncCtx* pCtx) {
@@ -907,7 +912,7 @@
SLTRState* pLtr = &pCtx->pLtr[pCtx->uiDependencyId];
int32_t iMaxTid = WELS_LOG2 (pCtx->pSvcParam->uiGopSize);
int32_t iMaxActualLtrIdx = -1;
- SSlice** ppSliceList = NULL;
+
SSpatialLayerInternal* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
if (pCtx->pSvcParam->bEnableLongTermReference)
iMaxActualLtrIdx = pCtx->pSvcParam->iNumRefFrame - STR_ROOM - 1 - WELS_MAX (iMaxTid , 1);
@@ -984,9 +989,7 @@
const int32_t iSliceNum = GetCurrentSliceNum (pCtx->pCurDqLayer);
-
- ppSliceList = pCtx->pCurDqLayer->ppSliceInLayer;
- WlesMarkMMCORefInfoScreen (pCtx, pLtr, ppSliceList, iSliceNum);
+ WlesMarkMMCORefInfoScreen (pCtx, pLtr, pCtx->pCurDqLayer->ppSliceInLayer, iSliceNum);
return;
}
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -537,7 +537,6 @@
return -1;
}
-
return ppSliceInLayer[kuiSliceIdc]->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
}
@@ -609,28 +608,26 @@
* \brief Get number of mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
* \param pSliceCtx SSlice context
+ * \param pSlice slice which request slice num
* \param kuiSliceIdc slice/slice_group idc
*
* \return count_num_of_mb - successful; -1 - failed;
*/
-int32_t WelsGetNumMbInSlice (SDqLayer* pCurDq, const int32_t kuiSliceIdc) {
+int32_t WelsGetNumMbInSlice (SDqLayer* pCurDq, SSlice* pSlice, const int32_t kuiSliceIdc) {
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
- SSlice* pSlice = pCurDq->ppSliceInLayer[kuiSliceIdc];
+ bool bInValidFlag = false;
- if (NULL == pSliceCtx || kuiSliceIdc < 0)
+ if (NULL == pSliceCtx || NULL == pSlice || kuiSliceIdc < 0) {
return -1;
- {
- SSliceCtx* pSliceSeg = pSliceCtx;
- if (SM_SINGLE_SLICE != pSliceSeg->uiSliceMode) {
- if (kuiSliceIdc >= pSliceSeg->iSliceNumInFrame)
- return -1;
- return pSlice->iCountMbNumInSlice;
- } else { /*if ( pSliceSeg->uiSliceMode == SM_SINGLE_SLICE )*/
- if (kuiSliceIdc > 0)
- return -1;
- return pSlice->iCountMbNumInSlice;
- }
}
+
+ bInValidFlag = ((SM_SINGLE_SLICE != pSliceCtx->uiSliceMode) && (kuiSliceIdc >= pSliceCtx->iSliceNumInFrame))
+ || ((SM_SINGLE_SLICE == pSliceCtx->uiSliceMode) && (kuiSliceIdc > 0));
+ if(bInValidFlag) {
+ return -1;
+ }
+
+ return pSlice->iCountMbNumInSlice;
}
int32_t GetCurrentSliceNum (const SDqLayer* pCurDq) {
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -1093,25 +1093,36 @@
return ENC_RETURN_SUCCESS;
}
-static inline int32_t InitSliceHeadWithBase (SSlice* pSlice, SSlice* pBaseSlice, const uint8_t kuiRefCount) {
+void InitSliceHeadWithBase (SSlice* pSlice, SSlice* pBaseSlice) {
+ if(NULL == pSlice || NULL == pBaseSlice) {
+ return;
+ }
+
SSliceHeaderExt* pBaseSHExt = &pBaseSlice->sSliceHeaderExt;
SSliceHeaderExt* pSHExt = &pSlice->sSliceHeaderExt;
- if (NULL == pSlice || NULL == pBaseSlice)
- return ENC_RETURN_INVALIDINPUT;
-
pSlice->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;
pSHExt->sSliceHeader.pPps = pBaseSHExt->sSliceHeader.pPps;
pSHExt->sSliceHeader.iSpsId = pBaseSHExt->sSliceHeader.iSpsId;
pSHExt->sSliceHeader.pSps = pBaseSHExt->sSliceHeader.pSps;
+}
+
+void InitSliceRefInfoWithBase (SSlice* pSlice, SSlice* pBaseSlice, const uint8_t kuiRefCount) {
+ if( NULL == pSlice || NULL == pBaseSlice) {
+ return;
+ }
+
+ SSliceHeaderExt* pBaseSHExt = &pBaseSlice->sSliceHeaderExt;
+ SSliceHeaderExt* pSHExt = &pSlice->sSliceHeaderExt;
+
pSHExt->sSliceHeader.uiRefCount = kuiRefCount;
memcpy (&pSHExt->sSliceHeader.sRefMarking, &pBaseSHExt->sSliceHeader.sRefMarking, sizeof (SRefPicMarking));
memcpy (&pSHExt->sSliceHeader.sRefReordering, &pBaseSHExt->sSliceHeader.sRefReordering,
sizeof (SRefPicListReorderSyntax));
- return ENC_RETURN_SUCCESS;
}
+
static inline int32_t InitSliceRC (SSlice* pSlice, const int32_t kiGlobalQp, const int32_t kiBitsPerMb) {
if (NULL == pSlice || kiGlobalQp < 0 || kiBitsPerMb < 0)
@@ -1162,6 +1173,10 @@
memcpy (pNewSliceList, pSliceList, sizeof (SSlice) * kiMaxSliceNumOld);
iSliceIdx = kiMaxSliceNumOld;
pBaseSlice = &pSliceList[0];
+ if (NULL == pBaseSlice) {
+ FreeSliceBuffer(pNewSliceList, kiMaxSliceNumNew, pMA, "ReallocateSliceList()::InitSliceBsBuffer()");
+ return ENC_RETURN_MEMALLOCERR;
+ }
for (; iSliceIdx < kiMaxSliceNumNew; iSliceIdx++) {
pSlice = pNewSliceList + iSliceIdx;
@@ -1197,11 +1212,8 @@
return iRet;
}
- iRet = InitSliceHeadWithBase (pSlice, pBaseSlice, pCtx->iNumRef0);
- if (ENC_RETURN_SUCCESS != iRet) {
- FreeSliceBuffer(pNewSliceList, kiMaxSliceNumNew, pMA, "ReallocateSliceList()::InitSliceBsBuffer()");
- return iRet;
- }
+ InitSliceHeadWithBase (pSlice, pBaseSlice);
+ InitSliceRefInfoWithBase (pSlice, pBaseSlice, pCtx->iNumRef0);
iRet = InitSliceRC (pSlice, pCtx->iGlobalQp, iBitsPerMb);
if (ENC_RETURN_SUCCESS != iRet) {