ref: 7acf0e5b0212143b3cb9d5710f7618fa225c138e
parent: 91cd93e5d0c69fa2f9729c3f042c845e8f44296c
author: ruil2 <ruil2@cisco.com>
date: Mon Jun 16 13:17:24 EDT 2014
cleanup interface parameters
--- a/codec/encoder/core/inc/au_set.h
+++ b/codec/encoder/core/inc/au_set.h
@@ -98,25 +98,28 @@
/*!
* \brief initialize pSps based on configurable parameters in svc
* \param pSps SWelsSPS*
- * \param layer_param SDLayerParam*, dependency layer parameter
+ * \param pLayerParam SSpatialLayerConfig dependency layer parameter
+ * \param pLayerParamInternal SSpatialLayerInternal*, internal dependency layer parameter
* \param iSpsId SPS Id
* \return 0 - successful
* 1 - failed
*/
-int32_t WelsInitSps (SWelsSPS* pSps, SDLayerParam* pLayerParam, const uint32_t kuiIntraPeriod,
- const int32_t kiNumRefFrame,
+int32_t WelsInitSps (SWelsSPS* pSps, SSpatialLayerConfig* pLayerParam, SSpatialLayerInternal* pLayerParamInternal,
+ const uint32_t kuiIntraPeriod, const int32_t kiNumRefFrame,
const uint32_t kiSpsId, const bool kbEnableFrameCropping, bool bEnableRc);
/*!
* \brief initialize subset pSps based on configurable parameters in svc
* \param pSubsetSps SSubsetSps*
- * \param layer_param SDLayerParam*, dependency layer parameter
+ * \param pLayerParam SSpatialLayerConfig dependency layer parameter
+ * \param pLayerParamInternal SSpatialLayerInternal*, internal dependency layer parameter
* \param kiSpsId SPS Id
* \return 0 - successful
* 1 - failed
*/
-int32_t WelsInitSubsetSps (SSubsetSps* pSubsetSps, SDLayerParam* pLayerParam, const uint32_t kuiIntraPeriod,
- const int32_t kiNumRefFrame,
+int32_t WelsInitSubsetSps (SSubsetSps* pSubsetSps, SSpatialLayerConfig* pLayerParam,
+ SSpatialLayerInternal* pLayerParamInternal,
+ const uint32_t kuiIntraPeriod, const int32_t kiNumRefFrame,
const uint32_t kiSpsId, const bool kbEnableFrameCropping, bool bEnableRc);
/*!
--- a/codec/encoder/core/inc/encoder.h
+++ b/codec/encoder/core/inc/encoder.h
@@ -86,7 +86,7 @@
EVideoFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum);
-int32_t GetTemporalLevel (SDLayerParam* fDlp, const int32_t kiFrameNum, const int32_t kiGopSize);
+int32_t GetTemporalLevel (SSpatialLayerInternal* fDlp, const int32_t kiFrameNum, const int32_t kiGopSize);
/*!
* \brief Dump reconstruction for dependency layer
*/
--- a/codec/encoder/core/inc/param_svc.h
+++ b/codec/encoder/core/inc/param_svc.h
@@ -80,24 +80,11 @@
typedef struct TagDLayerParam {
int32_t iActualWidth; // input source picture actual width
int32_t iActualHeight; // input source picture actual height
- int32_t iFrameWidth; // frame width
- int32_t iFrameHeight; // frame height
-
- int32_t iSpatialBitrate;
-
- /* temporal settings related */
int32_t iTemporalResolution;
int32_t iDecompositionStages;
uint8_t uiCodingIdx2TemporalId[ (1 << MAX_TEMPORAL_LEVEL) + 1];
- uint8_t uiProfileIdc; // value of profile IDC (0 for auto-detection)
- uint8_t uiLevelIdc;
int8_t iHighestTemporalId;
-// uint8_t uiDependencyId;
- int8_t iDLayerQp;
-
- SSliceConfig sSliceCfg; // multiple slice options
-
float fInputFrameRate; // input frame rate
float fOutputFrameRate; // output frame rate
@@ -104,13 +91,13 @@
#ifdef ENABLE_FRAME_DUMP
char sRecFileName[MAX_FNAME_LEN]; // file to be constructed
#endif//ENABLE_FRAME_DUMP
-} SDLayerParam;
+} SSpatialLayerInternal;
/*
* Cisco OpenH264 Encoder Parameter Configuration
*/
typedef struct TagWelsSvcCodingParam: SEncParamExt {
- SDLayerParam sDependencyLayers[MAX_DEPENDENCY_LAYER];
+ SSpatialLayerInternal sDependencyLayers[MAX_DEPENDENCY_LAYER];
/* General */
uint32_t uiGopSize; // GOP size (at maximal frame rate: 16)
@@ -217,19 +204,19 @@
iDecompStages = 0; // GOP size dependency, unknown here and be revised later
- memset (sDependencyLayers, 0, sizeof (SDLayerParam)*MAX_DEPENDENCY_LAYER);
+ memset (sDependencyLayers, 0, sizeof (SSpatialLayerInternal)*MAX_DEPENDENCY_LAYER);
+ memset (sSpatialLayers, 0 , sizeof (SSpatialLayerConfig)*MAX_SPATIAL_LAYER_NUM);
-
//init multi-slice
- sDependencyLayers[0].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
- sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 1500;
- sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ sSpatialLayers[0].sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 1500;
+ sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = 1;
const int32_t kiLesserSliceNum = ((MAX_SLICES_NUM < MAX_SLICES_NUM_TMP) ? MAX_SLICES_NUM : MAX_SLICES_NUM_TMP);
for (int32_t idx = 0; idx < kiLesserSliceNum; idx++)
- sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceMbNum[idx] = 960;
- sDependencyLayers[0].iDLayerQp = SVC_QUALITY_BASE_QP;
+ sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceMbNum[idx] = 960;
+ sSpatialLayers[0].iDLayerQp = SVC_QUALITY_BASE_QP;
}
@@ -251,13 +238,13 @@
iRCMode = pCodingParam.iRCMode; // rc mode
int8_t iIdxSpatial = 0;
- uint8_t uiProfileIdc = PRO_BASELINE;
+ EProfileIdc uiProfileIdc = PRO_BASELINE;
- SDLayerParam* pDlp = &sDependencyLayers[0];
+ SSpatialLayerInternal* pDlp = &sDependencyLayers[0];
while (iIdxSpatial < iSpatialLayerNum) {
- pDlp->uiProfileIdc = uiProfileIdc;
+ sSpatialLayers->uiProfileIdc = uiProfileIdc;
sSpatialLayers[iIdxSpatial].fFrameRate = WELS_CLIP3 (pCodingParam.fMaxFrameRate,
MIN_FRAME_RATE, MAX_FRAME_RATE);
pDlp->fInputFrameRate =
@@ -267,15 +254,12 @@
pDlp->sRecFileName[0] = '\0'; // file to be constructed
#endif//ENABLE_FRAME_DUMP
pDlp->iActualWidth = sSpatialLayers[iIdxSpatial].iVideoWidth = iPicWidth;
- pDlp->iFrameWidth = pDlp->iActualWidth;
-
pDlp->iActualHeight = sSpatialLayers[iIdxSpatial].iVideoHeight = iPicHeight;
- pDlp->iFrameHeight = pDlp->iActualHeight;
- pDlp->iSpatialBitrate =
+ sSpatialLayers->iSpatialBitrate =
sSpatialLayers[iIdxSpatial].iSpatialBitrate = pCodingParam.iTargetBitrate; // target bitrate for current spatial layer
- pDlp->iDLayerQp = SVC_QUALITY_BASE_QP;
+ sSpatialLayers->iDLayerQp = SVC_QUALITY_BASE_QP;
uiProfileIdc = PRO_SCALABLE_BASELINE;
++ pDlp;
@@ -390,18 +374,20 @@
pCodingParam.bEnableSpsPpsIdAddition;//For SVC meeting application, to avoid mosaic issue caused by cross-IDR reference.
//SHOULD enable this feature.
- SDLayerParam* pDlp = &sDependencyLayers[0];
+ SSpatialLayerInternal* pDlp = &sDependencyLayers[0];
+ SSpatialLayerConfig* pSpatialLayer = &sSpatialLayers[0];
float fMaxFr = .0f;
- uint8_t uiProfileIdc = PRO_BASELINE;
+ EProfileIdc uiProfileIdc = PRO_BASELINE;
int8_t iIdxSpatial = 0;
while (iIdxSpatial < iSpatialLayerNum) {
- pDlp->uiProfileIdc = (pCodingParam.sSpatialLayers[iIdxSpatial].uiProfileIdc == PRO_UNKNOWN) ? uiProfileIdc :
- pCodingParam.sSpatialLayers[iIdxSpatial].uiProfileIdc;
- pDlp->uiLevelIdc = (pCodingParam.sSpatialLayers[iIdxSpatial].uiLevelIdc == LEVEL_UNKNOWN) ? LEVEL_5_0 :
- pCodingParam.sSpatialLayers[iIdxSpatial].uiLevelIdc;
+ pSpatialLayer->uiProfileIdc = (pCodingParam.sSpatialLayers[iIdxSpatial].uiProfileIdc == PRO_UNKNOWN) ? uiProfileIdc :
+ pCodingParam.sSpatialLayers[iIdxSpatial].uiProfileIdc;
+ pSpatialLayer->uiLevelIdc = (pCodingParam.sSpatialLayers[iIdxSpatial].uiLevelIdc == LEVEL_UNKNOWN) ? LEVEL_5_0 :
+ pCodingParam.sSpatialLayers[iIdxSpatial].uiLevelIdc;
float fLayerFrameRate = WELS_CLIP3 (pCodingParam.sSpatialLayers[iIdxSpatial].fFrameRate,
MIN_FRAME_RATE, fParamMaxFrameRate);
+ pSpatialLayer->fFrameRate =
pDlp->fInputFrameRate =
pDlp->fOutputFrameRate = WELS_CLIP3 (fLayerFrameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);
if (pDlp->fInputFrameRate > fMaxFr + EPSN)
@@ -410,26 +396,27 @@
#ifdef ENABLE_FRAME_DUMP
pDlp->sRecFileName[0] = '\0'; // file to be constructed
#endif//ENABLE_FRAME_DUMP
- pDlp->iFrameWidth = pCodingParam.sSpatialLayers[iIdxSpatial].iVideoWidth; // frame width
- pDlp->iFrameHeight = pCodingParam.sSpatialLayers[iIdxSpatial].iVideoHeight;// frame height
- pDlp->iSpatialBitrate =
+ pSpatialLayer->iVideoWidth = pCodingParam.sSpatialLayers[iIdxSpatial].iVideoWidth; // frame width
+ pSpatialLayer->iVideoHeight = pCodingParam.sSpatialLayers[iIdxSpatial].iVideoHeight;// frame height
+ pSpatialLayer->iSpatialBitrate =
pCodingParam.sSpatialLayers[iIdxSpatial].iSpatialBitrate; // target bitrate for current spatial layer
//multi slice
- pDlp->sSliceCfg.uiSliceMode = pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.uiSliceMode;
- pDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint
+ pSpatialLayer->sSliceCfg.uiSliceMode = pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.uiSliceMode;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint
= (uint32_t) (pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.sSliceArgument.uiSliceSizeConstraint);
- pDlp->sSliceCfg.sSliceArgument.uiSliceNum
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum
= pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.sSliceArgument.uiSliceNum;
const int32_t kiLesserSliceNum = ((MAX_SLICES_NUM < MAX_SLICES_NUM_TMP) ? MAX_SLICES_NUM : MAX_SLICES_NUM_TMP);
- memcpy (pDlp->sSliceCfg.sSliceArgument.uiSliceMbNum,
+ memcpy (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum,
pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.sSliceArgument.uiSliceMbNum, // confirmed_safe_unsafe_usage
kiLesserSliceNum * sizeof (uint32_t)) ;
- pDlp->iDLayerQp = pCodingParam.sSpatialLayers[iIdxSpatial].iDLayerQp;
+ pSpatialLayer->iDLayerQp = pCodingParam.sSpatialLayers[iIdxSpatial].iDLayerQp;
uiProfileIdc = PRO_SCALABLE_BASELINE;
++ pDlp;
+ ++ pSpatialLayer;
++ iIdxSpatial;
}
@@ -444,15 +431,14 @@
void SetActualPicResolution() {
int32_t iSpatialIdx = iSpatialLayerNum - 1;
- SDLayerParam* pDlayer = &sDependencyLayers[iSpatialIdx];
-
for (; iSpatialIdx >= 0; iSpatialIdx --) {
- pDlayer = &sDependencyLayers[iSpatialIdx];
+ SSpatialLayerInternal* pDlayerInternal = &sDependencyLayers[iSpatialIdx];
+ SSpatialLayerConfig* pDlayer = &sSpatialLayers[iSpatialIdx];
- pDlayer->iActualWidth = pDlayer->iFrameWidth;
- pDlayer->iActualHeight = pDlayer->iFrameHeight;
- pDlayer->iFrameWidth = WELS_ALIGN (pDlayer->iActualWidth, MB_WIDTH_LUMA);
- pDlayer->iFrameHeight = WELS_ALIGN (pDlayer->iActualHeight, MB_HEIGHT_LUMA);
+ pDlayerInternal->iActualWidth = pDlayer->iVideoWidth;
+ pDlayerInternal->iActualHeight = pDlayer->iVideoHeight;
+ pDlayer->iVideoWidth = WELS_ALIGN (pDlayerInternal->iActualWidth, MB_WIDTH_LUMA);
+ pDlayer->iVideoHeight = WELS_ALIGN (pDlayerInternal->iActualHeight, MB_HEIGHT_LUMA);
}
}
@@ -465,8 +451,9 @@
const int32_t iDecStages = WELS_LOG2 (
uiGopSize); // (int8_t)GetLogFactor(1.0f, 1.0f * pcfg->uiGopSize); //log2(uiGopSize)
const uint8_t* pTemporalIdList = &g_kuiTemporalIdListTable[iDecStages][0];
- SDLayerParam* pDlp = &sDependencyLayers[0];
- uint8_t uiProfileIdc = PRO_BASELINE;
+ SSpatialLayerInternal* pDlp = &sDependencyLayers[0];
+ SSpatialLayerConfig* pSpatialLayer = &sSpatialLayers[0];
+ EProfileIdc uiProfileIdc = PRO_BASELINE;
int8_t i = 0;
while (i < iSpatialLayerNum) {
@@ -476,7 +463,7 @@
int8_t iMaxTemporalId = 0;
memset (pDlp->uiCodingIdx2TemporalId, INVALID_TEMPORAL_ID, sizeof (pDlp->uiCodingIdx2TemporalId));
- pDlp->uiProfileIdc = uiProfileIdc; // PRO_BASELINE, PRO_SCALABLE_BASELINE;
+ pSpatialLayer->uiProfileIdc = uiProfileIdc; // PRO_BASELINE, PRO_SCALABLE_BASELINE;
iNotCodedMask = (1 << (kuiLogFactorInOutRate + kuiLogFactorMaxInRate)) - 1;
for (uint32_t uiFrameIdx = 0; uiFrameIdx <= uiGopSize; ++ uiFrameIdx) {
@@ -495,6 +482,7 @@
uiProfileIdc = PRO_SCALABLE_BASELINE;
++ pDlp;
+ ++ pSpatialLayer;
++ i;
}
iDecompStages = (int8_t)iDecStages;
--- a/codec/encoder/core/src/au_set.cpp
+++ b/codec/encoder/core/src/au_set.cpp
@@ -356,14 +356,14 @@
return (iWidth > iActualWidth) || (iHeight > iActualHeight);
}
-int32_t WelsInitSps (SWelsSPS* pSps, SDLayerParam* pLayerParam, const uint32_t kuiIntraPeriod,
- const int32_t kiNumRefFrame,
+int32_t WelsInitSps (SWelsSPS* pSps, SSpatialLayerConfig* pLayerParam, SSpatialLayerInternal* pLayerParamInternal,
+ const uint32_t kuiIntraPeriod, const int32_t kiNumRefFrame,
const uint32_t kuiSpsId, const bool kbEnableFrameCropping, bool bEnableRc) {
memset (pSps, 0, sizeof (SWelsSPS));
pSps->uiSpsId = kuiSpsId;
- pSps->iMbWidth = (pLayerParam->iFrameWidth + 15) >> 4;
- pSps->iMbHeight = (pLayerParam->iFrameHeight + 15) >> 4;
+ pSps->iMbWidth = (pLayerParam->iVideoWidth + 15) >> 4;
+ pSps->iMbHeight = (pLayerParam->iVideoHeight + 15) >> 4;
if (0 == kuiIntraPeriod) {
//max value of both iFrameNum and POC are 2^16-1, in our encoder, iPOC=2*iFrameNum, so max of iFrameNum should be 2^15-1.--
@@ -380,8 +380,8 @@
if (kbEnableFrameCropping) {
// TODO: get frame_crop_left_offset, frame_crop_right_offset, frame_crop_top_offset, frame_crop_bottom_offset
- pSps->bFrameCroppingFlag = WelsGetPaddingOffset (pLayerParam->iActualWidth, pLayerParam->iActualHeight,
- pLayerParam->iFrameWidth, pLayerParam->iFrameHeight, pSps->sFrameCrop);
+ pSps->bFrameCroppingFlag = WelsGetPaddingOffset (pLayerParamInternal->iActualWidth, pLayerParamInternal->iActualHeight,
+ pLayerParam->iVideoWidth, pLayerParam->iVideoHeight, pSps->sFrameCrop);
} else {
pSps->bFrameCroppingFlag = false;
}
@@ -389,9 +389,9 @@
pSps->uiProfileIdc = pLayerParam->uiProfileIdc ? pLayerParam->uiProfileIdc : PRO_BASELINE;
if (bEnableRc) //fixed QP condition
- pSps->iLevelIdc = WelsGetLevelIdc (pSps, pLayerParam->fOutputFrameRate, pLayerParam->iSpatialBitrate);
+ pSps->iLevelIdc = WelsGetLevelIdc (pSps, pLayerParamInternal->fOutputFrameRate, pLayerParam->iSpatialBitrate);
else
- pSps->iLevelIdc = WelsGetLevelIdc (pSps, pLayerParam->fOutputFrameRate,
+ pSps->iLevelIdc = WelsGetLevelIdc (pSps, pLayerParamInternal->fOutputFrameRate,
0); // Set tar_br = 0 to remove the bitrate constraint; a better way is to set actual tar_br as 0
//for Scalable Baseline, Scalable High, and Scalable High Intra profiles.If level_idc is equal to 9, the indicated level is level 1b.
@@ -405,14 +405,16 @@
}
-int32_t WelsInitSubsetSps (SSubsetSps* pSubsetSps, SDLayerParam* pLayerParam, const uint32_t kuiIntraPeriod,
- const int32_t kiNumRefFrame,
+int32_t WelsInitSubsetSps (SSubsetSps* pSubsetSps, SSpatialLayerConfig* pLayerParam,
+ SSpatialLayerInternal* pLayerParamInternal,
+ const uint32_t kuiIntraPeriod, const int32_t kiNumRefFrame,
const uint32_t kuiSpsId, const bool kbEnableFrameCropping, bool bEnableRc) {
SWelsSPS* pSps = &pSubsetSps->pSps;
memset (pSubsetSps, 0, sizeof (SSubsetSps));
- WelsInitSps (pSps, pLayerParam, kuiIntraPeriod, kiNumRefFrame, kuiSpsId, kbEnableFrameCropping, bEnableRc);
+ WelsInitSps (pSps, pLayerParam, pLayerParamInternal, kuiIntraPeriod, kiNumRefFrame, kuiSpsId, kbEnableFrameCropping,
+ bEnableRc);
pSps->uiProfileIdc = (pLayerParam->uiProfileIdc >= PRO_SCALABLE_BASELINE) ? pLayerParam->uiProfileIdc :
PRO_SCALABLE_BASELINE;
--- a/codec/encoder/core/src/deblocking.cpp
+++ b/codec/encoder/core/src/deblocking.cpp
@@ -719,7 +719,7 @@
void PerformDeblockingFilter (sWelsEncCtx* pEnc) {
const int32_t kiCurDid = pEnc->uiDependencyId;
SWelsSvcCodingParam* pSvcParam = pEnc->pSvcParam;
- SDLayerParam* pDlp = &pSvcParam->sDependencyLayers[kiCurDid];
+ SSpatialLayerConfig* pSpatialLayer = &pSvcParam->sSpatialLayers[kiCurDid];
SDqLayer* pCurLayer = pEnc->pCurDqLayer;
if (pCurLayer->iLoopFilterDisableIdc == 0) {
@@ -728,7 +728,7 @@
int32_t iSliceCount = 0;
int32_t iSliceIdx = 0;
- if (SM_DYN_SLICE != pDlp->sSliceCfg.uiSliceMode) {
+ if (SM_DYN_SLICE != pSpatialLayer->sSliceCfg.uiSliceMode) {
iSliceCount = GetCurrentSliceNum (pCurLayer->pSliceEncCtx);
do {
DeblockingFilterSliceAvcbase (pCurLayer, pEnc->pFuncList, iSliceIdx);
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -85,7 +85,7 @@
return ENC_RETURN_UNSUPPORTED_PARA;
}
for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
- SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
+ SSpatialLayerInternal* fDlp = &pCfg->sDependencyLayers[i];
if (fDlp->fOutputFrameRate > fDlp->fInputFrameRate || (fDlp->fInputFrameRate >= -fEpsn
&& fDlp->fInputFrameRate <= fEpsn)
|| (fDlp->fOutputFrameRate >= -fEpsn && fDlp->fOutputFrameRate <= fEpsn)) {
@@ -103,7 +103,7 @@
}
for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
- SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
+ SSpatialLayerInternal* fDlp = &pCfg->sDependencyLayers[i];
if (fDlp->fInputFrameRate > fMaxFrameRate)
fMaxFrameRate = fDlp->fInputFrameRate;
}
@@ -117,8 +117,8 @@
if (pCfg->iRCMode != RC_OFF_MODE) {
int32_t iTotalBitrate = 0;
for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
- SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
- iTotalBitrate += fDlp->iSpatialBitrate;
+ SSpatialLayerConfig* pSpatialLayer = &pCfg->sSpatialLayers[i];
+ iTotalBitrate += pSpatialLayer->iSpatialBitrate;
}
if (iTotalBitrate > pCfg->iTargetBitrate) {
WelsLog (pLogCtx, WELS_LOG_ERROR,
@@ -190,9 +190,9 @@
}
for (i = 0; i < pCodingParam->iSpatialLayerNum; ++ i) {
- SDLayerParam* fDlp = &pCodingParam->sDependencyLayers[i];
- const int32_t kiPicWidth = fDlp->iFrameWidth;
- const int32_t kiPicHeight = fDlp->iFrameHeight;
+ SSpatialLayerConfig* pSpatialLayer = &pCodingParam->sSpatialLayers[i];
+ const int32_t kiPicWidth = pSpatialLayer->iVideoWidth;
+ const int32_t kiPicHeight = pSpatialLayer->iVideoHeight;
uint32_t iMbWidth = 0;
uint32_t iMbHeight = 0;
int32_t iMbNumInFrame = 0;
@@ -209,118 +209,119 @@
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (fDlp->sSliceCfg.uiSliceMode >= SM_RESERVED) {
+ if (pSpatialLayer->sSliceCfg.uiSliceMode >= SM_RESERVED) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMode (%d) settings!\n",
- fDlp->sSliceCfg.uiSliceMode);
+ pSpatialLayer->sSliceCfg.uiSliceMode);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if ((pCodingParam->uiMaxNalSize != 0) && (fDlp->sSliceCfg.uiSliceMode != SM_DYN_SLICE)) {
+ if ((pCodingParam->uiMaxNalSize != 0) && (pSpatialLayer->sSliceCfg.uiSliceMode != SM_DYN_SLICE)) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMode (%d) settings!,MaxNalSize = %d\n",
- fDlp->sSliceCfg.uiSliceMode, pCodingParam->uiMaxNalSize);
+ pSpatialLayer->sSliceCfg.uiSliceMode, pCodingParam->uiMaxNalSize);
return ENC_RETURN_UNSUPPORTED_PARA;
}
//check pSlice settings under multi-pSlice
if (kiPicWidth <= 16 && kiPicHeight <= 16) {
//only have one MB, set to single_slice
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
}
- switch (fDlp->sSliceCfg.uiSliceMode) {
+ switch (pSpatialLayer->sSliceCfg.uiSliceMode) {
case SM_SINGLE_SLICE:
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = 0;
for (iIdx = 0; iIdx < MAX_SLICES_NUM; iIdx++) {
- fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0;
}
break;
case SM_FIXEDSLCNUM_SLICE: {
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
iMbNumInFrame = iMbWidth * iMbHeight;
iMaxSliceNum = MAX_SLICES_NUM;
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0
- || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum <= 0
+ || pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
WelsLog (pCtx, WELS_LOG_DEBUG,
"ParamValidationExt(), uiSliceNum(%d) you set for SM_FIXEDSLCNUM_SLICE, now turn to SM_SINGLE_SLICE type!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum);
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
break;
}
if (pCodingParam->iRCMode != RC_OFF_MODE) { // multiple slices verify with gom
//check uiSliceNum
- GomValidCheckSliceNum (iMbWidth, iMbHeight, &fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
- assert (fDlp->sSliceCfg.sSliceArgument.uiSliceNum > 1);
+ GomValidCheckSliceNum (iMbWidth, iMbHeight, &pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum);
+ assert (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum > 1);
//set uiSliceMbNum with current uiSliceNum
- GomValidCheckSliceMbNum (iMbWidth, iMbHeight, &fDlp->sSliceCfg.sSliceArgument);
+ GomValidCheckSliceMbNum (iMbWidth, iMbHeight, &pSpatialLayer->sSliceCfg.sSliceArgument);
} else if (!CheckFixedSliceNumMultiSliceSetting (iMbNumInFrame,
- &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
+ &pSpatialLayer->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
//check uiSliceMbNum with current uiSliceNum
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
return ENC_RETURN_UNSUPPORTED_PARA;
}
// considering the coding efficient and performance, iCountMbNum constraint by MIN_NUM_MB_PER_SLICE condition of multi-pSlice mode settting
if (iMbNumInFrame <= MIN_NUM_MB_PER_SLICE) {
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
break;
case SM_AUTO_SLICE: {
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
}
break;
case SM_RASTER_SLICE: {
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
iMbNumInFrame = iMbWidth * iMbHeight;
iMaxSliceNum = MAX_SLICES_NUM;
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0] <= 0) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0] <= 0) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (!CheckRasterMultiSliceSetting (iMbNumInFrame, &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
+ if (!CheckRasterMultiSliceSetting (iMbNumInFrame,
+ &pSpatialLayer->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0
- || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { // verify interleave mode settings
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum <= 0
+ || pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { // verify interleave mode settings
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) in SM_RASTER_SLICE settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
WelsLog (pCtx, WELS_LOG_ERROR,
"ParamValidationExt(), pSlice setting for SM_RASTER_SLICE now turn to SM_SINGLE_SLICE!\n");
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
break;
}
- if ((pCodingParam->iRCMode != RC_OFF_MODE) && fDlp->sSliceCfg.sSliceArgument.uiSliceNum > 1) {
+ if ((pCodingParam->iRCMode != RC_OFF_MODE) && pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum > 1) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), WARNING: GOM based RC do not support SM_RASTER_SLICE!\n");
}
// considering the coding efficient and performance, iCountMbNum constraint by MIN_NUM_MB_PER_SLICE condition of multi-pSlice mode settting
if (iMbNumInFrame <= MIN_NUM_MB_PER_SLICE) {
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
break;
case SM_ROWMB_SLICE: {
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
@@ -329,16 +330,17 @@
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings more than MAX!\n", iMbHeight);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = iMbHeight;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = iMbHeight;
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum <= 0) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum);
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (!CheckRowMbMultiSliceSetting (iMbWidth, &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
+ if (!CheckRowMbMultiSliceSetting (iMbWidth,
+ &pSpatialLayer->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
return ENC_RETURN_UNSUPPORTED_PARA;
}
}
@@ -346,9 +348,9 @@
case SM_DYN_SLICE: {
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint <= 0) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint <= 0) {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid iSliceSize (%d) settings!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint);
return ENC_RETURN_UNSUPPORTED_PARA;
}
@@ -358,17 +360,18 @@
return ENC_RETURN_UNSUPPORTED_PARA;
}
- if (fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint > (pCodingParam->uiMaxNalSize - NAL_HEADER_ADD_0X30BYTES)) {
+ if (pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint > (pCodingParam->uiMaxNalSize -
+ NAL_HEADER_ADD_0X30BYTES)) {
WelsLog (pCtx, WELS_LOG_WARNING,
"ParamValidationExt(), slice mode = SM_DYN_SLICE, uiSliceSizeConstraint = %d ,uiMaxNalsize = %d!\n",
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint, pCodingParam->uiMaxNalSize);
- fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = pCodingParam->uiMaxNalSize - NAL_HEADER_ADD_0X30BYTES;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint, pCodingParam->uiMaxNalSize);
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = pCodingParam->uiMaxNalSize - NAL_HEADER_ADD_0X30BYTES;
}
// considering the coding efficient and performance, iCountMbNum constraint by MIN_NUM_MB_PER_SLICE condition of multi-pSlice mode settting
if (iMbWidth * iMbHeight <= MIN_NUM_MB_PER_SLICE) {
- fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ pSpatialLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ pSpatialLayer->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
@@ -375,7 +378,7 @@
break;
default: {
WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceMode (%d) settings!\n",
- pCodingParam->sDependencyLayers[0].sSliceCfg.uiSliceMode);
+ pCodingParam->sSpatialLayers[0].sSliceCfg.uiSliceMode);
return ENC_RETURN_UNSUPPORTED_PARA;
}
@@ -388,7 +391,7 @@
void WelsEncoderApplyFrameRate (SWelsSvcCodingParam* pParam) {
- SDLayerParam* pLayerParam;
+ SSpatialLayerInternal* pLayerParam;
const float kfEpsn = 0.000001f;
const int32_t kiNumLayer = pParam->iSpatialLayerNum;
int32_t i;
@@ -416,7 +419,7 @@
//TODO (Sijia): this is a temporary solution which keep the ratio between layers
//but it is also possible to fulfill the bitrate of lower layer first
- SDLayerParam* pLayerParam;
+ SSpatialLayerConfig* pLayerParam;
const int32_t iNumLayers = pParam->iSpatialLayerNum;
int32_t i, iOrigTotalBitrate = 0;
if (iLayer == SPATIAL_LAYER_ALL) {
@@ -428,12 +431,12 @@
}
//read old BR
for (i = 0; i < iNumLayers; i++) {
- iOrigTotalBitrate += pParam->sDependencyLayers[i].iSpatialBitrate;
+ iOrigTotalBitrate += pParam->sSpatialLayers[i].iSpatialBitrate;
}
//write new BR
float fRatio = 0.0;
for (i = 0; i < iNumLayers; i++) {
- pLayerParam = & (pParam->sDependencyLayers[i]);
+ pLayerParam = & (pParam->sSpatialLayers[i]);
fRatio = pLayerParam->iSpatialBitrate / (static_cast<float> (iOrigTotalBitrate));
pLayerParam->iSpatialBitrate = static_cast<int32_t> (pParam->iTargetBitrate * fRatio);
}
@@ -468,7 +471,7 @@
iNumDependencyLayers = pParam->iSpatialLayerNum;
do {
- SDLayerParam* pDLayer = &pParam->sDependencyLayers[iDIndex];
+ SSpatialLayerConfig* pDLayer = &pParam->sSpatialLayers[iDIndex];
// pDLayer->ptr_cfg = pParam;
int32_t iOrgNumNals = iCountNumNals;
@@ -484,8 +487,8 @@
// MAX_SLICES_NUM < MAX_LAYER_NUM_OF_FRAME ensured at svc_enc_slice_segment.h
assert (iCountNumNals - iOrgNumNals <= MAX_NAL_UNITS_IN_LAYER);
} else { /*if ( SM_SINGLE_SLICE != pDLayer->sSliceCfg.uiSliceMode )*/
- const int32_t kiNumOfSlice = GetInitialSliceNum ((pDLayer->iFrameWidth + 0x0f) >> 4,
- (pDLayer->iFrameHeight + 0x0f) >> 4,
+ const int32_t kiNumOfSlice = GetInitialSliceNum ((pDLayer->iVideoWidth + 0x0f) >> 4,
+ (pDLayer->iVideoHeight + 0x0f) >> 4,
&pDLayer->sSliceCfg);
// NEED check iCountNals value in case multiple slices is used
@@ -616,8 +619,8 @@
return 1;
for (i = 0; i < iNumDlayer; i++) {
- iMbWidth = ((*ppCtx)->pSvcParam->sDependencyLayers[i].iFrameWidth + 15) >> 4;
- iMbHeight = ((*ppCtx)->pSvcParam->sDependencyLayers[i].iFrameHeight + 15) >> 4;
+ iMbWidth = ((*ppCtx)->pSvcParam->sSpatialLayers[i].iVideoWidth + 15) >> 4;
+ iMbHeight = ((*ppCtx)->pSvcParam->sSpatialLayers[i].iVideoHeight + 15) >> 4;
iMbSize[i] = iMbWidth * iMbHeight;
iOverallMbNum += iMbSize[i];
}
@@ -733,8 +736,8 @@
while (iDlayerIndex < iDlayerCount) {
SRefList* pRefList = NULL;
uint32_t i = 0;
- const int32_t kiWidth = pParam->sDependencyLayers[iDlayerIndex].iFrameWidth;
- const int32_t kiHeight = pParam->sDependencyLayers[iDlayerIndex].iFrameHeight;
+ const int32_t kiWidth = pParam->sSpatialLayers[iDlayerIndex].iVideoWidth;
+ const int32_t kiHeight = pParam->sSpatialLayers[iDlayerIndex].iVideoHeight;
int32_t iPicWidth = WELS_ALIGN (kiWidth, MB_WIDTH_LUMA) + (PADDING_LENGTH << 1); // with iWidth of horizon
int32_t iPicChromaWidth = iPicWidth >> 1;
@@ -762,9 +765,9 @@
iDlayerIndex = 0;
while (iDlayerIndex < iDlayerCount) {
SDqLayer* pDqLayer = NULL;
- SDLayerParam* pDlayer = &pParam->sDependencyLayers[iDlayerIndex];
- const int32_t kiMbW = (pDlayer->iFrameWidth + 0x0f) >> 4;
- const int32_t kiMbH = (pDlayer->iFrameHeight + 0x0f) >> 4;
+ SSpatialLayerConfig* pDlayer = &pParam->sSpatialLayers[iDlayerIndex];
+ const int32_t kiMbW = (pDlayer->iVideoWidth + 0x0f) >> 4;
+ const int32_t kiMbH = (pDlayer->iVideoHeight + 0x0f) >> 4;
int32_t iMaxSliceNum = 1;
const int32_t kiSliceNum = GetInitialSliceNum (kiMbW, kiMbH, &pDlayer->sSliceCfg);
if (iMaxSliceNum < kiSliceNum)
@@ -851,7 +854,7 @@
pDqLayer->pFeatureSearchPreparation = static_cast<SFeatureSearchPreparation*> (pMa->WelsMallocz (sizeof (
SFeatureSearchPreparation), "pFeatureSearchPreparation"));
WELS_VERIFY_RETURN_PROC_IF (1, NULL == pDqLayer->pFeatureSearchPreparation, FreeMemorySvc (ppCtx));
- int32_t iReturn = RequestFeatureSearchPreparation (pMa, pDlayer->iFrameWidth, pDlayer->iFrameHeight,
+ int32_t iReturn = RequestFeatureSearchPreparation (pMa, pDlayer->iVideoWidth, pDlayer->iVideoHeight,
kiNeedFeatureStorage,
pDqLayer->pFeatureSearchPreparation);
WELS_VERIFY_RETURN_PROC_IF (1, ENC_RETURN_SUCCESS != iReturn, FreeMemorySvc (ppCtx));
@@ -882,7 +885,7 @@
while (iDlayerIndex < iDlayerCount) {
SDqIdc* pDqIdc = & (*ppCtx)->pDqIdcMap[iDlayerIndex];
const bool bUseSubsetSps = (iDlayerIndex > BASE_DEPENDENCY_ID);
- SDLayerParam* pDlayerParam = &pParam->sDependencyLayers[iDlayerIndex];
+ SSpatialLayerConfig* pDlayerParam = &pParam->sSpatialLayers[iDlayerIndex];
pDqIdc->uiSpatialId = iDlayerIndex;
pPps = & (*ppCtx)->pPPSArray[iPpsId];
@@ -895,8 +898,8 @@
// Need port pSps/pPps initialization due to spatial scalability changed
if (!bUseSubsetSps) {
- WelsInitSps (pSps, pDlayerParam, pParam->uiIntraPeriod, pParam->iNumRefFrame, iSpsId,
- pParam->bEnableFrameCroppingFlag, pParam->iRCMode != RC_OFF_MODE);
+ WelsInitSps (pSps, pDlayerParam, &pParam->sDependencyLayers[iDlayerIndex], pParam->uiIntraPeriod, pParam->iNumRefFrame,
+ iSpsId, pParam->bEnableFrameCroppingFlag, pParam->iRCMode != RC_OFF_MODE);
if (iDlayerCount > 1) {
pSps->bConstraintSet0Flag = true;
@@ -904,8 +907,9 @@
pSps->bConstraintSet2Flag = true;
}
} else {
- WelsInitSubsetSps (pSubsetSps, pDlayerParam, pParam->uiIntraPeriod, pParam->iNumRefFrame, iSpsId,
- pParam->bEnableFrameCroppingFlag, pParam->iRCMode != RC_OFF_MODE);
+ WelsInitSubsetSps (pSubsetSps, pDlayerParam, &pParam->sDependencyLayers[iDlayerIndex], pParam->uiIntraPeriod,
+ pParam->iNumRefFrame,
+ iSpsId, pParam->bEnableFrameCroppingFlag, pParam->iRCMode != RC_OFF_MODE);
}
// initialize pPps
@@ -984,8 +988,8 @@
iSpatialIdx = 0;
while (iSpatialIdx < kiNumSpatialLayers) {
- const int32_t kiTmpWidth = (pParam->sDependencyLayers[iSpatialIdx].iFrameWidth + 15) >> 4;
- const int32_t kiTmpHeight = (pParam->sDependencyLayers[iSpatialIdx].iFrameHeight + 15) >> 4;
+ const int32_t kiTmpWidth = (pParam->sSpatialLayers[iSpatialIdx].iVideoWidth + 15) >> 4;
+ const int32_t kiTmpHeight = (pParam->sSpatialLayers[iSpatialIdx].iVideoHeight + 15) >> 4;
int32_t iNumMb = kiTmpWidth * kiTmpHeight;
sMbSizeMap[iSpatialIdx].iMbWidth = kiTmpWidth;
@@ -1005,9 +1009,9 @@
iSpatialIdx = 0;
while (iSpatialIdx < kiNumSpatialLayers) {
- SDLayerParam* fDlp = &pParam->sDependencyLayers[iSpatialIdx];
+ SSpatialLayerConfig* fDlp = &pParam->sSpatialLayers[iSpatialIdx];
- const int32_t kiWidthPad = WELS_ALIGN (fDlp->iFrameWidth, 16) + (PADDING_LENGTH << 1);
+ const int32_t kiWidthPad = WELS_ALIGN (fDlp->iVideoWidth, 16) + (PADDING_LENGTH << 1);
iLineSizeY[iSpatialIdx][kbBaseTemporalFlag] = WELS_ALIGN (kiWidthPad, 32);
iLineSizeUV[iSpatialIdx][kbBaseTemporalFlag] = WELS_ALIGN ((kiWidthPad >> 1), 16);
@@ -1230,7 +1234,7 @@
int32_t RequestMemorySvc (sWelsEncCtx** ppCtx) {
SWelsSvcCodingParam* pParam = (*ppCtx)->pSvcParam;
CMemoryAlign* pMa = (*ppCtx)->pMemAlign;
- SDLayerParam* pFinalSpatial = NULL;
+ SSpatialLayerConfig* pFinalSpatial = NULL;
int32_t iCountBsLen = 0;
int32_t iCountNals = 0;
int32_t iMaxPicWidth = 0;
@@ -1265,9 +1269,9 @@
return 1;
}
- pFinalSpatial = &pParam->sDependencyLayers[kiNumDependencyLayers - 1];
- iMaxPicWidth = pFinalSpatial->iFrameWidth;
- iMaxPicHeight = pFinalSpatial->iFrameHeight;
+ pFinalSpatial = &pParam->sSpatialLayers[kiNumDependencyLayers - 1];
+ iMaxPicWidth = pFinalSpatial->iVideoWidth;
+ iMaxPicHeight = pFinalSpatial->iVideoHeight;
iCountMaxMbNum = ((15 + iMaxPicWidth) >> 4) * ((15 + iMaxPicHeight) >> 4);
iResult = AcquireLayersNals (ppCtx, pParam, &iCountLayers, &iCountNals);
@@ -1283,11 +1287,11 @@
int32_t iLayerBsSize = 0;
iIndex = 0;
while (iIndex < pParam->iSpatialLayerNum) {
- SDLayerParam* fDlp = &pParam->sDependencyLayers[iIndex];
+ SSpatialLayerConfig* fDlp = &pParam->sSpatialLayers[iIndex];
fCompressRatioThr = COMPRESS_RATIO_THR;
- iLayerBsSize = WELS_ROUND (((3 * fDlp->iFrameWidth * fDlp->iFrameHeight) >> 1) * fCompressRatioThr) +
+ iLayerBsSize = WELS_ROUND (((3 * fDlp->iVideoWidth * fDlp->iVideoHeight) >> 1) * fCompressRatioThr) +
MAX_MACROBLOCK_SIZE_IN_BYTE;
iLayerBsSize = WELS_ALIGN (iLayerBsSize, 4); // 4 bytes alinged
iVclLayersBsSizeCount += iLayerBsSize;
@@ -1581,7 +1585,7 @@
if (NULL != pCtx->ppDqLayerList && pParam != NULL) {
while (ilayer < pParam->iSpatialLayerNum) {
SDqLayer* pDq = pCtx->ppDqLayerList[ilayer];
- SDLayerParam* pDlp = &pCtx->pSvcParam->sDependencyLayers[ilayer];
+ SSpatialLayerConfig* pDlp = &pCtx->pSvcParam->sSpatialLayers[ilayer];
const bool kbIsDynamicSlicing = (SM_DYN_SLICE == pDlp->sSliceCfg.uiSliceMode);
@@ -1740,11 +1744,11 @@
uint16_t iMaxSliceCount = 0;
do {
- SDLayerParam* pDlp = &pCodingParam->sDependencyLayers[iSpatialIdx];
+ SSpatialLayerConfig* pDlp = &pCodingParam->sSpatialLayers[iSpatialIdx];
SSliceConfig* pMso = &pDlp->sSliceCfg;
SSliceArgument* pSlcArg = &pMso->sSliceArgument;
- const int32_t kiMbWidth = (pDlp->iFrameWidth + 15) >> 4;
- const int32_t kiMbHeight = (pDlp->iFrameHeight + 15) >> 4;
+ const int32_t kiMbWidth = (pDlp->iVideoWidth + 15) >> 4;
+ const int32_t kiMbHeight = (pDlp->iVideoHeight + 15) >> 4;
const int32_t kiMbNumInFrame = kiMbWidth * kiMbHeight;
int32_t iSliceNum = (SM_AUTO_SLICE == pMso->uiSliceMode) ? kiCpuCores : pSlcArg->uiSliceNum;
// NOTE: Per design, in case MT/DYNAMIC_SLICE_ASSIGN enabled, for SM_FIXEDSLCNUM_SLICE mode,
@@ -2155,7 +2159,7 @@
/*!
* \brief get temporal level due to configuration and coding context
*/
-int32_t GetTemporalLevel (SDLayerParam* fDlp, const int32_t kiFrameNum, const int32_t kiGopSize) {
+int32_t GetTemporalLevel (SSpatialLayerInternal* fDlp, const int32_t kiFrameNum, const int32_t kiGopSize) {
const int32_t kiCodingIdx = kiFrameNum & (kiGopSize - 1);
return fDlp->uiCodingIdx2TemporalId[kiCodingIdx];
@@ -2274,12 +2278,12 @@
if (pCtx->pSvcParam->iRCMode != RC_OFF_MODE) {
//RC case
uiFrmByte = (
- ((uint32_t) (pCtx->pSvcParam->sDependencyLayers[iCurDid].iSpatialBitrate)
+ ((uint32_t) (pCtx->pSvcParam->sSpatialLayers[iCurDid].iSpatialBitrate)
/ (uint32_t) (pCtx->pSvcParam->sDependencyLayers[iCurDid].fInputFrameRate)) >> 3);
} else {
//fixed QP case
const int32_t iTtlMbNumInFrame = pSliceCtx->iMbNumInFrame;
- int32_t iQDeltaTo26 = (26 - pCtx->pSvcParam->sDependencyLayers[iCurDid].iDLayerQp);
+ int32_t iQDeltaTo26 = (26 - pCtx->pSvcParam->sSpatialLayers[iCurDid].iDLayerQp);
uiFrmByte = (iTtlMbNumInFrame * byte_complexIMBat26);
if (iQDeltaTo26 > 0) {
@@ -2325,7 +2329,7 @@
SSlice* pSlice = NULL;
const uint8_t kiCurDid = pCtx->uiDependencyId;
const bool kbUseSubsetSpsFlag = (kiCurDid > BASE_DEPENDENCY_ID);
- SDLayerParam* fDlp = &pParam->sDependencyLayers[kiCurDid];
+ SSpatialLayerConfig* fDlp = &pParam->sSpatialLayers[kiCurDid];
SNalUnitHeaderExt* pNalHdExt = &pCurDq->sLayerInfo.sNalHeaderExt;
SNalUnitHeader* pNalHd = &pNalHdExt->sNalHeader;
SDqIdc* pDqIdc = &pCtx->pDqIdcMap[kiCurDid];
@@ -2962,7 +2966,7 @@
while (iSpatialIdx < iSpatialNum) {
const int32_t iDidIdx = (pSpatialIndexMap + iSpatialIdx)->iDid; // get iDid
- SDLayerParam* pParam = &pSvcParam->sDependencyLayers[iDidIdx];
+ SSpatialLayerConfig* pParam = &pSvcParam->sSpatialLayers[iDidIdx];
pCtx->uiDependencyId = iCurDid = (int8_t)iDidIdx;
pCtx->pVpp->AnalyzeSpatialPic (pCtx, iDidIdx);
@@ -2971,8 +2975,8 @@
pCtx->pEncPic->iPictureType = pCtx->eSliceType;
pCtx->pEncPic->iFramePoc = pCtx->iPOC;
- iCurWidth = pParam->iFrameWidth;
- iCurHeight = pParam->iFrameHeight;
+ iCurWidth = pParam->iVideoWidth;
+ iCurHeight = pParam->iVideoHeight;
iDidList[iSpatialIdx] = iCurDid;
@@ -2982,8 +2986,8 @@
case SM_FIXEDSLCNUM_SLICE:
case SM_AUTO_SLICE: {
if ((iCurDid > 0) && (pSvcParam->iMultipleThreadIdc > 1) &&
- (pSvcParam->sDependencyLayers[iCurDid].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
- && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[iCurDid].sSliceCfg.sSliceArgument.uiSliceNum)
+ (pSvcParam->sSpatialLayers[iCurDid].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && pSvcParam->iMultipleThreadIdc >= pSvcParam->sSpatialLayers[iCurDid].sSliceCfg.sSliceArgument.uiSliceNum)
)
AdjustEnhanceLayer (pCtx, iCurDid);
break;
@@ -3297,7 +3301,8 @@
if (
(!pCtx->pCurDqLayer->bDeblockingParallelFlag) &&
#if !defined(ENABLE_FRAME_DUMP)
- ((eNalRefIdc != NRI_PRI_LOWEST) && (pParam->iHighestTemporalId == 0 || iCurTid < pParam->iHighestTemporalId)) &&
+ ((eNalRefIdc != NRI_PRI_LOWEST) && (pSvcParam->sDependencyLayers[iDidIdx].iHighestTemporalId == 0
+ || iCurTid < pSvcParam->sDependencyLayers[iDidIdx].iHighestTemporalId)) &&
#endif//!ENABLE_FRAME_DUMP
true
) {
@@ -3478,12 +3483,12 @@
#endif//MT_DEBUG
if (pSvcParam->iMultipleThreadIdc > 1 && iDidList[0] == BASE_DEPENDENCY_ID
- && ((pSvcParam->sDependencyLayers[0].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE)
- || (pSvcParam->sDependencyLayers[0].sSliceCfg.uiSliceMode == SM_AUTO_SLICE))
- && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceNum
- && ((pSvcParam->sDependencyLayers[iDidList[iSpatialNum - 1]].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE)
- || (pSvcParam->sDependencyLayers[iDidList[iSpatialNum - 1]].sSliceCfg.uiSliceMode == SM_AUTO_SLICE))
- && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[iDidList[iSpatialNum -
+ && ((pSvcParam->sSpatialLayers[0].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE)
+ || (pSvcParam->sSpatialLayers[0].sSliceCfg.uiSliceMode == SM_AUTO_SLICE))
+ && pSvcParam->iMultipleThreadIdc >= pSvcParam->sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum
+ && ((pSvcParam->sSpatialLayers[iDidList[iSpatialNum - 1]].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE)
+ || (pSvcParam->sSpatialLayers[iDidList[iSpatialNum - 1]].sSliceCfg.uiSliceMode == SM_AUTO_SLICE))
+ && pSvcParam->iMultipleThreadIdc >= pSvcParam->sSpatialLayers[iDidList[iSpatialNum -
1]].sSliceCfg.sSliceArgument.uiSliceNum) {
AdjustBaseLayer (pCtx);
}
@@ -3538,14 +3543,14 @@
iIndexD = 0;
assert (pOldParam->iSpatialLayerNum == pNewParam->iSpatialLayerNum);
do {
- const SDLayerParam* kpOldDlp = &pOldParam->sDependencyLayers[iIndexD];
- const SDLayerParam* kpNewDlp = &pNewParam->sDependencyLayers[iIndexD];
+ const SSpatialLayerInternal* kpOldDlp = &pOldParam->sDependencyLayers[iIndexD];
+ const SSpatialLayerInternal* kpNewDlp = &pNewParam->sDependencyLayers[iIndexD];
float fT1 = .0f;
float fT2 = .0f;
// check frame size settings
- if (kpOldDlp->iFrameWidth != kpNewDlp->iFrameWidth ||
- kpOldDlp->iFrameHeight != kpNewDlp->iFrameHeight ||
+ if (pOldParam->sSpatialLayers[iIndexD].iVideoWidth != pNewParam->sSpatialLayers[iIndexD].iVideoWidth ||
+ pOldParam->sSpatialLayers[iIndexD].iVideoHeight != pNewParam->sSpatialLayers[iIndexD].iVideoHeight ||
kpOldDlp->iActualWidth != kpNewDlp->iActualWidth ||
kpOldDlp->iActualHeight != kpNewDlp->iActualHeight) {
bNeedReset = true;
@@ -3552,8 +3557,10 @@
break;
}
- if (kpOldDlp->sSliceCfg.uiSliceMode != kpNewDlp->sSliceCfg.uiSliceMode ||
- kpOldDlp->sSliceCfg.sSliceArgument.uiSliceNum != kpNewDlp->sSliceCfg.sSliceArgument.uiSliceNum) {
+ if (pOldParam->sSpatialLayers[iIndexD].sSliceCfg.uiSliceMode != pNewParam->sSpatialLayers[iIndexD].sSliceCfg.uiSliceMode
+ ||
+ pOldParam->sSpatialLayers[iIndexD].sSliceCfg.sSliceArgument.uiSliceNum !=
+ pNewParam->sSpatialLayers[iIndexD].sSliceCfg.sSliceArgument.uiSliceNum) {
bNeedReset = true;
break;
}
@@ -3653,21 +3660,24 @@
// d
iIndexD = 0;
do {
- SDLayerParam* pOldDlp = &pOldParam->sDependencyLayers[iIndexD];
- SDLayerParam* pNewDlp = &pNewParam->sDependencyLayers[iIndexD];
+ SSpatialLayerInternal* pOldDlpInternal = &pOldParam->sDependencyLayers[iIndexD];
+ SSpatialLayerInternal* pNewDlpInternal = &pNewParam->sDependencyLayers[iIndexD];
- pOldDlp->fInputFrameRate = pNewDlp->fInputFrameRate; // input frame rate
- pOldDlp->fOutputFrameRate = pNewDlp->fOutputFrameRate; // output frame rate
+ SSpatialLayerConfig* pOldDlp = &pOldParam->sSpatialLayers[iIndexD];
+ SSpatialLayerConfig* pNewDlp = &pNewParam->sSpatialLayers[iIndexD];
+
+ pOldDlpInternal->fInputFrameRate = pNewDlpInternal->fInputFrameRate; // input frame rate
+ pOldDlpInternal->fOutputFrameRate = pNewDlpInternal->fOutputFrameRate; // output frame rate
pOldDlp->iSpatialBitrate = pNewDlp->iSpatialBitrate;
pOldDlp->uiProfileIdc = pNewDlp->uiProfileIdc; // value of profile IDC (0 for auto-detection)
/* Derived variants below */
- pOldDlp->iTemporalResolution = pNewDlp->iTemporalResolution;
- pOldDlp->iDecompositionStages = pNewDlp->iDecompositionStages;
+ pOldDlpInternal->iTemporalResolution = pNewDlpInternal->iTemporalResolution;
+ pOldDlpInternal->iDecompositionStages = pNewDlpInternal->iDecompositionStages;
- memcpy (pOldDlp->uiCodingIdx2TemporalId, pNewDlp->uiCodingIdx2TemporalId,
- sizeof (pOldDlp->uiCodingIdx2TemporalId)); // confirmed_safe_unsafe_usage
+ memcpy (pOldDlpInternal->uiCodingIdx2TemporalId, pNewDlpInternal->uiCodingIdx2TemporalId,
+ sizeof (pOldDlpInternal->uiCodingIdx2TemporalId)); // confirmed_safe_unsafe_usage
++ iIndexD;
} while (iIndexD < pOldParam->iSpatialLayerNum);
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -84,7 +84,7 @@
pBaseMem += kiGomSizeI;
pWelsSvcRc->pTemporalOverRc = (SRCTemporal*)pBaseMem;
- pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pMA->WelsMalloc(sizeof (SRCSlicing) * kiSliceNum, "SlicingOverRC");
+ pWelsSvcRc->pSlicingOverRc = (SRCSlicing*)pMA->WelsMalloc (sizeof (SRCSlicing) * kiSliceNum, "SlicingOverRC");
}
void RcFreeLayerMemory (SWelsSvcRc* pWelsSvcRc, CMemoryAlign* pMA) {
@@ -111,7 +111,7 @@
void RcInitSequenceParameter (sWelsEncCtx* pEncCtx) {
SWelsSvcRc* pWelsSvcRc = NULL;
- SDLayerParam* pDLayerParam = NULL;
+ SSpatialLayerConfig* pDLayerParam = NULL;
int32_t j = 0;
int32_t iMbWidth = 0;
@@ -125,9 +125,9 @@
for (j = 0; j < pEncCtx->pSvcParam->iSpatialLayerNum; j++) {
SSliceCtx* pSliceCtx = &pEncCtx->pSliceCtxList[j];
pWelsSvcRc = &pEncCtx->pWelsSvcRc[j];
- pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[j];
- iMbWidth = (pDLayerParam->iFrameWidth >> 4);
- pWelsSvcRc->iNumberMbFrame = iMbWidth * (pDLayerParam->iFrameHeight >> 4);
+ 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
@@ -173,7 +173,7 @@
pWelsSvcRc->iGomSize = (pWelsSvcRc->iNumberMbFrame + pWelsSvcRc->iNumberMbGom - 1) / pWelsSvcRc->iNumberMbGom;
- RcInitLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign, 1 + pDLayerParam->iHighestTemporalId);
+ RcInitLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign, 1 + pEncCtx->pSvcParam->sDependencyLayers[j].iHighestTemporalId);
bMultiSliceMode = ((SM_RASTER_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
(SM_ROWMB_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
@@ -187,7 +187,7 @@
void RcInitTlWeight (sWelsEncCtx* pEncCtx) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+ SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
const int32_t kiDecompositionStages = pDLayerParam->iDecompositionStages;
const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
@@ -218,15 +218,17 @@
void RcUpdateBitrateFps (sWelsEncCtx* pEncCtx) {
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
- const int32_t kiGopSize = (1 << pDLayerParam->iDecompositionStages);
- const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
- int32_t input_iBitsPerFrame = WELS_ROUND(pDLayerParam->iSpatialBitrate * INT_MULTIPLY / pDLayerParam->fInputFrameRate);
+
+ 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 = pDLayerParam->fInputFrameRate;
+ 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;
@@ -269,8 +271,9 @@
const int32_t kiDid = pEncCtx->uiDependencyId;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
SRCTemporal* pTOverRc = pWelsSvcRc->pTemporalOverRc;
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
- const int32_t kiHighestTid = pDLayerParam->iHighestTemporalId;
+ 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
@@ -293,7 +296,7 @@
//Backup the initial bitrate and fps
pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
- pWelsSvcRc->dPreviousFps = pDLayerParam->fInputFrameRate;
+ pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
memset (pWelsSvcRc->pCurrentFrameGomSad, 0, pWelsSvcRc->iGomSize * sizeof (int32_t));
@@ -305,13 +308,14 @@
bool RcJudgeBitrateFpsUpdate (sWelsEncCtx* pEncCtx) {
int32_t iCurDid = pEncCtx->uiDependencyId;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[iCurDid];
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[iCurDid];
+ SSpatialLayerInternal* pDLayerParamInternal = &pEncCtx->pSvcParam->sDependencyLayers[iCurDid];
+ SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[iCurDid];
if ((pWelsSvcRc->iPreviousBitrate != pDLayerParam->iSpatialBitrate) ||
- (pWelsSvcRc->dPreviousFps - pDLayerParam->fInputFrameRate) > EPSN ||
- (pWelsSvcRc->dPreviousFps - pDLayerParam->fInputFrameRate) < -EPSN) {
+ (pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) > EPSN ||
+ (pWelsSvcRc->dPreviousFps - pDLayerParamInternal->fInputFrameRate) < -EPSN) {
pWelsSvcRc->iPreviousBitrate = pDLayerParam->iSpatialBitrate;
- pWelsSvcRc->dPreviousFps = pDLayerParam->fInputFrameRate;
+ pWelsSvcRc->dPreviousFps = pDLayerParamInternal->fInputFrameRate;
return true;
} else
return false;
@@ -353,7 +357,7 @@
void RcUpdateTemporalZero (sWelsEncCtx* pEncCtx) {
const int32_t kiDid = pEncCtx->uiDependencyId;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[kiDid];
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
+ SSpatialLayerInternal* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[kiDid];
const int32_t kiGopSize = (1 << pDLayerParam->iDecompositionStages);
if (pWelsSvcRc->iPreviousGopSize != kiGopSize) {
@@ -385,20 +389,20 @@
int32_t iBppIndex = 0;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+ SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
- if (pDLayerParam->fOutputFrameRate > EPSN && pDLayerParam->iFrameWidth && pDLayerParam->iFrameHeight)
- dBpp = (double) (pDLayerParam->iSpatialBitrate) / (double) (pDLayerParam->fOutputFrameRate * pDLayerParam->iFrameWidth *
- pDLayerParam->iFrameHeight);
+ 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->iFrameWidth * pDLayerParam->iFrameHeight <= 28800) // 90p video:160*90
+ if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 28800) // 90p video:160*90
iBppIndex = 0;
- else if (pDLayerParam->iFrameWidth * pDLayerParam->iFrameHeight <= 115200) // 180p video:320*180
+ else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 115200) // 180p video:320*180
iBppIndex = 1;
- else if (pDLayerParam->iFrameWidth * pDLayerParam->iFrameHeight <= 460800) // 360p video:640*360
+ else if (pDLayerParam->iVideoWidth * pDLayerParam->iVideoHeight <= 460800) // 360p video:640*360
iBppIndex = 2;
else
iBppIndex = 3;
@@ -583,20 +587,20 @@
SWelsSvcRc* RcJudgeBaseUsability (sWelsEncCtx* pEncCtx) {
SWelsSvcRc* pWelsSvcRc = NULL, *pWelsSvcRc_Base = NULL;
- SDLayerParam* pDlpBase = NULL, *pDLayerParam = NULL;
-
+ SSpatialLayerConfig* pDlpBase = NULL, *pDLayerParam = NULL;
+ SSpatialLayerInternal* pDlpBaseInternal = NULL;
if (pEncCtx->uiDependencyId <= 0)
return NULL;
-
- pDlpBase = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId - 1];
+ pDlpBaseInternal = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId - 1];
+ pDlpBase = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId - 1];
pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
- if (pEncCtx->uiTemporalId <= pDlpBase->iDecompositionStages) {
+ if (pEncCtx->uiTemporalId <= pDlpBaseInternal->iDecompositionStages) {
pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
pWelsSvcRc_Base = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId - 1];
- pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
- pDlpBase = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId - 1];
- if ((pDLayerParam->iFrameWidth * pDLayerParam->iFrameHeight / pWelsSvcRc->iNumberMbGom) ==
- (pDlpBase->iFrameWidth * pDlpBase->iFrameHeight / pWelsSvcRc_Base->iNumberMbGom))
+ 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;
@@ -925,7 +929,7 @@
void WelsRcPictureInitDisable (void* pCtx) {
sWelsEncCtx* pEncCtx = (sWelsEncCtx*)pCtx;
SWelsSvcRc* pWelsSvcRc = &pEncCtx->pWelsSvcRc[pEncCtx->uiDependencyId];
- SDLayerParam* pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId];
+ SSpatialLayerConfig* pDLayerParam = &pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId];
const int32_t kiQp = pDLayerParam->iDLayerQp;
pEncCtx->iGlobalQp = RcCalculateCascadingQp (pEncCtx, kiQp);
--- a/codec/encoder/core/src/ref_list_mgr_svc.cpp
+++ b/codec/encoder/core/src/ref_list_mgr_svc.cpp
@@ -356,7 +356,7 @@
sWelsEncCtx* pCtx = (sWelsEncCtx*)pEncCtx;
SRefList* pRefList = pCtx->ppRefPicListExt[pCtx->uiDependencyId];
SLTRState* pLtr = &pCtx->pLtr[pCtx->uiDependencyId];
- SDLayerParam* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
+ SSpatialLayerInternal* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
const int32_t kiNumRef = pCtx->pSvcParam->iNumRefFrame;
int32_t iRefIdx = 0;
@@ -708,7 +708,7 @@
sWelsEncCtx* pCtx = (sWelsEncCtx*)pEncCtx;
SRefList* pRefList = pCtx->ppRefPicListExt[pCtx->uiDependencyId];
SLTRState* pLtr = &pCtx->pLtr[pCtx->uiDependencyId];
- SDLayerParam* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
+ SSpatialLayerInternal* pParamD = &pCtx->pSvcParam->sDependencyLayers[pCtx->uiDependencyId];
const uint8_t kuiTid = pCtx->uiTemporalId;
// Need update ref list in case store base layer or target dependency layer construction
if (NULL == pCtx->pCurDqLayer)
@@ -763,9 +763,9 @@
if (pCtx->eSliceType != I_SLICE) {
int iLtrRefIdx = 0;
- SPicture *pRefOri = NULL;
+ SPicture* pRefOri = NULL;
for (int idx = 0; idx < pVaaExt->iNumOfAvailableRef; idx++) {
- iLtrRefIdx = pCtx->pVpp->GetRefFrameInfo(idx,pRefOri);
+ iLtrRefIdx = pCtx->pVpp->GetRefFrameInfo (idx, pRefOri);
if (iLtrRefIdx >= 0 && iLtrRefIdx <= pParam->iLTRRefNum) {
SPicture* pRefPic = pRefList->pLongRefList[iLtrRefIdx];
if (pRefPic != NULL && pRefPic->bUsedAsRef && pRefPic->bIsLongRef) {
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -322,7 +322,7 @@
iIdx = 0;
while (iIdx < iNumSpatialLayers) {
- SSliceConfig* pMso = &pPara->sDependencyLayers[iIdx].sSliceCfg;
+ SSliceConfig* pMso = &pPara->sSpatialLayers[iIdx].sSliceCfg;
const int32_t kiSliceNum = pMso->sSliceArgument.uiSliceNum;
if (((pMso->uiSliceMode == SM_FIXEDSLCNUM_SLICE) || (pMso->uiSliceMode == SM_AUTO_SLICE))
&& pPara->iMultipleThreadIdc > 1
@@ -520,7 +520,7 @@
int32_t AppendSliceToFrameBs (sWelsEncCtx* pCtx, SLayerBSInfo* pLbi, const int32_t iSliceCount) {
SWelsSvcCodingParam* pCodingParam = pCtx->pSvcParam;
- SDLayerParam* pDlp = &pCodingParam->sDependencyLayers[pCtx->uiDependencyId];
+ SSpatialLayerConfig* pDlp = &pCodingParam->sSpatialLayers[pCtx->uiDependencyId];
SWelsSliceBs* pSliceBs = NULL;
const bool kbIsDynamicSlicingMode = (pDlp->sSliceCfg.uiSliceMode == SM_DYN_SLICE);
@@ -717,7 +717,7 @@
const int32_t kiCurDid = pEncPEncCtx->uiDependencyId;
const int32_t kiCurTid = pEncPEncCtx->uiTemporalId;
SWelsSvcCodingParam* pCodingParam = pEncPEncCtx->pSvcParam;
- SDLayerParam* pParamD = &pCodingParam->sDependencyLayers[kiCurDid];
+ SSpatialLayerConfig* pParamD = &pCodingParam->sSpatialLayers[kiCurDid];
pCurDq = pEncPEncCtx->pCurDqLayer;
eNalType = pEncPEncCtx->eNalType;
@@ -788,7 +788,8 @@
if (pCurDq->bDeblockingParallelFlag && pSlice->sSliceHeaderExt.sSliceHeader.uiDisableDeblockingFilterIdc != 1
#if !defined(ENABLE_FRAME_DUMP)
&& (eNalRefIdc != NRI_PRI_LOWEST) &&
- (pParamD->iHighestTemporalId == 0 || kiCurTid < pParamD->iHighestTemporalId)
+ (pCodingParam->sDependencyLayers[kiCurDid].iHighestTemporalId == 0
+ || kiCurTid < pCodingParam->sDependencyLayers[kiCurDid].iHighestTemporalId)
#endif// !ENABLE_FRAME_DUMP
) {
DeblockingFilterSliceAvcbase (pCurDq, pEncPEncCtx->pFuncList, iSliceIdx);
@@ -896,7 +897,8 @@
if (pCurDq->bDeblockingParallelFlag && pSlice->sSliceHeaderExt.sSliceHeader.uiDisableDeblockingFilterIdc != 1
#if !defined(ENABLE_FRAME_DUMP)
&& (eNalRefIdc != NRI_PRI_LOWEST) &&
- (pParamD->iHighestTemporalId == 0 || kiCurTid < pParamD->iHighestTemporalId)
+ (pCodingParam->sDependencyLayers[kiCurDid].iHighestTemporalId == 0
+ || kiCurTid < pCodingParam->sDependencyLayers[kiCurDid].iHighestTemporalId)
#endif// !ENABLE_FRAME_DUMP
) {
DeblockingFilterSliceAvcbase (pCurDq, pEncPEncCtx->pFuncList, iSliceIdx);
@@ -1050,8 +1052,8 @@
// if using spatial base layer for complexity estimation
const bool kbModelingFromSpatial = (pCtx->pCurDqLayer->pRefLayer != NULL && iCurDid > 0)
- && (pCtx->pSvcParam->sDependencyLayers[iCurDid - 1].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
- && pCtx->pSvcParam->iMultipleThreadIdc >= pCtx->pSvcParam->sDependencyLayers[iCurDid -
+ && (pCtx->pSvcParam->sSpatialLayers[iCurDid - 1].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && pCtx->pSvcParam->iMultipleThreadIdc >= pCtx->pSvcParam->sSpatialLayers[iCurDid -
1].sSliceCfg.sSliceArgument.uiSliceNum);
if (kbModelingFromSpatial) { // using spatial base layer for complexity estimation
@@ -1115,7 +1117,7 @@
pPara = pCtx->pSvcParam;
while (iSpatialIdx < iSpatialNum) {
const int32_t kiDid = pDidList[iSpatialIdx];
- SDLayerParam* pDlp = &pPara->sDependencyLayers[kiDid];
+ SSpatialLayerInternal* pDlp = &pPara->sDependencyLayers[kiDid];
SSliceConfig* pMso = &pDlp->sSliceCfg;
SDqLayer* pCurDq = pCtx->ppDqLayerList[kiDid];
SSliceCtx* pSliceCtx = pCurDq->pSliceEncCtx;
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -472,7 +472,7 @@
pBs->uiCurBits = pDss->uiBsStackCurBits;
pBs->iLeftBits = pDss->iBsStackLeftBits;
pSlice->uiLastMbQp = pDss->uiLastMbQp;
- if(pMbSkipRun)
+ if (pMbSkipRun)
*pMbSkipRun = pDss->iMbSkipRunStack;
}
void UpdateQpForOverflow (SMB* pCurMb, uint8_t kuiChromaQpIndexOffset) {
@@ -712,7 +712,7 @@
SNalUnitHeaderExt* pNalHeadExt = &pCurLayer->sLayerInfo.sNalHeaderExt;
SSlice* pCurSlice = &pCurLayer->sLayerInfo.pSliceInLayer[kiSliceIdx];
SBitStringAux* pBs = pCurSlice->pSliceBsa;
- const int32_t kiDynamicSliceFlag = (pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId].sSliceCfg.uiSliceMode
+ const int32_t kiDynamicSliceFlag = (pEncCtx->pSvcParam->sSpatialLayers[pEncCtx->uiDependencyId].sSliceCfg.uiSliceMode
==
SM_DYN_SLICE);
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -127,8 +127,8 @@
// spatial pictures
iDlayerIndex = 0;
do {
- const int32_t kiPicWidth = pParam->sDependencyLayers[iDlayerIndex].iFrameWidth;
- const int32_t kiPicHeight = pParam->sDependencyLayers[iDlayerIndex].iFrameHeight;
+ const int32_t kiPicWidth = pParam->sSpatialLayers[iDlayerIndex].iVideoWidth;
+ const int32_t kiPicHeight = pParam->sSpatialLayers[iDlayerIndex].iVideoHeight;
const uint8_t kuiLayerInTemporal = 2 + WELS_MAX (pParam->sDependencyLayers[iDlayerIndex].iHighestTemporalId, 1);
const uint8_t kuiRefNumInTemporal = kuiLayerInTemporal + pParam->iLTRRefNum;
uint8_t i = 0;
@@ -291,7 +291,8 @@
SPicture* pSrcPic = NULL; // large
SPicture* pDstPic = NULL; // small
- SDLayerParam* pDlayerParam = NULL;
+ SSpatialLayerConfig* pDlayerParam = NULL;
+ SSpatialLayerInternal* pDlayerParamInternal = NULL;
int32_t iSpatialNum = 0;
int32_t iSrcWidth = 0;
int32_t iSrcHeight = 0;
@@ -300,10 +301,11 @@
int32_t iTemporalId = 0;
int32_t iActualSpatialLayerNum = 0;
- pDlayerParam = &pSvcParam->sDependencyLayers[iDependencyId];
- iTargetWidth = pDlayerParam->iFrameWidth;
- iTargetHeight = pDlayerParam->iFrameHeight;
- iTemporalId = pDlayerParam->uiCodingIdx2TemporalId[pCtx->iCodingIndex & (pSvcParam->uiGopSize - 1)];
+ pDlayerParamInternal = &pSvcParam->sDependencyLayers[iDependencyId];
+ pDlayerParam = &pSvcParam->sSpatialLayers[iDependencyId];
+ iTargetWidth = pDlayerParam->iVideoWidth;
+ iTargetHeight = pDlayerParam->iVideoHeight;
+ iTemporalId = pDlayerParamInternal->uiCodingIdx2TemporalId[pCtx->iCodingIndex & (pSvcParam->uiGopSize - 1)];
iSrcWidth = pSvcParam->SUsedPicRect.iWidth;
iSrcHeight = pSvcParam->SUsedPicRect.iHeight;
@@ -365,10 +367,11 @@
// -- highest layer, if no downsampling, [else] block above
if (pSvcParam->iSpatialLayerNum > 1) {
while (iDependencyId >= 0) {
- pDlayerParam = &pSvcParam->sDependencyLayers[iDependencyId];
- iTargetWidth = pDlayerParam->iFrameWidth;
- iTargetHeight = pDlayerParam->iFrameHeight;
- iTemporalId = pDlayerParam->uiCodingIdx2TemporalId[pCtx->iCodingIndex & (pSvcParam->uiGopSize - 1)];
+ pDlayerParamInternal = &pSvcParam->sDependencyLayers[iDependencyId];
+ pDlayerParam = &pSvcParam->sSpatialLayers[iDependencyId];
+ iTargetWidth = pDlayerParam->iVideoWidth;
+ iTargetHeight = pDlayerParam->iVideoHeight;
+ iTemporalId = pDlayerParamInternal->uiCodingIdx2TemporalId[pCtx->iCodingIndex & (pSvcParam->uiGopSize - 1)];
iPicturePos = m_uiSpatialLayersInTemporal[iDependencyId] - 1;
// NOT work for CGS, FIXME
@@ -414,7 +417,7 @@
}
for (; iSpatialIdx >= 0; iSpatialIdx --) {
- SDLayerParam* pCurLayer = &pParam->sDependencyLayers[iSpatialIdx];
+ SSpatialLayerInternal* pCurLayer = &pParam->sDependencyLayers[iSpatialIdx];
int32_t iCurDstWidth = pCurLayer->iActualWidth;
int32_t iCurDstHeight = pCurLayer->iActualHeight;
int32_t iInputWidthXDstHeight = kiInputPicWidth * iCurDstHeight;
@@ -1078,7 +1081,7 @@
return static_cast<ESceneChangeIdc> (iVaaFrameSceneChangeIdc);
}
-int32_t CWelsPreProcess::GetRefFrameInfo(int32_t iRefIdx,SPicture *&pRefOri) {
+int32_t CWelsPreProcess::GetRefFrameInfo (int32_t iRefIdx, SPicture*& pRefOri) {
const int32_t iTargetDid = m_pEncCtx->pSvcParam->iSpatialLayerNum - 1;
SVAAFrameInfoExt* pVaaExt = static_cast<SVAAFrameInfoExt*> (m_pEncCtx->pVaa);
SRefInfoParam* BestRefCandidateParam = & (pVaaExt->sVaaStrBestRefCandidate[iRefIdx]);