Showing the changes to codec/encoder/core/src/slice_multi_threading.cpp (1 of 12 files). Show all
Unified · Split
| @@ -120,9 +120,9 @@ void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx, · 119 unmodified lines | |||
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSliceConsume) { | 122 | void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSliceConsume) { |
| 123 | float* pRatioList = (float*)pRatio; | 123 | int32_t* pRatioList = (int32_t*)pRatio; |
| 124 | float fAvI[MAX_SLICES_NUM]; | 124 | int32_t iAvI[MAX_SLICES_NUM]; |
| 125 | float fSumAv = .0f; | 125 | int32_t iSumAv = 0; |
| 126 | uint32_t* pSliceTime = (uint32_t*)pSliceConsume; | 126 | uint32_t* pSliceTime = (uint32_t*)pSliceConsume; |
| 127 | int32_t* pCountMbInSlice = (int32_t*)pSliceCtx->pCountMbNumInSlice; | 127 | int32_t* pCountMbInSlice = (int32_t*)pSliceCtx->pCountMbNumInSlice; |
| 128 | const int32_t kiSliceCount = pSliceCtx->iSliceNumInFrame; | 128 | const int32_t kiSliceCount = pSliceCtx->iSliceNumInFrame; |
| @@ -131,16 +131,16 @@ void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSlice · 2 unmodified lines | |||
| 131 | WelsEmms(); | 131 | WelsEmms(); |
| 132 | 132 | ||
| 133 | while (iSliceIdx < kiSliceCount) { | 133 | while (iSliceIdx < kiSliceCount) { |
| 134 | fAvI[iSliceIdx] = 1.0f * pCountMbInSlice[iSliceIdx] / pSliceTime[iSliceIdx]; | 134 | iAvI[iSliceIdx] = WELS_DIV_ROUND(INT_MULTIPLY * pCountMbInSlice[iSliceIdx], pSliceTime[iSliceIdx]); |
| 135 | MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), pSliceConsumeTime[%d]= %d us, slice_run= %d\n", | 135 | MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), pSliceConsumeTime[%d]= %d us, slice_run= %d\n", |
| 136 | iSliceIdx, | 136 | iSliceIdx, |
| 137 | pSliceTime[iSliceIdx], pCountMbInSlice[iSliceIdx]); | 137 | pSliceTime[iSliceIdx], pCountMbInSlice[iSliceIdx]); |
| 138 | fSumAv += fAvI[iSliceIdx]; | 138 | iSumAv += iAvI[iSliceIdx]; |
| 139 | 139 | ||
| 140 | ++ iSliceIdx; | 140 | ++ iSliceIdx; |
| 141 | } | 141 | } |
| 142 | while (-- iSliceIdx >= 0) { | 142 | while (-- iSliceIdx >= 0) { |
| 143 | pRatioList[iSliceIdx] = fAvI[iSliceIdx] / fSumAv; | 143 | pRatioList[iSliceIdx] = WELS_DIV_ROUND(INT_MULTIPLY * iAvI[iSliceIdx], iSumAv); |
| 144 | } | 144 | } |
| 145 | } | 145 | } |
| 146 | 146 | ||
| @@ -200,7 +200,7 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 53 unmodified lines | |||
| 200 | const int32_t kiCountNumMb = pSliceCtx->iMbNumInFrame; | 200 | const int32_t kiCountNumMb = pSliceCtx->iMbNumInFrame; |
| 201 | int32_t iMinimalMbNum = pSliceCtx->iMbWidth; // in theory we need only 1 SMB, here let it as one SMB row required | 201 | int32_t iMinimalMbNum = pSliceCtx->iMbWidth; // in theory we need only 1 SMB, here let it as one SMB row required |
| 202 | int32_t iMaximalMbNum = 0; // dynamically assign later | 202 | int32_t iMaximalMbNum = 0; // dynamically assign later |
| 203 | float* pSliceComplexRatio = (float*)pComplexRatio; | 203 | int32_t* pSliceComplexRatio = (int32_t*)pComplexRatio; |
| 204 | int32_t iMbNumLeft = kiCountNumMb; | 204 | int32_t iMbNumLeft = kiCountNumMb; |
| 205 | int32_t iRunLen[MAX_THREADS_NUM] = {0}; | 205 | int32_t iRunLen[MAX_THREADS_NUM] = {0}; |
| 206 | int32_t iSliceIdx = 0; | 206 | int32_t iSliceIdx = 0; |
| @@ -236,11 +236,11 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 29 unmodified lines | |||
| 236 | 236 | ||
| 237 | iSliceIdx = 0; | 237 | iSliceIdx = 0; |
| 238 | while (iSliceIdx + 1 < kiCountSliceNum) { | 238 | while (iSliceIdx + 1 < kiCountSliceNum) { |
| 239 | int32_t iNumMbAssigning = WELS_ROUND (kiCountNumMb * pSliceComplexRatio[iSliceIdx]); | 239 | int32_t iNumMbAssigning = WELS_DIV_ROUND(kiCountNumMb * pSliceComplexRatio[iSliceIdx], INT_MULTIPLY); |
| 240 | 240 | ||
| 241 | // GOM boundary aligned | 241 | // GOM boundary aligned |
| 242 | if (pCtx->pSvcParam->iRCMode != RC_OFF_MODE) { | 242 | if (pCtx->pSvcParam->iRCMode != RC_OFF_MODE) { |
| 243 | iNumMbAssigning = WELS_ROUND (1.0f * iNumMbAssigning / iNumMbInEachGom) * iNumMbInEachGom; | 243 | iNumMbAssigning = iNumMbAssigning / iNumMbInEachGom * iNumMbInEachGom; |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | // make sure one GOM at least in each pSlice for safe | 246 | // make sure one GOM at least in each pSlice for safe |
| @@ -259,14 +259,14 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 12 unmodified lines | |||
| 259 | iRunLen[iSliceIdx] = iNumMbAssigning; | 259 | iRunLen[iSliceIdx] = iNumMbAssigning; |
| 260 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, | 260 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, |
| 261 | "[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n", | 261 | "[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n", |
| 262 | iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iNumMbAssigning); | 262 | iSliceIdx, pSliceComplexRatio[iSliceIdx]* 1.0f / INT_MULTIPLY, pSliceCtx->pCountMbNumInSlice[iSliceIdx], iNumMbAssigning); |
| 263 | ++ iSliceIdx; | 263 | ++ iSliceIdx; |
| 264 | iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts | 264 | iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts |
| 265 | } | 265 | } |
| 266 | iRunLen[iSliceIdx] = iMbNumLeft; | 266 | iRunLen[iSliceIdx] = iMbNumLeft; |
| 267 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, | 267 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, |
| 268 | "[MT] DynamicAdjustSlicing(), iSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n", | 268 | "[MT] DynamicAdjustSlicing(), iSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d\n", |
| 269 | iSliceIdx, pSliceComplexRatio[iSliceIdx], pSliceCtx->pCountMbNumInSlice[iSliceIdx], iMbNumLeft); | 269 | iSliceIdx, pSliceComplexRatio[iSliceIdx]* 1.0f / INT_MULTIPLY, pSliceCtx->pCountMbNumInSlice[iSliceIdx], iMbNumLeft); |
| 270 | 270 | ||
| 271 | 271 | ||
| 272 | if (DynamicAdjustSlicePEncCtxAll (pSliceCtx, iRunLen) == 0) { | 272 | if (DynamicAdjustSlicePEncCtxAll (pSliceCtx, iRunLen) == 0) { |
| @@ -329,7 +329,7 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 56 unmodified lines | |||
| 329 | && pPara->iMultipleThreadIdc >= kiSliceNum) { | 329 | && pPara->iMultipleThreadIdc >= kiSliceNum) { |
| 330 | pSmt->pSliceConsumeTime[iIdx] = (uint32_t*)pMa->WelsMallocz (kiSliceNum * sizeof (uint32_t), "pSliceConsumeTime[]"); | 330 | pSmt->pSliceConsumeTime[iIdx] = (uint32_t*)pMa->WelsMallocz (kiSliceNum * sizeof (uint32_t), "pSliceConsumeTime[]"); |
| 331 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pSliceConsumeTime[iIdx]), FreeMemorySvc (ppCtx)) | 331 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pSliceConsumeTime[iIdx]), FreeMemorySvc (ppCtx)) |
| 332 | pSmt->pSliceComplexRatio[iIdx] = (float*)pMa->WelsMalloc (kiSliceNum * sizeof (float), "pSliceComplexRatio[]"); | 332 | pSmt->pSliceComplexRatio[iIdx] = (int32_t*)pMa->WelsMalloc (kiSliceNum * sizeof (int32_t), "pSliceComplexRatio[]"); |
| 333 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pSliceComplexRatio[iIdx]), FreeMemorySvc (ppCtx)) | 333 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pSliceComplexRatio[iIdx]), FreeMemorySvc (ppCtx)) |
| 334 | } else { | 334 | } else { |
| 335 | pSmt->pSliceConsumeTime[iIdx] = NULL; | 335 | pSmt->pSliceConsumeTime[iIdx] = NULL; |