ref: 97298de90a901747a1681f88bf7ac11bd45fd39a
parent: 452fb868c7e1467a7900dd7623ab8a1b3b6e6efc
author: Sijia Chen <sijchen@cisco.com>
date: Thu Oct 23 13:50:50 EDT 2014
reformat cpp files for next release
--- a/codec/common/src/utils.cpp
+++ b/codec/common/src/utils.cpp
@@ -68,7 +68,7 @@
WelsSnprintf (pTraceTag, MAX_LOG_SIZE, "[OpenH264] Detail:");
break;
}
- WelsStrcat(pTraceTag,MAX_LOG_SIZE,kpFmt);
+ WelsStrcat (pTraceTag, MAX_LOG_SIZE, kpFmt);
va_start (vl, kpFmt);
logCtx->pfLog (logCtx->pLogCtx, iLevel, pTraceTag, vl);
va_end (vl);
--- a/codec/decoder/core/src/decode_slice.cpp
+++ b/codec/decoder/core/src/decode_slice.cpp
@@ -1065,9 +1065,9 @@
#endif
#ifdef HAVE_NEON_AARCH64
- if (iCpu & WELS_CPU_NEON) {
- pFunc->pWelsSetNonZeroCountFunc = SetNonZeroCount_AArch64_neon;
- }
+ if (iCpu & WELS_CPU_NEON) {
+ pFunc->pWelsSetNonZeroCountFunc = SetNonZeroCount_AArch64_neon;
+ }
#endif
}
--- a/codec/encoder/core/src/encoder.cpp
+++ b/codec/encoder/core/src/encoder.cpp
@@ -365,11 +365,13 @@
* \brief Dump reconstruction for dependency layer
*/
-extern "C" void DumpDependencyRec (SPicture* pCurPicture, const char* kpFileName, const int8_t kiDid, bool bAppend, SDqLayer* pDqLayer) {
+extern "C" void DumpDependencyRec (SPicture* pCurPicture, const char* kpFileName, const int8_t kiDid, bool bAppend,
+ SDqLayer* pDqLayer) {
WelsFileHandle* pDumpRecFile = NULL;
int32_t iWrittenSize = 0;
const char* openMode = bAppend ? "ab" : "wb";
- SWelsSPS* pSpsTmp = (kiDid> BASE_DEPENDENCY_ID)? &(pDqLayer->sLayerInfo.pSubsetSpsP->pSps) : pDqLayer->sLayerInfo.pSpsP;
+ SWelsSPS* pSpsTmp = (kiDid > BASE_DEPENDENCY_ID) ? & (pDqLayer->sLayerInfo.pSubsetSpsP->pSps) :
+ pDqLayer->sLayerInfo.pSpsP;
bool bFrameCroppingFlag = pSpsTmp->bFrameCroppingFlag;
SCropOffset* pFrameCrop = &pSpsTmp->sFrameCrop;
@@ -390,12 +392,15 @@
int32_t i = 0;
int32_t j = 0;
const int32_t kiStrideY = pCurPicture->iLineSize[0];
- const int32_t kiLumaWidth = bFrameCroppingFlag?(pCurPicture->iWidthInPixel-(( pFrameCrop->iCropLeft + pFrameCrop->iCropRight ) << 1 )) : pCurPicture->iWidthInPixel;
- const int32_t kiLumaHeight = bFrameCroppingFlag?(pCurPicture->iHeightInPixel-(( pFrameCrop->iCropTop + pFrameCrop->iCropBottom ) << 1 )) : pCurPicture->iHeightInPixel;
+ const int32_t kiLumaWidth = bFrameCroppingFlag ? (pCurPicture->iWidthInPixel - ((pFrameCrop->iCropLeft +
+ pFrameCrop->iCropRight) << 1)) : pCurPicture->iWidthInPixel;
+ const int32_t kiLumaHeight = bFrameCroppingFlag ? (pCurPicture->iHeightInPixel - ((pFrameCrop->iCropTop +
+ pFrameCrop->iCropBottom) << 1)) : pCurPicture->iHeightInPixel;
const int32_t kiChromaWidth = kiLumaWidth >> 1;
const int32_t kiChromaHeight = kiLumaHeight >> 1;
uint8_t* pSrc = NULL;
- pSrc = bFrameCroppingFlag ? (pCurPicture->pData[0] + kiStrideY * ( pFrameCrop->iCropTop << 1 ) + ( pFrameCrop->iCropLeft << 1 )) : pCurPicture->pData[0];
+ pSrc = bFrameCroppingFlag ? (pCurPicture->pData[0] + kiStrideY * (pFrameCrop->iCropTop << 1) +
+ (pFrameCrop->iCropLeft << 1)) : pCurPicture->pData[0];
for (j = 0; j < kiLumaHeight; ++ j) {
iWrittenSize = WelsFwrite (pSrc + j * kiStrideY, 1, kiLumaWidth, pDumpRecFile);
assert (iWrittenSize == kiLumaWidth);
@@ -407,7 +412,8 @@
}
for (i = 1; i < I420_PLANES; ++ i) {
const int32_t kiStrideUV = pCurPicture->iLineSize[i];
- pSrc = bFrameCroppingFlag ? (pCurPicture->pData[i] + kiStrideUV * pFrameCrop->iCropTop + pFrameCrop->iCropLeft) : pCurPicture->pData[i];
+ pSrc = bFrameCroppingFlag ? (pCurPicture->pData[i] + kiStrideUV * pFrameCrop->iCropTop + pFrameCrop->iCropLeft) :
+ pCurPicture->pData[i];
for (j = 0; j < kiChromaHeight; ++ j) {
iWrittenSize = WelsFwrite (pSrc + j * kiStrideUV, 1, kiChromaWidth, pDumpRecFile);
assert (iWrittenSize == kiChromaWidth);
@@ -427,9 +433,11 @@
* \brief Dump the reconstruction pictures
*/
-void DumpRecFrame (SPicture* pCurPicture, const char* kpFileName, const int8_t kiDid, bool bAppend, SDqLayer* pDqLayer) {
+void DumpRecFrame (SPicture* pCurPicture, const char* kpFileName, const int8_t kiDid, bool bAppend,
+ SDqLayer* pDqLayer) {
WelsFileHandle* pDumpRecFile = NULL;
- SWelsSPS* pSpsTmp = (kiDid> BASE_DEPENDENCY_ID)? &(pDqLayer->sLayerInfo.pSubsetSpsP->pSps) : pDqLayer->sLayerInfo.pSpsP;
+ SWelsSPS* pSpsTmp = (kiDid > BASE_DEPENDENCY_ID) ? & (pDqLayer->sLayerInfo.pSubsetSpsP->pSps) :
+ pDqLayer->sLayerInfo.pSpsP;
bool bFrameCroppingFlag = pSpsTmp->bFrameCroppingFlag;
SCropOffset* pFrameCrop = &pSpsTmp->sFrameCrop;
@@ -451,12 +459,15 @@
int32_t i = 0;
int32_t j = 0;
const int32_t kiStrideY = pCurPicture->iLineSize[0];
- const int32_t kiLumaWidth = bFrameCroppingFlag ? (pCurPicture->iWidthInPixel-(( pFrameCrop->iCropLeft + pFrameCrop->iCropRight ) << 1 )) : pCurPicture->iWidthInPixel;
- const int32_t kiLumaHeight = bFrameCroppingFlag ? (pCurPicture->iHeightInPixel-(( pFrameCrop->iCropTop + pFrameCrop->iCropBottom ) << 1 )) : pCurPicture->iHeightInPixel;
+ const int32_t kiLumaWidth = bFrameCroppingFlag ? (pCurPicture->iWidthInPixel - ((pFrameCrop->iCropLeft +
+ pFrameCrop->iCropRight) << 1)) : pCurPicture->iWidthInPixel;
+ const int32_t kiLumaHeight = bFrameCroppingFlag ? (pCurPicture->iHeightInPixel - ((pFrameCrop->iCropTop +
+ pFrameCrop->iCropBottom) << 1)) : pCurPicture->iHeightInPixel;
const int32_t kiChromaWidth = kiLumaWidth >> 1;
const int32_t kiChromaHeight = kiLumaHeight >> 1;
uint8_t* pSrc = NULL;
- pSrc = bFrameCroppingFlag ? (pCurPicture->pData[0] + kiStrideY * ( pFrameCrop->iCropTop << 1 ) + ( pFrameCrop->iCropLeft << 1 )) : pCurPicture->pData[0];
+ pSrc = bFrameCroppingFlag ? (pCurPicture->pData[0] + kiStrideY * (pFrameCrop->iCropTop << 1) +
+ (pFrameCrop->iCropLeft << 1)) : pCurPicture->pData[0];
for (j = 0; j < kiLumaHeight; ++ j) {
iWrittenSize = WelsFwrite (pSrc + j * kiStrideY, 1, kiLumaWidth, pDumpRecFile);
assert (iWrittenSize == kiLumaWidth);
@@ -468,7 +479,8 @@
}
for (i = 1; i < I420_PLANES; ++ i) {
const int32_t kiStrideUV = pCurPicture->iLineSize[i];
- pSrc = bFrameCroppingFlag ? (pCurPicture->pData[i] + kiStrideUV * pFrameCrop->iCropTop + pFrameCrop->iCropLeft) : pCurPicture->pData[i];
+ pSrc = bFrameCroppingFlag ? (pCurPicture->pData[i] + kiStrideUV * pFrameCrop->iCropTop + pFrameCrop->iCropLeft) :
+ pCurPicture->pData[i];
for (j = 0; j < kiChromaHeight; ++ j) {
iWrittenSize = WelsFwrite (pSrc + j * kiStrideUV, 1, kiChromaWidth, pDumpRecFile);
assert (iWrittenSize == kiChromaWidth);
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -156,9 +156,9 @@
}
if (pSpatialLayer->iMaxSpatialBitrate < pSpatialLayer->iSpatialBitrate * 1.1f) {
WelsLog (pLogCtx, WELS_LOG_WARNING,
- "MaxSpatialBitrate (%d) should set be larger than 1.1 times of SpatialBitrate (%d)",
- pSpatialLayer->iMaxSpatialBitrate, pSpatialLayer->iSpatialBitrate);
- // pSpatialLayer->iSpatialBitrate = (int32_t) (pSpatialLayer->iMaxSpatialBitrate/1.1f);
+ "MaxSpatialBitrate (%d) should set be larger than 1.1 times of SpatialBitrate (%d)",
+ pSpatialLayer->iMaxSpatialBitrate, pSpatialLayer->iSpatialBitrate);
+// pSpatialLayer->iSpatialBitrate = (int32_t) (pSpatialLayer->iMaxSpatialBitrate/1.1f);
}
}
if (iTotalBitrate > pCfg->iTargetBitrate) {
@@ -1357,7 +1357,9 @@
iTargetSpatialBsSize = iLayerBsSize;
iCountBsLen = iNonVclLayersBsSizeCount + iVclLayersBsSizeCount;
- pParam->iNumRefFrame = WELS_CLIP3 (pParam->iNumRefFrame, MIN_REF_PIC_COUNT, (pParam->iUsageType==CAMERA_VIDEO_REAL_TIME?MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA:MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN));
+ pParam->iNumRefFrame = WELS_CLIP3 (pParam->iNumRefFrame, MIN_REF_PIC_COUNT,
+ (pParam->iUsageType == CAMERA_VIDEO_REAL_TIME ? MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA :
+ MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN));
// Output
(*ppCtx)->pOut = (SWelsEncoderOutput*)pMa->WelsMalloc (sizeof (SWelsEncoderOutput), "SWelsEncoderOutput");
@@ -2015,7 +2017,9 @@
}
iRet = pCodingParam->DetermineTemporalSettings();
if (iRet != ENC_RETURN_SUCCESS) {
- WelsLog (pLogCtx, WELS_LOG_ERROR, "WelsInitEncoderExt(), DetermineTemporalSettings failed return %d (check in/out frame rate and temporal layer setting!)", iRet);
+ WelsLog (pLogCtx, WELS_LOG_ERROR,
+ "WelsInitEncoderExt(), DetermineTemporalSettings failed return %d (check in/out frame rate and temporal layer setting!)",
+ iRet);
return iRet;
}
iRet = GetMultipleThreadIdc (pLogCtx, pCodingParam, iSliceNum, iCacheLineSize, uiCpuFeatureFlags);
@@ -3029,7 +3033,8 @@
if (iSpatialNum < 1) { // skip due to temporal layer settings (different frame rate)
++ pCtx->iCodingIndex;
pFbi->eFrameType = videoFrameTypeSkip;
- WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] Frame timestamp = %8" PRId64", skip one frame", (int64_t)pSrcPic->uiTimeStamp);
+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] Frame timestamp = %8" PRId64", skip one frame",
+ (int64_t)pSrcPic->uiTimeStamp);
return ENC_RETURN_SUCCESS;
}
@@ -3036,7 +3041,8 @@
eFrameType = DecideFrameType (pCtx, iSpatialNum);
if (eFrameType == videoFrameTypeSkip) {
pFbi->eFrameType = eFrameType;
- WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] Frame timestamp = %8" PRId64", skip one frame", (int64_t)pSrcPic->uiTimeStamp);
+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] Frame timestamp = %8" PRId64", skip one frame",
+ (int64_t)pSrcPic->uiTimeStamp);
return ENC_RETURN_SUCCESS;
}
@@ -3043,7 +3049,8 @@
//loop each layer to check if have skip frame when RC and frame skip enable
if (CheckFrameSkipBasedMaxbr (pCtx, iSpatialNum, eFrameType, (uint32_t)pSrcPic->uiTimeStamp)) {
pFbi->eFrameType = videoFrameTypeSkip;
- WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] Frame timestamp = %8" PRId64", skip one frame", (int64_t)pSrcPic->uiTimeStamp);
+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] Frame timestamp = %8" PRId64", skip one frame",
+ (int64_t)pSrcPic->uiTimeStamp);
return ENC_RETURN_SUCCESS;
}
@@ -3427,7 +3434,7 @@
}
pCtx->pFuncList->pfRc.pfWelsRcPictureInfoUpdate (pCtx, iLayerSize);
- RcTraceFrameBits (pCtx,pSrcPic->uiTimeStamp);
+ RcTraceFrameBits (pCtx, pSrcPic->uiTimeStamp);
pCtx->pDecPic->iFrameAverageQp = pCtx->pWelsSvcRc->iAverageFrameQp;
//update scc related
@@ -3753,7 +3760,8 @@
} else {
/* maybe adjustment introduced in bitrate or little settings adjustment and so on.. */
pNewParam->iNumRefFrame = WELS_CLIP3 (pNewParam->iNumRefFrame, MIN_REF_PIC_COUNT,
- (pNewParam->iUsageType==CAMERA_VIDEO_REAL_TIME?MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA:MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN));
+ (pNewParam->iUsageType == CAMERA_VIDEO_REAL_TIME ? MAX_REFERENCE_PICTURE_COUNT_NUM_CAMERA :
+ MAX_REFERENCE_PICTURE_COUNT_NUM_SCREEN));
pNewParam->iLoopFilterDisableIdc = WELS_CLIP3 (pNewParam->iLoopFilterDisableIdc, 0, 6);
pNewParam->iLoopFilterAlphaC0Offset = WELS_CLIP3 (pNewParam->iLoopFilterAlphaC0Offset, -6, 6);
pNewParam->iLoopFilterBetaOffset = WELS_CLIP3 (pNewParam->iLoopFilterBetaOffset, -6, 6);
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -52,7 +52,7 @@
#define VIRTUAL_BUFFER_LOW_TH 120 //*INT_MULTIPLY
#define VIRTUAL_BUFFER_HIGH_TH 180 //*INT_MULTIPLY
-
+
//#define _TEST_TEMP_RC_
#ifdef _TEST_TEMP_RC_
//#define _NOT_USE_AQ_FOR_TEST_
@@ -61,855 +61,857 @@
#endif
#define _BITS_RANGE 0
const int32_t g_kiQpToQstepTable[52] = { 63, 71, 79, 89, 100, 112, 126, 141, 159, 178,
- 200, 224, 252, 283, 317, 356, 400, 449, 504, 566,
- 635, 713, 800, 898, 1008, 1131, 1270, 1425, 1600, 1796,
- 2016, 2263, 2540, 2851, 3200, 3592, 4032, 4525, 5080, 5702,
- 6400, 7184, 8063, 9051, 10159, 11404, 12800, 14368, 16127, 18102,
- 20319, 22807
- }; //WELS_ROUND(INT_MULTIPLY*pow (2.0, (iQP - 4.0) / 6.0))
-
+200, 224, 252, 283, 317, 356, 400, 449, 504, 566,
+635, 713, 800, 898, 1008, 1131, 1270, 1425, 1600, 1796,
+2016, 2263, 2540, 2851, 3200, 3592, 4032, 4525, 5080, 5702,
+6400, 7184, 8063, 9051, 10159, 11404, 12800, 14368, 16127, 18102,
+20319, 22807
+}; //WELS_ROUND(INT_MULTIPLY*pow (2.0, (iQP - 4.0) / 6.0))
+
void RcInitLayerMemory (SWelsSvcRc* pWelsSvcRc, CMemoryAlign* pMA, const int32_t kiMaxTl) {
- const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
- const int32_t kiGomSize = pWelsSvcRc->iGomSize;
- const int32_t kiGomSizeD = kiGomSize * sizeof (double);
- const int32_t kiGomSizeI = kiGomSize * sizeof (int32_t);
- const int32_t kiLayerRcSize = kiGomSizeD + (kiGomSizeI * 3) + sizeof (SRCTemporal) * kiMaxTl;
- uint8_t* pBaseMem = (uint8_t*)pMA->WelsMalloc (kiLayerRcSize, "pWelsSvcRc->pTemporalOverRc");
-
- if (NULL == pBaseMem)
- return;
-
- pWelsSvcRc->pTemporalOverRc = (SRCTemporal*)pBaseMem;
- pBaseMem += sizeof (SRCTemporal) * kiMaxTl;
- pWelsSvcRc->pGomComplexity = (double*)pBaseMem;
- pBaseMem += kiGomSizeD;
- pWelsSvcRc->pGomForegroundBlockNum = (int32_t*)pBaseMem;
- pBaseMem += kiGomSizeI;
- pWelsSvcRc->pCurrentFrameGomSad = (int32_t*)pBaseMem;
- pBaseMem += kiGomSizeI;
- pWelsSvcRc->pGomCost = (int32_t*)pBaseMem;
-
- pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pMA->WelsMalloc (sizeof (SRCSlicing) * kiSliceNum, "SlicingOverRC");
+const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
+const int32_t kiGomSize = pWelsSvcRc->iGomSize;
+const int32_t kiGomSizeD = kiGomSize * sizeof (double);
+const int32_t kiGomSizeI = kiGomSize * sizeof (int32_t);
+const int32_t kiLayerRcSize = kiGomSizeD + (kiGomSizeI * 3) + sizeof (SRCTemporal) * kiMaxTl;
+uint8_t* pBaseMem = (uint8_t*)pMA->WelsMalloc (kiLayerRcSize, "pWelsSvcRc->pTemporalOverRc");
+
+if (NULL == pBaseMem)
+return;
+
+pWelsSvcRc->pTemporalOverRc = (SRCTemporal*)pBaseMem;
+pBaseMem += sizeof (SRCTemporal) * kiMaxTl;
+pWelsSvcRc->pGomComplexity = (double*)pBaseMem;
+pBaseMem += kiGomSizeD;
+pWelsSvcRc->pGomForegroundBlockNum = (int32_t*)pBaseMem;
+pBaseMem += kiGomSizeI;
+pWelsSvcRc->pCurrentFrameGomSad = (int32_t*)pBaseMem;
+pBaseMem += kiGomSizeI;
+pWelsSvcRc->pGomCost = (int32_t*)pBaseMem;
+
+pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pMA->WelsMalloc (sizeof (SRCSlicing) * kiSliceNum, "SlicingOverRC");
}
-
+
void RcFreeLayerMemory (SWelsSvcRc* pWelsSvcRc, CMemoryAlign* pMA) {
- if (pWelsSvcRc != NULL && pWelsSvcRc->pSlicingOverRc != NULL) {
- pMA->WelsFree (pWelsSvcRc->pSlicingOverRc, "SlicingOverRC");
- pWelsSvcRc->pSlicingOverRc = NULL;
- }
- if (pWelsSvcRc != NULL && pWelsSvcRc->pTemporalOverRc != NULL) {
- pMA->WelsFree (pWelsSvcRc->pTemporalOverRc, "pWelsSvcRc->pTemporalOverRc");
- pWelsSvcRc->pTemporalOverRc = NULL;
- pWelsSvcRc->pGomComplexity = NULL;
- pWelsSvcRc->pGomForegroundBlockNum = NULL;
- pWelsSvcRc->pCurrentFrameGomSad = NULL;
- pWelsSvcRc->pGomCost = NULL;
- }
+if (pWelsSvcRc != NULL && pWelsSvcRc->pSlicingOverRc != NULL) {
+pMA->WelsFree (pWelsSvcRc->pSlicingOverRc, "SlicingOverRC");
+pWelsSvcRc->pSlicingOverRc = NULL;
}
-
+if (pWelsSvcRc != NULL && pWelsSvcRc->pTemporalOverRc != NULL) {
+pMA->WelsFree (pWelsSvcRc->pTemporalOverRc, "pWelsSvcRc->pTemporalOverRc");
+pWelsSvcRc->pTemporalOverRc = NULL;
+pWelsSvcRc->pGomComplexity = NULL;
+pWelsSvcRc->pGomForegroundBlockNum = NULL;
+pWelsSvcRc->pCurrentFrameGomSad = NULL;
+pWelsSvcRc->pGomCost = NULL;
+}
+}
+
static inline int32_t RcConvertQp2QStep (int32_t iQP) {
- return g_kiQpToQstepTable[iQP];
+return g_kiQpToQstepTable[iQP];
}
static inline int32_t RcConvertQStep2Qp (int32_t iQpStep) {
- return WELS_ROUND ((6 * log (iQpStep * 1.0f / INT_MULTIPLY) / log (2.0) + 4.0));
+return WELS_ROUND ((6 * log (iQpStep * 1.0f / INT_MULTIPLY) / log (2.0) + 4.0));
}
-
+
void RcInitSequenceParameter (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = NULL;
- SSpatialLayerConfig* pDLayerParam = NULL;
-
- int32_t j = 0;
- int32_t iMbWidth = 0;
-
- bool bMultiSliceMode = false;
- int32_t iGomRowMode0 = 1, iGomRowMode1 = 1;
+SWelsSvcRc* pWelsSvcRc = NULL;
+SSpatialLayerConfig* pDLayerParam = NULL;
+
+int32_t j = 0;
+int32_t iMbWidth = 0;
+
+bool bMultiSliceMode = false;
+int32_t iGomRowMode0 = 1, iGomRowMode1 = 1;
#ifdef _TEST_TEMP_RC_
- fp_test_rc = fopen ("testRC.dat", "w");
- fp_vgop = fopen ("vgop.dat", "w");
+fp_test_rc = fopen ("testRC.dat", "w");
+fp_vgop = fopen ("vgop.dat", "w");
#endif
- for (j = 0; j < pEncCtx->pSvcParam->iSpatialLayerNum; j++) {
- SSliceCtx* pSliceCtx = &pEncCtx->pSliceCtxList[j];
- pWelsSvcRc = &pEncCtx->pWelsSvcRc[j];
- pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[j];
- iMbWidth = (pDLayerParam->iVideoWidth >> 4);
- pWelsSvcRc->iNumberMbFrame = iMbWidth * (pDLayerParam->iVideoHeight >> 4);
- pWelsSvcRc->iSliceNum = pSliceCtx->iSliceNumInFrame;
-
- pWelsSvcRc->iRcVaryPercentage = _BITS_RANGE; // % -- for temp
- pWelsSvcRc->iRcVaryRatio = pWelsSvcRc->iRcVaryPercentage;
-
- pWelsSvcRc->iSkipBufferRatio = SKIP_RATIO;
-
- pWelsSvcRc->iQpRangeUpperInFrame = (QP_RANGE_UPPER_MODE1 * MAX_BITS_VARY_PERCENTAGE - ((
- QP_RANGE_UPPER_MODE1 - QP_RANGE_MODE0) *
- pWelsSvcRc->iRcVaryRatio)) / MAX_BITS_VARY_PERCENTAGE;
- pWelsSvcRc->iQpRangeLowerInFrame = (QP_RANGE_LOWER_MODE1 * MAX_BITS_VARY_PERCENTAGE - ((
- QP_RANGE_LOWER_MODE1 - QP_RANGE_MODE0) *
- pWelsSvcRc->iRcVaryRatio)) / MAX_BITS_VARY_PERCENTAGE;
-
- if (iMbWidth <= MB_WIDTH_THRESHOLD_90P) {
- pWelsSvcRc->iSkipQpValue = SKIP_QP_90P;
- iGomRowMode0 = GOM_ROW_MODE0_90P;
- iGomRowMode1 = GOM_ROW_MODE1_90P;
- } else if (iMbWidth <= MB_WIDTH_THRESHOLD_180P) {
- pWelsSvcRc->iSkipQpValue = SKIP_QP_180P;
- iGomRowMode0 = GOM_ROW_MODE0_180P;
- iGomRowMode1 = GOM_ROW_MODE1_180P;
- } else if (iMbWidth <= MB_WIDTH_THRESHOLD_360P) {
- pWelsSvcRc->iSkipQpValue = SKIP_QP_360P;
- iGomRowMode0 = GOM_ROW_MODE0_360P;
- iGomRowMode1 = GOM_ROW_MODE1_360P;
- } else {
- pWelsSvcRc->iSkipQpValue = SKIP_QP_720P;
- iGomRowMode0 = GOM_ROW_MODE0_720P;
- iGomRowMode1 = GOM_ROW_MODE1_720P;
- }
- iGomRowMode0 = iGomRowMode1 + ((iGomRowMode0 - iGomRowMode1) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
-
- pWelsSvcRc->iNumberMbGom = iMbWidth * iGomRowMode0;
-
- pWelsSvcRc->iMinQp = GOM_MIN_QP_MODE;
- pWelsSvcRc->iMaxQp = GOM_MAX_QP_MODE;
-
- pWelsSvcRc->iFrameDeltaQpUpper = LAST_FRAME_QP_RANGE_UPPER_MODE1 - ((LAST_FRAME_QP_RANGE_UPPER_MODE1 -
- LAST_FRAME_QP_RANGE_UPPER_MODE0) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
- pWelsSvcRc->iFrameDeltaQpLower = LAST_FRAME_QP_RANGE_LOWER_MODE1 - ((LAST_FRAME_QP_RANGE_LOWER_MODE1 -
- LAST_FRAME_QP_RANGE_LOWER_MODE0) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
-
- pWelsSvcRc->iSkipFrameNum = 0;
- pWelsSvcRc->iGomSize = (pWelsSvcRc->iNumberMbFrame + pWelsSvcRc->iNumberMbGom - 1) / pWelsSvcRc->iNumberMbGom;
-
-
- RcInitLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign, 1 + pEncCtx->pSvcParam->sDependencyLayers[j].iHighestTemporalId);
-
- bMultiSliceMode = ((SM_RASTER_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
- (SM_ROWMB_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
- (SM_DYN_SLICE == pDLayerParam->sSliceCfg.uiSliceMode));
- if (bMultiSliceMode)
- pWelsSvcRc->iNumberMbGom = pWelsSvcRc->iNumberMbFrame;
- }
+for (j = 0; j < pEncCtx->pSvcParam->iSpatialLayerNum; j++) {
+SSliceCtx* pSliceCtx = &pEncCtx->pSliceCtxList[j];
+pWelsSvcRc = &pEncCtx->pWelsSvcRc[j];
+pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[j];
+iMbWidth = (pDLayerParam->iVideoWidth >> 4);
+pWelsSvcRc->iNumberMbFrame = iMbWidth * (pDLayerParam->iVideoHeight >> 4);
+pWelsSvcRc->iSliceNum = pSliceCtx->iSliceNumInFrame;
+
+pWelsSvcRc->iRcVaryPercentage = _BITS_RANGE; // % -- for temp
+pWelsSvcRc->iRcVaryRatio = pWelsSvcRc->iRcVaryPercentage;
+
+pWelsSvcRc->iSkipBufferRatio = SKIP_RATIO;
+
+pWelsSvcRc->iQpRangeUpperInFrame = (QP_RANGE_UPPER_MODE1 * MAX_BITS_VARY_PERCENTAGE - ((
+QP_RANGE_UPPER_MODE1 - QP_RANGE_MODE0) *
+pWelsSvcRc->iRcVaryRatio)) / MAX_BITS_VARY_PERCENTAGE;
+pWelsSvcRc->iQpRangeLowerInFrame = (QP_RANGE_LOWER_MODE1 * MAX_BITS_VARY_PERCENTAGE - ((
+QP_RANGE_LOWER_MODE1 - QP_RANGE_MODE0) *
+pWelsSvcRc->iRcVaryRatio)) / MAX_BITS_VARY_PERCENTAGE;
+
+if (iMbWidth <= MB_WIDTH_THRESHOLD_90P) {
+pWelsSvcRc->iSkipQpValue = SKIP_QP_90P;
+iGomRowMode0 = GOM_ROW_MODE0_90P;
+iGomRowMode1 = GOM_ROW_MODE1_90P;
+} else if (iMbWidth <= MB_WIDTH_THRESHOLD_180P) {
+pWelsSvcRc->iSkipQpValue = SKIP_QP_180P;
+iGomRowMode0 = GOM_ROW_MODE0_180P;
+iGomRowMode1 = GOM_ROW_MODE1_180P;
+} else if (iMbWidth <= MB_WIDTH_THRESHOLD_360P) {
+pWelsSvcRc->iSkipQpValue = SKIP_QP_360P;
+iGomRowMode0 = GOM_ROW_MODE0_360P;
+iGomRowMode1 = GOM_ROW_MODE1_360P;
+} else {
+pWelsSvcRc->iSkipQpValue = SKIP_QP_720P;
+iGomRowMode0 = GOM_ROW_MODE0_720P;
+iGomRowMode1 = GOM_ROW_MODE1_720P;
}
-
-
+iGomRowMode0 = iGomRowMode1 + ((iGomRowMode0 - iGomRowMode1) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
+
+pWelsSvcRc->iNumberMbGom = iMbWidth * iGomRowMode0;
+
+pWelsSvcRc->iMinQp = GOM_MIN_QP_MODE;
+pWelsSvcRc->iMaxQp = GOM_MAX_QP_MODE;
+
+pWelsSvcRc->iFrameDeltaQpUpper = LAST_FRAME_QP_RANGE_UPPER_MODE1 - ((LAST_FRAME_QP_RANGE_UPPER_MODE1 -
+LAST_FRAME_QP_RANGE_UPPER_MODE0) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
+pWelsSvcRc->iFrameDeltaQpLower = LAST_FRAME_QP_RANGE_LOWER_MODE1 - ((LAST_FRAME_QP_RANGE_LOWER_MODE1 -
+LAST_FRAME_QP_RANGE_LOWER_MODE0) * pWelsSvcRc->iRcVaryRatio / MAX_BITS_VARY_PERCENTAGE);
+
+pWelsSvcRc->iSkipFrameNum = 0;
+pWelsSvcRc->iGomSize = (pWelsSvcRc->iNumberMbFrame + pWelsSvcRc->iNumberMbGom - 1) / pWelsSvcRc->iNumberMbGom;
+
+
+RcInitLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign, 1 + pEncCtx->pSvcParam->sDependencyLayers[j].iHighestTemporalId);
+
+bMultiSliceMode = ((SM_RASTER_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
+(SM_ROWMB_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
+(SM_DYN_SLICE == pDLayerParam->sSliceCfg.uiSliceMode));
+if (bMultiSliceMode)
+pWelsSvcRc->iNumberMbGom = pWelsSvcRc->iNumberMbFrame;
+}
+}
+
+
void RcInitTlWeight (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
- const int32_t kiDecompositionStages = pDLayerParam->iDecompositionStages;
- const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
-
- //Index 0:Virtual GOP size, Index 1:Frame rate
- //double WeightArray[4][4] = { {1.0, 0, 0, 0}, {0.6, 0.4, 0, 0}, {0.4, 0.3, 0.15, 0}, {0.25, 0.15, 0.125, 0.0875}};
- int32_t iWeightArray[4][4] = { {2000, 0, 0, 0}, {1200, 800, 0, 0}, {800, 600, 300, 0}, {500, 300, 250, 175}}; // original*WEIGHT_MULTIPLY
- const int32_t kiGopSize = (1 << kiDecompositionStages);
- int32_t i, k, n;
-
- n = 0;
- while (n <= kiHighestTid) {
- pTOverRc[n].iTlayerWeight = iWeightArray[kiDecompositionStages][n];
- ++ n;
- }
- //Calculate the frame index for the current frame and its reference frame
- for (n = 0; n < VGOP_SIZE; n += kiGopSize) {
- pWelsSvcRc->iTlOfFrames[n] = 0;
- for (i = 1; i <= kiDecompositionStages; i++) {
- for (k = 1 << (kiDecompositionStages - i); k < kiGopSize; k += (kiGopSize >> (i - 1))) {
- pWelsSvcRc->iTlOfFrames[k + n] = i;
- }
- }
- }
- pWelsSvcRc->iPreviousGopSize = kiGopSize;
- pWelsSvcRc->iGopNumberInVGop = VGOP_SIZE / kiGopSize;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+const int32_t kiDecompositionStages = pDLayerParam->iDecompositionStages;
+const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
+
+//Index 0:Virtual GOP size, Index 1:Frame rate
+//double WeightArray[4][4] = { {1.0, 0, 0, 0}, {0.6, 0.4, 0, 0}, {0.4, 0.3, 0.15, 0}, {0.25, 0.15, 0.125, 0.0875}};
+int32_t iWeightArray[4][4] = { {2000, 0, 0, 0}, {1200, 800, 0, 0}, {800, 600, 300, 0}, {500, 300, 250, 175}}; // original*WEIGHT_MULTIPLY
+const int32_t kiGopSize = (1 << kiDecompositionStages);
+int32_t i, k, n;
+
+n = 0;
+while (n <= kiHighestTid) {
+pTOverRc[n].iTlayerWeight = iWeightArray[kiDecompositionStages][n];
+++ n;
}
-
+//Calculate the frame index for the current frame and its reference frame
+for (n = 0; n < VGOP_SIZE; n += kiGopSize) {
+pWelsSvcRc->iTlOfFrames[n] = 0;
+for (i = 1; i <= kiDecompositionStages; i++) {
+for (k = 1 << (kiDecompositionStages - i); k < kiGopSize; k += (kiGopSize >> (i - 1))) {
+pWelsSvcRc->iTlOfFrames[k + n] = i;
+}
+}
+}
+pWelsSvcRc->iPreviousGopSize = kiGopSize;
+pWelsSvcRc->iGopNumberInVGop = VGOP_SIZE / kiGopSize;
+}
+
void RcUpdateBitrateFps (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
-
- SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
- SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
- const int32_t kiGopSize = (1 << pDLayerParamInternal->iDecompositionStages);
- const int32_t kiHighestTid = pDLayerParamInternal->iHighestTemporalId;
- int32_t input_iBitsPerFrame = WELS_ROUND (pDLayerParam->iSpatialBitrate * INT_MULTIPLY /
- pDLayerParamInternal->fInputFrameRate);
- const int32_t kiGopBits = WELS_DIV_ROUND (input_iBitsPerFrame * kiGopSize, INT_MULTIPLY);
- int32_t i;
-
- pWelsSvcRc->iBitRate = pDLayerParam->iSpatialBitrate;
- pWelsSvcRc->fFrameRate = pDLayerParamInternal->fInputFrameRate;
-
- int32_t iTargetVaryRange = FRAME_iTargetBits_VARY_RANGE * (MAX_BITS_VARY_PERCENTAGE - pWelsSvcRc->iRcVaryRatio);
- int32_t iMinBitsRatio = (MAX_BITS_VARY_PERCENTAGE) * INT_MULTIPLY - iTargetVaryRange;
- int32_t iMaxBitsRatio = (MAX_BITS_VARY_PERCENTAGE) * (INT_MULTIPLY + FRAME_iTargetBits_VARY_RANGE);
-
- for (i = 0; i <= kiHighestTid; i++) {
- const int64_t kdConstraitBits = kiGopBits * pTOverRc[i].iTlayerWeight;
- pTOverRc[i].iMinBitsTl = WELS_DIV_ROUND (kdConstraitBits * iMinBitsRatio,
- INT_MULTIPLY * MAX_BITS_VARY_PERCENTAGE * WEIGHT_MULTIPLY);
- pTOverRc[i].iMaxBitsTl = WELS_DIV_ROUND (kdConstraitBits * iMaxBitsRatio,
- INT_MULTIPLY * MAX_BITS_VARY_PERCENTAGE * WEIGHT_MULTIPLY);
- }
- //When bitrate is changed, pBuffer size should be updated
- pWelsSvcRc->iBufferSizeSkip = WELS_DIV_ROUND (pWelsSvcRc->iBitRate * pWelsSvcRc->iSkipBufferRatio, INT_MULTIPLY);
- pWelsSvcRc->iBufferSizePadding = WELS_DIV_ROUND (pWelsSvcRc->iBitRate * PADDING_BUFFER_RATIO, INT_MULTIPLY);
-
- //change remaining bits
- if (pWelsSvcRc->iBitsPerFrame > REMAIN_BITS_TH)
- pWelsSvcRc->iRemainingBits = pWelsSvcRc->iRemainingBits * input_iBitsPerFrame / pWelsSvcRc->iBitsPerFrame;
- pWelsSvcRc->iBitsPerFrame = input_iBitsPerFrame;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+
+SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
+SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+const int32_t kiGopSize = (1 << pDLayerParamInternal->iDecompositionStages);
+const int32_t kiHighestTid = pDLayerParamInternal->iHighestTemporalId;
+int32_t input_iBitsPerFrame = WELS_ROUND (pDLayerParam->iSpatialBitrate * INT_MULTIPLY /
+pDLayerParamInternal->fInputFrameRate);
+const int32_t kiGopBits = WELS_DIV_ROUND (input_iBitsPerFrame * kiGopSize, INT_MULTIPLY);
+int32_t i;
+
+pWelsSvcRc->iBitRate = pDLayerParam->iSpatialBitrate;
+pWelsSvcRc->fFrameRate = pDLayerParamInternal->fInputFrameRate;
+
+int32_t iTargetVaryRange = FRAME_iTargetBits_VARY_RANGE * (MAX_BITS_VARY_PERCENTAGE - pWelsSvcRc->iRcVaryRatio);
+int32_t iMinBitsRatio = (MAX_BITS_VARY_PERCENTAGE) * INT_MULTIPLY - iTargetVaryRange;
+int32_t iMaxBitsRatio = (MAX_BITS_VARY_PERCENTAGE) * (INT_MULTIPLY + FRAME_iTargetBits_VARY_RANGE);
+
+for (i = 0; i <= kiHighestTid; i++) {
+const int64_t kdConstraitBits = kiGopBits * pTOverRc[i].iTlayerWeight;
+pTOverRc[i].iMinBitsTl = WELS_DIV_ROUND (kdConstraitBits * iMinBitsRatio,
+INT_MULTIPLY * MAX_BITS_VARY_PERCENTAGE * WEIGHT_MULTIPLY);
+pTOverRc[i].iMaxBitsTl = WELS_DIV_ROUND (kdConstraitBits * iMaxBitsRatio,
+INT_MULTIPLY * MAX_BITS_VARY_PERCENTAGE * WEIGHT_MULTIPLY);
}
-
-
+//When bitrate is changed, pBuffer size should be updated
+pWelsSvcRc->iBufferSizeSkip = WELS_DIV_ROUND (pWelsSvcRc->iBitRate * pWelsSvcRc->iSkipBufferRatio, INT_MULTIPLY);
+pWelsSvcRc->iBufferSizePadding = WELS_DIV_ROUND (pWelsSvcRc->iBitRate * PADDING_BUFFER_RATIO, INT_MULTIPLY);
+
+//change remaining bits
+if (pWelsSvcRc->iBitsPerFrame > REMAIN_BITS_TH)
+pWelsSvcRc->iRemainingBits = pWelsSvcRc->iRemainingBits * input_iBitsPerFrame / pWelsSvcRc->iBitsPerFrame;
+pWelsSvcRc->iBitsPerFrame = input_iBitsPerFrame;
+}
+
+
void RcInitVGop (sWelsEncCtx* pEncCtx) {
- const int32_t kiDid = pEncCtx->uiDependencyId;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- const int32_t kiHighestTid = pEncCtx->pSvcParam->sDependencyLayers[kiDid].iHighestTemporalId;
-
- pWelsSvcRc->iRemainingBits = WELS_DIV_ROUND (VGOP_SIZE * pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
- pWelsSvcRc->iRemainingWeights = pWelsSvcRc->iGopNumberInVGop * WEIGHT_MULTIPLY;
-
- pWelsSvcRc->iFrameCodedInVGop = 0;
- pWelsSvcRc->iGopIndexInVGop = 0;
-
- for (int32_t i = 0; i <= kiHighestTid; ++ i)
- pTOverRc[i].iGopBitsDq = 0;
- pWelsSvcRc->iSkipFrameInVGop = 0;
+const int32_t kiDid = pEncCtx->uiDependencyId;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+const int32_t kiHighestTid = pEncCtx->pSvcParam->sDependencyLayers[kiDid].iHighestTemporalId;
+
+pWelsSvcRc->iRemainingBits = WELS_DIV_ROUND (VGOP_SIZE * pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
+pWelsSvcRc->iRemainingWeights = pWelsSvcRc->iGopNumberInVGop * WEIGHT_MULTIPLY;
+
+pWelsSvcRc->iFrameCodedInVGop = 0;
+pWelsSvcRc->iGopIndexInVGop = 0;
+
+for (int32_t i = 0; i <= kiHighestTid; ++ i)
+pTOverRc[i].iGopBitsDq = 0;
+pWelsSvcRc->iSkipFrameInVGop = 0;
}
-
+
void RcInitRefreshParameter (sWelsEncCtx* pEncCtx) {
- const int32_t kiDid = pEncCtx->uiDependencyId;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[kiDid];
- SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
- const int32_t kiHighestTid = pDLayerParamInternal->iHighestTemporalId;
- int32_t i;
-
- //I frame R-Q Model
- pWelsSvcRc->iIntraComplexity = 0;
- pWelsSvcRc->iIntraMbCount = 0;
-
- //P frame R-Q Model
- for (i = 0; i <= kiHighestTid; i++) {
- pTOverRc[i].iPFrameNum = 0;
- pTOverRc[i].iLinearCmplx = 0;
- pTOverRc[i].iFrameCmplxMean = 0;
- }
-
- pWelsSvcRc->iBufferFullnessSkip = 0;
- pWelsSvcRc->iBufferFullnessPadding = 0;
-
- pWelsSvcRc->iGopIndexInVGop = 0;
- pWelsSvcRc->iRemainingBits = 0;
- pWelsSvcRc->iBitsPerFrame = 0;
-
- //Backup the initial bitrate and fps
- pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
- pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
-
- memset (pWelsSvcRc->pCurrentFrameGomSad, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
-
- RcInitTlWeight (pEncCtx);
- RcUpdateBitrateFps (pEncCtx);
- RcInitVGop (pEncCtx);
+const int32_t kiDid = pEncCtx->uiDependencyId;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[kiDid];
+SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
+const int32_t kiHighestTid = pDLayerParamInternal->iHighestTemporalId;
+int32_t i;
+
+//I frame R-Q Model
+pWelsSvcRc->iIntraComplexity = 0;
+pWelsSvcRc->iIntraMbCount = 0;
+
+//P frame R-Q Model
+for (i = 0; i <= kiHighestTid; i++) {
+pTOverRc[i].iPFrameNum = 0;
+pTOverRc[i].iLinearCmplx = 0;
+pTOverRc[i].iFrameCmplxMean = 0;
}
-
+
+pWelsSvcRc->iBufferFullnessSkip = 0;
+pWelsSvcRc->iBufferFullnessPadding = 0;
+
+pWelsSvcRc->iGopIndexInVGop = 0;
+pWelsSvcRc->iRemainingBits = 0;
+pWelsSvcRc->iBitsPerFrame = 0;
+
+//Backup the initial bitrate and fps
+pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
+pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
+
+memset (pWelsSvcRc->pCurrentFrameGomSad, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
+
+RcInitTlWeight (pEncCtx);
+RcUpdateBitrateFps (pEncCtx);
+RcInitVGop (pEncCtx);
+}
+
bool RcJudgeBitrateFpsUpdate (sWelsEncCtx* pEncCtx) {
- int32_t iCurDid = pEncCtx->uiDependencyId;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[iCurDid];
- SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[iCurDid];
- SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[iCurDid];
-
- if ((pWelsSvcRc->iPreviousBitrate != pDLayerParam->iSpatialBitrate) ||
- (pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) > EPSN ||
- (pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) < -EPSN) {
- pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
- pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
- return true;
- } else
- return false;
+int32_t iCurDid = pEncCtx->uiDependencyId;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[iCurDid];
+SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[iCurDid];
+SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[iCurDid];
+
+if ((pWelsSvcRc->iPreviousBitrate != pDLayerParam->iSpatialBitrate) ||
+(pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) > EPSN ||
+(pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) < -EPSN) {
+pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
+pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
+return true;
+} else
+return false;
}
-
+
#if GOM_TRACE_FLAG
void RcTraceVGopBitrate (sWelsEncCtx* pEncCtx) {
- const int32_t kiDid = pEncCtx->uiDependencyId;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
-
- if (pWelsSvcRc->iFrameCodedInVGop) {
- const int32_t kiHighestTid = pEncCtx->pSvcParam->sDependencyLayers[kiDid].iHighestTemporalId;
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- int32_t iVGopBitrate = 0;
- int32_t iTotalBits = pWelsSvcRc->iPaddingBitrateStat;
- int32_t iTid = 0;
- while (iTid <= kiHighestTid) {
- iTotalBits += pTOverRc[iTid].iGopBitsDq;
- ++ iTid;
- }
- int32_t iFrameInVGop = pWelsSvcRc->iFrameCodedInVGop + pWelsSvcRc->iSkipFrameInVGop;
- if (0 != iFrameInVGop)
- iVGopBitrate = WELS_ROUND (iTotalBits / iFrameInVGop * pWelsSvcRc->fFrameRate);
+const int32_t kiDid = pEncCtx->uiDependencyId;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
+
+if (pWelsSvcRc->iFrameCodedInVGop) {
+const int32_t kiHighestTid = pEncCtx->pSvcParam->sDependencyLayers[kiDid].iHighestTemporalId;
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+int32_t iVGopBitrate = 0;
+int32_t iTotalBits = pWelsSvcRc->iPaddingBitrateStat;
+int32_t iTid = 0;
+while (iTid <= kiHighestTid) {
+iTotalBits += pTOverRc[iTid].iGopBitsDq;
+++ iTid;
+}
+int32_t iFrameInVGop = pWelsSvcRc->iFrameCodedInVGop + pWelsSvcRc->iSkipFrameInVGop;
+if (0 != iFrameInVGop)
+iVGopBitrate = WELS_ROUND (iTotalBits / iFrameInVGop * pWelsSvcRc->fFrameRate);
#ifdef _TEST_TEMP_Rc_
- fprintf (fp_vgop, "%d\n", WELS_ROUND ((double)iTotalBits / iFrameInVGop));
+fprintf (fp_vgop, "%d\n", WELS_ROUND ((double)iTotalBits / iFrameInVGop));
#endif
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "[Rc] VGOPbitrate%d: %d ", kiDid, iVGopBitrate);
- if (iTotalBits > 0) {
- iTid = 0;
- while (iTid <= kiHighestTid) {
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "T%d=%8.3f ", iTid, (double) (pTOverRc[iTid].iGopBitsDq / iTotalBits));
- ++ iTid;
- }
- }
- }
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "[Rc] VGOPbitrate%d: %d ", kiDid, iVGopBitrate);
+if (iTotalBits > 0) {
+iTid = 0;
+while (iTid <= kiHighestTid) {
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "T%d=%8.3f ", iTid, (double) (pTOverRc[iTid].iGopBitsDq / iTotalBits));
+++ iTid;
}
+}
+}
+}
#endif
-
+
void RcUpdateTemporalZero (sWelsEncCtx* pEncCtx) {
- const int32_t kiDid = pEncCtx->uiDependencyId;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
- SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
- const int32_t kiGopSize = (1 << pDLayerParam->iDecompositionStages);
-
- if (pWelsSvcRc->iPreviousGopSize != kiGopSize) {
+const int32_t kiDid = pEncCtx->uiDependencyId;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
+SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
+const int32_t kiGopSize = (1 << pDLayerParam->iDecompositionStages);
+
+if (pWelsSvcRc->iPreviousGopSize != kiGopSize) {
#if GOM_TRACE_FLAG
- RcTraceVGopBitrate (pEncCtx);
+RcTraceVGopBitrate (pEncCtx);
#endif
- RcInitTlWeight (pEncCtx);
- RcInitVGop (pEncCtx);
- } else if (pWelsSvcRc->iGopIndexInVGop == pWelsSvcRc->iGopNumberInVGop || pEncCtx->eSliceType == I_SLICE) {
+RcInitTlWeight (pEncCtx);
+RcInitVGop (pEncCtx);
+} else if (pWelsSvcRc->iGopIndexInVGop == pWelsSvcRc->iGopNumberInVGop || pEncCtx->eSliceType == I_SLICE) {
#if GOM_TRACE_FLAG
- RcTraceVGopBitrate (pEncCtx);
+RcTraceVGopBitrate (pEncCtx);
#endif
- RcInitVGop (pEncCtx);
- }
- pWelsSvcRc->iGopIndexInVGop++;
+RcInitVGop (pEncCtx);
}
-
-
+pWelsSvcRc->iGopIndexInVGop++;
+}
+
+
void RcInitIdrQp (sWelsEncCtx* pEncCtx) {
- double dBpp = 0;
- int32_t i;
-
- //64k@6fps for 90p: bpp 0.74 QP:24
- //192k@12fps for 180p: bpp 0.28 QP:26
- //512k@24fps for 360p: bpp 0.09 QP:30
- //1500k@30fps for 720p: bpp 0.05 QP:32
- double dBppArray[4][3] = {{0.5, 0.75, 1.0}, {0.2, 0.3, 0.4}, {0.05, 0.09, 0.13}, {0.03, 0.06, 0.1}};
- int32_t dInitialQPArray[4][4] = {{28, 26, 24, 22}, {30, 28, 26, 24}, {32, 30, 28, 26}, {34, 32, 30, 28}};
- int32_t iBppIndex = 0;
-
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
-
- if (pDLayerParam->fFrameRate > EPSN && pDLayerParam->iVideoWidth && pDLayerParam->iVideoHeight)
- dBpp = (double) (pDLayerParam->iSpatialBitrate) / (double) (pDLayerParam->fFrameRate * pDLayerParam->iVideoWidth *
- pDLayerParam->iVideoHeight);
- else
- dBpp = 0.1;
-
- //Area*2
- if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 28800) // 90p video:160*90
- iBppIndex = 0;
- else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 115200) // 180p video:320*180
- iBppIndex = 1;
- else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 460800) // 360p video:640*360
- iBppIndex = 2;
- else
- iBppIndex = 3;
-
- //Search
- for (i = 0; i < 3; i++) {
- if (dBpp <= dBppArray[iBppIndex][i])
- break;
- }
- pWelsSvcRc->iInitialQp = dInitialQPArray[iBppIndex][i];
- pWelsSvcRc->iInitialQp = WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
- pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
- pWelsSvcRc->iQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
- pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
+double dBpp = 0;
+int32_t i;
+
+//64k@6fps for 90p: bpp 0.74 QP:24
+//192k@12fps for 180p: bpp 0.28 QP:26
+//512k@24fps for 360p: bpp 0.09 QP:30
+//1500k@30fps for 720p: bpp 0.05 QP:32
+double dBppArray[4][3] = {{0.5, 0.75, 1.0}, {0.2, 0.3, 0.4}, {0.05, 0.09, 0.13}, {0.03, 0.06, 0.1}};
+int32_t dInitialQPArray[4][4] = {{28, 26, 24, 22}, {30, 28, 26, 24}, {32, 30, 28, 26}, {34, 32, 30, 28}};
+int32_t iBppIndex = 0;
+
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
+
+if (pDLayerParam->fFrameRate > EPSN && pDLayerParam->iVideoWidth && pDLayerParam->iVideoHeight)
+dBpp = (double) (pDLayerParam->iSpatialBitrate) / (double) (pDLayerParam->fFrameRate * pDLayerParam->iVideoWidth *
+pDLayerParam->iVideoHeight);
+else
+dBpp = 0.1;
+
+//Area*2
+if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 28800) // 90p video:160*90
+iBppIndex = 0;
+else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 115200) // 180p video:320*180
+iBppIndex = 1;
+else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 460800) // 360p video:640*360
+iBppIndex = 2;
+else
+iBppIndex = 3;
+
+//Search
+for (i = 0; i < 3; i++) {
+if (dBpp <= dBppArray[iBppIndex][i])
+break;
}
-
+pWelsSvcRc->iInitialQp = dInitialQPArray[iBppIndex][i];
+pWelsSvcRc->iInitialQp = WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
+pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
+pWelsSvcRc->iQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
+pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
+}
+
void RcCalculateIdrQp (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- //obtain the idr qp using previous idr complexity
- if (pWelsSvcRc->iNumberMbFrame != pWelsSvcRc->iIntraMbCount) {
- pWelsSvcRc->iIntraComplexity = pWelsSvcRc->iIntraComplexity * pWelsSvcRc->iNumberMbFrame /
- pWelsSvcRc->iIntraMbCount;
- }
- pWelsSvcRc->iInitialQp = RcConvertQStep2Qp (pWelsSvcRc->iIntraComplexity /
- pWelsSvcRc->iTargetBits);
- pWelsSvcRc->iInitialQp = WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
- pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
- pWelsSvcRc->iQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
- pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+//obtain the idr qp using previous idr complexity
+if (pWelsSvcRc->iNumberMbFrame != pWelsSvcRc->iIntraMbCount) {
+pWelsSvcRc->iIntraComplexity = pWelsSvcRc->iIntraComplexity * pWelsSvcRc->iNumberMbFrame /
+pWelsSvcRc->iIntraMbCount;
}
-
-
+pWelsSvcRc->iInitialQp = RcConvertQStep2Qp (pWelsSvcRc->iIntraComplexity /
+pWelsSvcRc->iTargetBits);
+pWelsSvcRc->iInitialQp = WELS_CLIP3 (pWelsSvcRc->iInitialQp, MIN_IDR_QP, MAX_IDR_QP);
+pEncCtx->iGlobalQp = pWelsSvcRc->iInitialQp;
+pWelsSvcRc->iQStep = RcConvertQp2QStep (pEncCtx->iGlobalQp);
+pWelsSvcRc->iLastCalculatedQScale = pEncCtx->iGlobalQp;
+}
+
+
void RcCalculatePictureQp (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- int32_t iTl = pEncCtx->uiTemporalId;
- SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[iTl];
- int32_t iLumaQp = 0;
-
- if (0 == pTOverRc->iPFrameNum) {
- iLumaQp = pWelsSvcRc->iInitialQp;
- } else if (pWelsSvcRc->iCurrentBitsLevel == BITS_EXCEEDED) {
- iLumaQp = MAX_LOW_BR_QP;
- //limit QP
- int32_t iLastIdxCodecInVGop = pWelsSvcRc->iFrameCodedInVGop - 1;
- if (iLastIdxCodecInVGop < 0)
- iLastIdxCodecInVGop += VGOP_SIZE;
- int32_t iTlLast = pWelsSvcRc->iTlOfFrames[iLastIdxCodecInVGop];
- int32_t iDeltaQpTemporal = iTl - iTlLast;
- if (0 == iTlLast && iTl > 0)
- iDeltaQpTemporal += 3;
- else if (0 == iTl && iTlLast > 0)
- iDeltaQpTemporal -= 3;
-
- iLumaQp = WELS_CLIP3 (iLumaQp,
- pWelsSvcRc->iLastCalculatedQScale - pWelsSvcRc->iFrameDeltaQpLower + iDeltaQpTemporal,
- pWelsSvcRc->iLastCalculatedQScale + pWelsSvcRc->iFrameDeltaQpUpper + iDeltaQpTemporal);
- iLumaQp = WELS_CLIP3 (iLumaQp, GOM_MIN_QP_MODE, MAX_LOW_BR_QP);
-
- pWelsSvcRc->iQStep = RcConvertQp2QStep (iLumaQp);
- pWelsSvcRc->iLastCalculatedQScale = iLumaQp;
-
- if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
- iLumaQp = WELS_CLIP3 ((iLumaQp * INT_MULTIPLY - pEncCtx->pVaa->sAdaptiveQuantParam.iAverMotionTextureIndexToDeltaQp) /
- INT_MULTIPLY, GOM_MIN_QP_MODE, MAX_LOW_BR_QP);
- }
-
- pEncCtx->iGlobalQp = iLumaQp;
-
- return;
- } else {
- int64_t iCmplxRatio = WELS_DIV_ROUND64 (pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity * INT_MULTIPLY,
- pTOverRc->iFrameCmplxMean);
- iCmplxRatio = WELS_CLIP3 (iCmplxRatio, INT_MULTIPLY - FRAME_CMPLX_RATIO_RANGE, INT_MULTIPLY + FRAME_CMPLX_RATIO_RANGE);
-
- pWelsSvcRc->iQStep = WELS_DIV_ROUND ((pTOverRc->iLinearCmplx * iCmplxRatio), (pWelsSvcRc->iTargetBits * INT_MULTIPLY));
- iLumaQp = RcConvertQStep2Qp (pWelsSvcRc->iQStep);
-
- //limit QP
- int32_t iLastIdxCodecInVGop = pWelsSvcRc->iFrameCodedInVGop - 1;
- if (iLastIdxCodecInVGop < 0)
- iLastIdxCodecInVGop += VGOP_SIZE;
- int32_t iTlLast = pWelsSvcRc->iTlOfFrames[iLastIdxCodecInVGop];
- int32_t iDeltaQpTemporal = iTl - iTlLast;
- if (0 == iTlLast && iTl > 0)
- iDeltaQpTemporal += 3;
- else if (0 == iTl && iTlLast > 0)
- iDeltaQpTemporal -= 3;
-
- iLumaQp = WELS_CLIP3 (iLumaQp,
- pWelsSvcRc->iLastCalculatedQScale - pWelsSvcRc->iFrameDeltaQpLower + iDeltaQpTemporal,
- pWelsSvcRc->iLastCalculatedQScale + pWelsSvcRc->iFrameDeltaQpUpper + iDeltaQpTemporal);
- }
-
- iLumaQp = WELS_CLIP3 (iLumaQp, GOM_MIN_QP_MODE, GOM_MAX_QP_MODE);
-
- pWelsSvcRc->iQStep = RcConvertQp2QStep (iLumaQp);
- pWelsSvcRc->iLastCalculatedQScale = iLumaQp;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+int32_t iTl = pEncCtx->uiTemporalId;
+SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[iTl];
+int32_t iLumaQp = 0;
+
+if (0 == pTOverRc->iPFrameNum) {
+iLumaQp = pWelsSvcRc->iInitialQp;
+} else if (pWelsSvcRc->iCurrentBitsLevel == BITS_EXCEEDED) {
+iLumaQp = MAX_LOW_BR_QP;
+//limit QP
+int32_t iLastIdxCodecInVGop = pWelsSvcRc->iFrameCodedInVGop - 1;
+if (iLastIdxCodecInVGop < 0)
+iLastIdxCodecInVGop += VGOP_SIZE;
+int32_t iTlLast = pWelsSvcRc->iTlOfFrames[iLastIdxCodecInVGop];
+int32_t iDeltaQpTemporal = iTl - iTlLast;
+if (0 == iTlLast && iTl > 0)
+iDeltaQpTemporal += 3;
+else if (0 == iTl && iTlLast > 0)
+iDeltaQpTemporal -= 3;
+
+iLumaQp = WELS_CLIP3 (iLumaQp,
+pWelsSvcRc->iLastCalculatedQScale - pWelsSvcRc->iFrameDeltaQpLower + iDeltaQpTemporal,
+pWelsSvcRc->iLastCalculatedQScale + pWelsSvcRc->iFrameDeltaQpUpper + iDeltaQpTemporal);
+iLumaQp = WELS_CLIP3 (iLumaQp, GOM_MIN_QP_MODE, MAX_LOW_BR_QP);
+
+pWelsSvcRc->iQStep = RcConvertQp2QStep (iLumaQp);
+pWelsSvcRc->iLastCalculatedQScale = iLumaQp;
+
+if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
+iLumaQp = WELS_CLIP3 ((iLumaQp * INT_MULTIPLY - pEncCtx->pVaa->sAdaptiveQuantParam.iAverMotionTextureIndexToDeltaQp) /
+INT_MULTIPLY, GOM_MIN_QP_MODE, MAX_LOW_BR_QP);
+}
+
+pEncCtx->iGlobalQp = iLumaQp;
+
+return;
+} else {
+int64_t iCmplxRatio = WELS_DIV_ROUND64 (pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity * INT_MULTIPLY,
+pTOverRc->iFrameCmplxMean);
+iCmplxRatio = WELS_CLIP3 (iCmplxRatio, INT_MULTIPLY - FRAME_CMPLX_RATIO_RANGE, INT_MULTIPLY + FRAME_CMPLX_RATIO_RANGE);
+
+pWelsSvcRc->iQStep = WELS_DIV_ROUND ((pTOverRc->iLinearCmplx * iCmplxRatio), (pWelsSvcRc->iTargetBits * INT_MULTIPLY));
+iLumaQp = RcConvertQStep2Qp (pWelsSvcRc->iQStep);
+
+//limit QP
+int32_t iLastIdxCodecInVGop = pWelsSvcRc->iFrameCodedInVGop - 1;
+if (iLastIdxCodecInVGop < 0)
+iLastIdxCodecInVGop += VGOP_SIZE;
+int32_t iTlLast = pWelsSvcRc->iTlOfFrames[iLastIdxCodecInVGop];
+int32_t iDeltaQpTemporal = iTl - iTlLast;
+if (0 == iTlLast && iTl > 0)
+iDeltaQpTemporal += 3;
+else if (0 == iTl && iTlLast > 0)
+iDeltaQpTemporal -= 3;
+
+iLumaQp = WELS_CLIP3 (iLumaQp,
+pWelsSvcRc->iLastCalculatedQScale - pWelsSvcRc->iFrameDeltaQpLower + iDeltaQpTemporal,
+pWelsSvcRc->iLastCalculatedQScale + pWelsSvcRc->iFrameDeltaQpUpper + iDeltaQpTemporal);
+}
+
+iLumaQp = WELS_CLIP3 (iLumaQp, GOM_MIN_QP_MODE, GOM_MAX_QP_MODE);
+
+pWelsSvcRc->iQStep = RcConvertQp2QStep (iLumaQp);
+pWelsSvcRc->iLastCalculatedQScale = iLumaQp;
#ifndef _NOT_USE_AQ_FOR_TEST_
- if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
-
- iLumaQp = WELS_DIV_ROUND (iLumaQp * INT_MULTIPLY - pEncCtx->pVaa->sAdaptiveQuantParam.iAverMotionTextureIndexToDeltaQp,
- INT_MULTIPLY);
-
- if (! ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE) && (pEncCtx->pSvcParam->bEnableFrameSkip == false)))
- iLumaQp = WELS_CLIP3 (iLumaQp, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
-
- }
+if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
+
+iLumaQp = WELS_DIV_ROUND (iLumaQp * INT_MULTIPLY - pEncCtx->pVaa->sAdaptiveQuantParam.iAverMotionTextureIndexToDeltaQp,
+INT_MULTIPLY);
+
+if (! ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE) && (pEncCtx->pSvcParam->bEnableFrameSkip == false)))
+iLumaQp = WELS_CLIP3 (iLumaQp, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
+
+}
#endif
- pEncCtx->iGlobalQp = iLumaQp;
+pEncCtx->iGlobalQp = iLumaQp;
}
-
+
void RcInitSliceInformation (sWelsEncCtx* pEncCtx) {
- SSliceCtx* pCurSliceCtx = pEncCtx->pCurDqLayer->pSliceEncCtx;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
- const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
- const int32_t kiBitsPerMb = WELS_DIV_ROUND (pWelsSvcRc->iTargetBits * INT_MULTIPLY, pWelsSvcRc->iNumberMbFrame);
-
- for (int32_t i = 0; i < kiSliceNum; i++) {
- pSOverRc->iStartMbSlice =
- pSOverRc->iEndMbSlice = pCurSliceCtx->pFirstMbInSlice[i];
- pSOverRc->iEndMbSlice += (pCurSliceCtx->pCountMbNumInSlice[i] - 1);
- pSOverRc->iTotalQpSlice = 0;
- pSOverRc->iTotalMbSlice = 0;
- pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pCurSliceCtx->pCountMbNumInSlice[i], INT_MULTIPLY);
- pSOverRc->iFrameBitsSlice = 0;
- pSOverRc->iGomBitsSlice = 0;
- ++ pSOverRc;
- }
+SSliceCtx* pCurSliceCtx = pEncCtx->pCurDqLayer->pSliceEncCtx;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
+const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
+const int32_t kiBitsPerMb = WELS_DIV_ROUND (pWelsSvcRc->iTargetBits * INT_MULTIPLY, pWelsSvcRc->iNumberMbFrame);
+
+for (int32_t i = 0; i < kiSliceNum; i++) {
+pSOverRc->iStartMbSlice =
+pSOverRc->iEndMbSlice = pCurSliceCtx->pFirstMbInSlice[i];
+pSOverRc->iEndMbSlice += (pCurSliceCtx->pCountMbNumInSlice[i] - 1);
+pSOverRc->iTotalQpSlice = 0;
+pSOverRc->iTotalMbSlice = 0;
+pSOverRc->iTargetBitsSlice = WELS_DIV_ROUND (kiBitsPerMb * pCurSliceCtx->pCountMbNumInSlice[i], INT_MULTIPLY);
+pSOverRc->iFrameBitsSlice = 0;
+pSOverRc->iGomBitsSlice = 0;
+++ pSOverRc;
}
-
+}
+
void RcDecideTargetBits (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[pEncCtx->uiTemporalId];
-
- pWelsSvcRc->iCurrentBitsLevel = BITS_NORMAL;
- //allocate bits
- if (pEncCtx->eSliceType == I_SLICE) {
- pWelsSvcRc->iTargetBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame * IDR_BITRATE_RATIO, INT_MULTIPLY);
- } else {
- if (pWelsSvcRc->iRemainingWeights > pTOverRc->iTlayerWeight)
- pWelsSvcRc->iTargetBits = (int32_t) ((int64_t)pWelsSvcRc->iRemainingBits * pTOverRc->iTlayerWeight /
- pWelsSvcRc->iRemainingWeights);
- else //this case should be not hit. needs to more test case to verify this
- pWelsSvcRc->iTargetBits = pWelsSvcRc->iRemainingBits;
- if ((pWelsSvcRc->iTargetBits <= 0) && ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE)
- && (pEncCtx->pSvcParam->bEnableFrameSkip == false))) {
- pWelsSvcRc->iCurrentBitsLevel = BITS_EXCEEDED;
- }
- pWelsSvcRc->iTargetBits = WELS_CLIP3 (pWelsSvcRc->iTargetBits, pTOverRc->iMinBitsTl, pTOverRc->iMaxBitsTl);
- }
- pWelsSvcRc->iRemainingWeights -= pTOverRc->iTlayerWeight;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[pEncCtx->uiTemporalId];
+
+pWelsSvcRc->iCurrentBitsLevel = BITS_NORMAL;
+//allocate bits
+if (pEncCtx->eSliceType == I_SLICE) {
+pWelsSvcRc->iTargetBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame * IDR_BITRATE_RATIO, INT_MULTIPLY);
+} else {
+if (pWelsSvcRc->iRemainingWeights > pTOverRc->iTlayerWeight)
+pWelsSvcRc->iTargetBits = (int32_t) ((int64_t)pWelsSvcRc->iRemainingBits * pTOverRc->iTlayerWeight /
+pWelsSvcRc->iRemainingWeights);
+else //this case should be not hit. needs to more test case to verify this
+pWelsSvcRc->iTargetBits = pWelsSvcRc->iRemainingBits;
+if ((pWelsSvcRc->iTargetBits <= 0) && ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE)
+&& (pEncCtx->pSvcParam->bEnableFrameSkip == false))) {
+pWelsSvcRc->iCurrentBitsLevel = BITS_EXCEEDED;
}
-
-
+pWelsSvcRc->iTargetBits = WELS_CLIP3 (pWelsSvcRc->iTargetBits, pTOverRc->iMinBitsTl, pTOverRc->iMaxBitsTl);
+}
+pWelsSvcRc->iRemainingWeights -= pTOverRc->iTlayerWeight;
+}
+
+
void RcInitGomParameters (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
- const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
- const int32_t kiGlobalQp = pEncCtx->iGlobalQp;
-
- pWelsSvcRc->iAverageFrameQp = 0;
- pWelsSvcRc->iMinFrameQp = 51;;
- pWelsSvcRc->iMaxFrameQp = 0;
- for (int32_t i = 0; i < kiSliceNum; ++i) {
- pSOverRc->iComplexityIndexSlice = 0;
- pSOverRc->iCalculatedQpSlice = kiGlobalQp;
- ++ pSOverRc;
- }
- memset (pWelsSvcRc->pGomComplexity, 0, pWelsSvcRc->iGomSize * sizeof (double));
- memset (pWelsSvcRc->pGomCost, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
+const int32_t kiSliceNum = pWelsSvcRc->iSliceNum;
+const int32_t kiGlobalQp = pEncCtx->iGlobalQp;
+
+pWelsSvcRc->iAverageFrameQp = 0;
+pWelsSvcRc->iMinFrameQp = 51;;
+pWelsSvcRc->iMaxFrameQp = 0;
+for (int32_t i = 0; i < kiSliceNum; ++i) {
+pSOverRc->iComplexityIndexSlice = 0;
+pSOverRc->iCalculatedQpSlice = kiGlobalQp;
+++ pSOverRc;
}
-
+memset (pWelsSvcRc->pGomComplexity, 0, pWelsSvcRc->iGomSize * sizeof (double));
+memset (pWelsSvcRc->pGomCost, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
+}
+
void RcCalculateMbQp (sWelsEncCtx* pEncCtx, SMB* pCurMb, const int32_t kiSliceId) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[kiSliceId];
- int32_t iLumaQp = pSOverRc->iCalculatedQpSlice;
- SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
- const uint8_t kuiChromaQpIndexOffset = pCurLayer->sLayerInfo.pPpsP->uiChromaQpIndexOffset;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[kiSliceId];
+int32_t iLumaQp = pSOverRc->iCalculatedQpSlice;
+SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
+const uint8_t kuiChromaQpIndexOffset = pCurLayer->sLayerInfo.pPpsP->uiChromaQpIndexOffset;
#ifndef _NOT_USE_AQ_FOR_TEST_
- if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
- iLumaQp = (int8_t)WELS_CLIP3 (iLumaQp +
- pEncCtx->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp[pCurMb->iMbXY], pWelsSvcRc->iMinQp, 51);
- }
+if (pEncCtx->pSvcParam->bEnableAdaptiveQuant) {
+iLumaQp = (int8_t)WELS_CLIP3 (iLumaQp +
+pEncCtx->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp[pCurMb->iMbXY], pWelsSvcRc->iMinQp, 51);
+}
#endif
- pCurMb->uiChromaQp = g_kuiChromaQpTable[CLIP3_QP_0_51 (iLumaQp + kuiChromaQpIndexOffset)];
- pCurMb->uiLumaQp = iLumaQp;
+pCurMb->uiChromaQp = g_kuiChromaQpTable[CLIP3_QP_0_51 (iLumaQp + kuiChromaQpIndexOffset)];
+pCurMb->uiLumaQp = iLumaQp;
}
-
+
SWelsSvcRc* RcJudgeBaseUsability (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = NULL, *pWelsSvcRc_Base = NULL;
- SSpatialLayerConfig* pDlpBase = NULL, *pDLayerParam = NULL;
- SSpatialLayerInternal* pDlpBaseInternal = NULL;
- if (pEncCtx->uiDependencyId <= 0)
- return NULL;
- pDlpBaseInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId - 1];
- pDlpBase = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId - 1];
- pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
- if (pEncCtx->uiTemporalId <= pDlpBaseInternal->iDecompositionStages) {
- pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
- pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
- pDlpBase = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId - 1];
- if ((pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight / pWelsSvcRc->iNumberMbGom) ==
- (pDlpBase->iVideoWidth * pDlpBase->iVideoHeight / pWelsSvcRc_Base->iNumberMbGom))
- return pWelsSvcRc_Base;
- else
- return NULL;
- } else
- return NULL;
+SWelsSvcRc* pWelsSvcRc = NULL, *pWelsSvcRc_Base = NULL;
+SSpatialLayerConfig* pDlpBase = NULL, *pDLayerParam = NULL;
+SSpatialLayerInternal* pDlpBaseInternal = NULL;
+if (pEncCtx->uiDependencyId <= 0)
+return NULL;
+pDlpBaseInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId - 1];
+pDlpBase = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId - 1];
+pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
+if (pEncCtx->uiTemporalId <= pDlpBaseInternal->iDecompositionStages) {
+pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
+pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
+pDlpBase = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId - 1];
+if ((pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight / pWelsSvcRc->iNumberMbGom) ==
+(pDlpBase->iVideoWidth * pDlpBase->iVideoHeight / pWelsSvcRc_Base->iNumberMbGom))
+return pWelsSvcRc_Base;
+else
+return NULL;
+} else
+return NULL;
}
-
+
void RcGomTargetBits (sWelsEncCtx* pEncCtx, const int32_t kiSliceId) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SWelsSvcRc* pWelsSvcRc_Base = NULL;
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[kiSliceId];
-
- int32_t iAllocateBits = 0;
- int32_t iSumSad = 0;
- int32_t iLastGomIndex = 0;
- int32_t iLeftBits = 0;
- const int32_t kiComplexityIndex = pSOverRc->iComplexityIndexSlice;
- int32_t i;
-
- iLastGomIndex = pSOverRc->iEndMbSlice / pWelsSvcRc->iNumberMbGom;
- iLeftBits = pSOverRc->iTargetBitsSlice - pSOverRc->iFrameBitsSlice;
-
- if (iLeftBits <= 0) {
- pSOverRc->iGomTargetBits = 0;
- return;
- } else if (kiComplexityIndex >= iLastGomIndex) {
- iAllocateBits = iLeftBits;
- } else {
- pWelsSvcRc_Base = RcJudgeBaseUsability (pEncCtx);
- pWelsSvcRc_Base = (pWelsSvcRc_Base) ? pWelsSvcRc_Base : pWelsSvcRc;
- for (i = kiComplexityIndex; i <= iLastGomIndex; i++) {
- iSumSad += pWelsSvcRc_Base->pCurrentFrameGomSad[i];
- }
- if (0 == iSumSad)
- iAllocateBits = WELS_DIV_ROUND (iLeftBits, (iLastGomIndex - kiComplexityIndex));
- else
- iAllocateBits = WELS_DIV_ROUND ((int64_t)iLeftBits * pWelsSvcRc_Base->pCurrentFrameGomSad[kiComplexityIndex + 1],
- iSumSad);
-
- }
- pSOverRc->iGomTargetBits = iAllocateBits;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SWelsSvcRc* pWelsSvcRc_Base = NULL;
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[kiSliceId];
+
+int32_t iAllocateBits = 0;
+int32_t iSumSad = 0;
+int32_t iLastGomIndex = 0;
+int32_t iLeftBits = 0;
+const int32_t kiComplexityIndex = pSOverRc->iComplexityIndexSlice;
+int32_t i;
+
+iLastGomIndex = pSOverRc->iEndMbSlice / pWelsSvcRc->iNumberMbGom;
+iLeftBits = pSOverRc->iTargetBitsSlice - pSOverRc->iFrameBitsSlice;
+
+if (iLeftBits <= 0) {
+pSOverRc->iGomTargetBits = 0;
+return;
+} else if (kiComplexityIndex >= iLastGomIndex) {
+iAllocateBits = iLeftBits;
+} else {
+pWelsSvcRc_Base = RcJudgeBaseUsability (pEncCtx);
+pWelsSvcRc_Base = (pWelsSvcRc_Base) ? pWelsSvcRc_Base : pWelsSvcRc;
+for (i = kiComplexityIndex; i <= iLastGomIndex; i++) {
+iSumSad += pWelsSvcRc_Base->pCurrentFrameGomSad[i];
}
-
-
-
+if (0 == iSumSad)
+iAllocateBits = WELS_DIV_ROUND (iLeftBits, (iLastGomIndex - kiComplexityIndex));
+else
+iAllocateBits = WELS_DIV_ROUND ((int64_t)iLeftBits * pWelsSvcRc_Base->pCurrentFrameGomSad[kiComplexityIndex + 1],
+iSumSad);
+
+}
+pSOverRc->iGomTargetBits = iAllocateBits;
+}
+
+
+
void RcCalculateGomQp (sWelsEncCtx* pEncCtx, SMB* pCurMb, int32_t iSliceId) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[iSliceId];
- int64_t iBitsRatio = 1;
-
- int64_t iLeftBits = pSOverRc->iTargetBitsSlice - pSOverRc->iFrameBitsSlice;
- int64_t iTargetLeftBits = iLeftBits + pSOverRc->iGomBitsSlice - pSOverRc->iGomTargetBits;
-
- if (iLeftBits <= 0) {
- pSOverRc->iCalculatedQpSlice += 2;
- } else {
- //globe decision
- iBitsRatio = 10000 * iLeftBits / (iTargetLeftBits + 1);
- if (iBitsRatio < 8409) //2^(-1.5/6)*10000
- pSOverRc->iCalculatedQpSlice += 2;
- else if (iBitsRatio < 9439) //2^(-0.5/6)*10000
- pSOverRc->iCalculatedQpSlice += 1;
- else if (iBitsRatio > 10600) //2^(0.5/6)*10000
- pSOverRc->iCalculatedQpSlice -= 1;
- else if (iBitsRatio > 11900) //2^(1.5/6)*10000
- pSOverRc->iCalculatedQpSlice -= 2;
- }
-
- pSOverRc->iCalculatedQpSlice = WELS_CLIP3 (pSOverRc->iCalculatedQpSlice,
- pEncCtx->iGlobalQp - pWelsSvcRc->iQpRangeLowerInFrame, pEncCtx->iGlobalQp + pWelsSvcRc->iQpRangeUpperInFrame);
- if (! ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE) && (pEncCtx->pSvcParam->bEnableFrameSkip == false)))
- pSOverRc->iCalculatedQpSlice = WELS_CLIP3 (pSOverRc->iCalculatedQpSlice, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
-
- pSOverRc->iGomBitsSlice = 0;
-
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[iSliceId];
+int64_t iBitsRatio = 1;
+
+int64_t iLeftBits = pSOverRc->iTargetBitsSlice - pSOverRc->iFrameBitsSlice;
+int64_t iTargetLeftBits = iLeftBits + pSOverRc->iGomBitsSlice - pSOverRc->iGomTargetBits;
+
+if (iLeftBits <= 0) {
+pSOverRc->iCalculatedQpSlice += 2;
+} else {
+//globe decision
+iBitsRatio = 10000 * iLeftBits / (iTargetLeftBits + 1);
+if (iBitsRatio < 8409) //2^(-1.5/6)*10000
+pSOverRc->iCalculatedQpSlice += 2;
+else if (iBitsRatio < 9439) //2^(-0.5/6)*10000
+pSOverRc->iCalculatedQpSlice += 1;
+else if (iBitsRatio > 10600) //2^(0.5/6)*10000
+pSOverRc->iCalculatedQpSlice -= 1;
+else if (iBitsRatio > 11900) //2^(1.5/6)*10000
+pSOverRc->iCalculatedQpSlice -= 2;
}
-
+
+pSOverRc->iCalculatedQpSlice = WELS_CLIP3 (pSOverRc->iCalculatedQpSlice,
+pEncCtx->iGlobalQp - pWelsSvcRc->iQpRangeLowerInFrame, pEncCtx->iGlobalQp + pWelsSvcRc->iQpRangeUpperInFrame);
+if (! ((pEncCtx->pSvcParam->iRCMode == RC_BITRATE_MODE) && (pEncCtx->pSvcParam->bEnableFrameSkip == false)))
+pSOverRc->iCalculatedQpSlice = WELS_CLIP3 (pSOverRc->iCalculatedQpSlice, pWelsSvcRc->iMinQp, pWelsSvcRc->iMaxQp);
+
+pSOverRc->iGomBitsSlice = 0;
+
+}
+
void RcVBufferCalculationSkip (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- const int32_t kiOutputBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
- //condition 1: whole pBuffer fullness
- pWelsSvcRc->iBufferFullnessSkip += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] bits in buffer = %3d",pWelsSvcRc->iBufferFullnessSkip);
- //condition 2: VGOP bits constraint
- int32_t iVGopBitsPred = 0;
- for (int32_t i = pWelsSvcRc->iFrameCodedInVGop + 1; i < VGOP_SIZE; i++)
- iVGopBitsPred += pTOverRc[pWelsSvcRc->iTlOfFrames[i]].iMinBitsTl;
- iVGopBitsPred -= pWelsSvcRc->iRemainingBits;
- double dIncPercent = iVGopBitsPred * 100.0 * INT_MULTIPLY / (pWelsSvcRc->iBitsPerFrame * VGOP_SIZE) -
- (double)VGOP_BITS_PERCENTAGE_DIFF;
-
- if ((pWelsSvcRc->iBufferFullnessSkip > pWelsSvcRc->iBufferSizeSkip
- && pWelsSvcRc->iAverageFrameQp > pWelsSvcRc->iSkipQpValue)
- || (dIncPercent > pWelsSvcRc->iRcVaryPercentage)) {
- pEncCtx->iSkipFrameFlag = 1;
- pWelsSvcRc->iBufferFullnessSkip = pWelsSvcRc->iBufferFullnessSkip - kiOutputBits;
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] bits in buffer = %3d",pWelsSvcRc->iBufferFullnessSkip);
- }
-
- pWelsSvcRc->iBufferFullnessSkip = WELS_MAX (pWelsSvcRc->iBufferFullnessSkip, 0);
-
- if (pEncCtx->iSkipFrameFlag == 1) {
- pWelsSvcRc->iRemainingBits += kiOutputBits;
- pWelsSvcRc->iSkipFrameNum++;
- pWelsSvcRc->iSkipFrameInVGop++;
- }
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
+const int32_t kiOutputBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
+//condition 1: whole pBuffer fullness
+pWelsSvcRc->iBufferFullnessSkip += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] bits in buffer = %3d", pWelsSvcRc->iBufferFullnessSkip);
+//condition 2: VGOP bits constraint
+int32_t iVGopBitsPred = 0;
+for (int32_t i = pWelsSvcRc->iFrameCodedInVGop + 1; i < VGOP_SIZE; i++)
+iVGopBitsPred += pTOverRc[pWelsSvcRc->iTlOfFrames[i]].iMinBitsTl;
+iVGopBitsPred -= pWelsSvcRc->iRemainingBits;
+double dIncPercent = iVGopBitsPred * 100.0 * INT_MULTIPLY / (pWelsSvcRc->iBitsPerFrame * VGOP_SIZE) -
+(double)VGOP_BITS_PERCENTAGE_DIFF;
+
+if ((pWelsSvcRc->iBufferFullnessSkip > pWelsSvcRc->iBufferSizeSkip
+&& pWelsSvcRc->iAverageFrameQp > pWelsSvcRc->iSkipQpValue)
+|| (dIncPercent > pWelsSvcRc->iRcVaryPercentage)) {
+pEncCtx->iSkipFrameFlag = 1;
+pWelsSvcRc->iBufferFullnessSkip = pWelsSvcRc->iBufferFullnessSkip - kiOutputBits;
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] bits in buffer = %3d", pWelsSvcRc->iBufferFullnessSkip);
}
-
+
+pWelsSvcRc->iBufferFullnessSkip = WELS_MAX (pWelsSvcRc->iBufferFullnessSkip, 0);
+
+if (pEncCtx->iSkipFrameFlag == 1) {
+pWelsSvcRc->iRemainingBits += kiOutputBits;
+pWelsSvcRc->iSkipFrameNum++;
+pWelsSvcRc->iSkipFrameInVGop++;
+}
+}
+
void WelsRcFrameDelayJudge (void* pCtx, EVideoFrameType eFrameType, long long uiTimeStamp) {
- sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
- SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
-
- int32_t iSentBits = WELS_ROUND (pDLayerParam->iSpatialBitrate / pDLayerParamInternal->fOutputFrameRate);
-
- pWelsSvcRc->bSkipFlag = false;
- if (pWelsSvcRc->iBufferFullnessSkip > pWelsSvcRc->iBufferSizeSkip) {
- pWelsSvcRc->bSkipFlag = true;
- pWelsSvcRc->iSkipFrameNum++;
- pWelsSvcRc->iSkipFrameInVGop++;
- pWelsSvcRc->iBufferFullnessSkip -= iSentBits;
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG,"[Rc] bits in buffer = %3d",pWelsSvcRc->iBufferFullnessSkip);
- pWelsSvcRc->iBufferFullnessSkip = WELS_MAX (pWelsSvcRc->iBufferFullnessSkip, 0);
- }
+sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
+SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+
+int32_t iSentBits = WELS_ROUND (pDLayerParam->iSpatialBitrate / pDLayerParamInternal->fOutputFrameRate);
+
+pWelsSvcRc->bSkipFlag = false;
+if (pWelsSvcRc->iBufferFullnessSkip > pWelsSvcRc->iBufferSizeSkip) {
+pWelsSvcRc->bSkipFlag = true;
+pWelsSvcRc->iSkipFrameNum++;
+pWelsSvcRc->iSkipFrameInVGop++;
+pWelsSvcRc->iBufferFullnessSkip -= iSentBits;
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG, "[Rc] bits in buffer = %3d", pWelsSvcRc->iBufferFullnessSkip);
+pWelsSvcRc->iBufferFullnessSkip = WELS_MAX (pWelsSvcRc->iBufferFullnessSkip, 0);
}
-
+}
+
void RcVBufferCalculationPadding (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- const int32_t kiOutputBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
- const int32_t kiBufferThreshold = WELS_DIV_ROUND (PADDING_THRESHOLD * (-pWelsSvcRc->iBufferSizePadding), INT_MULTIPLY);
-
- pWelsSvcRc->iBufferFullnessPadding += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
-
- if (pWelsSvcRc->iBufferFullnessPadding < kiBufferThreshold) {
- pWelsSvcRc->iPaddingSize = -pWelsSvcRc->iBufferFullnessPadding;
- pWelsSvcRc->iPaddingSize >>= 3; // /8
- pWelsSvcRc->iBufferFullnessPadding = 0;
- } else
- pWelsSvcRc->iPaddingSize = 0;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+const int32_t kiOutputBits = WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY);
+const int32_t kiBufferThreshold = WELS_DIV_ROUND (PADDING_THRESHOLD * (-pWelsSvcRc->iBufferSizePadding), INT_MULTIPLY);
+
+pWelsSvcRc->iBufferFullnessPadding += (pWelsSvcRc->iFrameDqBits - kiOutputBits);
+
+if (pWelsSvcRc->iBufferFullnessPadding < kiBufferThreshold) {
+pWelsSvcRc->iPaddingSize = -pWelsSvcRc->iBufferFullnessPadding;
+pWelsSvcRc->iPaddingSize >>= 3; // /8
+pWelsSvcRc->iBufferFullnessPadding = 0;
+} else
+pWelsSvcRc->iPaddingSize = 0;
}
-
-
+
+
void RcTraceFrameBits (void* pCtx, long long uiTimeStamp) {
- sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
-
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG,
- "[Rc] Frame timestamp = %8d, Frame type =%d, encoding_qp%d, average qp = %3d, max qp = %3d, min qp = %3d, index = %8d,\
+sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+
+WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_DEBUG,
+"[Rc] Frame timestamp = %8d, Frame type =%d, encoding_qp%d, average qp = %3d, max qp = %3d, min qp = %3d, index = %8d,\
iTid = %1d, used = %8d, bitsperframe = %8d, target = %8d, remaingbits = %8d, skipbuffersize = %8d",
- (uint32_t)uiTimeStamp,pEncCtx->eSliceType, pEncCtx->uiDependencyId, pWelsSvcRc->iAverageFrameQp,pWelsSvcRc->iMaxFrameQp,pWelsSvcRc->iMinFrameQp,
- pEncCtx->iFrameIndex, pEncCtx->uiTemporalId, pWelsSvcRc->iFrameDqBits,WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame, INT_MULTIPLY),
- pWelsSvcRc->iTargetBits, pWelsSvcRc->iRemainingBits, pWelsSvcRc->iBufferSizeSkip);
-
+(uint32_t)uiTimeStamp, pEncCtx->eSliceType, pEncCtx->uiDependencyId, pWelsSvcRc->iAverageFrameQp,
+pWelsSvcRc->iMaxFrameQp, pWelsSvcRc->iMinFrameQp,
+pEncCtx->iFrameIndex, pEncCtx->uiTemporalId, pWelsSvcRc->iFrameDqBits, WELS_DIV_ROUND (pWelsSvcRc->iBitsPerFrame,
+INT_MULTIPLY),
+pWelsSvcRc->iTargetBits, pWelsSvcRc->iRemainingBits, pWelsSvcRc->iBufferSizeSkip);
+
}
-
+
void RcUpdatePictureQpBits (sWelsEncCtx* pEncCtx, int32_t iCodedBits) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
- SSliceCtx* pCurSliceCtx = pEncCtx->pCurDqLayer->pSliceEncCtx;
- int32_t iTotalQp = 0, iTotalMb = 0;
- int32_t i;
-
- if (pEncCtx->eSliceType == P_SLICE) {
- for (i = 0; i < pCurSliceCtx->iSliceNumInFrame; i++) {
- iTotalQp += pSOverRc->iTotalQpSlice;
- iTotalMb += pSOverRc->iTotalMbSlice;
- ++ pSOverRc;
- }
- if (iTotalMb > 0)
- pWelsSvcRc->iAverageFrameQp = WELS_DIV_ROUND (INT_MULTIPLY * iTotalQp, iTotalMb * INT_MULTIPLY);
- else
- pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
- } else {
- pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
- }
- pWelsSvcRc->iFrameDqBits = iCodedBits;
- pWelsSvcRc->pTemporalOverRc[pEncCtx->uiTemporalId].iGopBitsDq += pWelsSvcRc->iFrameDqBits;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+SRCSlicing* pSOverRc = &pWelsSvcRc->pSlicingOverRc[0];
+SSliceCtx* pCurSliceCtx = pEncCtx->pCurDqLayer->pSliceEncCtx;
+int32_t iTotalQp = 0, iTotalMb = 0;
+int32_t i;
+
+if (pEncCtx->eSliceType == P_SLICE) {
+for (i = 0; i < pCurSliceCtx->iSliceNumInFrame; i++) {
+iTotalQp += pSOverRc->iTotalQpSlice;
+iTotalMb += pSOverRc->iTotalMbSlice;
+++ pSOverRc;
}
-
+if (iTotalMb > 0)
+pWelsSvcRc->iAverageFrameQp = WELS_DIV_ROUND (INT_MULTIPLY * iTotalQp, iTotalMb * INT_MULTIPLY);
+else
+pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
+} else {
+pWelsSvcRc->iAverageFrameQp = pEncCtx->iGlobalQp;
+}
+pWelsSvcRc->iFrameDqBits = iCodedBits;
+pWelsSvcRc->pTemporalOverRc[pEncCtx->uiTemporalId].iGopBitsDq += pWelsSvcRc->iFrameDqBits;
+}
+
void RcUpdateIntraComplexity (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- int32_t iAlpha = WELS_DIV_ROUND (INT_MULTIPLY, (1 + pWelsSvcRc->iIdrNum));
- if (iAlpha < (INT_MULTIPLY / 4)) iAlpha = INT_MULTIPLY / 4;
-
- int64_t iIntraCmplx = pWelsSvcRc->iQStep * pWelsSvcRc->iFrameDqBits;
- pWelsSvcRc->iIntraComplexity = WELS_DIV_ROUND (((INT_MULTIPLY - iAlpha) * pWelsSvcRc->iIntraComplexity + iAlpha *
- iIntraCmplx), INT_MULTIPLY);
- pWelsSvcRc->iIntraMbCount = pWelsSvcRc->iNumberMbFrame;
-
- pWelsSvcRc->iIdrNum++;
- if (pWelsSvcRc->iIdrNum > 255)
- pWelsSvcRc->iIdrNum = 255;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+int32_t iAlpha = WELS_DIV_ROUND (INT_MULTIPLY, (1 + pWelsSvcRc->iIdrNum));
+if (iAlpha < (INT_MULTIPLY / 4)) iAlpha = INT_MULTIPLY / 4;
+
+int64_t iIntraCmplx = pWelsSvcRc->iQStep * pWelsSvcRc->iFrameDqBits;
+pWelsSvcRc->iIntraComplexity = WELS_DIV_ROUND (((INT_MULTIPLY - iAlpha) * pWelsSvcRc->iIntraComplexity + iAlpha *
+iIntraCmplx), INT_MULTIPLY);
+pWelsSvcRc->iIntraMbCount = pWelsSvcRc->iNumberMbFrame;
+
+pWelsSvcRc->iIdrNum++;
+if (pWelsSvcRc->iIdrNum > 255)
+pWelsSvcRc->iIdrNum = 255;
}
-
+
void RcUpdateFrameComplexity (sWelsEncCtx* pEncCtx) {
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- const int32_t kiTl = pEncCtx->uiTemporalId;
- SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[kiTl];
-
- if (0 == pTOverRc->iPFrameNum) {
- pTOverRc->iLinearCmplx = ((int64_t)pWelsSvcRc->iFrameDqBits) * pWelsSvcRc->iQStep;
- } else {
- pTOverRc->iLinearCmplx = WELS_DIV_ROUND64 ((LINEAR_MODEL_DECAY_FACTOR * (int64_t)pTOverRc->iLinearCmplx
- + (INT_MULTIPLY - LINEAR_MODEL_DECAY_FACTOR) * (int64_t) (pWelsSvcRc->iFrameDqBits * pWelsSvcRc->iQStep)),
- INT_MULTIPLY);
- }
- int32_t iAlpha = WELS_DIV_ROUND (INT_MULTIPLY, (1 + pTOverRc->iPFrameNum));
- if (iAlpha < SMOOTH_FACTOR_MIN_VALUE)
- iAlpha = SMOOTH_FACTOR_MIN_VALUE;
- pTOverRc->iFrameCmplxMean = WELS_DIV_ROUND (((INT_MULTIPLY - iAlpha) * pTOverRc->iFrameCmplxMean + iAlpha *
- pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity), INT_MULTIPLY);
-
- pTOverRc->iPFrameNum++;
- if (pTOverRc->iPFrameNum > 255)
- pTOverRc->iPFrameNum = 255;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+const int32_t kiTl = pEncCtx->uiTemporalId;
+SRCTemporal* pTOverRc = &pWelsSvcRc->pTemporalOverRc[kiTl];
+
+if (0 == pTOverRc->iPFrameNum) {
+pTOverRc->iLinearCmplx = ((int64_t)pWelsSvcRc->iFrameDqBits) * pWelsSvcRc->iQStep;
+} else {
+pTOverRc->iLinearCmplx = WELS_DIV_ROUND64 ((LINEAR_MODEL_DECAY_FACTOR * (int64_t)pTOverRc->iLinearCmplx
++ (INT_MULTIPLY - LINEAR_MODEL_DECAY_FACTOR) * (int64_t) (pWelsSvcRc->iFrameDqBits * pWelsSvcRc->iQStep)),
+INT_MULTIPLY);
}
-
+int32_t iAlpha = WELS_DIV_ROUND (INT_MULTIPLY, (1 + pTOverRc->iPFrameNum));
+if (iAlpha < SMOOTH_FACTOR_MIN_VALUE)
+iAlpha = SMOOTH_FACTOR_MIN_VALUE;
+pTOverRc->iFrameCmplxMean = WELS_DIV_ROUND (((INT_MULTIPLY - iAlpha) * pTOverRc->iFrameCmplxMean + iAlpha *
+pEncCtx->pVaa->sComplexityAnalysisParam.iFrameComplexity), INT_MULTIPLY);
+
+pTOverRc->iPFrameNum++;
+if (pTOverRc->iPFrameNum > 255)
+pTOverRc->iPFrameNum = 255;
+}
+
int32_t RcCalculateCascadingQp (struct TagWelsEncCtx* pEncCtx, int32_t iQp) {
- int32_t iTemporalQp = 0;
- if (pEncCtx->pSvcParam->iDecompStages) {
- if (pEncCtx->uiTemporalId == 0)
- iTemporalQp = iQp - 3 - (pEncCtx->pSvcParam->iDecompStages - 1);
- else
- iTemporalQp = iQp - (pEncCtx->pSvcParam->iDecompStages - pEncCtx->uiTemporalId);
- iTemporalQp = WELS_CLIP3 (iTemporalQp, 1, 51);
- } else
- iTemporalQp = iQp;
- return iTemporalQp;
+int32_t iTemporalQp = 0;
+if (pEncCtx->pSvcParam->iDecompStages) {
+if (pEncCtx->uiTemporalId == 0)
+iTemporalQp = iQp - 3 - (pEncCtx->pSvcParam->iDecompStages - 1);
+else
+iTemporalQp = iQp - (pEncCtx->pSvcParam->iDecompStages - pEncCtx->uiTemporalId);
+iTemporalQp = WELS_CLIP3 (iTemporalQp, 1, 51);
+} else
+iTemporalQp = iQp;
+return iTemporalQp;
}
-
+
void WelsRcPictureInitGom (void* pCtx) {
- sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
-
- if (pEncCtx->eSliceType == I_SLICE) {
- if (0 == pWelsSvcRc->iIdrNum) { //iIdrNum == 0 means encoder has been initialed
- RcInitRefreshParameter (pEncCtx);
- }
- }
- if (RcJudgeBitrateFpsUpdate (pEncCtx)) {
- RcUpdateBitrateFps (pEncCtx);
- }
- if (pEncCtx->uiTemporalId == 0) {
- RcUpdateTemporalZero (pEncCtx);
- }
- RcDecideTargetBits (pEncCtx);
- //decide globe_qp
- if (pEncCtx->eSliceType == I_SLICE) {
- if (0 == pWelsSvcRc->iIdrNum)
- RcInitIdrQp (pEncCtx);
- else {
- RcCalculateIdrQp (pEncCtx);
- }
- } else {
- RcCalculatePictureQp (pEncCtx);
- }
- RcInitSliceInformation (pEncCtx);
- RcInitGomParameters (pEncCtx);
-
+sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+
+if (pEncCtx->eSliceType == I_SLICE) {
+if (0 == pWelsSvcRc->iIdrNum) { //iIdrNum == 0 means encoder has been initialed
+RcInitRefreshParameter (pEncCtx);
}
-
-
-
+}
+if (RcJudgeBitrateFpsUpdate (pEncCtx)) {
+RcUpdateBitrateFps (pEncCtx);
+}
+if (pEncCtx->uiTemporalId == 0) {
+RcUpdateTemporalZero (pEncCtx);
+}
+RcDecideTargetBits (pEncCtx);
+//decide globe_qp
+if (pEncCtx->eSliceType == I_SLICE) {
+if (0 == pWelsSvcRc->iIdrNum)
+RcInitIdrQp (pEncCtx);
+else {
+RcCalculateIdrQp (pEncCtx);
+}
+} else {
+RcCalculatePictureQp (pEncCtx);
+}
+RcInitSliceInformation (pEncCtx);
+RcInitGomParameters (pEncCtx);
+
+}
+
+
+
void WelsRcPictureInfoUpdateGom (void* pCtx, int32_t iLayerSize) {
- sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
- SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- int32_t iCodedBits = (iLayerSize << 3);
-
- RcUpdatePictureQpBits (pEncCtx, iCodedBits);
-
- if (pEncCtx->eSliceType == P_SLICE) {
- RcUpdateFrameComplexity (pEncCtx);
- } else {
- RcUpdateIntraComplexity (pEncCtx);
- }
- pWelsSvcRc->iRemainingBits -= pWelsSvcRc->iFrameDqBits;
-
- if (pEncCtx->pSvcParam->bEnableFrameSkip /*&&
+sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
+SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+int32_t iCodedBits = (iLayerSize << 3);
+
+RcUpdatePictureQpBits (pEncCtx, iCodedBits);
+
+if (pEncCtx->eSliceType == P_SLICE) {
+RcUpdateFrameComplexity (pEncCtx);
+} else {
+RcUpdateIntraComplexity (pEncCtx);
+}
+pWelsSvcRc->iRemainingBits -= pWelsSvcRc->iFrameDqBits;
+
+if (pEncCtx->pSvcParam->bEnableFrameSkip /*&&
pEncCtx->uiDependencyId == pEncCtx->pSvcParam->iSpatialLayerNum - 1*/) {
- RcVBufferCalculationSkip (pEncCtx);
- }
+RcVBufferCalculationSkip (pEncCtx);
+}
- if (pEncCtx->pSvcParam->iPaddingFlag)
- RcVBufferCalculationPadding (pEncCtx);
- pWelsSvcRc->iFrameCodedInVGop++;
+if (pEncCtx->pSvcParam->iPaddingFlag)
+ RcVBufferCalculationPadding (pEncCtx);
+pWelsSvcRc->iFrameCodedInVGop++;
#ifdef _TEST_TEMP_Rc_
- fprintf (fp_test_rc, "%d\n", pWelsSvcRc->iFrameDqBits);
- if (pEncCtx->iSkipFrameFlag)
- fprintf (fp_test_rc, "0\n");
- fflush (fp_test_rc);
+fprintf (fp_test_rc, "%d\n", pWelsSvcRc->iFrameDqBits);
+if (pEncCtx->iSkipFrameFlag)
+ fprintf (fp_test_rc, "0\n");
+fflush (fp_test_rc);
#endif
}
@@ -955,8 +957,8 @@
pWelsSvcRc->pGomCost[kiComplexityIndex] += iCostLuma;
- pWelsSvcRc->iMinFrameQp = WELS_MIN(pWelsSvcRc->iMinFrameQp,pCurMb->uiLumaQp);
- pWelsSvcRc->iMaxFrameQp = WELS_MAX(pWelsSvcRc->iMaxFrameQp,pCurMb->uiLumaQp);
+ pWelsSvcRc->iMinFrameQp = WELS_MIN (pWelsSvcRc->iMinFrameQp, pCurMb->uiLumaQp);
+ pWelsSvcRc->iMaxFrameQp = WELS_MAX (pWelsSvcRc->iMaxFrameQp, pCurMb->uiLumaQp);
if (iCurMbBits > 0) {
pSOverRc->iTotalQpSlice += pCurMb->uiLumaQp;
pSOverRc->iTotalMbSlice++;
@@ -1054,7 +1056,7 @@
pEncCtx->iGlobalQp = WELS_CLIP3 (iQp, MIN_IDR_QP, MAX_IDR_QP);
} else {
int32_t iTargetBits = WELS_ROUND (((float)iBitRate / pDLayerConfig->fFrameRate)); //iBitRate / 10;
- int32_t iQstep = (int32_t)(WELS_DIV_ROUND64 (iFrameCplx * pWelsSvcRc->iAvgCost2Bits, iTargetBits));
+ int32_t iQstep = (int32_t) (WELS_DIV_ROUND64 (iFrameCplx * pWelsSvcRc->iAvgCost2Bits, iTargetBits));
int32_t iQp = RcConvertQStep2Qp (iQstep);
iDeltaQp = iQp - iBaseQp;
if (pWelsSvcRc->iBufferFullnessSkip > iBitRate) {
@@ -1108,7 +1110,7 @@
iSentBits = WELS_MAX (iSentBits, 0);
const int32_t iVbufferThRatio = (eFrameType == videoFrameTypeI
- || eFrameType == videoFrameTypeIDR) ? VIRTUAL_BUFFER_HIGH_TH : VIRTUAL_BUFFER_LOW_TH;
+ || eFrameType == videoFrameTypeIDR) ? VIRTUAL_BUFFER_HIGH_TH : VIRTUAL_BUFFER_LOW_TH;
const int32_t iVbufferTh = WELS_DIV_ROUND ((((int64_t)iBitRate) * iVbufferThRatio), INT_MULTIPLY);
pWelsSvcRc->iBufferFullnessSkip -= iSentBits;
@@ -1120,7 +1122,9 @@
}
if (pWelsSvcRc->bSkipFlag) {
pWelsSvcRc->iSkipFrameNum++;
- WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "SCC iSkipFrameNum = %d,buffer = %d,threadhold = %d,bitrate = %d,timestamp=%lld\n", pWelsSvcRc->iSkipFrameNum,pWelsSvcRc->iBufferFullnessSkip,iVbufferTh,iBitRate,uiTimeStamp);
+ WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO,
+ "SCC iSkipFrameNum = %d,buffer = %d,threadhold = %d,bitrate = %d,timestamp=%lld\n", pWelsSvcRc->iSkipFrameNum,
+ pWelsSvcRc->iBufferFullnessSkip, iVbufferTh, iBitRate, uiTimeStamp);
}
pWelsSvcRc->uiLastTimeStamp = uiTimeStamp;
}
--- a/codec/encoder/core/src/ref_list_mgr_svc.cpp
+++ b/codec/encoder/core/src/ref_list_mgr_svc.cpp
@@ -71,7 +71,7 @@
for (i = 0; i < pCtx->pSvcParam->iLTRRefNum + 1; i++)
pRefList->pLongRefList[i] = NULL;
for (i = 0; i < pCtx->pSvcParam->iNumRefFrame + 1; i++)
- pRefList->pRef[i]->SetUnref ();
+ pRefList->pRef[i]->SetUnref();
pRefList->uiLongRefCount = 0;
pRefList->uiShortRefCount = 0;
@@ -106,7 +106,7 @@
SPicture* pRef = pRefList->pLongRefList[i];
if (pRef != NULL && pRef->bUsedAsRef && pRef->bIsLongRef && (!pRef->bIsSceneLTR) &&
(pCtx->uiTemporalId < pRef->uiTemporalId || pCtx->bCurFrameMarkedAsSceneLtr)) {
- pRef->SetUnref ();
+ pRef->SetUnref();
DeleteLTRFromLongList (pCtx, i);
i--;
}
@@ -162,7 +162,7 @@
iMaxFrameNumPlus1) & (FRAME_NUM_EQUAL | FRAME_NUM_SMALLER))) {
WelsLog (pLogCtx, WELS_LOG_WARNING, "LTR ,invalid LTR delete ,long_term_idx = %d , iFrameNum =%d ",
pLongRefList[i]->iLongTermPicNum, pLongRefList[i]->iFrameNum);
- pLongRefList[i]->SetUnref ();
+ pLongRefList[i]->SetUnref();
DeleteLTRFromLongList (pCtx, i);
pLtr->bLTRMarkEnable = true;
if (pRefList->uiLongRefCount == 0) {
@@ -175,7 +175,7 @@
&& pLtr->iLTRMarkMode == LTR_DELAY_MARK) {
WelsLog (pLogCtx, WELS_LOG_WARNING, "LTR ,iMarkFrameNum invalid LTR delete ,long_term_idx = %d , iFrameNum =%d ",
pLongRefList[i]->iLongTermPicNum, pLongRefList[i]->iFrameNum);
- pLongRefList[i]->SetUnref ();
+ pLongRefList[i]->SetUnref();
DeleteLTRFromLongList (pCtx, i);
pLtr->bLTRMarkEnable = true;
if (pRefList->uiLongRefCount == 0) {
@@ -211,7 +211,7 @@
for (j = 0; j < pRefList->uiLongRefCount; j++) {
if (pLongRefList[j]->iLongTermPicNum != pLtr->iCurLtrIdx) {
- pLongRefList[j]->SetUnref ();
+ pLongRefList[j]->SetUnref();
DeleteLTRFromLongList (pCtx, j);
}
}
@@ -228,7 +228,7 @@
} else if (pLtr->uiLtrMarkState == LTR_MARKING_FAILED) {
for (i = 0; i < pRefList->uiLongRefCount; i++) {
if (pLongRefList[i]->iFrameNum == pLtr->iLtrMarkFbFrameNum) {
- pLongRefList[i]->SetUnref ();
+ pLongRefList[i]->SetUnref();
DeleteLTRFromLongList (pCtx, i);
break;
}
@@ -297,7 +297,7 @@
pLongRefList[0] = pShortRefList[i];
pRefList->uiLongRefCount++;
if (pRefList->uiLongRefCount > pCtx->pSvcParam->iLTRRefNum) {
- pRefList->pLongRefList[pRefList->uiLongRefCount - 1]->SetUnref ();
+ pRefList->pLongRefList[pRefList->uiLongRefCount - 1]->SetUnref();
DeleteLTRFromLongList (pCtx, pRefList->uiLongRefCount - 1);
}
DeleteSTRFromShortList (pCtx, i);
@@ -311,7 +311,7 @@
pCtx->pVaa->uiMarkLongTermPicIdx = pCtx->pDecPic->iLongTermPicNum;
if (pLongRefList[iLtrIdx] != NULL) {
- pLongRefList[iLtrIdx]->SetUnref ();
+ pLongRefList[iLtrIdx]->SetUnref();
DeleteLTRFromLongList (pCtx, iLtrIdx);
}
pLongRefList[iLtrIdx] = pCtx->pDecPic;
@@ -334,7 +334,7 @@
if (pRefList->pNextBuffer == NULL && pRefList->uiShortRefCount > 0) {
pRefList->pNextBuffer = pRefList->pShortRefList[pRefList->uiShortRefCount - 1];
- pRefList->pNextBuffer->SetUnref ();
+ pRefList->pNextBuffer->SetUnref();
}
pCtx->pDecPic = pRefList->pNextBuffer;
@@ -398,12 +398,12 @@
}
for (i = pRefList->uiShortRefCount - 1; i > 0; i--) {
- pRefList->pShortRefList[i]->SetUnref ();
+ pRefList->pShortRefList[i]->SetUnref();
DeleteSTRFromShortList (pCtx, i);
}
if (pRefList->uiShortRefCount > 0 && (pRefList->pShortRefList[0]->uiTemporalId > 0
|| pRefList->pShortRefList[0]->iFrameNum != pCtx->iFrameNum)) {
- pRefList->pShortRefList[0]->SetUnref ();
+ pRefList->pShortRefList[0]->SetUnref();
DeleteSTRFromShortList (pCtx, 0);
}
}
@@ -698,7 +698,8 @@
//update info in src list
UpdateOriginalPicInfo (pCtx->pEncPic, pCtx->pDecPic);
PrefetchNextBuffer (pCtx);
- pCtx->pVpp->UpdateSrcListLosslessScreenRefSelectionWithLtr (pCtx->pEncPic, iDIdx, pCtx->pVaa->uiMarkLongTermPicIdx, pCtx->ppRefPicListExt[iDIdx]->pLongRefList);
+ pCtx->pVpp->UpdateSrcListLosslessScreenRefSelectionWithLtr (pCtx->pEncPic, iDIdx, pCtx->pVaa->uiMarkLongTermPicIdx,
+ pCtx->ppRefPicListExt[iDIdx]->pLongRefList);
}
static void UpdateSrcPicList (void* pEncCtx) {
@@ -707,7 +708,8 @@
//update info in src list
UpdateOriginalPicInfo (pCtx->pEncPic, pCtx->pDecPic);
PrefetchNextBuffer (pCtx);
- pCtx->pVpp->UpdateSrcList (pCtx->pEncPic, iDIdx, pCtx->ppRefPicListExt[iDIdx]->pShortRefList, pCtx->ppRefPicListExt[iDIdx]->uiShortRefCount);
+ pCtx->pVpp->UpdateSrcList (pCtx->pEncPic, iDIdx, pCtx->ppRefPicListExt[iDIdx]->pShortRefList,
+ pCtx->ppRefPicListExt[iDIdx]->uiShortRefCount);
}
bool WelsUpdateRefListScreen (void* pEncCtx) {
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -1195,7 +1195,8 @@
*ppPic2 = tmp;
}
-void CWelsPreProcess::UpdateSrcListLosslessScreenRefSelectionWithLtr (SPicture* pCurPicture, const int32_t kiCurDid, const int32_t kuiMarkLongTermPicIdx, SPicture** pLongRefList) {
+void CWelsPreProcess::UpdateSrcListLosslessScreenRefSelectionWithLtr (SPicture* pCurPicture, const int32_t kiCurDid,
+ const int32_t kuiMarkLongTermPicIdx, SPicture** pLongRefList) {
SPicture** pLongRefSrcList = &m_pSpatialPic[kiCurDid][0];
for (int32_t i = 0; i < MAX_REF_PIC_COUNT; ++i) {
if (NULL == pLongRefSrcList[i + 1] || (NULL != pLongRefList[i] && pLongRefList[i]->bUsedAsRef
@@ -1202,23 +1203,24 @@
&& pLongRefList[i]->bIsLongRef)) {
continue;
} else {
- pLongRefSrcList[i + 1]->SetUnref ();
+ pLongRefSrcList[i + 1]->SetUnref();
}
}
WelsExchangeSpatialPictures (&m_pSpatialPic[kiCurDid][0],
&m_pSpatialPic[kiCurDid][1 + kuiMarkLongTermPicIdx]);
m_iAvaliableRefInSpatialPicList = MAX_REF_PIC_COUNT;
- (GetCurrentFrameFromOrigList(kiCurDid))->SetUnref ();
+ (GetCurrentFrameFromOrigList (kiCurDid))->SetUnref();
}
-void CWelsPreProcess::UpdateSrcList (SPicture* pCurPicture, const int32_t kiCurDid, SPicture** pShortRefList, const uint32_t kuiShortRefCount) {
+void CWelsPreProcess::UpdateSrcList (SPicture* pCurPicture, const int32_t kiCurDid, SPicture** pShortRefList,
+ const uint32_t kuiShortRefCount) {
SPicture** pRefSrcList = &m_pSpatialPic[kiCurDid][0];
//pRefSrcList[0] is for current frame
if (pCurPicture->bUsedAsRef || pCurPicture->bIsLongRef) {
- if (pCurPicture->iPictureType == P_SLICE && pCurPicture->uiTemporalId != 0 ) {
+ if (pCurPicture->iPictureType == P_SLICE && pCurPicture->uiTemporalId != 0) {
for (int iRefIdx = kuiShortRefCount - 1; iRefIdx >= 0; --iRefIdx) {
WelsExchangeSpatialPictures (&pRefSrcList[iRefIdx + 1],
- &pRefSrcList[iRefIdx]);
+ &pRefSrcList[iRefIdx]);
}
m_iAvaliableRefInSpatialPicList = kuiShortRefCount;
} else {
@@ -1225,13 +1227,13 @@
WelsExchangeSpatialPictures (&pRefSrcList[0], &pRefSrcList[1]);
for (int32_t i = MAX_SHORT_REF_COUNT - 1; i > 0 ; --i) {
if (pRefSrcList[i + 1] != NULL) {
- pRefSrcList[i + 1]->SetUnref ();
+ pRefSrcList[i + 1]->SetUnref();
}
}
m_iAvaliableRefInSpatialPicList = 1;
}
}
- (GetCurrentFrameFromOrigList(kiCurDid))->SetUnref ();
+ (GetCurrentFrameFromOrigList (kiCurDid))->SetUnref();
}
//TODO: may opti later