History

Multi-thread-fixed:RBC#1753:update csv files as dynamic slice mode reallocate enable

Huade Shi (huashi) committed 9 years ago

Commit e07768b1 parent b8ba4183 files · +54 −1198Browse files

Showing the changes to codec/encoder/core/src/svc_encode_slice.cpp (1 of 3 files). Show all

Unified · Split

codec/encoder/core/src/svc_encode_slice.cpp+50−42
@@ -1005,12 +1005,11 @@ int32_t InitOneSliceInThread (sWelsEncCtx* pCtx, · 1004 unmodified lines
10051005 const int32_t kiThreadIdx,
10061006 const int32_t kiDlayerIdx,
10071007 const int32_t kiSliceIdx) {
1008− SDqLayer* pDqLayer = pCtx->pCurDqLayer;
1009− const int32_t kiCodedNumInThread = pDqLayer->sSliceThreadInfo[kiThreadIdx].iCodedSliceNum;
1008+ const int32_t kiCodedNumInThread = pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iCodedSliceNum;
10101009
1011− assert(kiCodedNumInThread < pDqLayer->sSliceThreadInfo[kiThreadIdx].iMaxSliceNum -1 );
1010+ assert(kiCodedNumInThread <= pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iMaxSliceNum -1 );
10121011
1013− pSlice = &pDqLayer->sSliceThreadInfo [kiThreadIdx].pSliceInThread[kiCodedNumInThread];
1012+ pSlice = &pCtx->pCurDqLayer->sSliceThreadInfo [kiThreadIdx].pSliceInThread[kiCodedNumInThread];
10141013 pSlice->iSliceIdx = kiSliceIdx;
10151014 pSlice->uiThreadIdx = kiThreadIdx;
10161015
@@ -1026,17 +1025,23 @@ int32_t InitSliceThreadInfo (sWelsEncCtx* pCtx, · 9 unmodified lines
10261025 SDqLayer* pDqLayer,
10271026 const int32_t kiDlayerIndex,
10281027 CMemoryAlign* pMa) {
1029− int32_t iThreadNum = pCtx->pSvcParam->iMultipleThreadIdc;
1030− int32_t iMaxSliceNumInThread = 0;
1031− int32_t iIdx = 0;
1032− int32_t iRet = 0;
1028+ int32_t iThreadNum = pCtx->pSvcParam->iMultipleThreadIdc;
1029+ int32_t iMaxSliceNum = 0;
1030+ int32_t iIdx = 0;
1031+ int32_t iRet = 0;
1032+ SliceModeEnum eSlicMode = pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument.uiSliceMode;
10331033
10341034 assert (iThreadNum > 0);
1035− iMaxSliceNumInThread = pDqLayer->iMaxSliceNum;
1035+ if( SM_SIZELIMITED_SLICE == eSlicMode && iThreadNum > 1) {
1036+ iMaxSliceNum = pDqLayer->iMaxSliceNum / iThreadNum + 1;
1037+ } else {
1038+ iMaxSliceNum = pDqLayer->iMaxSliceNum;
1039+ }
1040+
10361041 while (iIdx < iThreadNum) {
1037− pDqLayer->sSliceThreadInfo[iIdx].iMaxSliceNum = iMaxSliceNumInThread;
1042+ pDqLayer->sSliceThreadInfo[iIdx].iMaxSliceNum = iMaxSliceNum;
10381043 pDqLayer->sSliceThreadInfo[iIdx].iCodedSliceNum = 0;
1039− pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread = (SSlice*)pMa->WelsMallocz (sizeof (SSlice) * iMaxSliceNumInThread, "pSliceInThread");
1044+ pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread = (SSlice*)pMa->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "pSliceInThread");
10401045 if (NULL == pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread) {
10411046 WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR,
10421047 "CWelsH264SVCEncoder::InitSliceThreadInfo: pSliceThreadInfo->pSliceInThread[iIdx] is NULL");
@@ -1045,7 +1050,7 @@ int32_t InitSliceThreadInfo (sWelsEncCtx* pCtx, · 2 unmodified lines
10451050 iRet = InitSliceList (pCtx,
10461051 pDqLayer,
10471052 pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread,
1048− iMaxSliceNumInThread,
1053+ iMaxSliceNum,
10491054 kiDlayerIndex,
10501055 pMa);
10511056 if (ENC_RETURN_SUCCESS != iRet) {
@@ -1110,7 +1115,7 @@ int32_t InitSliceInLayer (sWelsEncCtx* pCtx, · 58 unmodified lines
11101115
11111116 iStartIdx = 0;
11121117 for(iThreadIdx = 0; iThreadIdx < pCtx->iActiveThreadsNum; iThreadIdx++ ) {
1113− for (iSliceIdx = 0; iSliceIdx < pDqLayer->sSliceThreadInfo[iThreadIdx].iMaxSliceNum; iSliceIdx++ ) {
1118+ for (iSliceIdx = 0; iSliceIdx < pDqLayer->sSliceThreadInfo[iThreadIdx].iMaxSliceNum; iSliceIdx++ ) {
11141119 pDqLayer->ppSliceInLayer[iStartIdx + iSliceIdx] = pDqLayer->sSliceThreadInfo[iThreadIdx].pSliceInThread+ iSliceIdx;
11151120 }
11161121
@@ -1179,13 +1184,14 @@ int32_t ReallocateSliceList (sWelsEncCtx* pCtx, · 62 unmodified lines
11791184 int32_t iRet = 0;
11801185 const int32_t kiCurDid = pCtx->uiDependencyId;
11811186 int32_t iMaxSliceBufferSize = (pCtx)->iSliceBufferSize[kiCurDid];
1182− bool bIndependenceBsBuffer = (pCtx->pSvcParam->iMultipleThreadIdc > 1 &&
1183− SM_SINGLE_SLICE != pSliceArgument->uiSliceMode) ? true : false;
11841187
11851188 if (NULL == pSliceList || NULL == pSliceArgument) {
11861189 return ENC_RETURN_INVALIDINPUT;
11871190 }
11881191
1192+ bool bIndependenceBsBuffer = (pCtx->pSvcParam->iMultipleThreadIdc > 1 &&
1193+ SM_SINGLE_SLICE != pSliceArgument->uiSliceMode) ? true : false;
1194+
11891195 pNewSliceList = (SSlice*)pMA->WelsMallocz (sizeof (SSlice) * kiMaxSliceNumNew, "pSliceInThread");
11901196 if (NULL == pNewSliceList) {
11911197 WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ReallocateSliceList: pNewSliceList is NULL");
@@ -1257,24 +1263,29 @@ int32_t ReallocateSliceList (sWelsEncCtx* pCtx, · 65 unmodified lines
12571263 return ENC_RETURN_SUCCESS;
12581264 }
12591265
1260−int32_t CalculateNewSliceNum (SDqLayer* pDqLayer,
1266+int32_t CalculateNewSliceNum (sWelsEncCtx* pCtx,
12611267 SSlice* pLastCodedSlice,
12621268 const int32_t iMaxSliceNumOld,
12631269 int32_t& iMaxSliceNumNew) {
1264− int32_t CodedMBNum = 0;
1265−
1266− if (NULL == pLastCodedSlice)
1270+ if ( NULL == pCtx || NULL == pLastCodedSlice || 0 == iMaxSliceNumOld ) {
12671271 return ENC_RETURN_INVALIDINPUT;
1272+ }
12681273
1269− CodedMBNum = pLastCodedSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice +
1270− pLastCodedSlice->iCountMbNumInSlice;
1271− if (CodedMBNum <= 0) {
1272− return ENC_RETURN_UNEXPECTED;
1274+ if ( 1 == pCtx->iActiveThreadsNum ) {
1275+ iMaxSliceNumNew = iMaxSliceNumOld * SLICE_NUM_EXPAND_COEF;
1276+ return ENC_RETURN_SUCCESS;
12731277 }
1274− //iMaxSliceNumNew = iMaxSliceNumOld * (pDqLayer->iMbWidth * pDqLayer->iMbHeight / CodedMBNum + 1);
1275− //TO DO, will used above logic later, here keep origin logic in order to pass ut
1276− iMaxSliceNumNew = iMaxSliceNumOld;
1277− iMaxSliceNumNew *= SLICE_NUM_EXPAND_COEF;
1278+
1279+ int32_t iPartitionID = pLastCodedSlice->iSliceIdx / pCtx->iActiveThreadsNum;
1280+ int32_t iMBNumInPatition = pCtx->pCurDqLayer->EndMbIdxOfPartition[iPartitionID]
1281+ - pCtx->pCurDqLayer->FirstMbIdxOfPartition[iPartitionID] + 1;
1282+ int32_t iLeftMBNum = pCtx->pCurDqLayer->EndMbIdxOfPartition[iPartitionID]
1283+ - pCtx->pCurDqLayer->LastCodedMbIdxOfPartition[iPartitionID] + 1;
1284+ int32_t iIncreaseSlicNum = (iLeftMBNum * INT_MULTIPLY / iMBNumInPatition) * iMaxSliceNumOld;
1285+
1286+ iIncreaseSlicNum = ( 0 == (iIncreaseSlicNum / INT_MULTIPLY) ) ? 1 : (iIncreaseSlicNum / INT_MULTIPLY);
1287+ iMaxSliceNumNew = iMaxSliceNumOld + iIncreaseSlicNum;
1288+
12781289 return ENC_RETURN_SUCCESS;
12791290 }
12801291
@@ -1282,18 +1293,16 @@ int32_t ReallocateSliceInThread (sWelsEncCtx* pCtx, · 1 unmodified line
12821293 SDqLayer* pDqLayer,
12831294 const int32_t kiDlayerIdx,
12841295 const int32_t kiThreadIndex) {
1285−
1286− int32_t iMaxSliceNumInThread = pDqLayer->sSliceThreadInfo[kiThreadIndex].iMaxSliceNum;
1287− int32_t iMaxSliceNumUpdate = 0;
1288− int32_t iRet = 0;
1289− SSlice* pLastCodedSlice = pDqLayer->sSliceThreadInfo[kiThreadIndex].pSliceInThread + (iMaxSliceNumInThread - 1);
1296+ int32_t iMaxSliceNum = pDqLayer->sSliceThreadInfo[kiThreadIndex].iMaxSliceNum;
1297+ int32_t iMaxSliceNumNew = 0;
1298+ int32_t iRet = 0;
1299+ SSlice* pLastCodedSlice = &pDqLayer->sSliceThreadInfo[kiThreadIndex].pSliceInThread [iMaxSliceNum - 1];
12901300 SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIdx].sSliceArgument;
12911301
1292− iRet = CalculateNewSliceNum (pDqLayer,
1302+ iRet = CalculateNewSliceNum (pCtx,
12931303 pLastCodedSlice,
1294− iMaxSliceNumInThread,
1295− iMaxSliceNumUpdate);
1296−
1304+ iMaxSliceNum,
1305+ iMaxSliceNumNew);
12971306 if (ENC_RETURN_SUCCESS != iRet) {
12981307 return iRet;
12991308 }
@@ -1301,13 +1310,13 @@ int32_t ReallocateSliceInThread (sWelsEncCtx* pCtx, · 1 unmodified line
13011310 iRet = ReallocateSliceList (pCtx,
13021311 pSliceArgument,
13031312 pDqLayer->sSliceThreadInfo[kiThreadIndex].pSliceInThread,
1304− iMaxSliceNumInThread,
1305− iMaxSliceNumUpdate);
1313+ iMaxSliceNum,
1314+ iMaxSliceNumNew);
13061315 if (ENC_RETURN_SUCCESS != iRet) {
13071316 return iRet;
13081317 }
13091318
1310− pDqLayer->sSliceThreadInfo[kiThreadIndex].iMaxSliceNum = iMaxSliceNumUpdate;
1319+ pDqLayer->sSliceThreadInfo[kiThreadIndex].iMaxSliceNum = iMaxSliceNumNew;
13111320
13121321 return ENC_RETURN_SUCCESS;
13131322 }
@@ -1367,7 +1376,7 @@ int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { · 53 unmodified lines
13671376 const int32_t kiCurDid = pCtx->uiDependencyId;
13681377 SSlice* pLastCodedSlice = pCurLayer->sSliceThreadInfo[0].pSliceInThread + (iMaxSliceNumOld - 1);
13691378 SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiCurDid].sSliceArgument;
1370− iRet = CalculateNewSliceNum (pCurLayer,
1379+ iRet = CalculateNewSliceNum (pCtx,
13711380 pLastCodedSlice,
13721381 iMaxSliceNumOld,
13731382 iMaxSliceNumNew);
@@ -1705,8 +1714,7 @@ bool DynSlcJudgeSliceBoundaryStepBack (void* pCtx, void* pSlice, SSliceCtx* pSli · 331 unmodified lines
17051714 const int32_t kiActiveThreadsNum = pEncCtx->iActiveThreadsNum;
17061715 const int32_t kiPartitaionId = pCurSlice->iSliceIdx % kiActiveThreadsNum;
17071716 const int32_t kiEndMbIdxOfPartition = pEncCtx->pCurDqLayer->EndMbIdxOfPartition[kiPartitaionId];
1708− const int32_t kiMaxSliceNum = pEncCtx->pCurDqLayer->sSliceThreadInfo[pCurSlice->uiThreadIdx].iMaxSliceNum;
1709− const bool kbCurMbNotFirstMbOfCurSlice = ((iCurMbIdx > 0) && (pSliceCtx->pOverallMbMap[iCurMbIdx] ==
1717+ const bool kbCurMbNotFirstMbOfCurSlice = ((iCurMbIdx > 0) && (pSliceCtx->pOverallMbMap[iCurMbIdx] ==
17101718 pSliceCtx->pOverallMbMap[iCurMbIdx - 1]));
17111719 const bool kbCurMbNotLastMbOfCurPartition = iCurMbIdx < kiEndMbIdxOfPartition;
17121720

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t