ref: d02addd90f0aec5384bf30ee6809c20517a5c5fb
parent: 60f36eb25a9b30499aedc33e63c82ae3c15e277a
author: huade <huashi@cisco.com>
date: Wed Nov 25 08:36:37 EST 2015
remove pCountMbNumInSlice from SSliceCtx
--- a/codec/encoder/core/inc/slice.h
+++ b/codec/encoder/core/inc/slice.h
@@ -181,6 +181,8 @@
SCabacCtx sCabacCtx;
int32_t iCabacInitIdc;
int32_t iMbSkipRun;
+
+int32_t iCountMbNumInSlice;
uint32_t uiSliceConsumeTime;
int32_t iSliceComplexRatio;
} SSlice, *PSlice;
--- a/codec/encoder/core/inc/svc_enc_slice_segment.h
+++ b/codec/encoder/core/inc/svc_enc_slice_segment.h
@@ -86,7 +86,6 @@
int32_t iSliceNumInFrame; /* count number of slices in frame; */
int32_t iMbNumInFrame; /* count number of MBs in frame */
uint16_t* pOverallMbMap; /* overall MB map in frame, store virtual slice idc; */
-int32_t* pCountMbNumInSlice; /* count number of MBs in every slice respectively; */
uint32_t uiSliceSizeConstraint; /* in byte */
int32_t iMaxSliceNumConstraint; /* maximal number of slices constraint */
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2766,18 +2766,18 @@
i = 0;
while (i < iPartitionNum) {
if (i + 1 == iPartitionNum) {
- pSliceCtx->pCountMbNumInSlice[i] = iAssignableMbLeft;
+ pSliceInLayer[i].iCountMbNumInSlice = iAssignableMbLeft;
} else {
- pSliceCtx->pCountMbNumInSlice[i] = iCountMbNumPerPartition;
+ pSliceInLayer[i].iCountMbNumInSlice = iCountMbNumPerPartition;
}
pSliceInLayer[i].sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = iFirstMbIdx;
WelsSetMemMultiplebytes_c (pSliceCtx->pOverallMbMap + iFirstMbIdx, i,
- pSliceCtx->pCountMbNumInSlice[i], sizeof (uint16_t));
+ pSliceInLayer[i].iCountMbNumInSlice, sizeof (uint16_t));
// for next partition(or pSlice)
- iFirstMbIdx += pSliceCtx->pCountMbNumInSlice[i];
- iAssignableMbLeft -= pSliceCtx->pCountMbNumInSlice[i];
+ iFirstMbIdx += pSliceInLayer[i].iCountMbNumInSlice;
+ iAssignableMbLeft -= pSliceInLayer[i].iCountMbNumInSlice;
++ i;
}
}
@@ -4803,21 +4803,6 @@
}
pMA->WelsFree (pCurLayer->sLayerInfo.pSliceInLayer, "Slice");
pCurLayer->sLayerInfo.pSliceInLayer = pSlice;
- int32_t* pCountMbNumInSlice = (int32_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int32_t),
- "pSliceSeg->pCountMbNumInSlice");
- if (NULL == pCountMbNumInSlice) {
- WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR,
- "CWelsH264SVCEncoder::DynSliceRealloc: realloc pCountMbNumInSlice not successful");
- return ENC_RETURN_MEMALLOCERR;
- }
- memcpy (pCountMbNumInSlice, pCurLayer->sSliceEncCtx.pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld);
- uiSliceIdx = iMaxSliceNumOld;
- while (uiSliceIdx < iMaxSliceNum) {
- pCountMbNumInSlice[uiSliceIdx] = pCurLayer->sSliceEncCtx.iMbNumInFrame;
- uiSliceIdx++;
- }
- pMA->WelsFree (pCurLayer->sSliceEncCtx.pCountMbNumInSlice, "pSliceSeg->pCountMbNumInSlice");
- pCurLayer->sSliceEncCtx.pCountMbNumInSlice = pCountMbNumInSlice;
//deal with rate control variables
const int32_t kiCurDid = pCtx->uiDependencyId;
@@ -4837,7 +4822,7 @@
pSORC->iCalculatedQpSlice = pCtx->iGlobalQp;
pSORC->iTotalQpSlice = 0;
pSORC->iTotalMbSlice = 0;
- pSORC->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pCurLayer->sSliceEncCtx.pCountMbNumInSlice[uiSliceIdx],
+ pSORC->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pCurLayer->sLayerInfo.pSliceInLayer[uiSliceIdx].iCountMbNumInSlice,
INT_MULTIPLY);
pSORC->iFrameBitsSlice = 0;
pSORC->iGomBitsSlice = 0;
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -511,7 +511,6 @@
}
void RcInitSliceInformation (sWelsEncCtx* pEncCtx) {
- SSliceCtx* pCurSliceCtx = &pEncCtx->pCurDqLayer->sSliceEncCtx;
SSlice* pSliceInLayer = pEncCtx->pCurDqLayer->sLayerInfo.pSliceInLayer;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
@@ -522,10 +521,10 @@
for (int32_t i = 0; i < kiSliceNum; i++) {
pSOverRc->iStartMbSlice =
pSOverRc->iEndMbSlice = pSliceInLayer[i].sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
- pSOverRc->iEndMbSlice += (pCurSliceCtx->pCountMbNumInSlice[i] - 1);
+ pSOverRc->iEndMbSlice += (pSliceInLayer[i].iCountMbNumInSlice - 1);
pSOverRc->iTotalQpSlice = 0;
pSOverRc->iTotalMbSlice = 0;
- pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pCurSliceCtx->pCountMbNumInSlice[i], INT_MULTIPLY);
+ pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pSliceInLayer[i].iCountMbNumInSlice, INT_MULTIPLY);
pSOverRc->iFrameBitsSlice = 0;
pSOverRc->iGomBitsSlice = 0;
++ pSOverRc;
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -85,7 +85,7 @@
const uint16_t* kpMbMap = pSliceCtx->pOverallMbMap;
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
int32_t iIdx = pUpdateSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
- const int32_t kiEndMbInSlice = iIdx + pSliceCtx->pCountMbNumInSlice[uiSliceIdc] - 1;
+ const int32_t kiEndMbInSlice = iIdx + pUpdateSlice->iCountMbNumInSlice - 1;
do {
SMB* pMb = &pMbList[iIdx];
@@ -132,7 +132,6 @@
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
SSlice* pSliceInLayer = pCurDq->sLayerInfo.pSliceInLayer;
int32_t iSumAv = 0;
- int32_t* pCountMbInSlice = (int32_t*)pSliceCtx->pCountMbNumInSlice;
const int32_t kiSliceCount = pSliceCtx->iSliceNumInFrame;
int32_t iSliceIdx = 0;
int32_t iAvI[MAX_SLICES_NUM];
@@ -140,10 +139,11 @@
WelsEmms();
while (iSliceIdx < kiSliceCount) {
- iAvI[iSliceIdx] = WELS_DIV_ROUND (INT_MULTIPLY * pCountMbInSlice[iSliceIdx], pSliceInLayer[iSliceIdx].uiSliceConsumeTime);
+ iAvI[iSliceIdx] = WELS_DIV_ROUND (INT_MULTIPLY * pSliceInLayer[iSliceIdx].iCountMbNumInSlice,
+ pSliceInLayer[iSliceIdx].uiSliceConsumeTime);
MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), uiSliceConsumeTime[%d]= %d us, slice_run= %d",
iSliceIdx,
- pSliceInLayer[iSliceIdx].uiSliceConsumeTime, pCountMbInSlice[iSliceIdx]);
+ pSliceInLayer[iSliceIdx].uiSliceConsumeTime, pSliceInLayer[iSliceIdx].iCountMbNumInSlice);
iSumAv += iAvI[iSliceIdx];
++ iSliceIdx;
@@ -271,7 +271,7 @@
MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG,
"[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, iSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d",
iSliceIdx, pSliceInLayer[iSliceIdx].iSliceComplexRatio * 1.0f / INT_MULTIPLY,
- pSliceCtx->pCountMbNumInSlice[iSliceIdx],
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice,
iNumMbAssigning);
++ iSliceIdx;
iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts
@@ -280,9 +280,8 @@
MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG,
"[MT] DynamicAdjustSlicing(), iSliceIdx= %d, iSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d",
iSliceIdx, pSliceInLayer[iSliceIdx].iSliceComplexRatio * 1.0f / INT_MULTIPLY,
- pSliceCtx->pCountMbNumInSlice[iSliceIdx], iMbNumLeft);
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice, iMbNumLeft);
-
if (DynamicAdjustSlicePEncCtxAll (pCurDqLayer, iRunLen) == 0) {
const int32_t kiThreadNum = pCtx->pSvcParam->iCountThreadsNum;
int32_t iThreadIdx = 0;
@@ -367,7 +366,7 @@
iIdx = 0;
while (iIdx < iNumSpatialLayers) {
SSliceArgument* pSliceArgument = &pPara->sSpatialLayers[iIdx].sSliceArgument;
- if (pSliceArgument->uiSliceMode == SM_FIXEDSLCNUM_SLICE || pSliceArgument->uiSliceMode == SM_RASTER_SLICE) {
+ if (pSliceArgument->uiSliceMode == SM_FIXEDSLCNUM_SLICE || pSliceArgument->uiSliceMode == SM_RASTER_SLICE) {
bWillUseTaskManage = true;
}
++ iIdx;
@@ -789,7 +788,7 @@
pEncPEncCtx->iCodingIndex, iSliceIdx,
pEncPEncCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[iSliceIdx].uiSliceConsumeTime, iSliceSize,
pCurDq->sLayerInfo.pSliceInLayer[iSliceIdx].sSliceHeaderExt.sSliceHeader.iFirstMbInSlice,
- pCurDq->sSliceEncCtx.pCountMbNumInSlice[iSliceIdx]);
+ pCurDq->sLayerInfo.pSliceInLayer[iSliceIdx].iCountMbNumInSlice);
}
#if defined(SLICE_INFO_OUTPUT)
@@ -898,7 +897,8 @@
MT_TRACE_LOG (pEncPEncCtx, WELS_LOG_INFO,
"[MT] CodingSliceThreadProc(), coding_idx %d, iPartitionId %d, uiSliceIdx %d, iSliceSize %d, count_mb_slice %d, iEndMbInPartition %d, pCurDq->pLastCodedMbIdxOfPartition[%d] %d\n",
- pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize, pCurDq->sSliceEncCtx.pCountMbNumInSlice[iSliceIdx],
+ pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize,
+ pCurDq->sLayerInfo.pSliceInLayer[iSliceIdx].iCountMbNumInSlice,
kiEndMbInPartition, kiPartitionId, pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
iAnyMbLeftInPartition = kiEndMbInPartition - (1 + pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -83,7 +83,7 @@
while (iSliceIdx < iSliceNum) {
const int32_t kiFirstMb = iSliceIdx * kiMbWidth;
SSliceHeaderExt* pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
- pSliceSeg->pCountMbNumInSlice[iSliceIdx] = kiMbWidth;
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice = kiMbWidth;
pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = kiFirstMb;
WelsSetMemMultiplebytes_c(pSliceSeg->pOverallMbMap + kiFirstMb, iSliceIdx,
kiMbWidth, sizeof(uint16_t));
@@ -100,11 +100,11 @@
iSliceIdx = 0;
do {
- const int32_t kiCurRunLength = kpSlicesAssignList[iSliceIdx];
- int32_t iRunIdx = 0;
- pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
+ const int32_t kiCurRunLength = kpSlicesAssignList[iSliceIdx];
+ int32_t iRunIdx = 0;
+ pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = iMbIdx;
- pSliceSeg->pCountMbNumInSlice[iSliceIdx] = kiCurRunLength;
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice = kiCurRunLength;
// due here need check validate mb_assign_map for input pData, can not use memset
do {
@@ -121,9 +121,9 @@
iSliceIdx = 0;
do {
- pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
- pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = 0;
- pSliceSeg->pCountMbNumInSlice[iSliceIdx] = kiCountNumMbInFrame;
+ pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
+ pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = 0;
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice = kiCountNumMbInFrame;
iSliceIdx++;
} while (iSliceIdx < kiMaxSliceNum);
} else { // any else uiSliceMode?
@@ -366,6 +366,7 @@
const int32_t kiMbWidth,
const int32_t kiMbHeight) {
SSliceCtx* pSliceSeg = &pCurDq->sSliceEncCtx;
+ SSlice* pSliceInLayer = pCurDq->sLayerInfo.pSliceInLayer;
const int32_t kiCountMbNum = kiMbWidth * kiMbHeight;
SliceModeEnum uiSliceMode = SM_SINGLE_SLICE;
@@ -383,12 +384,6 @@
pSliceSeg->pOverallMbMap = NULL;
}
- if (NULL != pSliceSeg->pCountMbNumInSlice) {
- pMa->WelsFree (pSliceSeg->pCountMbNumInSlice, "pSliceSeg->pCountMbNumInSlice");
-
- pSliceSeg->pCountMbNumInSlice = NULL;
- }
-
// just for safe
pSliceSeg->iSliceNumInFrame = 0;
pSliceSeg->iMbNumInFrame = 0;
@@ -403,15 +398,11 @@
WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pOverallMbMap)
pSliceSeg->iSliceNumInFrame = 1;
- pSliceSeg->pCountMbNumInSlice = (int32_t*)pMa->WelsMalloc (pSliceSeg->iSliceNumInFrame * sizeof (int32_t),
- "pSliceSeg->pCountMbNumInSlice");
-
- WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pCountMbNumInSlice)
pSliceSeg->uiSliceMode = uiSliceMode;
pSliceSeg->iMbWidth = kiMbWidth;
pSliceSeg->iMbHeight = kiMbHeight;
pSliceSeg->iMbNumInFrame = kiCountMbNum;
- pSliceSeg->pCountMbNumInSlice[0] = kiCountMbNum;
+ pSliceInLayer[0].iCountMbNumInSlice = kiCountMbNum;
return AssignMbMapSingleSlice (pSliceSeg->pOverallMbMap, kiCountMbNum, sizeof (pSliceSeg->pOverallMbMap[0]));
} else { //if ( SM_MULTIPLE_SLICE == uiSliceMode )
@@ -429,10 +420,6 @@
if (-1 == pSliceSeg->iSliceNumInFrame)
return 1;
- pSliceSeg->pCountMbNumInSlice = (int32_t*)pMa->WelsMalloc (pSliceSeg->iSliceNumInFrame * sizeof (int32_t),
- "pSliceSeg->pCountMbNumInSlice");
- WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pCountMbNumInSlice)
-
pSliceSeg->uiSliceMode = pSliceArgument->uiSliceMode;
pSliceSeg->iMbWidth = kiMbWidth;
@@ -475,12 +462,6 @@
pSliceSeg->pOverallMbMap = NULL;
}
- if (NULL != pSliceSeg->pCountMbNumInSlice) {
- pMa->WelsFree (pSliceSeg->pCountMbNumInSlice, "pSliceSeg->pCountMbNumInSlice");
-
- pSliceSeg->pCountMbNumInSlice = NULL;
- }
-
pSliceSeg->iMbNumInFrame = 0;
pSliceSeg->iMbWidth = 0;
pSliceSeg->iMbHeight = 0;
@@ -641,18 +622,20 @@
*/
int32_t WelsGetNumMbInSlice (SDqLayer* pCurDq, const int32_t kuiSliceIdc) {
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
+ SSlice* pSlice = &pCurDq->sLayerInfo.pSliceInLayer[kuiSliceIdc];
+
if (NULL == pSliceCtx || kuiSliceIdc < 0)
return -1;
{
SSliceCtx* pSliceSeg = pSliceCtx;
if (SM_SINGLE_SLICE != pSliceSeg->uiSliceMode) {
- if (NULL == pSliceSeg->pCountMbNumInSlice || kuiSliceIdc >= pSliceSeg->iSliceNumInFrame)
+ if (kuiSliceIdc >= pSliceSeg->iSliceNumInFrame)
return -1;
- return pSliceSeg->pCountMbNumInSlice[ kuiSliceIdc ];
+ return pSlice->iCountMbNumInSlice;
} else { /*if ( pSliceSeg->uiSliceMode == SM_SINGLE_SLICE )*/
- if (kuiSliceIdc > 0 || NULL == pSliceSeg->pCountMbNumInSlice)
+ if (kuiSliceIdc > 0)
return -1;
- return pSliceSeg->pCountMbNumInSlice[ kuiSliceIdc ];
+ return pSlice->iCountMbNumInSlice;
}
}
}
@@ -674,7 +657,7 @@
assert (iCountSliceNumInFrame <= MAX_THREADS_NUM);
while (iSliceIdx < iCountSliceNumInFrame) {
- if (pRunLength[iSliceIdx] != pSliceCtx->pCountMbNumInSlice[iSliceIdx]) {
+ if (pRunLength[iSliceIdx] != pSliceInLayer[iSliceIdx].iCountMbNumInSlice) {
iSameRunLenFlag = 0;
break;
}
@@ -689,7 +672,7 @@
const int32_t kiSliceRun = pRunLength[iSliceIdx];
SSliceHeaderExt* pSliceHeaderExt = &pSliceInLayer[iSliceIdx].sSliceHeaderExt;
pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = iFirstMbIdx;
- pSliceCtx->pCountMbNumInSlice[iSliceIdx] = kiSliceRun;
+ pSliceInLayer[iSliceIdx].iCountMbNumInSlice = kiSliceRun;
WelsSetMemMultiplebytes_c(pSliceCtx->pOverallMbMap + iFirstMbIdx, iSliceIdx,
kiSliceRun, sizeof(uint16_t));
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -617,7 +617,7 @@
iNextMbIdx = WelsGetNextMbOfSlice (pCurLayer, iCurMbIdx);
//whether all of MB in current pSlice encoded or not
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbCoded >= kiTotalNumMb) {
- pSliceCtx->pCountMbNumInSlice[kiSliceIdx] = iCurMbIdx - pCurLayer->pLastCodedMbIdxOfPartition[kiPartitionId];
+ pSlice->iCountMbNumInSlice = iCurMbIdx - pCurLayer->pLastCodedMbIdxOfPartition[kiPartitionId];
pCurLayer->pLastCodedMbIdxOfPartition[kiPartitionId] =
iCurMbIdx; // update pLastCodedMbIdxOfPartition, finish coding, use iCurMbIdx directly
break;
--- a/codec/encoder/core/src/wels_task_encoder.cpp
+++ b/codec/encoder/core/src/wels_task_encoder.cpp
@@ -224,7 +224,7 @@
m_pSlice->uiSliceConsumeTime,
m_iSliceSize,
m_pCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[m_iSliceIdx].sSliceHeaderExt.sSliceHeader.iFirstMbInSlice,
- m_pCtx->pCurDqLayer->sSliceEncCtx.pCountMbNumInSlice[m_iSliceIdx]);
+ m_pSlice->iCountMbNumInSlice);
}