ref: cfae723e96f53282876b60d27fc4b4d41f14c31a
parent: c2e37d59bb9bc720b9fe1108fafd8cb673904643
author: huade <huashi@cisco.com>
date: Wed Dec 21 09:16:43 EST 2016
Multi-thread-fixed:RBC#1711:refactoring for RcInitSliceInformation
--- a/codec/encoder/core/inc/rc.h
+++ b/codec/encoder/core/inc/rc.h
@@ -168,6 +168,7 @@
// bits allocation and status
int32_t iRemainingBits;
+int32_t iBitsPerMb;
int32_t iTargetBits;
int32_t iCurrentBitsLevel;//0:normal; 1:limited; 2:exceeded.
@@ -261,6 +262,7 @@
PWelsRCPostFrameSkippingFunc pfWelsRcPostFrameSkipping;
} SWelsRcFunc;
+void RCInitOneSliceInformation(sWelsEncCtx* pEncCtx, SSlice* pSlice);
void CheckFrameSkipBasedMaxbr (sWelsEncCtx* pCtx,const long long uiTimeStamp, int32_t iDidIdx);
void UpdateBufferWhenFrameSkipped(sWelsEncCtx* pCtx, int32_t iSpatialNum);
void UpdateMaxBrCheckWindowStatus(sWelsEncCtx* pCtx, int32_t iSpatialNum, const long long uiTimeStamp);
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -512,25 +512,37 @@
pEncCtx->iGlobalQp = iLumaQp;
}
-void RcInitSliceInformation (sWelsEncCtx* pEncCtx) {
- SSlice** ppSliceInLayer = pEncCtx->pCurDqLayer->ppSliceInLayer;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &ppSliceInLayer[0]->sSlicingOverRc;
- const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
- const int32_t kiBitsPerMb = WELS_DIV_ROUND (static_cast<int64_t> (pWelsSvcRc->iTargetBits) * INT_MULTIPLY,
- pWelsSvcRc->iNumberMbFrame);
+void RCInitOneSliceInformation(sWelsEncCtx* pEncCtx, SSlice* pSlice) {
- for (int32_t i = 0; i < kiSliceNum; i++) {
- pSOverRc = &ppSliceInLayer[i]->sSlicingOverRc;
- pSOverRc->iStartMbSlice =
- pSOverRc->iEndMbSlice = ppSliceInLayer[i]->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
- pSOverRc->iEndMbSlice += (ppSliceInLayer[i]->iCountMbNumInSlice - 1);
- pSOverRc->iTotalQpSlice = 0;
- pSOverRc->iTotalMbSlice = 0;
- pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (static_cast<int64_t> (kiBitsPerMb) * ppSliceInLayer[i]->iCountMbNumInSlice,
- INT_MULTIPLY);
- pSOverRc->iFrameBitsSlice = 0;
- pSOverRc->iGomBitsSlice = 0;
+ bool bGomRC = (RC_OFF_MODE == pEncCtx->pSvcParam->iRCMode ||
+ RC_BUFFERBASED_MODE == pEncCtx->pSvcParam->iRCMode ||
+ (RC_TIMESTAMP_MODE == pEncCtx->pSvcParam->iRCMode &&
+ pEncCtx->pSvcParam->iUsageType == SCREEN_CONTENT_REAL_TIME) ) ? false : true;
+ if(bGomRC) {
+ SRCSlicing* pSOverRc = &pSlice->sSlicingOverRc;
+ const int32_t kiBitsPerMb = pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId].iBitsPerMb;
+ pSOverRc->iStartMbSlice = pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice;
+ pSOverRc->iEndMbSlice = pSOverRc->iStartMbSlice + pSlice->iCountMbNumInSlice - 1;
+ pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (static_cast<int64_t> (kiBitsPerMb) * pSlice->iCountMbNumInSlice,
+ INT_MULTIPLY);
+ }
+}
+
+void RcInitSliceInformation (sWelsEncCtx* pEncCtx) {
+ SSlice** ppSliceInLayer = pEncCtx->pCurDqLayer->ppSliceInLayer;
+ SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+ const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
+ pWelsSvcRc->iBitsPerMb = WELS_DIV_ROUND (static_cast<int64_t> (pWelsSvcRc->iTargetBits) * INT_MULTIPLY,
+ pWelsSvcRc->iNumberMbFrame);
+ for (int32_t i = 0; i < kiSliceNum; i++) {
+ SRCSlicing* pSOverRc = &ppSliceInLayer[i]->sSlicingOverRc;
+ pSOverRc->iTotalQpSlice = 0;
+ pSOverRc->iTotalMbSlice = 0;
+ pSOverRc->iFrameBitsSlice = 0;
+ pSOverRc->iGomBitsSlice = 0;
+ pSOverRc->iStartMbSlice = 0;
+ pSOverRc->iEndMbSlice = 0;
+ pSOverRc->iTargetBitsSlice = 0;
}
}
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -1477,6 +1477,9 @@
WelsSliceHeaderExtInit (pEncCtx, pCurLayer, pCurSlice);
+ //init slice RC information
+ RCInitOneSliceInformation(pEncCtx, pCurSlice);
+
g_pWelsWriteSliceHeader[pCurSlice->bSliceHeaderExtFlag] (pEncCtx, pBs, pCurLayer, pCurSlice,
pEncCtx->pFuncList->pParametersetStrategy);