Showing the changes to codec/encoder/core/src/svc_encode_slice.cpp (1 of 4 files). Show all
Unified · Split
| @@ -996,11 +996,14 @@ int32_t InitOneSliceInThread (sWelsEncCtx* pCtx, · 995 unmodified lines | ||
| 996 | 996 | const int32_t kiThreadIdx, |
| 997 | 997 | const int32_t kiDlayerIdx, |
| 998 | 998 | const int32_t kiSliceIdx) { |
| 999 | − const int32_t kiCodedNumInThread = pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iCodedSliceNum; | |
| 1000 | 999 | |
| 1001 | − assert(kiCodedNumInThread <= pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iMaxSliceNum -1 ); | |
| 1002 | − | |
| 1003 | − pSlice = &pCtx->pCurDqLayer->sSliceThreadInfo [kiThreadIdx].pSliceInThread[kiCodedNumInThread]; | |
| 1000 | + if (pCtx->pCurDqLayer->bThreadSlcBufferFlag) { | |
| 1001 | + const int32_t kiCodedNumInThread = pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iCodedSliceNum; | |
| 1002 | + assert(kiCodedNumInThread <= pCtx->pCurDqLayer->sSliceThreadInfo[kiThreadIdx].iMaxSliceNum -1 ); | |
| 1003 | + pSlice = &pCtx->pCurDqLayer->sSliceThreadInfo [kiThreadIdx].pSliceInThread[kiCodedNumInThread]; | |
| 1004 | + } else { | |
| 1005 | + pSlice = &pCtx->pCurDqLayer->sSliceThreadInfo [0].pSliceInThread[kiSliceIdx]; | |
| 1006 | + } | |
| 1004 | 1007 | pSlice->iSliceIdx = kiSliceIdx; |
| 1005 | 1008 | pSlice->uiThreadIdx = kiThreadIdx; |
| 1006 | 1009 | |
| @@ -1018,18 +1021,22 @@ int32_t InitSliceThreadInfo (sWelsEncCtx* pCtx, · 11 unmodified lines | ||
| 1018 | 1021 | CMemoryAlign* pMa) { |
| 1019 | 1022 | int32_t iThreadNum = pCtx->pSvcParam->iMultipleThreadIdc; |
| 1020 | 1023 | int32_t iMaxSliceNum = 0; |
| 1024 | + int32_t iSlcBufferNum = 0; | |
| 1021 | 1025 | int32_t iIdx = 0; |
| 1022 | 1026 | int32_t iRet = 0; |
| 1023 | − SliceModeEnum eSlicMode = pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument.uiSliceMode; | |
| 1024 | 1027 | |
| 1025 | 1028 | assert (iThreadNum > 0); |
| 1026 | − if( SM_SIZELIMITED_SLICE == eSlicMode && iThreadNum > 1) { | |
| 1027 | − iMaxSliceNum = pDqLayer->iMaxSliceNum / iThreadNum + 1; | |
| 1029 | + | |
| 1030 | + //for fixed slice num case, no need to reallocate, so one slice buffer for all thread | |
| 1031 | + if( pDqLayer->bThreadSlcBufferFlag) { | |
| 1032 | + iMaxSliceNum = pDqLayer->iMaxSliceNum / iThreadNum + 1; | |
| 1033 | + iSlcBufferNum = iThreadNum; | |
| 1028 | 1034 | } else { |
| 1029 | − iMaxSliceNum = pDqLayer->iMaxSliceNum; | |
| 1035 | + iMaxSliceNum = pDqLayer->iMaxSliceNum; | |
| 1036 | + iSlcBufferNum = 1; | |
| 1030 | 1037 | } |
| 1031 | 1038 | |
| 1032 | − while (iIdx < iThreadNum) { | |
| 1039 | + while (iIdx < iSlcBufferNum) { | |
| 1033 | 1040 | pDqLayer->sSliceThreadInfo[iIdx].iMaxSliceNum = iMaxSliceNum; |
| 1034 | 1041 | pDqLayer->sSliceThreadInfo[iIdx].iCodedSliceNum = 0; |
| 1035 | 1042 | pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread = (SSlice*)pMa->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "pSliceInThread"); |
| @@ -1055,6 +1062,7 @@ int32_t InitSliceThreadInfo (sWelsEncCtx* pCtx, · 19 unmodified lines | ||
| 1055 | 1062 | pDqLayer->sSliceThreadInfo[iIdx].iCodedSliceNum = 0; |
| 1056 | 1063 | pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread = NULL; |
| 1057 | 1064 | } |
| 1065 | + | |
| 1058 | 1066 | return ENC_RETURN_SUCCESS; |
| 1059 | 1067 | } |
| 1060 | 1068 | |
| @@ -1108,7 +1116,7 @@ int32_t InitSliceInLayer (sWelsEncCtx* pCtx, · 47 unmodified lines | ||
| 1108 | 1116 | return ENC_RETURN_MEMALLOCERR; |
| 1109 | 1117 | } |
| 1110 | 1118 | |
| 1111 | − iRet = InitSliceBoundaryInfo (pDqLayer, &pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument, iMaxSliceNum); | |
| 1119 | + iRet = InitSliceBoundaryInfo (pDqLayer, pSliceArgument, iMaxSliceNum); | |
| 1112 | 1120 | if (ENC_RETURN_SUCCESS != iRet) { |
| 1113 | 1121 | return iRet; |
| 1114 | 1122 | } |