History

Multi-thread-fixed:RBC#1751:Dynamic slice mode under multiThread reallocate feature enable

huade committed 9 years ago

Commit 095f0b61 parent 623599014 files · +325 −336Browse files

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

Unified · Split

codec/encoder/core/src/wels_task_encoder.cpp+38−35
@@ -112,13 +112,12 @@ WelsErrorType CWelsSliceEncodingTask::InitTask() { · 111 unmodified lines
112112 return ENC_RETURN_UNEXPECTED;
113113 }
114114
115− //m_pCtx->iEncoderError = InitOneSliceInThread (m_pCtx, m_pSlice, m_iThreadIdx, m_pCtx->uiDependencyId, m_iSliceIdx);
116− //WELS_VERIFY_RETURN_IFNEQ (m_pCtx->iEncoderError, ENC_RETURN_SUCCESS)
117− m_pSlice = &m_pCtx->pCurDqLayer->sSliceThreadInfo.pSliceInThread[0][m_iSliceIdx];
115+ int32_t iReturn = InitOneSliceInThread (m_pCtx, m_pSlice, m_iThreadIdx, m_pCtx->uiDependencyId, m_iSliceIdx);
116+ WELS_VERIFY_RETURN_IFNEQ (iReturn, ENC_RETURN_SUCCESS)
118117 m_pSliceBs = &m_pSlice->sSliceBs;
119118
120− m_pSliceBs->uiBsPos = 0;
121− m_pSliceBs->iNalIndex = 0;
119+ iReturn = SetSliceBoundaryInfo(m_pCtx->pCurDqLayer, m_pSlice, m_iSliceIdx);
120+ WELS_VERIFY_RETURN_IFNEQ (iReturn, ENC_RETURN_SUCCESS)
122121
123122 m_pCtx->iEncoderError = SetSliceBoundaryInfo(m_pCtx->pCurDqLayer, m_pSlice, m_iSliceIdx);
124123 WELS_VERIFY_RETURN_IFNEQ (m_pCtx->iEncoderError, ENC_RETURN_SUCCESS)
@@ -150,6 +149,7 @@ void CWelsSliceEncodingTask::FinishTask() { · 25 unmodified lines
150149 }
151150
152151 WelsErrorType CWelsSliceEncodingTask::ExecuteTask() {
152+
153153 #if MT_DEBUG_BS_WR
154154 m_pSliceBs->bSliceCodedFlag = false;
155155 #endif//MT_DEBUG_BS_WR
@@ -176,7 +176,6 @@ WelsErrorType CWelsSliceEncodingTask::ExecuteTask() { · 20 unmodified lines
176176
177177 m_iSliceSize = 0;
178178 iReturn = WriteSliceBs (m_pCtx, m_pSliceBs, m_iSliceIdx, m_iSliceSize);
179−
180179 if (ENC_RETURN_SUCCESS != iReturn) {
181180 WelsLog (&m_pCtx->sLogCtx, WELS_LOG_WARNING,
182181 "[MT] CWelsSliceEncodingTask ExecuteTask(), WriteSliceBs not successful: coding_idx %d, um_iSliceIdx %d",
@@ -185,7 +184,7 @@ WelsErrorType CWelsSliceEncodingTask::ExecuteTask() { · 2 unmodified lines
185184 return iReturn;
186185 }
187186
188− m_pCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (m_pCtx->pCurDqLayer, m_pCtx->pFuncList, m_iSliceIdx);
187+ m_pCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (m_pCtx->pCurDqLayer, m_pCtx->pFuncList, m_pSlice);
189188
190189 WelsLog (&m_pCtx->sLogCtx, WELS_LOG_DETAIL,
191190 "@pSlice=%-6d sliceType:%c idc:%d size:%-6d", m_iSliceIdx,
@@ -196,9 +195,7 @@ WelsErrorType CWelsSliceEncodingTask::ExecuteTask() { · 4 unmodified lines
196195 #if MT_DEBUG_BS_WR
197196 m_pSliceBs->bSliceCodedFlag = true;
198197 #endif//MT_DEBUG_BS_WR
199−
200− //m_pCtx->pCurDqLayer->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx] ++;
201−
198+ m_pCtx->pCurDqLayer->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx] ++;
202199 return ENC_RETURN_SUCCESS;
203200 }
204201
@@ -238,38 +235,42 @@ void CWelsLoadBalancingSlicingEncodingTask::FinishTask() { · 33 unmodified lines
238235 WelsErrorType CWelsConstrainedSizeSlicingEncodingTask::ExecuteTask() {
239236
240237 SDqLayer* pCurDq = m_pCtx->pCurDqLayer;
241− SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
242238 const int32_t kiSliceIdxStep = m_pCtx->iActiveThreadsNum;
243239 SSpatialLayerInternal* pParamInternal = &m_pCtx->pSvcParam->sDependencyLayers[m_pCtx->uiDependencyId];
244240 const int32_t kiPartitionId = m_iSliceIdx % kiSliceIdxStep;
245− const int32_t kiFirstMbInPartition = pCurDq->pFirstMbIdxOfPartition[kiPartitionId];
246− const int32_t kiEndMbIdxInPartition = pCurDq->pEndMbIdxOfPartition[kiPartitionId];
247− m_pSlice = &pCurDq->sSliceThreadInfo.pSliceInThread[0][m_iSliceIdx];
241+ const int32_t kiFirstMbInPartition = pCurDq->FirstMbIdxOfPartition[kiPartitionId];
242+ const int32_t kiEndMbIdxInPartition = pCurDq->EndMbIdxOfPartition[kiPartitionId];
243+ const int32_t kiCodedSliceNumByThread = pCurDq->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx];
244+ m_pSlice = &pCurDq->sSliceThreadInfo.pSliceInThread[m_iThreadIdx][kiCodedSliceNumByThread];
248245 m_pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = kiFirstMbInPartition;
249− pCurDq->pNumSliceCodedOfPartition[kiPartitionId] = 1;
250− pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId] = 0;
246+ int32_t iReturn = 0;
247+ bool bNeedReallocate = false;
251248
252249 //deal with partition: TODO: here SSliceThreadPrivateData is just for parition info and actually has little relationship with threadbuffer, and iThreadIndex is not used in threadpool model, need renaming after removing old logic to avoid confusion
250+ int32_t iDiffMbIdx = kiEndMbIdxInPartition - kiFirstMbInPartition;
251+ if( 0 == iDiffMbIdx) {
252+ m_pSlice->iSliceIdx = -1;
253+ return ENC_RETURN_SUCCESS;
254+ }
253255
254− int32_t iAnyMbLeftInPartition = kiEndMbIdxInPartition - kiFirstMbInPartition + 1;
256+ int32_t iAnyMbLeftInPartition = iDiffMbIdx + 1;
255257 int32_t iLocalSliceIdx = m_iSliceIdx;
256258 while (iAnyMbLeftInPartition > 0) {
257− //TODO: will reallocate
258− if (iLocalSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
259− WelsLog (&m_pCtx->sLogCtx, WELS_LOG_WARNING,
260− "[MT] CWelsConstrainedSizeSlicingEncodingTask ExecuteTask() coding_idx %d, uiLocalSliceIdx %d, pSliceCtx->iMaxSliceNumConstraint %d",
261− pParamInternal->iCodingIndex,
262− iLocalSliceIdx, pSliceCtx->iMaxSliceNumConstraint);
263− return ENC_RETURN_KNOWN_ISSUE;
264− }
259+ bNeedReallocate = (pCurDq->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx]
260+ >= pCurDq->sSliceThreadInfo.iMaxSliceNumInThread[m_iThreadIdx] -1) ? true : false;
261+ if (bNeedReallocate) {
262+ WelsMutexLock (&m_pCtx->pSliceThreading->mutexThreadSlcBuffReallocate);
263+ //for memory statistic variable
264+ iReturn = ReallocateSliceInThread(m_pCtx, pCurDq, m_pCtx->uiDependencyId, m_iThreadIdx);
265+ WelsMutexUnlock (&m_pCtx->pSliceThreading->mutexThreadSlcBuffReallocate);
266+ if (ENC_RETURN_SUCCESS != iReturn) {
267+ return iReturn;
268+ }
269+ }
265270
266− m_pSlice = &pCurDq->sSliceThreadInfo.pSliceInThread[0][iLocalSliceIdx];
271+ iReturn = InitOneSliceInThread (m_pCtx, m_pSlice, m_iThreadIdx, m_pCtx->uiDependencyId, iLocalSliceIdx);
272+ WELS_VERIFY_RETURN_IFNEQ (iReturn, ENC_RETURN_SUCCESS)
267273 m_pSliceBs = &m_pSlice->sSliceBs;
268−
269− m_pSliceBs->uiBsPos = 0;
270− m_pSliceBs->iNalIndex = 0;
271−
272− SetOneSliceBsBufferUnderMultithread (m_pCtx, m_iThreadIdx, m_pSlice);
273274 InitBits (&m_pSliceBs->sBsWrite, m_pSliceBs->pBsBuffer, m_pSliceBs->uiSize);
274275
275276 if (m_bNeedPrefix) {
@@ -302,7 +303,7 @@ WelsErrorType CWelsConstrainedSizeSlicingEncodingTask::ExecuteTask() { · 26 unmodified lines
302303 return iReturn;
303304 }
304305
305− m_pCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (pCurDq, m_pCtx->pFuncList, iLocalSliceIdx);
306+ m_pCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (pCurDq, m_pCtx->pFuncList, m_pSlice);
306307
307308 WelsLog (&m_pCtx->sLogCtx, WELS_LOG_DETAIL,
308309 "@pSlice=%-6d sliceType:%c idc:%d size:%-6d\n",
@@ -313,12 +314,14 @@ WelsErrorType CWelsConstrainedSizeSlicingEncodingTask::ExecuteTask() { · 4 unmodified lines
313314 );
314315
315316 WelsLog (&m_pCtx->sLogCtx, WELS_LOG_DEBUG,
316− "[MT] CWelsConstrainedSizeSlicingEncodingTask(), coding_idx %d, iPartitionId %d, m_iThreadIdx %d, iLocalSliceIdx %d, m_iSliceSize %d, ParamValidationExt(), invalid uiMaxNalSizeiEndMbInPartition %d, pCurDq->pLastCodedMbIdxOfPartition[%d] %d\n",
317+ "[MT] CWelsConstrainedSizeSlicingEncodingTask(), coding_idx %d, iPartitionId %d, m_iThreadIdx %d, iLocalSliceIdx %d, m_iSliceSize %d, ParamValidationExt(), invalid uiMaxNalSizeiEndMbInPartition %d, pCurDq->LastCodedMbIdxOfPartition[%d] %d\n",
317318 pParamInternal->iCodingIndex, kiPartitionId, m_iThreadIdx, iLocalSliceIdx, m_iSliceSize,
318− kiEndMbIdxInPartition, kiPartitionId, pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId]);
319+ kiEndMbIdxInPartition, kiPartitionId, pCurDq->LastCodedMbIdxOfPartition[kiPartitionId]);
319320
320− iAnyMbLeftInPartition = kiEndMbIdxInPartition - pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId];
321+ iAnyMbLeftInPartition = kiEndMbIdxInPartition - pCurDq->LastCodedMbIdxOfPartition[kiPartitionId];
321322 iLocalSliceIdx += kiSliceIdxStep;
323+ m_pCtx->pCurDqLayer->sSliceThreadInfo.iEncodedSliceNumInThread[m_iThreadIdx] ++;
324+
322325 }
323326
324327 return ENC_RETURN_SUCCESS;

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