ref: d1e25d748fd5f7d9c2c5dba93c0ba3d7d1cb73ad
parent: 9f30ffc0150ab69000b93bc8355a70b562bb65d1
author: Huade Shi (huashi) <[email protected]>
date: Tue Mar 28 10:58:48 EDT 2017
SliceBufferReallocate:RBC#1796:New flag for slice buffer/slice bs buffer
--- a/codec/encoder/core/inc/svc_enc_frame.h
+++ b/codec/encoder/core/inc/svc_enc_frame.h
@@ -112,6 +112,8 @@
SPicture* pDecPic; // reconstruction picture pointer for layer
SPicture* pRefOri[MAX_REF_PIC_COUNT];
+bool bThreadSlcBufferFlag;
+bool bSliceBsBufferFlag;
int32_t iMaxSliceNum;
int32_t NumSliceCodedOfPartition[MAX_THREADS_NUM]; // for dynamic slicing mode
int32_t LastCodedMbIdxOfPartition[MAX_THREADS_NUM]; // for dynamic slicing mode
--- a/codec/encoder/core/inc/svc_encode_slice.h
+++ b/codec/encoder/core/inc/svc_encode_slice.h
@@ -107,10 +107,11 @@
void InitSliceRefInfoWithBase (SSlice* pSlice, SSlice* pBaseSlice, const uint8_t kuiRefCount);
-int32_t InitSliceList (sWelsEncCtx* pCtx,
- SSlice*& pSliceList,
+int32_t InitSliceList (SSlice*& pSliceList,
+ SBitStringAux* pBsWrite,
const int32_t kiMaxSliceNum,
- const int32_t kiDlayerIndex,
+ const int32_t kiMaxSliceBufferSize,
+ const bool bIndependenceBsBuffer,
CMemoryAlign* pMa);
int32_t InitAllSlicesInThread (sWelsEncCtx* pCtx);
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -928,21 +928,16 @@
}
}
-int32_t InitSliceList (sWelsEncCtx* pCtx,
- SSlice*& pSliceList,
+int32_t InitSliceList (SSlice*& pSliceList,
+ SBitStringAux* pBsWrite,
const int32_t kiMaxSliceNum,
- const int32_t kiDlayerIndex,
+ const int32_t kiMaxSliceBufferSize,
+ const bool bIndependenceBsBuffer,
CMemoryAlign* pMa) {
- SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument;
- int32_t iMaxSliceBufferSize = (pCtx)->iSliceBufferSize[kiDlayerIndex];
int32_t iSliceIdx = 0;
int32_t iRet = 0;
- //SM_SINGLE_SLICE mode using single-thread bs writer pOut->sBsWrite
- //even though multi-thread is on for other layers
- bool bIndependenceBsBuffer = (pCtx->pSvcParam->iMultipleThreadIdc > 1 &&
- SM_SINGLE_SLICE != pSliceArgument->uiSliceMode) ? true : false;
- if (iMaxSliceBufferSize <= 0) {
+ if (kiMaxSliceBufferSize <= 0) {
return ENC_RETURN_UNEXPECTED;
}
@@ -958,9 +953,9 @@
pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = 0;
iRet = InitSliceBsBuffer (pSlice,
- &pCtx->pOut->sBsWrite,
+ pBsWrite,
bIndependenceBsBuffer,
- iMaxSliceBufferSize,
+ kiMaxSliceBufferSize,
pMa);
if (ENC_RETURN_SUCCESS != iRet) {
return iRet;
@@ -1043,10 +1038,11 @@
"CWelsH264SVCEncoder::InitSliceThreadInfo: pSliceThreadInfo->pSliceInThread[iIdx] is NULL");
return ENC_RETURN_MEMALLOCERR;
}
- iRet = InitSliceList (pCtx,
- pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread,
+ iRet = InitSliceList (pDqLayer->sSliceThreadInfo[iIdx].pSliceInThread,
+ &pCtx->pOut->sBsWrite,
iMaxSliceNum,
- kiDlayerIndex,
+ pCtx->iSliceBufferSize[kiDlayerIndex],
+ pDqLayer->bSliceBsBufferFlag,
pMa);
if (ENC_RETURN_SUCCESS != iRet) {
return iRet;
@@ -1071,6 +1067,15 @@
int32_t iThreadIdx = 0;
int32_t iStartIdx = 0;
int32_t iMaxSliceNum = pDqLayer->iMaxSliceNum;
+ SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument;
+
+ //SM_SINGLE_SLICE mode using single-thread bs writer pOut->sBsWrite
+ //even though multi-thread is on for other layers
+ pDqLayer->bSliceBsBufferFlag = (pCtx->pSvcParam->iMultipleThreadIdc > 1 &&
+ SM_SINGLE_SLICE != pSliceArgument->uiSliceMode) ? true : false;
+
+ pDqLayer->bThreadSlcBufferFlag = (pCtx->pSvcParam->iMultipleThreadIdc > 1 &&
+ SM_SIZELIMITED_SLICE == pSliceArgument->uiSliceMode) ? true : false;
iRet = InitSliceThreadInfo (pCtx,
pDqLayer,