commit
1fb6b91b72
@ -284,6 +284,7 @@ typedef enum {
|
||||
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;
|
||||
|
||||
|
@ -174,7 +174,7 @@ int32_t ParamValidation (SLogContext* pLogCtx, SWelsSvcCodingParam* pCfg) {
|
||||
}
|
||||
|
||||
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 @@ int32_t ParamValidation (SLogContext* pLogCtx, SWelsSvcCodingParam* pCfg) {
|
||||
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);
|
||||
|
@ -773,7 +773,7 @@ bool CheckFrameSkipBasedMaxbr (sWelsEncCtx* pEncCtx, int32_t iSpatialNum, EVideo
|
||||
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 @@ void WelsRcInitModule (sWelsEncCtx* pEncCtx, RC_MODES iRcMode) {
|
||||
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 @@ void WelsRcInitModule (sWelsEncCtx* pEncCtx, RC_MODES iRcMode) {
|
||||
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:
|
||||
|
@ -793,9 +793,9 @@ void CWelsPreProcess::AnalyzePictureComplexity (sWelsEncCtx* pCtx, SPicture* pCu
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user