ref: 623599024f8e4add2aa15ab980c5ee346468f2d0
parent: 612a0a3ff138aa79276eb2d7fd31b6c261123dd9
author: huade <[email protected]>
date: Wed Dec 21 17:33:07 EST 2016
Multi-thread-fixed:RBC#1726:add new design for non-dynamic slice mode
--- a/codec/encoder/core/inc/svc_encode_slice.h
+++ b/codec/encoder/core/inc/svc_encode_slice.h
@@ -84,7 +84,9 @@
int32_t AllocMbCacheAligned (SMbCache* pMbCache, CMemoryAlign* pMa);
void FreeMbCache (SMbCache* pMbCache, CMemoryAlign* pMa);
-int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer, SSliceArgument* pSliceArgument);
+int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer,
+ SSliceArgument* pSliceArgument,
+ const int32_t kiSliceNumInFrame);
int32_t SetSliceBoundaryInfo(SDqLayer* pCurLayer, SSlice* pSlice, const int32_t kiSliceIdx);
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -3743,6 +3743,8 @@
pLayerBsInfo->iNalCount = 0;
pLayerBsInfo->eFrameType = eFrameType;
pLayerBsInfo->iSubSeqId = GetSubSequenceId (pCtx, eFrameType);
+
+ //InitAllSlicesInThread(pCtx);
pCtx->pTaskManage->ExecuteTasks();
if (pCtx->iEncoderError) {
WelsLog (pLogCtx, WELS_LOG_ERROR,
@@ -3752,7 +3754,7 @@
}
//TO DO: add update ppSliceInLayer module based on pSliceInThread[ThreadNum]
- // UpdateSliceInLayerInfo(); // reordering
+ //SliceLayerInfoUpdate (pCtx, pFbi, pLayerBsInfo, 1);
iLayerSize = AppendSliceToFrameBs (pCtx, pLayerBsInfo, iSliceCount);
}
// THREAD_FULLY_FIRE_MODE && SM_SIZELIMITED_SLICE
@@ -4503,7 +4505,7 @@
int32_t iPayloadSize = 0;
SSlice* pCurSlice = NULL;
- if (iSliceIdx >= (pCurLayer->iMaxSliceNum - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
+ if (iSliceIdx >= (pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[uiTheadIdx] - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
if (pCtx->iActiveThreadsNum == 1) {
//only single thread support re-alloc now
if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) {
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -650,6 +650,14 @@
iEventIdx);
}
+ iReturn = SetSliceBoundaryInfo(pEncPEncCtx->pCurDqLayer, pSlice, iSliceIdx);
+ if (ENC_RETURN_SUCCESS != iReturn) {
+ uiThrdRet = iReturn;
+ WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
+ pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
+ iEventIdx);
+ }
+
assert (iSliceIdx == pSlice->iSliceIdx);
iReturn = WelsCodeOneSlice (pEncPEncCtx, pSlice, eNalType);
if (ENC_RETURN_SUCCESS != iReturn) {
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -813,8 +813,9 @@
}
//Initialize slice's boundary info)
-int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer, SSliceArgument* pSliceArgument) {
-
+int32_t InitSliceBoundaryInfo (SDqLayer* pCurLayer,
+ SSliceArgument* pSliceArgument,
+ const int32_t kiSliceNumInFrame) {
const int32_t* kpSlicesAssignList = (int32_t*) & (pSliceArgument->uiSliceMbNum[0]);
const int32_t kiMBWidth = pCurLayer->iMbWidth;
const int32_t kiMBHeight = pCurLayer->iMbHeight;
@@ -823,7 +824,7 @@
int32_t iFirstMBInSlice = 0;
int32_t iMbNumInSlice = 0;
- for( ;iSliceIdx < pCurLayer->iMaxSliceNum; iSliceIdx++ ){
+ for( ;iSliceIdx < kiSliceNumInFrame; iSliceIdx++ ){
if (SM_SINGLE_SLICE == pSliceArgument->uiSliceMode) {
iFirstMBInSlice = 0;
iMbNumInSlice = kiCountNumMbInFrame;
@@ -1029,11 +1030,7 @@
int32_t iIdx = 0;
int32_t iRet = 0;
- assert (iThreadNum > 0);
- //iMaxSliceNumInThread = (pCtx->iMaxSliceCount / iThreadNum + 1) * 2;
iMaxSliceNumInThread = pDqLayer->iMaxSliceNum;
- iMaxSliceNumInThread = WELS_MIN (pCtx->iMaxSliceCount, (int) iMaxSliceNumInThread);
-
while (iIdx < iThreadNum) {
pSliceThreadInfo->iMaxSliceNumInThread[iIdx] = iMaxSliceNumInThread;
pSliceThreadInfo->iEncodedSliceNumInThread[iIdx] = 0;
@@ -1067,43 +1064,52 @@
SDqLayer* pDqLayer,
const int32_t kiDlayerIndex,
CMemoryAlign* pMa) {
- int32_t iRet = 0;
- int32_t iSliceIdx = 0;
- int32_t iMaxSliceNum = pDqLayer->iMaxSliceNum;
+ int32_t iRet = 0;
+ int32_t iSliceIdx = 0;
+ int32_t iThreadIdx = 0;
+ int32_t iStartIdx = 0;
+ int32_t iMaxSliceNum = pDqLayer->iMaxSliceNum;
- pDqLayer->ppSliceInLayer = (SSlice**)pMa->WelsMallocz (sizeof (SSlice*) * iMaxSliceNum, "ppSliceInLayer");
+ iRet = InitSliceThreadInfo (pCtx,
+ pDqLayer,
+ kiDlayerIndex,
+ pMa);
+ if (ENC_RETURN_SUCCESS != iRet) {
+ return ENC_RETURN_MEMALLOCERR;
+ }
+
+ pDqLayer->iMaxSliceNum = iMaxSliceNum * pCtx->iActiveThreadsNum;
+
+ pDqLayer->ppSliceInLayer = (SSlice**)pMa->WelsMallocz (sizeof (SSlice*) * pDqLayer->iMaxSliceNum, "ppSliceInLayer");
if (NULL == pDqLayer->ppSliceInLayer) {
WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::InitSliceInLayer() pDqLayer->ppSliceInLayer is NULL");
return ENC_RETURN_MEMALLOCERR;
}
- pDqLayer->pFirstMbIdxOfSlice = (int32_t*)pMa->WelsMallocz (sizeof (int32_t*) * iMaxSliceNum, "pFirstMbIdxOfSlice");
+ pDqLayer->pFirstMbIdxOfSlice = (int32_t*)pMa->WelsMallocz (sizeof (int32_t*) * pDqLayer->iMaxSliceNum, "pFirstMbIdxOfSlice");
if (NULL == pDqLayer->pFirstMbIdxOfSlice) {
WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::InitSliceInLayer() pDqLayer->pFirstMbIdxOfSlice is NULL");
return ENC_RETURN_MEMALLOCERR;
}
- pDqLayer->pCountMbNumInSlice = (int32_t*)pMa->WelsMallocz (sizeof (int32_t*) * iMaxSliceNum, "pCountMbNumInSlice");
+ pDqLayer->pCountMbNumInSlice = (int32_t*)pMa->WelsMallocz (sizeof (int32_t*) * pDqLayer->iMaxSliceNum, "pCountMbNumInSlice");
if (NULL == pDqLayer->pCountMbNumInSlice) {
WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::InitSliceInLayer() pDqLayer->pCountMbNumInSlice is NULL");
return ENC_RETURN_MEMALLOCERR;
}
- iRet = InitSliceBoundaryInfo (pDqLayer, &pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument);
+ iRet = InitSliceBoundaryInfo (pDqLayer, &pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument, iMaxSliceNum);
if (ENC_RETURN_SUCCESS != iRet) {
return iRet;
}
- InitSliceThreadInfo (pCtx,
- pDqLayer,
- kiDlayerIndex,
- pMa);
- if (ENC_RETURN_SUCCESS != iRet) {
- return iRet;
- }
+ iStartIdx = 0;
+ for(iThreadIdx = 0; iThreadIdx < pCtx->iActiveThreadsNum; iThreadIdx++ ) {
+ for (iSliceIdx = 0; iSliceIdx < pDqLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; iSliceIdx++) {
+ pDqLayer->ppSliceInLayer[iStartIdx + iSliceIdx] = pDqLayer->sSliceThreadInfo.pSliceInThread[iThreadIdx] + iSliceIdx;
+ }
- for (iSliceIdx = 0; iSliceIdx < iMaxSliceNum; iSliceIdx++) {
- pDqLayer->ppSliceInLayer[iSliceIdx] = pDqLayer->sSliceThreadInfo.pSliceInThread[0] + iSliceIdx;
+ iStartIdx += pDqLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx];
}
return ENC_RETURN_SUCCESS;
@@ -1333,10 +1339,12 @@
int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) {
SDqLayer* pCurLayer = pCtx->pCurDqLayer;
- int32_t iMaxSliceNumOld = pCurLayer->iMaxSliceNum;
+ int32_t iMaxSliceNumOld = pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[0];
int32_t iMaxSliceNumNew = 0;
int32_t iRet = 0;
int32_t iSliceIdx = 0;
+ int32_t iThreadIdx = 0;
+ int32_t iStartIdx = 0;
const int32_t kiCurDid = pCtx->uiDependencyId;
SSlice* pLastCodedSlice = pCurLayer->sSliceThreadInfo.pSliceInThread[0] + (iMaxSliceNumOld - 1);
SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiCurDid].sSliceArgument;
@@ -1358,21 +1366,27 @@
return iRet;
}
- iRet = ExtendLayerBuffer(pCtx, iMaxSliceNumOld, iMaxSliceNumNew);
+ pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[0] = iMaxSliceNumNew;
+
+ iMaxSliceNumNew = 0;
+ for(iThreadIdx = 0; iThreadIdx < pCtx->iActiveThreadsNum; iThreadIdx++ ) {
+ iMaxSliceNumNew += pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx];
+ }
+
+ iRet = ExtendLayerBuffer(pCtx, pCurLayer->iMaxSliceNum, iMaxSliceNumNew);
if (ENC_RETURN_SUCCESS != iRet) {
return iRet;
}
- for (iSliceIdx = 0; iSliceIdx < iMaxSliceNumNew; iSliceIdx++) {
- pCurLayer->ppSliceInLayer[iSliceIdx] = pCurLayer->sSliceThreadInfo.pSliceInThread[0] + iSliceIdx;
+ for(iThreadIdx = 0; iThreadIdx < pCtx->iActiveThreadsNum; iThreadIdx++ ) {
+ for (iSliceIdx = 0; iSliceIdx < pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; iSliceIdx++) {
+ pCurLayer->ppSliceInLayer[iStartIdx + iSliceIdx] = pCurLayer->sSliceThreadInfo.pSliceInThread[iThreadIdx] + iSliceIdx;
+ }
+ iStartIdx += pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx];
}
- if (pCtx->iMaxSliceCount < iMaxSliceNumNew) {
- pCtx->iMaxSliceCount = iMaxSliceNumNew;
- }
-
- pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[0] = iMaxSliceNumNew;
pCurLayer->iMaxSliceNum = iMaxSliceNumNew;
+
return ENC_RETURN_SUCCESS;
}
@@ -1623,15 +1637,15 @@
bool DynSlcJudgeSliceBoundaryStepBack (void* pCtx, void* pSlice, SSliceCtx* pSliceCtx, SMB* pCurMb,
SDynamicSlicingStack* pDss) {
sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
- SSlice* pCurSlice = (SSlice*)pSlice;
- int32_t iCurMbIdx = pCurMb->iMbXY;
- uint32_t uiLen = 0;
+ SSlice* pCurSlice = (SSlice*)pSlice;
+ int32_t iCurMbIdx = pCurMb->iMbXY;
+ uint32_t uiLen = 0;
int32_t iPosBitOffset = 0;
- const int32_t kiActiveThreadsNum = pEncCtx->iActiveThreadsNum;
- const int32_t kiPartitaionId = pCurSlice->iSliceIdx % kiActiveThreadsNum;
+ const int32_t kiActiveThreadsNum = pEncCtx->iActiveThreadsNum;
+ const int32_t kiPartitaionId = pCurSlice->iSliceIdx % kiActiveThreadsNum;
const int32_t kiEndMbIdxOfPartition = pEncCtx->pCurDqLayer->pEndMbIdxOfPartition[kiPartitaionId];
-
- const bool kbCurMbNotFirstMbOfCurSlice = ((iCurMbIdx > 0) && (pSliceCtx->pOverallMbMap[iCurMbIdx] ==
+ const int32_t kiMaxSliceNum = pEncCtx->pCurDqLayer->sSliceThreadInfo.iMaxSliceNumInThread[pCurSlice->uiThreadIdx];
+ const bool kbCurMbNotFirstMbOfCurSlice = ((iCurMbIdx > 0) && (pSliceCtx->pOverallMbMap[iCurMbIdx] ==
pSliceCtx->pOverallMbMap[iCurMbIdx - 1]));
const bool kbCurMbNotLastMbOfCurPartition = iCurMbIdx < kiEndMbIdxOfPartition;
@@ -1662,9 +1676,9 @@
// as iMaxSliceNum is always equal to iMaxSliceNumConstraint in origin design
// and will also extend when reallocated,
// tmp change is: iMaxSliceNumConstraint is alway set to be MAXSLICENUM, will not change even reallocate
- const bool kbSliceNumNotExceedConstraint = pSliceCtx->iSliceNumInFrame < pEncCtx->pCurDqLayer->iMaxSliceNum;
- const bool kbSliceIdxNotExceedConstraint = ((int) pCurSlice->iSliceIdx + kiActiveThreadsNum) < pEncCtx->pCurDqLayer->iMaxSliceNum;
- const bool kbSliceNumReachConstraint = (pSliceCtx->iSliceNumInFrame == pEncCtx->pCurDqLayer->iMaxSliceNum);
+ const bool kbSliceNumNotExceedConstraint = pSliceCtx->iSliceNumInFrame < kiMaxSliceNum;
+ const bool kbSliceIdxNotExceedConstraint = ((int) pCurSlice->iSliceIdx + kiActiveThreadsNum) < kiMaxSliceNum;
+ const bool kbSliceNumReachConstraint = (pSliceCtx->iSliceNumInFrame == kiMaxSliceNum);
//DYNAMIC_SLICING_ONE_THREAD: judge jump_avoiding_pack_exceed
if (kbSliceNumNotExceedConstraint && kbSliceIdxNotExceedConstraint) {//able to add new pSlice
--- a/codec/encoder/core/src/wels_task_encoder.cpp
+++ b/codec/encoder/core/src/wels_task_encoder.cpp
@@ -112,7 +112,8 @@
return ENC_RETURN_UNEXPECTED;
}
- // InitOneSliceInThread();
+ //m_pCtx->iEncoderError = InitOneSliceInThread (m_pCtx, m_pSlice, m_iThreadIdx, m_pCtx->uiDependencyId, m_iSliceIdx);
+ //WELS_VERIFY_RETURN_IFNEQ (m_pCtx->iEncoderError, ENC_RETURN_SUCCESS)
m_pSlice = &m_pCtx->pCurDqLayer->sSliceThreadInfo.pSliceInThread[0][m_iSliceIdx];
m_pSliceBs = &m_pSlice->sSliceBs;
@@ -195,6 +196,8 @@
#if MT_DEBUG_BS_WR
m_pSliceBs->bSliceCodedFlag = true;
#endif//MT_DEBUG_BS_WR
+
+ //m_pCtx->pCurDqLayer->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx] ++;
return ENC_RETURN_SUCCESS;
}