History

Use Int instead of Double in Rate Control and Modify anchor SHA1 value

dongzha committed 12 years ago

Commit f6ce43f1 parent 08377f312 files · +187 −163Browse files

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

Unified · Split

codec/encoder/core/src/slice_multi_threading.cpp+12−12
@@ -120,9 +120,9 @@ void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx, · 119 unmodified lines
120}120}
121 121
122void CalcSliceComplexRatio (void* pRatio, SSliceCtx* pSliceCtx, uint32_t* pSliceConsume) {122void 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 required201 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 later202 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 aligned241 // 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 safe246 // 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 parts264 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;

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