ref: e448da82e4555c40d7d4b437cfa1dd22bc6c02c0
parent: 74b9a3f7e112cf81c06812d353f62fb3113af082
author: huade <huashi@cisco.com>
date: Wed Dec 21 10:31:00 EST 2016
Multi-thread-fixed:RBC#1715:refactoring for slice boundary info init/update module
--- a/codec/encoder/core/inc/svc_enc_slice_segment.h
+++ b/codec/encoder/core/inc/svc_enc_slice_segment.h
@@ -149,12 +149,12 @@
/*!
* \brief Get first mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
- * \param ppSliceInLayer slice list in current layer
+ * \param pCurLayer current layer
* \param kiSliceIdc slice idc
*
* \return first_mb - successful; -1 - failed;
*/
-int32_t WelsGetFirstMbOfSlice (SSlice** ppSliceInLayer, const int32_t kiSliceIdc);
+int32_t WelsGetFirstMbOfSlice (SDqLayer* pCurLayer, const int32_t kiSliceIdc);
/*!
* \brief Get successive mb to be processed in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
--- a/codec/encoder/core/inc/svc_encode_slice.h
+++ b/codec/encoder/core/inc/svc_encode_slice.h
@@ -84,10 +84,9 @@
int32_t AllocMbCacheAligned (SMbCache* pMbCache, CMemoryAlign* pMa);
void FreeMbCache (SMbCache* pMbCache, CMemoryAlign* pMa);
-int32_t InitSliceMBInfo (SSliceArgument* pSliceArgument,
- SSlice* pSlice,
- const int32_t kiMBWidth,
- const int32_t kiMBHeight);
+int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer, SSliceArgument* pSliceArgument);
+
+int32_t SetSliceBoundaryInfo(SDqLayer* pCurLayer, SSlice* pSlice, const int32_t kiSliceIdx);
int32_t AllocateSliceMBBuffer (SSlice* pSlice, CMemoryAlign* pMa);
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -3682,6 +3682,9 @@
WelsLoadNal (pCtx->pOut, eNalType, eNalRefIdc);
assert (0 == (int) pCurSlice->uiSliceIdx);
+ pCtx->iEncoderError = SetSliceBoundaryInfo(pCtx->pCurDqLayer, pCurSlice, 0);
+ WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
+
pCtx->iEncoderError = WelsCodeOneSlice (pCtx, pCurSlice, eNalType);
WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
@@ -3823,6 +3826,10 @@
WelsLoadNal (pCtx->pOut, eNalType, eNalRefIdc);
pCurSlice = pCtx->pCurDqLayer->ppSliceInLayer[iSliceIdx];
assert (iSliceIdx == (int) pCurSlice->uiSliceIdx);
+
+ pCtx->iEncoderError = SetSliceBoundaryInfo(pCtx->pCurDqLayer, pCurSlice, iSliceIdx);
+ WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
+
pCtx->iEncoderError = WelsCodeOneSlice (pCtx, pCurSlice, eNalType);
WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -710,6 +710,7 @@
pSOverRc->iGomTargetBits = iAllocateBits;
}
+
void RcCalculateGomQp (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
SRCSlicing* pSOverRc = &pSlice->sSlicingOverRc;
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -81,10 +81,9 @@
SMB* pMbList,
const int32_t uiSliceIdc) {
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
- SSlice* pUpdateSlice = pCurDq->ppSliceInLayer[uiSliceIdc];
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
- int32_t iIdx = pUpdateSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
- const int32_t kiEndMbInSlice = iIdx + pUpdateSlice->iCountMbNumInSlice - 1;
+ int32_t iIdx = pCurDq->pFirstMbIdxOfSlice[uiSliceIdc];
+ const int32_t kiEndMbInSlice = iIdx + pCurDq->pCountMbNumInSlice[uiSliceIdc] - 1;
do {
UpdateMbNeighbor (pCurDq, &pMbList[iIdx], kiMbWidth, uiSliceIdc);
@@ -638,6 +637,15 @@
WelsLoadNalForSlice (pSliceBs, eNalType, eNalRefIdc);
pCurSlice = pEncPEncCtx->pCurDqLayer->ppSliceInLayer[iSliceIdx];
assert (iSliceIdx == (int) pCurSlice->uiSliceIdx);
+
+ iReturn = SetSliceBoundaryInfo(pEncPEncCtx->pCurDqLayer, pCurSlice, iSliceIdx);
+ if (ENC_RETURN_SUCCESS != iReturn) {
+ uiThrdRet = iReturn;
+ WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
+ pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
+ iEventIdx);
+ }
+
iReturn = WelsCodeOneSlice (pEncPEncCtx, pCurSlice, eNalType);
if (ENC_RETURN_SUCCESS != iReturn) {
uiThrdRet = iReturn;
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -527,17 +527,17 @@
/*!
* \brief Get first mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
- * \param ppSliceInLayer slice list in current layer
+ * \param pCurLayer current layer
* \param kuiSliceIdc slice idc
*
* \return iFirstMb - successful; -1 - failed;
*/
-int32_t WelsGetFirstMbOfSlice (SSlice** ppSliceInLayer, const int32_t kuiSliceIdc) {
- if ( NULL == ppSliceInLayer || NULL == ppSliceInLayer[kuiSliceIdc] ) {
+int32_t WelsGetFirstMbOfSlice (SDqLayer* pCurLayer, const int32_t kuiSliceIdc) {
+ if ( NULL == pCurLayer || NULL == pCurLayer->pFirstMbIdxOfSlice ) {
return -1;
}
- return ppSliceInLayer[kuiSliceIdc]->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
+ return pCurLayer->pFirstMbIdxOfSlice[kuiSliceIdc];
}
/*!
@@ -637,7 +637,6 @@
int32_t DynamicAdjustSlicePEncCtxAll (SDqLayer* pCurDq,
int32_t* pRunLength) {
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
- SSlice** ppSliceInLayer = pCurDq->ppSliceInLayer;
const int32_t iCountNumMbInFrame = pSliceCtx->iMbNumInFrame;
const int32_t iCountSliceNumInFrame = pSliceCtx->iSliceNumInFrame;
int32_t iSameRunLenFlag = 1;
@@ -647,7 +646,7 @@
assert (iCountSliceNumInFrame <= MAX_THREADS_NUM);
while (iSliceIdx < iCountSliceNumInFrame) {
- if (pRunLength[iSliceIdx] != ppSliceInLayer[iSliceIdx]->iCountMbNumInSlice) {
+ if (pRunLength[iSliceIdx] != pCurDq->pFirstMbIdxOfSlice[iSliceIdx]) {
iSameRunLenFlag = 0;
break;
}
@@ -660,9 +659,6 @@
iSliceIdx = 0;
do {
const int32_t kiSliceRun = pRunLength[iSliceIdx];
- SSliceHeaderExt* pSliceHeaderExt = &ppSliceInLayer[iSliceIdx]->sSliceHeaderExt;
- pSliceHeaderExt->sSliceHeader.iFirstMbInSlice = iFirstMbIdx;
- ppSliceInLayer[iSliceIdx]->iCountMbNumInSlice = kiSliceRun;
pCurDq->pFirstMbIdxOfSlice[iSliceIdx] = iFirstMbIdx;
pCurDq->pCountMbNumInSlice[iSliceIdx] = kiSliceRun;
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -94,8 +94,6 @@
pCurSliceExt->bStoreRefBasePicFlag = false;
- pCurSliceHeader->iFirstMbInSlice = WelsGetFirstMbOfSlice (pCurLayer->ppSliceInLayer, pSlice->uiSliceIdx);
-
pCurSliceHeader->iFrameNum = pParamInternal->iFrameNum;
pCurSliceHeader->uiIdrPicId = pParamInternal->uiIdrPicId;
pCurSliceHeader->iPicOrderCntLsb = pEncCtx->pEncPic->iFramePoc; // 0
@@ -814,49 +812,64 @@
}
}
-//Initialize slice's MB info)
-int32_t InitSliceMBInfo (SSliceArgument* pSliceArgument,
- SSlice* pSlice,
- const int32_t kiMBWidth,
- const int32_t kiMBHeight) {
- SSliceHeader* pSliceHeader = &pSlice->sSliceHeaderExt.sSliceHeader;
+//Initialize slice's boundary info)
+int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer, SSliceArgument* pSliceArgument) {
+
const int32_t* kpSlicesAssignList = (int32_t*) & (pSliceArgument->uiSliceMbNum[0]);
+ const int32_t kiMBWidth = pCurLayer->iMbWidth;
+ const int32_t kiMBHeight = pCurLayer->iMbHeight;
const int32_t kiCountNumMbInFrame = kiMBWidth * kiMBHeight;
- const int32_t kiSliceIdx = pSlice->uiSliceIdx;
+ int32_t iSliceIdx = 0;
int32_t iFirstMBInSlice = 0;
int32_t iMbNumInSlice = 0;
- if (SM_SINGLE_SLICE == pSliceArgument->uiSliceMode) {
- iFirstMBInSlice = 0;
- iMbNumInSlice = kiCountNumMbInFrame;
+ for( ;iSliceIdx < pCurLayer->iMaxSliceNum; iSliceIdx++ ){
+ if (SM_SINGLE_SLICE == pSliceArgument->uiSliceMode) {
+ iFirstMBInSlice = 0;
+ iMbNumInSlice = kiCountNumMbInFrame;
- } else if ((SM_RASTER_SLICE == pSliceArgument->uiSliceMode) && (0 == pSliceArgument->uiSliceMbNum[0])) {
- iFirstMBInSlice = kiSliceIdx * kiMBWidth;
- iMbNumInSlice = kiMBWidth;
- } else if (SM_RASTER_SLICE == pSliceArgument->uiSliceMode ||
+ } else if ((SM_RASTER_SLICE == pSliceArgument->uiSliceMode) && (0 == pSliceArgument->uiSliceMbNum[0])) {
+ iFirstMBInSlice = iSliceIdx * kiMBWidth;
+ iMbNumInSlice = kiMBWidth;
+ } else if (SM_RASTER_SLICE == pSliceArgument->uiSliceMode ||
SM_FIXEDSLCNUM_SLICE == pSliceArgument->uiSliceMode) {
- int32_t iMbIdx = 0;
- for (int i = 0; i < kiSliceIdx; i++) {
- iMbIdx += kpSlicesAssignList[i];
- }
+ int32_t iMbIdx = 0;
+ for (int i = 0; i < iSliceIdx; i++) {
+ iMbIdx += kpSlicesAssignList[i];
+ }
- if (iMbIdx >= kiCountNumMbInFrame) {
- return ENC_RETURN_UNEXPECTED;
+ if (iMbIdx >= kiCountNumMbInFrame) {
+ return ENC_RETURN_UNEXPECTED;
+ }
+
+ iFirstMBInSlice = iMbIdx;
+ iMbNumInSlice = kpSlicesAssignList[iSliceIdx];
+
+ } else if (SM_SIZELIMITED_SLICE == pSliceArgument->uiSliceMode) {
+ iFirstMBInSlice = 0;
+ iMbNumInSlice = kiCountNumMbInFrame;
+
+ } else { // any else uiSliceMode?
+ assert (0);
}
- iFirstMBInSlice = iMbIdx;
- iMbNumInSlice = kpSlicesAssignList[kiSliceIdx];
+ pCurLayer->pCountMbNumInSlice[iSliceIdx] = iMbNumInSlice;
+ pCurLayer->pFirstMbIdxOfSlice[iSliceIdx] = iFirstMBInSlice;
+ }
- } else if (SM_SIZELIMITED_SLICE == pSliceArgument->uiSliceMode) {
- iFirstMBInSlice = 0;
- iMbNumInSlice = kiCountNumMbInFrame;
+ return ENC_RETURN_SUCCESS;
+}
- } else { // any else uiSliceMode?
- assert (0);
+int32_t SetSliceBoundaryInfo(SDqLayer* pCurLayer, SSlice* pSlice, const int32_t kiSliceIdx) {
+ if(NULL == pCurLayer || NULL == pSlice ||
+ NULL == pCurLayer->pFirstMbIdxOfSlice ||
+ NULL == pCurLayer->pCountMbNumInSlice) {
+
+ return ENC_RETURN_UNEXPECTED;
}
- pSlice->iCountMbNumInSlice = iMbNumInSlice;
- pSliceHeader->iFirstMbInSlice = iFirstMBInSlice;
+ pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = pCurLayer->pFirstMbIdxOfSlice[kiSliceIdx];
+ pSlice->iCountMbNumInSlice = pCurLayer->pCountMbNumInSlice[kiSliceIdx];
return ENC_RETURN_SUCCESS;
}
@@ -941,9 +954,11 @@
}
pSlice->uiSliceIdx = iSliceIdx;
+ pSlice->iCountMbNumInSlice = 0;
+ pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = 0;
iRet = InitSliceBsBuffer (pSlice,
- & pCtx->pOut->sBsWrite,
+ &pCtx->pOut->sBsWrite,
bIndependenceBsBuffer,
iMaxSliceBufferSize,
pMa);
@@ -951,12 +966,6 @@
return iRet;
}
- iRet = InitSliceMBInfo (pSliceArgument, pSlice,
- kiMBWidth, kiMBHeight);
-
- if (ENC_RETURN_SUCCESS != iRet) {
- return iRet;
- }
iRet = AllocateSliceMBBuffer (pSlice, pMa);
if (ENC_RETURN_SUCCESS != iRet) {
@@ -993,11 +1002,6 @@
pSlice->sSliceBs.iNalIndex = 0;
pSlice->sSliceBs.pBsBuffer = pCtx->pSliceThreading->pThreadBsBuffer[kiThreadIdx];
- // init slice MB info
- iRet = InitSliceMBInfo (pSliceArgument, pSlice, kiMBWidth, kiMBHeight);
- if (ENC_RETURN_SUCCESS != iRet) {
- return iRet;
- }
return ENC_RETURN_SUCCESS;
}
*/
@@ -1073,6 +1077,11 @@
return ENC_RETURN_MEMALLOCERR;
}
+ iRet = InitSliceBoundaryInfo (pDqLayer, &pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument);
+ if (ENC_RETURN_SUCCESS != iRet) {
+ return iRet;
+ }
+
InitSliceThreadInfo (pCtx,
pDqLayer,
kiDlayerIndex,
@@ -1142,7 +1151,6 @@
const int32_t kiMaxSliceNumOld,
const int32_t kiMaxSliceNumNew) {
CMemoryAlign* pMA = pCtx->pMemAlign;
- SDqLayer* pCurLayer = pCtx->pCurDqLayer;
SSlice* pBaseSlice = NULL;
SSlice* pNewSliceList = NULL;
SSlice* pSlice = NULL;
@@ -1181,6 +1189,8 @@
}
pSlice->uiSliceIdx = iSliceIdx;
+ pSlice->iCountMbNumInSlice = 0;
+ pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = 0;
iRet = InitSliceBsBuffer (pSlice,
& pCtx->pOut->sBsWrite,
@@ -1198,15 +1208,6 @@
return iRet;
}
- iRet = InitSliceMBInfo (pSliceArgument,
- pSlice,
- pCurLayer->iMbWidth,
- pCurLayer->iMbHeight);
- if (ENC_RETURN_SUCCESS != iRet) {
- FreeSliceBuffer(pNewSliceList, kiMaxSliceNumNew, pMA, "ReallocateSliceList()::InitSliceBsBuffer()");
- return iRet;
- }
-
InitSliceHeadWithBase (pSlice, pBaseSlice);
InitSliceRefInfoWithBase (pSlice, pBaseSlice, pCtx->iNumRef0);
@@ -1356,6 +1357,7 @@
pCurLayer->iMaxSliceNum = iMaxSliceNumNew;
return ENC_RETURN_SUCCESS;
}
+
/*
int32_t ReOrderSliceInLayer (SDqLayer* pCurLayer,
--- a/codec/encoder/core/src/wels_task_encoder.cpp
+++ b/codec/encoder/core/src/wels_task_encoder.cpp
@@ -119,6 +119,9 @@
m_pSliceBs->uiBsPos = 0;
m_pSliceBs->iNalIndex = 0;
+ m_pCtx->iEncoderError = SetSliceBoundaryInfo(m_pCtx->pCurDqLayer, m_pSlice, m_iSliceIdx);
+ WELS_VERIFY_RETURN_IFNEQ (m_pCtx->iEncoderError, ENC_RETURN_SUCCESS)
+
SetOneSliceBsBufferUnderMultithread (m_pCtx, m_iThreadIdx, m_pSlice);
assert ((void*) (&m_pSliceBs->sBsWrite) == (void*)m_pSlice->pSliceBsa);