ref: c2e37d59bb9bc720b9fe1108fafd8cb673904643
parent: c917d318aaffaf991b9abdc49dad987b2d3e8086
author: huade <[email protected]>
date: Wed Dec 21 11:33:58 EST 2016
Multi-thread-fixed:RBC#1720:iMaxSliceNumConstraint replaced by iMaxSliceNum
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2478,6 +2478,7 @@
void WelsInitCurrentDlayerMltslc (sWelsEncCtx* pCtx, int32_t iPartitionNum) {
SDqLayer* pCurDq = pCtx->pCurDqLayer;
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
+ uint32_t uiMiniPacketSize = 0;
UpdateSlicepEncCtxWithPartition (pCurDq, iPartitionNum);
@@ -2508,12 +2509,9 @@
}
//MINPACKETSIZE_CONSTRAINT
- if (pSliceCtx->uiSliceSizeConstraint
- <
- (uint32_t) (uiFrmByte//suppose 16 byte per mb at average
- / (pSliceCtx->iMaxSliceNumConstraint))
- ) {
-
+ //suppose 16 byte per mb at average
+ uiMiniPacketSize = (uint32_t) (uiFrmByte / pSliceCtx->iMaxSliceNumConstraint);
+ if (pSliceCtx->uiSliceSizeConstraint < uiMiniPacketSize ) {
WelsLog (& (pCtx->sLogCtx),
WELS_LOG_WARNING,
"Set-SliceConstraint(%d) too small for current resolution (MB# %d) under QP/BR!",
@@ -4445,7 +4443,7 @@
SDqLayer* pCurLayer = pCtx->pCurDqLayer;
int32_t iCountNals = pCtx->pOut->iCountNals;
- int32_t iMaxSliceNumOld = pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint;
+ int32_t iMaxSliceNumOld = pCurLayer->iMaxSliceNum;
int32_t iMaxSliceNum = iMaxSliceNumOld;
iCountNals += iMaxSliceNum * (pCtx->pSvcParam->iSpatialLayerNum + pCtx->bNeedPrefixNalFlag);
iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;
@@ -4512,7 +4510,6 @@
) {
SDqLayer* pCurLayer = pCtx->pCurDqLayer;
- SSliceCtx* pSliceCtx = &pCurLayer->sSliceEncCtx;
SSlice* pStartSlice = pCurLayer->ppSliceInLayer[iStartSliceIdx];
int32_t iNalIdxInLayer = *pNalIdxInLayer;
int32_t iSliceIdx = iStartSliceIdx;
@@ -4538,7 +4535,7 @@
int32_t iPayloadSize = 0;
SSlice* pCurSlice = NULL;
- if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
+ if (iSliceIdx >= (pCurLayer->iMaxSliceNum - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
if (pCtx->iActiveThreadsNum == 1) {
//only single thread support re-alloc now
if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) {
@@ -4546,10 +4543,10 @@
"CWelsH264SVCEncoder::WelsCodeOnePicPartition: DynSliceRealloc not successful");
return ENC_RETURN_MEMALLOCERR;
}
- } else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
+ } else if (iSliceIdx >= pCurLayer->iMaxSliceNum) {
WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR,
- "CWelsH264SVCEncoder::WelsCodeOnePicPartition: iSliceIdx(%d) over iMaxSliceNumConstraint(%d)", iSliceIdx,
- pSliceCtx->iMaxSliceNumConstraint);
+ "CWelsH264SVCEncoder::WelsCodeOnePicPartition: iSliceIdx(%d) over iMaxSliceNum(%d)", iSliceIdx,
+ pCurLayer->iMaxSliceNum);
return ENC_RETURN_MEMALLOCERR;
}
}
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -688,7 +688,6 @@
WelsEventSignal (
&pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent);
} else { // for SM_SIZELIMITED_SLICE parallelization
- SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
const int32_t kiPartitionId = iThreadIdx;
const int32_t kiSliceIdxStep = pEncPEncCtx->iActiveThreadsNum;
const int32_t kiFirstMbInPartition = pCurDq->pFirstMbIdxOfPartition[kiPartitionId];
@@ -702,14 +701,14 @@
pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId] = 0;
while (iAnyMbLeftInPartition > 0) {
- if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
+ if (iSliceIdx >= pCurDq->iMaxSliceNum) {
// TODO: need exception handler for not large enough of MAX_SLICES_NUM related memory usage
// No idea about its solution due MAX_SLICES_NUM is fixed lenght in relevent pData structure
uiThrdRet = 1;
WelsLog (&pEncPEncCtx->sLogCtx, WELS_LOG_WARNING,
- "[MT] CodingSliceThreadProc Too many slices: coding_idx %d, iSliceIdx %d, pSliceCtx->iMaxSliceNumConstraint %d",
+ "[MT] CodingSliceThreadProc Too many slices: coding_idx %d, iSliceIdx %d, pCurDq->iMaxSliceNum %d",
pParamInternal->iCodingIndex,
- iSliceIdx, pSliceCtx->iMaxSliceNumConstraint);
+ iSliceIdx, pCurDq->iMaxSliceNum);
WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
iEventIdx);
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -455,8 +455,8 @@
pSliceSeg->iMbHeight = 0;
pSliceSeg->iSliceNumInFrame = 0;
pSliceSeg->iMbNumInFrame = 0;
- pSliceSeg->uiSliceSizeConstraint = 0;
- pSliceSeg->iMaxSliceNumConstraint = 0;
+ pSliceSeg->uiSliceSizeConstraint = 0;
+ pSliceSeg->iMaxSliceNumConstraint = 0;
}
}
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -1285,7 +1285,7 @@
CMemoryAlign* pMA = pCtx->pMemAlign;
SDqLayer* pCurLayer = pCtx->pCurDqLayer;
SSlice** ppSlice = NULL;
- int32_t iMaxSliceNumOld = pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint;
+ int32_t iMaxSliceNumOld = pCurLayer->iMaxSliceNum;
int32_t iMaxSliceNumNew = 0;
int32_t iRet = 0;
int32_t iSliceIdx = 0;
@@ -1352,7 +1352,6 @@
pCtx->iMaxSliceCount = iMaxSliceNumNew;
}
- pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint = iMaxSliceNumNew;
pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[0] = iMaxSliceNumNew;
pCurLayer->iMaxSliceNum = iMaxSliceNumNew;
return ENC_RETURN_SUCCESS;
@@ -1431,7 +1430,7 @@
}
//reallocate ppSliceInLayer if total encoded slice num exceed max slice num
- if (iCodedSliceNum > pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint) {
+ if (iCodedSliceNum > pCurLayer->iMaxSliceNum) {
ppSlice = (SSlice**)pMA->WelsMallocz (sizeof (SSlice*) * iCodedSliceNum, "ppSlice");
if (NULL == ppSlice) {
WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ppSlice is NULL");
@@ -1440,7 +1439,7 @@
pMA->WelsFree (pCurLayer->ppSliceInLayer, "ppSliceInLayer");
pCurLayer->ppSliceInLayer = ppSlice;
- pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint = iCodedSliceNum;
+ pCurLayer->iMaxSliceNum = iCodedSliceNum;
}
//update ppSliceInLayer based on pSliceInThread, reordering based on slice index
@@ -1535,7 +1534,6 @@
#if _DEBUG
assert (NULL != pNextSlice);
- // now ( pSliceCtx->iSliceNumInFrame < pSliceCtx->iMaxSliceNumConstraint ) always true by the call of this pFunc
#endif
//init next pSlice info
@@ -1587,12 +1585,15 @@
WelsMutexLock (&pEncCtx->pSliceThreading->mutexSliceNumUpdate);
//lock the acessing to this variable: pSliceCtx->iSliceNumInFrame
}
- const bool kbSliceNumNotExceedConstraint = pSliceCtx->iSliceNumInFrame <
- pSliceCtx->iMaxSliceNumConstraint; /*tmp choice to avoid complex memory operation, 100520, to be modify*/
- const bool kbSliceIdxNotExceedConstraint = ((int) pCurSlice->uiSliceIdx + kiActiveThreadsNum) <
- pSliceCtx->iMaxSliceNumConstraint;
- const bool kbSliceNumReachConstraint = (pSliceCtx->iSliceNumInFrame ==
- pSliceCtx->iMaxSliceNumConstraint);
+ //tmp choice to avoid complex memory operation, 100520, to be modify
+ //TODO: pSliceCtx->iSliceNumInFrame should match max slice num limitation in given profile based on standard
+ // current change is tmp solution which equal to origin design,
+ // as iMaxSliceNum is always equal to iMaxSliceNumConstraint in origin design
+ // and will also extend when reallocated,
+ // tmp change is: iMaxSliceNumConstraint is alway set to be MAXSLICENUM, will not change even reallocate
+ const bool kbSliceNumNotExceedConstraint = pSliceCtx->iSliceNumInFrame < pEncCtx->pCurDqLayer->iMaxSliceNum;
+ const bool kbSliceIdxNotExceedConstraint = ((int) pCurSlice->uiSliceIdx + kiActiveThreadsNum) < pEncCtx->pCurDqLayer->iMaxSliceNum;
+ const bool kbSliceNumReachConstraint = (pSliceCtx->iSliceNumInFrame == pEncCtx->pCurDqLayer->iMaxSliceNum);
//DYNAMIC_SLICING_ONE_THREAD: judge jump_avoiding_pack_exceed
if (kbSliceNumNotExceedConstraint && kbSliceIdxNotExceedConstraint) {//able to add new pSlice
--- a/codec/encoder/core/src/wels_task_encoder.cpp
+++ b/codec/encoder/core/src/wels_task_encoder.cpp
@@ -232,15 +232,11 @@
//CWelsConstrainedSizeSlicingEncodingTask
WelsErrorType CWelsConstrainedSizeSlicingEncodingTask::ExecuteTask() {
- SDqLayer* pCurDq = m_pCtx->pCurDqLayer;
-
+ SDqLayer* pCurDq = m_pCtx->pCurDqLayer;
SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
const int32_t kiSliceIdxStep = m_pCtx->iActiveThreadsNum;
-
- SSpatialLayerInternal* pParamInternal = &m_pCtx->pSvcParam->sDependencyLayers[m_pCtx->uiDependencyId];
+ SSpatialLayerInternal* pParamInternal = &m_pCtx->pSvcParam->sDependencyLayers[m_pCtx->uiDependencyId];
SSliceHeaderExt* pStartSliceHeaderExt = &pCurDq->ppSliceInLayer[m_iSliceIdx]->sSliceHeaderExt;
-
- //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
const int32_t kiPartitionId = m_iSliceIdx % kiSliceIdxStep;
const int32_t kiFirstMbInPartition = pCurDq->pFirstMbIdxOfPartition[kiPartitionId];
const int32_t kiEndMbIdxInPartition = pCurDq->pEndMbIdxOfPartition[kiPartitionId];
@@ -247,11 +243,13 @@
pStartSliceHeaderExt->sSliceHeader.iFirstMbInSlice = kiFirstMbInPartition;
pCurDq->pNumSliceCodedOfPartition[kiPartitionId] = 1;
pCurDq->pLastCodedMbIdxOfPartition[kiPartitionId] = 0;
- //end of deal with partition
+ //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
+
int32_t iAnyMbLeftInPartition = kiEndMbIdxInPartition - kiFirstMbInPartition + 1;
int32_t iLocalSliceIdx = m_iSliceIdx;
while (iAnyMbLeftInPartition > 0) {
+ //TODO: will reallocate
if (iLocalSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
WelsLog (&m_pCtx->sLogCtx, WELS_LOG_WARNING,
"[MT] CWelsConstrainedSizeSlicingEncodingTask ExecuteTask() coding_idx %d, uiLocalSliceIdx %d, pSliceCtx->iMaxSliceNumConstraint %d",