ref: 36cfb3bd32a287fc4abebe447fae9a5080f1100c
parent: 4cdee3b2d1f1ae34cb9c4f31baf890c0f0e941a2
author: ruil2 <ruil2@cisco.com>
date: Mon Jul 14 09:57:03 EDT 2014
add buffer based rc
--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -198,6 +198,7 @@
RC_QUALITY_MODE = 0, //Quality mode
RC_BITRATE_MODE = 1, //Bitrate mode
RC_LOW_BW_MODE = 2, //bitrate limited mode
+ RC_BUFFERBASED_MODE = 3,//no bitrate control,only using buffer status,adjust the video quality
RC_OFF_MODE = -1, // rate control off mode
} RC_MODES;
--- a/codec/encoder/core/inc/rc.h
+++ b/codec/encoder/core/inc/rc.h
@@ -52,8 +52,6 @@
//trace
#define GOM_TRACE_FLAG 0
#define GOM_H_SCC 8
-#define WELS_RC_DISABLE 0
-#define WELS_RC_GOM 1
enum {
BITS_NORMAL,
@@ -71,6 +69,8 @@
MAX_LOW_BR_QP = 42,
MIN_IDR_QP = 26,
MAX_IDR_QP = 32,
+MIN_SCREEN_QP = 26,
+MAX_SCREEN_QP = 32,
DELTA_QP = 2,
DELTA_QP_BGD_THD = 3,
@@ -232,7 +232,7 @@
PWelsRCMBInfoUpdateFunc pfWelsRcMbInfoUpdate;
} SWelsRcFunc;
-void WelsRcInitModule (void* pCtx, int32_t iModule);
+void WelsRcInitModule (void* pCtx,RC_MODES iRcMode);
void WelsRcFreeMemory (void* pCtx);
}
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2042,7 +2042,7 @@
if (pCodingParam->iMultipleThreadIdc > 1)
iRet = CreateSliceThreads (pCtx);
- WelsRcInitModule (pCtx, pCtx->pSvcParam->iRCMode != RC_OFF_MODE ? WELS_RC_GOM : WELS_RC_DISABLE);
+ WelsRcInitModule (pCtx, pCtx->pSvcParam->iRCMode);
pCtx->pVpp = new CWelsPreProcess (pCtx);
if (pCtx->pVpp == NULL) {
@@ -2948,17 +2948,19 @@
bool CheckFrameSkipBasedMaxbr (sWelsEncCtx* pCtx, int32_t iSpatialNum) {
SSpatialPicIndex* pSpatialIndexMap = &pCtx->sSpatialIndexMap[0];
bool bSkipMustFlag = false;
-
- if (RC_OFF_MODE != pCtx->pSvcParam->iRCMode && true == pCtx->pSvcParam->bEnableFrameSkip) {
- for (int32_t i = 0; i < iSpatialNum; i++) {
- if (0 == pCtx->pSvcParam->sSpatialLayers[i].iMaxSpatialBitrate) {
- break;
- }
- pCtx->uiDependencyId = (uint8_t) (pSpatialIndexMap + i)->iDid;
- pCtx->pFuncList->pfRc.pfWelsRcPicDelayJudge (pCtx);
- if (true == pCtx->pWelsSvcRc[pCtx->uiDependencyId].bSkipFlag) {
- bSkipMustFlag = true;
- break;
+ if (pCtx->pSvcParam->bEnableFrameSkip) {
+ if ((RC_QUALITY_MODE == pCtx->pSvcParam->iRCMode) || (RC_BITRATE_MODE == pCtx->pSvcParam->iRCMode)
+ || (RC_LOW_BW_MODE == pCtx->pSvcParam->iRCMode)) {
+ for (int32_t i = 0; i < iSpatialNum; i++) {
+ if (0 == pCtx->pSvcParam->sSpatialLayers[i].iMaxSpatialBitrate) {
+ break;
+ }
+ pCtx->uiDependencyId = (uint8_t) (pSpatialIndexMap + i)->iDid;
+ pCtx->pFuncList->pfRc.pfWelsRcPicDelayJudge (pCtx);
+ if (true == pCtx->pWelsSvcRc[pCtx->uiDependencyId].bSkipFlag) {
+ bSkipMustFlag = true;
+ break;
+ }
}
}
}
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -999,13 +999,28 @@
void WelsRcMbInfoUpdateDisable (void* pCtx, SMB* pCurMb, int32_t iCostLuma, SSlice* pSlice) {
}
+void WelRcPictureInitBufferBasedQp (void* pCtx) {
+ sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
+ SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
+ SVAAFrameInfo* pVaa = static_cast<SVAAFrameInfo*> (pEncCtx->pVaa);
-void WelsRcInitModule (void* pCtx, int32_t iModule) {
+ int32_t iMinQp = MIN_SCREEN_QP;
+ if (pVaa->eSceneChangeIdc == LARGE_CHANGED_SCENE)
+ iMinQp = MIN_SCREEN_QP + 2;
+ else if (pVaa->eSceneChangeIdc == MEDIUM_CHANGED_SCENE)
+ iMinQp = MIN_SCREEN_QP + 1;
+ else
+ iMinQp = MIN_SCREEN_QP;
+
+ pEncCtx->iGlobalQp += pEncCtx->iDropNumber;
+ pEncCtx->iGlobalQp = WELS_CLIP3 (pEncCtx->iGlobalQp, MIN_SCREEN_QP, MAX_SCREEN_QP);
+}
+void WelsRcInitModule (void* pCtx, RC_MODES iRcMode) {
sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
SWelsRcFunc* pRcf = &pEncCtx->pFuncList->pfRc;
- switch (iModule) {
- case WELS_RC_DISABLE:
+ switch (iRcMode) {
+ case RC_OFF_MODE:
pRcf->pfWelsRcPictureInit = WelsRcPictureInitDisable;
pRcf->pfWelsRcPicDelayJudge = NULL;
pRcf->pfWelsRcPictureInfoUpdate = WelsRcPictureInfoUpdateDisable;
@@ -1012,7 +1027,16 @@
pRcf->pfWelsRcMbInit = WelsRcMbInitDisable;
pRcf->pfWelsRcMbInfoUpdate = WelsRcMbInfoUpdateDisable;
break;
- case WELS_RC_GOM:
+ case RC_BUFFERBASED_MODE:
+ pRcf->pfWelsRcPictureInit = WelRcPictureInitBufferBasedQp;
+ pRcf->pfWelsRcPicDelayJudge = NULL;
+ pRcf->pfWelsRcPictureInfoUpdate = WelsRcPictureInfoUpdateDisable;
+ pRcf->pfWelsRcMbInit = WelsRcMbInitDisable;
+ pRcf->pfWelsRcMbInfoUpdate = WelsRcMbInfoUpdateDisable;
+ break;
+ case RC_QUALITY_MODE:
+ case RC_BITRATE_MODE:
+ case RC_LOW_BW_MODE:
default:
pRcf->pfWelsRcPictureInit = WelsRcPictureInitGom;
pRcf->pfWelsRcPicDelayJudge = WelsRcFrameDelayJudge;
--- a/testbin/welsenc.cfg
+++ b/testbin/welsenc.cfg
@@ -29,7 +29,8 @@
MultipleThreadIdc 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#============================== RATE CONTROL ==============================
-RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode; -1: rc off mode
+RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode;
+ # 3: buffer based mode,can't control bitrate; -1: rc off mode;
TargetBitrate 5000 # Unit: kbps, controled by EnableRC also
MaxOverallBitrate 6000 # Unit: kbps, max bitrate overall
EnableFrameSkip 1 #Enable Frame Skip
--- a/testbin/welsenc_arbitrary_res.cfg
+++ b/testbin/welsenc_arbitrary_res.cfg
@@ -30,7 +30,8 @@
MultipleThreadIdc 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#============================== RATE CONTROL ==============================
-RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode; -1: rc off mode
+RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode;
+ # 3: buffer based mode,can't control bitrate; -1: rc off mode;
TargetBitrate 5000 # Unit: kbps, controled by EnableRC also
MaxOverallBitrate 6000 # Unit: kbps, max bitrate overall
--- a/testbin/welsenc_ios.cfg
+++ b/testbin/welsenc_ios.cfg
@@ -30,7 +30,8 @@
MultipleThreadIdc 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#============================== RATE CONTROL ==============================
-RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode; -1: rc off mode
+RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode;
+ # 3: buffer based mode,can't control bitrate; -1: rc off mode;
TargetBitrate 5000 # Unit: kbps, controled by EnableRC also
MaxOverallBitrate 6000 # Unit: kbps, max bitrate overall
EnableFrameSkip 1 #Enable Frame Skip
--- a/testbin/welsenc_vd_1d.cfg
+++ b/testbin/welsenc_vd_1d.cfg
@@ -30,7 +30,8 @@
MultipleThreadIdc 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#============================== RATE CONTROL ==============================
-RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode; -1: rc off mode
+RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode;
+ # 3: buffer based mode,can't control bitrate; -1: rc off mode;
TargetBitrate 5000 # Unit: kbps, controled by EnableRC also
MaxOverallBitrate 6000 # Unit: kbps, max bitrate overall
--- a/testbin/welsenc_vd_rc.cfg
+++ b/testbin/welsenc_vd_rc.cfg
@@ -30,7 +30,8 @@
MultipleThreadIdc 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#============================== RATE CONTROL ==============================
-RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode; -1: rc off mode
+RCMode 0 # 0: quality mode; 1: bitrate mode; 2: bitrate limited mode;
+ # 3: buffer based mode,can't control bitrate; -1: rc off mode;
TargetBitrate 600 # Unit: kbps, controled by EnableRC also
MaxOverallBitrate 800 # Unit: kbps, max bitrate overall