Use Int instead of Double in Rate Control and Modify anchor SHA1 value
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 | 122 | void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSliceConsume) { |
| 123 | − float* pRatioList = (float*)pRatio; | |
| 124 | − float fAvI[MAX_SLICES_NUM]; | |
| 125 | − float fSumAv = .0f; | |
| 123 | + int32_t* pRatioList = (int32_t*)pRatio; | |
| 124 | + int32_t iAvI[MAX_SLICES_NUM]; | |
| 125 | + int32_t iSumAv = 0; | |
| 126 | 126 | uint32_t* pSliceTime = (uint32_t*)pSliceConsume; |
| 127 | 127 | int32_t* pCountMbInSlice = (int32_t*)pSliceCtx->pCountMbNumInSlice; |
| 128 | 128 | const int32_t kiSliceCount = pSliceCtx->iSliceNumInFrame; |
| @@ -131,16 +131,16 @@ void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSlice · 2 unmodified lines | ||
| 131 | 131 | WelsEmms(); |
| 132 | 132 | |
| 133 | 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 | 135 | MT_TRACE_LOG (NULL, WELS_LOG_DEBUG, "[MT] CalcSliceComplexRatio(), pSliceConsumeTime[%d]= %d us, slice_run= %d\n", |
| 136 | 136 | iSliceIdx, |
| 137 | 137 | pSliceTime[iSliceIdx], pCountMbInSlice[iSliceIdx]); |
| 138 | − fSumAv += fAvI[iSliceIdx]; | |
| 138 | + iSumAv += iAvI[iSliceIdx]; | |
| 139 | 139 | |
| 140 | 140 | ++ iSliceIdx; |
| 141 | 141 | } |
| 142 | 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 | 200 | const int32_t kiCountNumMb = pSliceCtx->iMbNumInFrame; |
| 201 | 201 | int32_t iMinimalMbNum = pSliceCtx->iMbWidth; // in theory we need only 1 SMB, here let it as one SMB row required |
| 202 | 202 | int32_t iMaximalMbNum = 0; // dynamically assign later |
| 203 | − float* pSliceComplexRatio = (float*)pComplexRatio; | |
| 203 | + int32_t* pSliceComplexRatio = (int32_t*)pComplexRatio; | |
| 204 | 204 | int32_t iMbNumLeft = kiCountNumMb; |
| 205 | 205 | int32_t iRunLen[MAX_THREADS_NUM] = {0}; |
| 206 | 206 | int32_t iSliceIdx = 0; |
| @@ -236,11 +236,11 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 29 unmodified lines | ||
| 236 | 236 | |
| 237 | 237 | iSliceIdx = 0; |
| 238 | 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 | 241 | // GOM boundary aligned |
| 242 | 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 | 246 | // make sure one GOM at least in each pSlice for safe |
| @@ -259,14 +259,14 @@ void DynamicAdjustSlicing (sWelsEncCtx* pCtx, · 12 unmodified lines | ||
| 259 | 259 | iRunLen[iSliceIdx] = iNumMbAssigning; |
| 260 | 260 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, |
| 261 | 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 | 263 | ++ iSliceIdx; |
| 264 | 264 | iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts |
| 265 | 265 | } |
| 266 | 266 | iRunLen[iSliceIdx] = iMbNumLeft; |
| 267 | 267 | MT_TRACE_LOG (pCtx, WELS_LOG_DEBUG, |
| 268 | 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 | 272 | if (DynamicAdjustSlicePEncCtxAll (pSliceCtx, iRunLen) == 0) { |
| @@ -329,7 +329,7 @@ int32_t RequestMtResource (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pCodingPara · 56 unmodified lines | ||
| 329 | 329 | && pPara->iMultipleThreadIdc >= kiSliceNum) { |
| 330 | 330 | pSmt->pSliceConsumeTime[iIdx] = (uint32_t*)pMa->WelsMallocz (kiSliceNum * sizeof (uint32_t), "pSliceConsumeTime[]"); |
| 331 | 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 | 333 | WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pSliceComplexRatio[iIdx]), FreeMemorySvc (ppCtx)) |
| 334 | 334 | } else { |
| 335 | 335 | pSmt->pSliceConsumeTime[iIdx] = NULL; |