ref: 1fb6b91b72e93b4ee99e7b102254808b8f6fd5e2
parent: bd50f64152ad38f1c454e2a63eba3db3029b3435
parent: 13f6ff59ccfec2689bb734c72803b5771f1c88f4
author: sijchen <sijchen@cisco.com>
date: Thu Dec 25 11:35:40 EST 2014
Merge pull request #1669 from ruil2/rc add RC_TIMESTAMP_MODE mode
--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -284,6 +284,7 @@
RC_QUALITY_MODE = 0, ///< quality mode
RC_BITRATE_MODE = 1, ///< bitrate mode
RC_BUFFERBASED_MODE = 2, ///< no bitrate control,only using buffer status,adjust the video quality
+ RC_TIMESTAMP_MODE = 3, //rate control based timestamp
RC_OFF_MODE = -1 ///< rate control off mode
} RC_MODES;
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -174,7 +174,7 @@
}
if ((pCfg->iRCMode != RC_OFF_MODE) && (pCfg->iRCMode != RC_QUALITY_MODE) && (pCfg->iRCMode != RC_BUFFERBASED_MODE)
- && (pCfg->iRCMode != RC_BITRATE_MODE)) {
+ && (pCfg->iRCMode != RC_BITRATE_MODE)&& (pCfg->iRCMode != RC_TIMESTAMP_MODE)) {
WelsLog (pLogCtx, WELS_LOG_ERROR, "ParamValidation(),Invalid iRCMode = %d", pCfg->iRCMode);
return ENC_RETURN_UNSUPPORTED_PARA;
}
@@ -198,10 +198,10 @@
iTotalBitrate, pCfg->iTargetBitrate);
return ENC_RETURN_INVALIDINPUT;
}
- if ((pCfg->iRCMode == RC_QUALITY_MODE) || (pCfg->iRCMode == RC_BITRATE_MODE))
+ if ((pCfg->iRCMode == RC_QUALITY_MODE) || (pCfg->iRCMode == RC_BITRATE_MODE) || (pCfg->iRCMode == RC_TIMESTAMP_MODE))
if (!pCfg->bEnableFrameSkip)
WelsLog (pLogCtx, WELS_LOG_WARNING,
- "bEnableFrameSkip = %d,bitrate can't be controlled for RC_QUALITY_MODE and RC_BITRATE_MODE without enabling skip frame.",
+ "bEnableFrameSkip = %d,bitrate can't be controlled for RC_QUALITY_MODE,RC_BITRATE_MODE and RC_TIMESTAMP_MODE without enabling skip frame.",
pCfg->bEnableFrameSkip);
}
return WelsCheckRefFrameLimitation (pLogCtx, pCfg);
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -773,7 +773,7 @@
SSpatialPicIndex* pSpatialIndexMap = &pEncCtx->sSpatialIndexMap[0];
bool bSkipMustFlag = false;
if (pEncCtx->pSvcParam->bEnableFrameSkip) {
- if ((RC_QUALITY_MODE == pEncCtx->pSvcParam->iRCMode) || (RC_BITRATE_MODE == pEncCtx->pSvcParam->iRCMode)) {
+ if ((RC_QUALITY_MODE == pEncCtx->pSvcParam->iRCMode) || (RC_BITRATE_MODE == pEncCtx->pSvcParam->iRCMode)|| (RC_TIMESTAMP_MODE == pEncCtx->pSvcParam->iRCMode)) {
for (int32_t i = 0; i < iSpatialNum; i++) {
if (UNSPECIFIED_BIT_RATE == pEncCtx->pSvcParam->sSpatialLayers[i].iMaxSpatialBitrate) {
@@ -1288,9 +1288,18 @@
pRcf->pfWelsCheckSkipBasedMaxbr = NULL;
pRcf->pfWelsUpdateBufferWhenSkip = NULL;
pRcf->pfWelsUpdateMaxBrWindowStatus = NULL;
-
break;
case RC_BITRATE_MODE:
+ pRcf->pfWelsRcPictureInit = WelsRcPictureInitGom;
+ pRcf->pfWelsRcPicDelayJudge = WelsRcFrameDelayJudge;
+ pRcf->pfWelsRcPictureInfoUpdate = WelsRcPictureInfoUpdateGom;
+ pRcf->pfWelsRcMbInit = WelsRcMbInitGom;
+ pRcf->pfWelsRcMbInfoUpdate = WelsRcMbInfoUpdateGom;
+ pRcf->pfWelsCheckSkipBasedMaxbr = CheckFrameSkipBasedMaxbr;
+ pRcf->pfWelsUpdateBufferWhenSkip = UpdateBufferWhenFrameSkipped;
+ pRcf->pfWelsUpdateMaxBrWindowStatus = UpdateMaxBrCheckWindowStatus;
+ break;
+ case RC_TIMESTAMP_MODE:
if (pEncCtx->pSvcParam->iUsageType == SCREEN_CONTENT_REAL_TIME) {
pRcf->pfWelsRcPictureInit = WelRcPictureInitScc;
pRcf->pfWelsRcPicDelayJudge = WelsRcFrameDelayJudgeScc;
@@ -1304,15 +1313,7 @@
InitRcModuleScc (pEncCtx);
} else {
- pRcf->pfWelsRcPictureInit = WelsRcPictureInitGom;
- pRcf->pfWelsRcPicDelayJudge = WelsRcFrameDelayJudge;
- pRcf->pfWelsRcPictureInfoUpdate = WelsRcPictureInfoUpdateGom;
- pRcf->pfWelsRcMbInit = WelsRcMbInitGom;
- pRcf->pfWelsRcMbInfoUpdate = WelsRcMbInfoUpdateGom;
- pRcf->pfWelsCheckSkipBasedMaxbr = CheckFrameSkipBasedMaxbr;
- pRcf->pfWelsUpdateBufferWhenSkip = UpdateBufferWhenFrameSkipped;
- pRcf->pfWelsUpdateMaxBrWindowStatus = UpdateMaxBrCheckWindowStatus;
-
+ WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_INFO, "to be done in the future");
}
break;
case RC_QUALITY_MODE:
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -793,9 +793,9 @@
if (pSvcParam->iRCMode == RC_QUALITY_MODE && pCtx->eSliceType == P_SLICE) {
iComplexityAnalysisMode = FRAME_SAD;
- } else if (pSvcParam->iRCMode == RC_BITRATE_MODE && pCtx->eSliceType == P_SLICE) {
+ } else if (((pSvcParam->iRCMode == RC_BITRATE_MODE)||(pSvcParam->iRCMode == RC_TIMESTAMP_MODE)) && pCtx->eSliceType == P_SLICE) {
iComplexityAnalysisMode = GOM_SAD;
- } else if (pSvcParam->iRCMode == RC_BITRATE_MODE && pCtx->eSliceType == I_SLICE) {
+ } else if (((pSvcParam->iRCMode == RC_BITRATE_MODE)||(pSvcParam->iRCMode == RC_TIMESTAMP_MODE)) && pCtx->eSliceType == I_SLICE) {
iComplexityAnalysisMode = GOM_VAR;
} else {
return;