shithub: openh264

Download patch

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]);