ref: 6322950cb9191a2ba60c4108471ce7ca0ec0679f
parent: 3ff7e3d0451b4d2eb8e2315eb881817dce221558
parent: 35fa429fb01ed08c4c8679c5c3bc4d73dd2b1b7c
author: Ethan Hugg <ethanhugg@gmail.com>
date: Mon Feb 17 15:05:24 EST 2014
Merge pull request #293 from ruil2/interface_step1 encoder interface update step1 --- review request #75
--- a/codec/api/svc/codec_api.h
+++ b/codec/api/svc/codec_api.h
@@ -56,8 +56,8 @@
/*
* return: CM_RETURN: 0 - success; otherwise - failed;
*/
- virtual int EXTAPI Initialize (SVCEncodingParam* pParam, const INIT_TYPE kiInitType = INIT_TYPE_PARAMETER_BASED) = 0;
- virtual int EXTAPI Initialize2 (void* pParam, const INIT_TYPE kiInitType = INIT_TYPE_CONFIG_BASED) = 0;
+ virtual int EXTAPI Initialize (SEncParamBase* pParam, const INIT_TYPE kiInitType = INIT_TYPE_PARAMETER_BASED) = 0;
+ virtual int EXTAPI Initialize2 (void* pParam, const INIT_TYPE kiInitType = INIT_TYPE_PARAMETER_BASED) = 0;
virtual int EXTAPI Uninitialize() = 0;
@@ -141,7 +141,7 @@
typedef const ISVCEncoderVtbl* ISVCEncoder;
struct ISVCEncoderVtbl {
- int (*Initialize) (ISVCEncoder*, SVCEncodingParam* pParam, const INIT_TYPE kiInitType);
+ int (*Initialize) (ISVCEncoder*, SEncParamBase* pParam, const INIT_TYPE kiInitType);
int (*Initialize2) (ISVCEncoder*, void* pParam, const INIT_TYPE kiInitType);
int (*Uninitialize) (ISVCEncoder*);
--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -72,7 +72,8 @@
typedef enum {
ENCODER_OPTION_DATAFORMAT = 0,
ENCODER_OPTION_IDR_INTERVAL,
- ENCODER_OPTION_SVC_ENCODE_PARAM,
+ ENCODER_OPTION_SVC_ENCODE_PARAM_BASE,
+ ENCODER_OPTION_SVC_ENCODE_PARAM_EXT,
ENCODER_OPTION_FRAME_RATE,
ENCODER_OPTION_BITRATE,
ENCODER_OPTION_INTER_SPATIAL_PRED,
@@ -126,7 +127,7 @@
/* SVC Encoder/Decoder Initializing Parameter Types */
typedef enum {
INIT_TYPE_PARAMETER_BASED = 0, // For SVC DEMO Application
- INIT_TYPE_CONFIG_BASED, // For SVC CONSOLE Application
+ INIT_TYPE_PARAMETER_EXT, // For SVC CONSOLE Application
} INIT_TYPE;
//enumerate the type of video bitstream which is provided to decoder
@@ -159,7 +160,14 @@
} SLTRMarkingFeedback;
typedef struct {
+ unsigned int
+ uiSliceMbNum[MAX_SLICES_NUM_TMP]; //here we use a tmp fixed value since MAX_SLICES_NUM is not defined here and its definition may be changed;
+ unsigned int uiSliceNum;
+ unsigned int uiSliceSizeConstraint;
+ } SSliceArgument;//not all the elements in this argument will be used, how it will be used depends on uiSliceMode; see below
+typedef struct {
+
//# 0 SM_SINGLE_SLICE | SliceNum==1
//# 1 SM_FIXEDSLCNUM_SLICE | according to SliceNum | Enabled dynamic slicing for multi-thread
//# 2 SM_RASTER_SLICE | according to SlicesAssign | Need input of MB numbers each slice. In addition, if other constraint in SSliceArgument is presented, need to follow the constraints. Typically if MB num and slice size are both constrained, re-encoding may be involved.
@@ -166,12 +174,7 @@
//# 3 SM_ROWMB_SLICE | according to PictureMBHeight | Typical of single row of mbs each slice?+ slice size constraint which including re-encoding
//# 4 SM_DYN_SLICE | according to SliceSize | Dynamic slicing (have no idea about slice_nums until encoding current frame)
unsigned int uiSliceMode; //by default, uiSliceMode will be 0
- struct {
- unsigned int
- uiSliceMbNum[MAX_SLICES_NUM_TMP]; //here we use a tmp fixed value since MAX_SLICES_NUM is not defined here and its definition may be changed;
- unsigned int uiSliceNum;
- unsigned int uiSliceSizeConstraint;
- } sSliceArgument;//not all the elements in this argument will be used, how it will be used depends on uiSliceMode; see below
+ SSliceArgument sSliceArgument;
} SSliceConfig;
typedef struct {
@@ -183,42 +186,149 @@
int iCgsSnrRefined; // 0: SNR layers all MGS; 1: SNR layers all CGS
int iInterSpatialLayerPredFlag; // 0: diabled [independency spatial layer coding]; 1: enabled [base spatial layer dependency coding]
- int iQualityBitrate[MAX_QUALITY_LAYER_NUM]; // target bitrate for a quality layer
+ unsigned int uiProfileIdc; // value of profile IDC (0 for auto-detection)
+ int iDLayerQp;
+ int iQualityBitrate[MAX_QUALITY_LAYER_NUM]; // target bitrate for a quality layer
SSliceConfig sSliceCfg;
} SSpatialLayerConfig;
+#ifdef __cplusplus
/* SVC Encoding Parameters */
-typedef struct {
+typedef struct TagEncParamBase{
+
+ int iUsageType; //enable_screen_content_signal;// 0: //camera video signal; 1: screen content signal;
+ int iInputCsp; // color space of input sequence
+
int iPicWidth; // width of picture in samples
int iPicHeight; // height of picture in samples
int iTargetBitrate; // target bitrate desired
+ int iRCMode; // RC mode
+ float fMaxFrameRate; // input maximal frame rate
+
+} SEncParamBase, *PEncParamBase;
+
+
+typedef struct TagEncParamExt:SEncParamBase
+{
int iTemporalLayerNum; // layer number at temporal level
int iSpatialLayerNum; // layer number at spatial level
- float fFrameRate; // input maximal frame rate
-
- int iInputCsp; // color space of input sequence
- int iKeyPicCodingMode;// mode of key picture coding
- int iIntraPeriod; // period of Intra frame
+ unsigned int uiIntraPeriod; // period of Intra frame
bool bEnableSpsPpsIdAddition;
bool bPrefixNalAddingCtrl;
- bool bEnableDenoise; // denoise control
- bool bEnableBackgroundDetection; // background detection control //VAA_BACKGROUND_DETECTION //BGD cmd
+ bool bEnableDenoise; // denoise control
+ bool bEnableBackgroundDetection;// background detection control //VAA_BACKGROUND_DETECTION //BGD cmd
bool bEnableAdaptiveQuant; // adaptive quantization control
bool bEnableFrameSkip; // allow skipping frames to keep the bitrate within limits
bool bEnableCropPic; // enable cropping source picture. 8/25/2010
// false: Streaming Video Sharing; true: Video Conferencing Meeting;
+
bool bEnableLongTermReference; // 0: on, 1: off
- int iLtrMarkPeriod;
+ int iLtrMarkPeriod;
+ int iPaddingFlag; // 0:disable padding;1:padding
+ int iEtropyCodingModeFlag;
- int iRCMode; // RC mode
- int iTemporalBitrate[MAX_TEMPORAL_LAYER_NUM]; // target bitrate specified for a temporal level
- int iPaddingFlag; // 0:disable padding;1:padding
-
SSpatialLayerConfig sSpatialLayers[MAX_SPATIAL_LAYER_NUM];
+ int iNumRefFrame; // number of reference frame used
+ unsigned int uiFrameToBeCoded; // frame to be encoded (at input frame rate)
+ unsigned int uiGopSize;
+ bool bEnableRc;
+ short iMultipleThreadIdc; // 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
+ short iCountThreadsNum; // # derived from disable_multiple_slice_idc (=0 or >1) means;
-} SVCEncodingParam, *PSVCEncodingParam;
+ int iLTRRefNum;
+ bool bEnableSSEI;
+ bool bEnableFrameCroppingFlag;// enable frame cropping flag: TRUE always in application
+
+ /* Deblocking loop filter */
+ int iLoopFilterDisableIdc; // 0: on, 1: off, 2: on except for slice boundaries
+ int iLoopFilterAlphaC0Offset;// AlphaOffset: valid range [-6, 6], default 0
+
+ int iLoopFilterBetaOffset; // BetaOffset: valid range [-6, 6], default 0
+ int iInterLayerLoopFilterDisableIdc; // Employed based upon inter-layer, same comment as above
+ int iInterLayerLoopFilterAlphaC0Offset; // InterLayerLoopFilterAlphaC0Offset
+ int iInterLayerLoopFilterBetaOffset; // InterLayerLoopFilterBetaOffset
+ bool bEnableSceneChangeDetect;
+
+ //added
+ int iMaxQp;
+ int iMinQp;
+
+}SEncParamExt;
+#else
+/* SVC Encoding Parameters */
+typedef struct TagEncParamBase{
+
+ int iUsageType; //enable_screen_content_signal;// 0: //camera video signal; 1: screen content signal;
+ int iInputCsp; // color space of input sequence
+
+ int iPicWidth; // width of picture in samples
+ int iPicHeight; // height of picture in samples
+ int iTargetBitrate; // target bitrate desired
+ int iRCMode; // RC mode
+ float fMaxFrameRate; // input maximal frame rate
+
+} SEncParamBase, *PEncParamBase;
+
+typedef struct TagEncParamExt
+{
+ int iUsageType; //enable_screen_content_signal;// 0: //camera video signal; 1: screen content signal;
+ int iInputCsp; // color space of input sequence
+
+ int iPicWidth; // width of picture in samples
+ int iPicHeight; // height of picture in samples
+ int iTargetBitrate; // target bitrate desired
+ int iRCMode; // RC mode
+ float fMaxFrameRate; // input maximal frame rate
+
+ int iTemporalLayerNum; // layer number at temporal level
+ int iSpatialLayerNum; // layer number at spatial level
+
+ unsigned int uiIntraPeriod; // period of Intra frame
+ bool bEnableSpsPpsIdAddition;
+ bool bPrefixNalAddingCtrl;
+ bool bEnableDenoise; // denoise control
+ bool bEnableBackgroundDetection;// background detection control //VAA_BACKGROUND_DETECTION //BGD cmd
+ bool bEnableAdaptiveQuant; // adaptive quantization control
+ bool bEnableFrameSkip; // allow skipping frames to keep the bitrate within limits
+ bool bEnableCropPic; // enable cropping source picture. 8/25/2010
+ // false: Streaming Video Sharing; true: Video Conferencing Meeting;
+
+ bool bEnableLongTermReference; // 0: on, 1: off
+ int iLtrMarkPeriod;
+ int iPaddingFlag; // 0:disable padding;1:padding
+ int iEtropyCodingModeFlag;
+
+ SSpatialLayerConfig sSpatialLayers[MAX_SPATIAL_LAYER_NUM];
+ int iNumRefFrame; // number of reference frame used
+ unsigned int uiFrameToBeCoded; // frame to be encoded (at input frame rate)
+ unsigned int uiGopSize;
+ bool bEnableRc;
+ short iMultipleThreadIdc; // 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
+ short iCountThreadsNum; // # derived from disable_multiple_slice_idc (=0 or >1) means;
+
+ int iLTRRefNum;
+ bool bEnableSSEI;
+ bool bEnableFrameCroppingFlag;// enable frame cropping flag: TRUE always in application
+
+ /* Deblocking loop filter */
+ int iLoopFilterDisableIdc; // 0: on, 1: off, 2: on except for slice boundaries
+ int iLoopFilterAlphaC0Offset;// AlphaOffset: valid range [-6, 6], default 0
+
+ int iLoopFilterBetaOffset; // BetaOffset: valid range [-6, 6], default 0
+ int iInterLayerLoopFilterDisableIdc; // Employed based upon inter-layer, same comment as above
+ int iInterLayerLoopFilterAlphaC0Offset; // InterLayerLoopFilterAlphaC0Offset
+ int iInterLayerLoopFilterBetaOffset; // InterLayerLoopFilterBetaOffset
+ bool bEnableSceneChangeDetect;
+
+ //added
+ int iMaxQp;
+ int iMinQp;
+
+}SEncParamExt;
+
+#endif
//Define a new struct to show the property of video bitstream.
typedef struct {
--- a/codec/console/enc/src/welsenc.cpp
+++ b/codec/console/enc/src/welsenc.cpp
@@ -46,8 +46,6 @@
//#define STICK_STREAM_SIZE
#include "measure_time.h"
-#include "param_svc.h"
-//#include "layered_pic_buffer.h"
#include "read_config.h"
#include "typedefs.h"
@@ -89,7 +87,7 @@
*/
typedef struct LayerpEncCtx_s {
int32_t iDLayerQp;
- SMulSliceOption sMso;
+ SSliceConfig sSliceCfg;
} SLayerPEncCtx;
@@ -100,7 +98,7 @@
g_iCtrlC = 1;
}
-int ParseConfig (CReadConfig& cRdCfg, SWelsSvcCodingParam& pSvcParam, SFilesSet& sFileSet) {
+int ParseConfig (CReadConfig& cRdCfg, SEncParamExt& pSvcParam, SFilesSet& sFileSet) {
string strTag[4];
int32_t iLeftTargetBitrate = 0;
int32_t iLeftSpatialBitrate[MAX_DEPENDENCY_LAYER] = { 0 };
@@ -206,11 +204,11 @@
} else if (strTag[0].compare ("EnableLongTermReference") == 0) {
pSvcParam.bEnableLongTermReference = atoi (strTag[1].c_str()) ? true : false;
} else if (strTag[0].compare ("LtrMarkPeriod") == 0) {
- pSvcParam.uiLtrMarkPeriod = (uint32_t)atoi (strTag[1].c_str());
+ pSvcParam.iLtrMarkPeriod = (uint32_t)atoi (strTag[1].c_str());
} else if (strTag[0].compare ("NumLayers") == 0) {
- pSvcParam.iNumDependencyLayer = (int8_t)atoi (strTag[1].c_str());
- if (pSvcParam.iNumDependencyLayer > MAX_DEPENDENCY_LAYER || pSvcParam.iNumDependencyLayer <= 0) {
- fprintf (stderr, "Invalid parameter in iNumDependencyLayer: %d.\n", pSvcParam.iNumDependencyLayer);
+ pSvcParam.iSpatialLayerNum = (int8_t)atoi (strTag[1].c_str());
+ if (pSvcParam.iSpatialLayerNum > MAX_DEPENDENCY_LAYER || pSvcParam.iSpatialLayerNum <= 0) {
+ fprintf (stderr, "Invalid parameter in iSpatialLayerNum: %d.\n", pSvcParam.iSpatialLayerNum);
iRet = 1;
break;
}
@@ -230,10 +228,10 @@
}
}
- const int8_t kiActualLayerNum = WELS_MIN (pSvcParam.iNumDependencyLayer, iLayerCount);
- if (pSvcParam.iNumDependencyLayer >
+ const int8_t kiActualLayerNum = WELS_MIN (pSvcParam.iSpatialLayerNum, iLayerCount);
+ if (pSvcParam.iSpatialLayerNum >
kiActualLayerNum) { // fixed number of dependency layer due to parameter error in settings
- pSvcParam.iNumDependencyLayer = kiActualLayerNum;
+ pSvcParam.iSpatialLayerNum = kiActualLayerNum;
}
assert (kiActualLayerNum <= MAX_DEPENDENCY_LAYER);
@@ -243,7 +241,7 @@
int32_t iLayerArg = -2;
int32_t iNumQualityBitrateLayerSet = 0;
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
CReadConfig cRdLayerCfg (sFileSet.sSpatialLayers[iLayer].strLayerCfgFile);
memset (&sLayerCtx, 0, sizeof (SLayerPEncCtx));
@@ -260,15 +258,11 @@
if (strTag[0].empty())
continue;
if (strTag[0].compare ("SourceWidth") == 0) {
- pDLayer->iFrameWidth = atoi (strTag[1].c_str());
- pDLayer->iActualWidth = pDLayer->iFrameWidth;
+ pDLayer->iVideoWidth = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SourceHeight") == 0) {
- pDLayer->iFrameHeight = atoi (strTag[1].c_str());
- pDLayer->iActualHeight = pDLayer->iFrameHeight;
- } else if (strTag[0].compare ("FrameRateIn") == 0) {
- pDLayer->fInputFrameRate = (float)atof (strTag[1].c_str());
+ pDLayer->iVideoHeight = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("FrameRateOut") == 0) {
- pDLayer->fOutputFrameRate = (float)atof (strTag[1].c_str());
+ pDLayer->fFrameRate = (float)atof (strTag[1].c_str());
} else if (strTag[0].compare ("InputFile") == 0) {
if (strTag[1].length() > 0)
sFileSet.sSpatialLayers[iLayer].strSeqFile = strTag[1];
@@ -299,32 +293,32 @@
} else if (strTag[0].compare ("InitialQP") == 0) {
sLayerCtx.iDLayerQp = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SliceMode") == 0) {
- sLayerCtx.sMso.uiSliceMode = (SliceMode)atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.uiSliceMode = (SliceMode)atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SliceSize") == 0) { //SM_DYN_SLICE
- sLayerCtx.sMso.sSliceArgument.uiSliceSizeConstraint = (SliceMode)atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceSizeConstraint = (SliceMode)atoi (strTag[1].c_str());
continue;
} else if (strTag[0].compare ("SliceNum") == 0) {
- sLayerCtx.sMso.sSliceArgument.iSliceNum = atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceNum = atoi (strTag[1].c_str());
} else if (strTag[0].compare (0, kiSize, str_) == 0) {
const char* kpString = strTag[0].c_str();
int uiSliceIdx = atoi (&kpString[kiSize]);
assert (uiSliceIdx < MAX_SLICES_NUM);
- sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
}
}
}
pDLayer->iDLayerQp = sLayerCtx.iDLayerQp;
- pDLayer->sMso.uiSliceMode = sLayerCtx.sMso.uiSliceMode;
+ pDLayer->sSliceCfg.uiSliceMode = sLayerCtx.sSliceCfg.uiSliceMode;
- memcpy (&pDLayer->sMso, &sLayerCtx.sMso, sizeof (SMulSliceOption)); // confirmed_safe_unsafe_usage
- memcpy (&pDLayer->sMso.sSliceArgument.uiSliceMbNum[0], &sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[0],
- sizeof (sLayerCtx.sMso.sSliceArgument.uiSliceMbNum)); // confirmed_safe_unsafe_usage
+ memcpy (&pDLayer->sSliceCfg, &sLayerCtx.sSliceCfg, sizeof (SSliceConfig)); // confirmed_safe_unsafe_usage
+ memcpy (&pDLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0], &sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum[0],
+ sizeof (sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum)); // confirmed_safe_unsafe_usage
}
return iRet;
}
-int ParseCommandLine (int argc, char** argv, SVCEncodingParam& sParam) {
+int ParseCommandLine (int argc, char** argv, SEncParamExt& sParam) {
char* pCmd;
int i = 0;
@@ -338,7 +332,7 @@
sParam.iTemporalLayerNum = atoi (argv[i++]);
else if (!strcmp (pCmd, "-iper") && (i < argc))
- sParam.iIntraPeriod = atoi (argv[i++]);
+ sParam.uiIntraPeriod = atoi (argv[i++]);
else if (!strcmp (pCmd, "-spsid") && (i < argc))
sParam.bEnableSpsPpsIdAddition = atoi (argv[i++]) ? true : false;
@@ -418,7 +412,7 @@
printf ("\n");
}
-int ParseCommandLine (int argc, char** argv, SWelsSvcCodingParam& pSvcParam, SFilesSet& sFileSet) {
+int ParseCommandLine (int argc, char** argv, SEncParamExt& pSvcParam, SFilesSet& sFileSet) {
char* pCommand = NULL;
SLayerPEncCtx sLayerCtx[3];
int n = 0;
@@ -462,7 +456,7 @@
pSvcParam.bEnableLongTermReference = atoi (argv[n++]) ? true : false;
else if (!strcmp (pCommand, "-ltrper") && (n < argc))
- pSvcParam.uiLtrMarkPeriod = atoi (argv[n++]);
+ pSvcParam.iLtrMarkPeriod = atoi (argv[n++]);
else if (!strcmp (pCommand, "-rc") && (n < argc))
pSvcParam.bEnableRc = atoi (argv[n++]) ? true : false;
@@ -471,19 +465,19 @@
pSvcParam.iTargetBitrate = atoi (argv[n++]);
else if (!strcmp (pCommand, "-numl") && (n < argc)) {
- pSvcParam.iNumDependencyLayer = atoi (argv[n++]);
- for (int ln = 0 ; (ln < pSvcParam.iNumDependencyLayer) && (n < argc) ; ln++) {
+ pSvcParam.iSpatialLayerNum = atoi (argv[n++]);
+ for (int ln = 0 ; (ln < pSvcParam.iSpatialLayerNum) && (n < argc) ; ln++) {
// pSvcParam.sDependencyLayers[ln].uiDependencyId = ln;
sFileSet.sSpatialLayers[ln].strLayerCfgFile.assign (argv[n++]);
}
- for (int8_t iLayer = 0; iLayer < pSvcParam.iNumDependencyLayer; ++ iLayer) {
+ for (int8_t iLayer = 0; iLayer < pSvcParam.iSpatialLayerNum; ++ iLayer) {
SLayerPEncCtx sLayerCtx;
string strTag[4];
int32_t iLayerArg = -2;
int32_t iNumQualityBitrateLayerSet = 0;
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
CReadConfig cRdLayerCfg (sFileSet.sSpatialLayers[iLayer].strLayerCfgFile);
memset (&sLayerCtx, 0, sizeof (SLayerPEncCtx));
@@ -500,15 +494,11 @@
if (strTag[0].empty())
continue;
if (strTag[0].compare ("SourceWidth") == 0) {
- pDLayer->iFrameWidth = atoi (strTag[1].c_str());
- pDLayer->iActualWidth = pDLayer->iFrameWidth;
+ pDLayer->iVideoWidth = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SourceHeight") == 0) {
- pDLayer->iFrameHeight = atoi (strTag[1].c_str());
- pDLayer->iActualHeight = pDLayer->iFrameHeight;
- } else if (strTag[0].compare ("FrameRateIn") == 0) {
- pDLayer->fInputFrameRate = (float)atof (strTag[1].c_str());
+ pDLayer->iVideoHeight = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("FrameRateOut") == 0) {
- pDLayer->fOutputFrameRate = (float)atof (strTag[1].c_str());
+ pDLayer->fFrameRate = (float)atof (strTag[1].c_str());
} else if (strTag[0].compare ("InputFile") == 0) {
if (strTag[1].length() > 0)
sFileSet.sSpatialLayers[iLayer].strSeqFile = strTag[1];
@@ -529,24 +519,24 @@
} else if (strTag[0].compare ("InitialQP") == 0) {
sLayerCtx.iDLayerQp = atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SliceMode") == 0) {
- sLayerCtx.sMso.uiSliceMode = (SliceMode)atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.uiSliceMode = (SliceMode)atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SliceSize") == 0) { //SM_DYN_SLICE
- sLayerCtx.sMso.sSliceArgument.uiSliceSizeConstraint = (SliceMode)atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceSizeConstraint = (SliceMode)atoi (strTag[1].c_str());
} else if (strTag[0].compare ("SliceNum") == 0) {
- sLayerCtx.sMso.sSliceArgument.iSliceNum = atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceNum = atoi (strTag[1].c_str());
} else if (strTag[0].compare (0, kiSize, str_) == 0) {
const char* kpString = strTag[0].c_str();
int uiSliceIdx = atoi (&kpString[kiSize]);
assert (uiSliceIdx < MAX_SLICES_NUM);
- sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
+ sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum[uiSliceIdx] = atoi (strTag[1].c_str());
}
}
}
pDLayer->iDLayerQp = sLayerCtx.iDLayerQp;
- pDLayer->sMso.uiSliceMode = sLayerCtx.sMso.uiSliceMode;
- memcpy (&pDLayer->sMso, &sLayerCtx.sMso, sizeof (SMulSliceOption)); // confirmed_safe_unsafe_usage
- memcpy (&pDLayer->sMso.sSliceArgument.uiSliceMbNum[0], &sLayerCtx.sMso.sSliceArgument.uiSliceMbNum[0],
- sizeof (sLayerCtx.sMso.sSliceArgument.uiSliceMbNum)); // confirmed_safe_unsafe_usage
+ pDLayer->sSliceCfg.uiSliceMode = sLayerCtx.sSliceCfg.uiSliceMode;
+ memcpy (&pDLayer->sSliceCfg, &sLayerCtx.sSliceCfg, sizeof (SSliceConfig)); // confirmed_safe_unsafe_usage
+ memcpy (&pDLayer->sSliceCfg.sSliceArgument.uiSliceMbNum[0], &sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum[0],
+ sizeof (sLayerCtx.sSliceCfg.sSliceArgument.uiSliceMbNum)); // confirmed_safe_unsafe_usage
}
}
@@ -569,33 +559,25 @@
else if (!strcmp (pCommand, "-sw") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->iFrameWidth = atoi (argv[n++]);
- pDLayer->iActualWidth = pDLayer->iFrameWidth;
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
+ pDLayer->iVideoWidth = atoi (argv[n++]);
}
else if (!strcmp (pCommand, "-sh") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->iFrameHeight = atoi (argv[n++]);
- pDLayer->iActualHeight = pDLayer->iFrameHeight;
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
+ pDLayer->iVideoHeight = atoi (argv[n++]);
}
- else if (!strcmp (pCommand, "-frin") && (n + 1 < argc)) {
+ else if (!strcmp (pCommand, "-frout") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->fInputFrameRate = (float)atof (argv[n++]);
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
+ pDLayer->fFrameRate = (float)atof (argv[n++]);
}
- else if (!strcmp (pCommand, "-frout") && (n + 1 < argc)) {
- unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->fOutputFrameRate = (float)atof (argv[n++]);
- }
-
else if (!strcmp (pCommand, "-lqp") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
pDLayer->iDLayerQp = sLayerCtx[iLayer].iDLayerQp = atoi (argv[n++]);
}
//sLayerCtx[iLayer].num_quality_layers = pDLayer->num_quality_layers = 1;
@@ -602,32 +584,32 @@
else if (!strcmp (pCommand, "-ltarb") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
pDLayer->iSpatialBitrate = 1000 * atoi (argv[n++]);
}
else if (!strcmp (pCommand, "-slcmd") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
switch (atoi (argv[n++])) {
case 0:
- pDLayer->sMso.uiSliceMode = SM_SINGLE_SLICE;
+ pDLayer->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
break;
case 1:
- pDLayer->sMso.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
+ pDLayer->sSliceCfg.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
break;
case 2:
- pDLayer->sMso.uiSliceMode = SM_RASTER_SLICE;
+ pDLayer->sSliceCfg.uiSliceMode = SM_RASTER_SLICE;
break;
case 3:
- pDLayer->sMso.uiSliceMode = SM_ROWMB_SLICE;
+ pDLayer->sSliceCfg.uiSliceMode = SM_ROWMB_SLICE;
break;
case 4:
- pDLayer->sMso.uiSliceMode = SM_DYN_SLICE;
+ pDLayer->sSliceCfg.uiSliceMode = SM_DYN_SLICE;
break;
default:
- pDLayer->sMso.uiSliceMode = SM_RESERVED;
+ pDLayer->sSliceCfg.uiSliceMode = SM_RESERVED;
break;
}
}
@@ -634,14 +616,14 @@
else if (!strcmp (pCommand, "-slcsize") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->sMso.sSliceArgument.uiSliceSizeConstraint = atoi (argv[n++]);
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
+ pDLayer->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = atoi (argv[n++]);
}
else if (!strcmp (pCommand, "-slcnum") && (n + 1 < argc)) {
unsigned int iLayer = atoi (argv[n++]);
- SDLayerParam* pDLayer = &pSvcParam.sDependencyLayers[iLayer];
- pDLayer->sMso.sSliceArgument.iSliceNum = atoi (argv[n++]);
+ SSpatialLayerConfig* pDLayer = &pSvcParam.sSpatialLayers[iLayer];
+ pDLayer->sSliceCfg.sSliceArgument.uiSliceNum = atoi (argv[n++]);
}
}
return 0;
@@ -649,9 +631,9 @@
-int FillSpecificParameters (SVCEncodingParam& sParam) {
+int FillSpecificParameters (SEncParamExt& sParam) {
/* Test for temporal, spatial, SNR scalability */
- sParam.fFrameRate = 30.0f; // input frame rate
+ sParam.fMaxFrameRate = 30.0f; // input frame rate
sParam.iPicWidth = 1280; // width of picture in samples
sParam.iPicHeight = 720; // height of picture in samples
sParam.iTargetBitrate = 2500000; // target bitrate desired
@@ -666,8 +648,7 @@
sParam.iLtrMarkPeriod = 30;
sParam.iInputCsp = videoFormatI420; // color space of input sequence
- sParam.iKeyPicCodingMode = 1; // mode of key picture coding
- sParam.iIntraPeriod = 320; // period of Intra frame
+ sParam.uiIntraPeriod = 320; // period of Intra frame
sParam.bEnableSpsPpsIdAddition = 1;
sParam.bPrefixNalAddingCtrl = 1;
@@ -679,7 +660,6 @@
sParam.sSpatialLayers[iIndexLayer].iSpatialBitrate = 64000;
sParam.sSpatialLayers[iIndexLayer].iCgsSnrRefined = 0;
// sParam.sSpatialLayers[iIndexLayer].iQualityBitrate[0] = 0;
-// memset(sParam.iTemporalBitrate, 0, sizeof(sParam.iTemporalBitrate));
sParam.sSpatialLayers[iIndexLayer].iInterSpatialLayerPredFlag = 0;
#ifdef MT_ENABLED
sParam.sSpatialLayers[iIndexLayer].sSliceCfg.uiSliceMode = 0;
@@ -737,7 +717,7 @@
if (sParam.sSpatialLayers[i].fFrameRate > fMaxFr + EPSN)
fMaxFr = sParam.sSpatialLayers[i].fFrameRate;
}
- sParam.fFrameRate = fMaxFr;
+ sParam.fMaxFrameRate = fMaxFr;
return 0;
}
@@ -753,7 +733,7 @@
FILE* pFpBs = NULL;
FILE* pFpSrc = NULL;
SFrameBSInfo sFbi;
- SVCEncodingParam sSvcParam;
+ SEncParamExt sSvcParam;
int64_t iStart = 0, iTotal = 0;
int32_t ret = 0;
@@ -777,7 +757,7 @@
}
memset (&sFbi, 0, sizeof (SFrameBSInfo));
- memset (&sSvcParam, 0, sizeof (SVCEncodingParam));
+ memset (&sSvcParam, 0, sizeof (SEncParamBase));
FillSpecificParameters (sSvcParam);
@@ -898,7 +878,7 @@
return 1;
SFrameBSInfo sFbi;
- SWelsSvcCodingParam sSvcParam;
+ SEncParamExt sSvcParam;
int64_t iStart = 0, iTotal = 0;
// Preparing encoding process
@@ -926,10 +906,10 @@
int iParsedNum = 2;
memset (&sFbi, 0, sizeof (SFrameBSInfo));
- memset (&sSvcParam, 0, sizeof (SWelsSvcCodingParam));
+ memset (&sSvcParam, 0, sizeof (SEncParamExt));
sSvcParam.iInputCsp = videoFormatI420; // I420 in default
- sSvcParam.sDependencyLayers[0].uiProfileIdc = PRO_BASELINE;
+ sSvcParam.sSpatialLayers[0].uiProfileIdc = PRO_BASELINE;
// svc_cfg->sDependencyLayers[0].frext_mode = 0;
// for configuration file
@@ -955,21 +935,11 @@
}
iTotalFrameMax = (int32_t)sSvcParam.uiFrameToBeCoded;
- sSvcParam.SUsedPicRect.iLeft = 0;
- sSvcParam.SUsedPicRect.iTop = 0;
-// sSvcParam.max_pic_width =
- sSvcParam.iActualPicWidth =
- sSvcParam.SUsedPicRect.iWidth = sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iFrameWidth;
-// pSvcParam.max_pic_height =
- sSvcParam.iActualPicHeight =
- sSvcParam.SUsedPicRect.iHeight = sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iFrameHeight;
+ sSvcParam.iPicWidth = sSvcParam.sSpatialLayers[sSvcParam.iSpatialLayerNum - 1].iVideoWidth;
+ sSvcParam.iPicHeight = sSvcParam.sSpatialLayers[sSvcParam.iSpatialLayerNum - 1].iVideoHeight;
- sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iFrameWidth =
- WELS_ALIGN(sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iActualWidth, MB_WIDTH_LUMA);
- sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iFrameHeight =
- WELS_ALIGN(sSvcParam.sDependencyLayers[sSvcParam.iNumDependencyLayer - 1].iActualHeight, MB_HEIGHT_LUMA);
- if (cmResultSuccess != pPtrEnc->Initialize2 ((void*)&sSvcParam, INIT_TYPE_CONFIG_BASED)) { // SVC encoder initialization
+ if (cmResultSuccess != pPtrEnc->Initialize (&sSvcParam, INIT_TYPE_PARAMETER_EXT)) { // SVC encoder initialization
fprintf (stderr, "SVC encoder Initialize failed\n");
iRet = 1;
goto INSIDE_MEM_FREE;
@@ -995,10 +965,10 @@
}
#endif
- pSrcPicList = new SSourcePicture * [sSvcParam.iNumDependencyLayer];
- while (iDlayerIdx < sSvcParam.iNumDependencyLayer) {
- SDLayerParam* pDLayer = &sSvcParam.sDependencyLayers[iDlayerIdx];
- const int kiPicResSize = pDLayer->iActualWidth * pDLayer->iActualHeight;
+ pSrcPicList = new SSourcePicture * [sSvcParam.iSpatialLayerNum];
+ while (iDlayerIdx < sSvcParam.iSpatialLayerNum) {
+ SSpatialLayerConfig* pDLayer = &sSvcParam.sSpatialLayers[iDlayerIdx];
+ const int kiPicResSize = pDLayer->iVideoWidth * pDLayer->iVideoHeight;
SSourcePicture* pSrcPic = new SSourcePicture;
if (pSrcPic == NULL) {
iRet = 1;
@@ -1013,10 +983,10 @@
}
pSrcPic->iColorFormat = videoFormatI420;
- pSrcPic->iPicWidth = pDLayer->iActualWidth;
- pSrcPic->iPicHeight = pDLayer->iActualHeight;
- pSrcPic->iStride[0] = pDLayer->iActualWidth;
- pSrcPic->iStride[1] = pSrcPic->iStride[2] = pDLayer->iActualWidth >> 1;
+ pSrcPic->iPicWidth = pDLayer->iVideoWidth;
+ pSrcPic->iPicHeight = pDLayer->iVideoHeight;
+ pSrcPic->iStride[0] = pDLayer->iVideoWidth;
+ pSrcPic->iStride[1] = pSrcPic->iStride[2] = pDLayer->iVideoWidth >> 1;
pSrcPicList[iDlayerIdx] = pSrcPic;
@@ -1052,10 +1022,10 @@
iDlayerIdx = 0;
int nSpatialLayerNum = 0;
- while (iDlayerIdx < sSvcParam.iNumDependencyLayer) {
- SDLayerParam* pDLayer = &sSvcParam.sDependencyLayers[iDlayerIdx];
- const int kiPicResSize = ((pDLayer->iActualWidth * pDLayer->iActualHeight) * 3) >> 1;
- uint32_t uiSkipIdx = (1 << pDLayer->iTemporalResolution);
+ while (iDlayerIdx < sSvcParam.iSpatialLayerNum) {
+ SSpatialLayerConfig* pDLayer = &sSvcParam.sSpatialLayers[iDlayerIdx];
+ const int kiPicResSize = ((pDLayer->iVideoWidth * pDLayer->iVideoHeight) * 3) >> 1;
+ uint32_t uiSkipIdx = 1;//(1 << pDLayer->iTemporalResolution);
bool bCanBeRead = false;
@@ -1067,15 +1037,15 @@
pSrcPicList[nSpatialLayerNum]->pData[0] = pYUV[iDlayerIdx];
pSrcPicList[nSpatialLayerNum]->pData[1] = pSrcPicList[nSpatialLayerNum]->pData[0] +
- (pDLayer->iActualWidth * pDLayer->iActualHeight);
+ (pDLayer->iVideoWidth * pDLayer->iVideoHeight);
pSrcPicList[nSpatialLayerNum]->pData[2] = pSrcPicList[nSpatialLayerNum]->pData[1] +
- ((pDLayer->iActualWidth * pDLayer->iActualHeight) >> 2);
+ ((pDLayer->iVideoWidth * pDLayer->iVideoHeight) >> 2);
- pSrcPicList[nSpatialLayerNum]->iPicWidth = pDLayer->iActualWidth;
- pSrcPicList[nSpatialLayerNum]->iPicHeight = pDLayer->iActualHeight;
- pSrcPicList[nSpatialLayerNum]->iStride[0] = pDLayer->iActualWidth;
+ pSrcPicList[nSpatialLayerNum]->iPicWidth = pDLayer->iVideoWidth;
+ pSrcPicList[nSpatialLayerNum]->iPicHeight = pDLayer->iVideoHeight;
+ pSrcPicList[nSpatialLayerNum]->iStride[0] = pDLayer->iVideoWidth;
pSrcPicList[nSpatialLayerNum]->iStride[1] = pSrcPicList[nSpatialLayerNum]->iStride[2]
- = pDLayer->iActualWidth >> 1;
+ = pDLayer->iVideoWidth >> 1;
++ nSpatialLayerNum;
} else { // file end while reading
@@ -1161,7 +1131,7 @@
if (iActualFrameEncodedCount > 0) {
double dElapsed = iTotal / 1e6;
printf ("Width: %d\nHeight: %d\nFrames: %d\nencode time: %f sec\nFPS: %f fps\n",
- sSvcParam.iActualPicWidth, sSvcParam.iActualPicHeight,
+ sSvcParam.iPicWidth, sSvcParam.iPicHeight,
iActualFrameEncodedCount, dElapsed, (iActualFrameEncodedCount * 1.0) / dElapsed);
}
@@ -1186,7 +1156,7 @@
#endif
// Destruction memory introduced in this routine
iDlayerIdx = 0;
- while (iDlayerIdx < sSvcParam.iNumDependencyLayer) {
+ while (iDlayerIdx < sSvcParam.iSpatialLayerNum) {
if (pFileYUV[iDlayerIdx] != NULL) {
fclose (pFileYUV[iDlayerIdx]);
pFileYUV[iDlayerIdx] = NULL;
@@ -1195,7 +1165,7 @@
}
if (pSrcPicList) {
- for (int32_t i = 0; i < sSvcParam.iNumDependencyLayer; i++) {
+ for (int32_t i = 0; i < sSvcParam.iSpatialLayerNum; i++) {
if (pSrcPicList[i]) {
delete pSrcPicList[i];
pSrcPicList[i] = NULL;
--- a/codec/encoder/core/inc/param_svc.h
+++ b/codec/encoder/core/inc/param_svc.h
@@ -96,7 +96,7 @@
// uint8_t uiDependencyId;
int8_t iDLayerQp;
-SMulSliceOption sMso; // multiple slice options
+SSliceConfig sSliceCfg; // multiple slice options
float fInputFrameRate; // input frame rate
float fOutputFrameRate; // output frame rate
@@ -109,17 +109,11 @@
/*
* Cisco OpenH264 Encoder Parameter Configuration
*/
-typedef struct TagWelsSvcCodingParam {
+typedef struct TagWelsSvcCodingParam: SEncParamExt{
SDLayerParam sDependencyLayers[MAX_DEPENDENCY_LAYER];
/* General */
uint32_t uiGopSize; // GOP size (at maximal frame rate: 16)
-uint32_t uiIntraPeriod; // intra period (multiple of GOP size as desired)
-int32_t iNumRefFrame; // number of reference frame used
-
-int32_t iActualPicWidth; // actual input picture width
-int32_t iActualPicHeight; // actual input picture height
-
struct {
int32_t iLeft;
int32_t iTop;
@@ -129,62 +123,16 @@
char* pCurPath; // record current lib path such as:/pData/pData/com.wels.enc/lib/
-float fMaxFrameRate; // maximal frame rate [Hz / fps]
-int32_t iInputCsp; // color space of input sequence
-uint32_t uiFrameToBeCoded; // frame to be encoded (at input frame rate)
-
-int32_t iTargetBitrate; // overall target bitrate introduced in RC module
-int16_t iMultipleThreadIdc; // 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
-int16_t iCountThreadsNum; // # derived from disable_multiple_slice_idc (=0 or >1) means;
-
-int32_t iLTRRefNum;
-uint32_t uiLtrMarkPeriod; //the min distance of two int32_t references
-
bool bDeblockingParallelFlag; // deblocking filter parallelization control flag
bool bMgsT0OnlyStrategy; //MGS_T0_only_strategy
-bool bEnableSSEI;
-bool bEnableFrameCroppingFlag; // enable frame cropping flag: true alwayse in application
-bool bEnableCropPic; // enable cropping source picture. , 8/25/2010
-// false: Streaming Video Sharing; true: Video Conferencing Meeting;
-int8_t iDecompStages; // GOP size dependency
+// FALSE: Streaming Video Sharing; TRUE: Video Conferencing Meeting;
-/* Deblocking loop filter */
-int8_t iLoopFilterDisableIdc; // 0: on, 1: off, 2: on except for slice boundaries
-int8_t iLoopFilterAlphaC0Offset;// AlphaOffset: valid range [-6, 6], default 0
-
-int8_t iLoopFilterBetaOffset; // BetaOffset: valid range [-6, 6], default 0
-int8_t iInterLayerLoopFilterDisableIdc; // Employed based upon inter-layer, same comment as above
-int8_t iInterLayerLoopFilterAlphaC0Offset; // InterLayerLoopFilterAlphaC0Offset
-int8_t iInterLayerLoopFilterBetaOffset; // InterLayerLoopFilterBetaOffset
-
+int8_t iDecompStages; // GOP size dependency
/* Rate Control */
bool bEnableRc;
-int8_t iRCMode;
-int8_t iPaddingFlag;
-/* denoise control */
-bool bEnableDenoise;
-/* scene change detection control */
-bool bEnableSceneChangeDetect;
-// background detection control
-bool bEnableBackgroundDetection;
-/* adaptive quantization control */
-bool bEnableAdaptiveQuant;
-/* frame skipping */
-bool bEnableFrameSkip;
-/* long term reference control */
-bool bEnableLongTermReference;
-/* pSps pPps id addition control */
-bool bEnableSpsPpsIdAddition;
-/* Layer definition */
-bool bPrefixNalAddingCtrl;
-int8_t iNumDependencyLayer; // number of dependency(Spatial/CGS) layers used to be encoded
-int8_t iNumTemporalLayer; // number of temporal layer specified
-
-
-
public:
TagWelsSvcCodingParam (const bool kbEnableRc = true) {
FillDefault (kbEnableRc);
@@ -196,8 +144,8 @@
uiIntraPeriod = 0; // intra period (multiple of GOP size as desired)
iNumRefFrame = MIN_REF_PIC_COUNT; // number of reference frame used
- iActualPicWidth = 0; // actual input picture width
- iActualPicHeight = 0; // actual input picture height
+ iPicWidth = 0; // actual input picture width
+ iPicHeight = 0; // actual input picture height
SUsedPicRect.iLeft =
SUsedPicRect.iTop =
SUsedPicRect.iWidth =
@@ -220,7 +168,7 @@
iCountThreadsNum = 1; // # derived from disable_multiple_slice_idc (=0 or >1) means;
iLTRRefNum = 0;
- uiLtrMarkPeriod = 30; //the min distance of two int32_t references
+ iLtrMarkPeriod = 30; //the min distance of two int32_t references
bMgsT0OnlyStrategy =
true; // Strategy of have MGS only at T0 frames (0: do not use this strategy; 1: use this strategy)
@@ -251,25 +199,99 @@
bEnableLongTermReference = false; // long term reference control
bEnableSpsPpsIdAddition = true; // pSps pPps id addition control
bPrefixNalAddingCtrl = true; // prefix NAL adding control
- iNumDependencyLayer = 0; // number of dependency(Spatial/CGS) layers used to be encoded
- iNumTemporalLayer = 0; // number of temporal layer specified
+ iSpatialLayerNum = 1; // number of dependency(Spatial/CGS) layers used to be encoded
+ iTemporalLayerNum = 1; // number of temporal layer specified
+ iMaxQp = 51;
+ iMinQp = 0;
+ iUsageType = 0;
memset(sDependencyLayers,0,sizeof(SDLayerParam)*MAX_DEPENDENCY_LAYER);
+
+
+
+ //init multi-slice
+ sDependencyLayers[0].sSliceCfg.uiSliceMode = 0;
+ sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 1500;
+ sDependencyLayers[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;
+
+
}
-int32_t ParamTranscode (SVCEncodingParam& pCodingParam, const bool kbEnableRc = true) {
- pCodingParam.fFrameRate = WELS_CLIP3 (pCodingParam.fFrameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);
+int32_t ParamBaseTranscode (SEncParamBase& pCodingParam, const bool kbEnableRc = true) {
+
+ pCodingParam.fMaxFrameRate = WELS_CLIP3 (pCodingParam.fMaxFrameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);
iInputCsp = pCodingParam.iInputCsp; // color space of input sequence
+
+ iPicWidth = pCodingParam.iPicWidth;
+ iPicHeight = pCodingParam.iPicHeight;
+
+ SUsedPicRect.iLeft = 0;
+ SUsedPicRect.iTop = 0;
+ SUsedPicRect.iWidth = ((iPicWidth >> 1) << 1);
+ SUsedPicRect.iHeight = ((iPicHeight >> 1) << 1);
+
+ bEnableRc = kbEnableRc;
+ if (pCodingParam.iRCMode != RC_MODE0 && pCodingParam.iRCMode != RC_MODE1)
+ iRCMode = RC_MODE1;
+ else
+ iRCMode = pCodingParam.iRCMode; // rc mode
+
+
+
+ int8_t iIdxSpatial = 0;
+ uint8_t uiProfileIdc = PRO_BASELINE;
+ SDLayerParam* pDlp = &sDependencyLayers[0];
+
+ while (iIdxSpatial < iSpatialLayerNum) {
+
+ pDlp->uiProfileIdc = uiProfileIdc;
+ sSpatialLayers[iIdxSpatial].fFrameRate = WELS_CLIP3 (sSpatialLayers[iIdxSpatial].fFrameRate,
+ MIN_FRAME_RATE, pCodingParam.fMaxFrameRate);
+ pDlp->fInputFrameRate =
+ pDlp->fOutputFrameRate = WELS_CLIP3 (sSpatialLayers[iIdxSpatial].fFrameRate, MIN_FRAME_RATE,
+ MAX_FRAME_RATE);
+#ifdef ENABLE_FRAME_DUMP
+ pDlp->sRecFileName[0] = '\0'; // file to be constructed
+#endif//ENABLE_FRAME_DUMP
+ pDlp->iActualWidth = sSpatialLayers[iIdxSpatial].iVideoWidth = iPicWidth;
+ pDlp->iFrameWidth = WELS_ALIGN(pDlp->iActualWidth, MB_WIDTH_LUMA);
+
+ pDlp->iActualHeight = sSpatialLayers[iIdxSpatial].iVideoHeight = iPicHeight;
+ pDlp->iFrameHeight = WELS_ALIGN(pDlp->iActualHeight, MB_HEIGHT_LUMA);
+
+ pDlp->iSpatialBitrate =
+ sSpatialLayers[iIdxSpatial].iSpatialBitrate = pCodingParam.iTargetBitrate; // target bitrate for current spatial layer
+
+
+ pDlp->iDLayerQp = SVC_QUALITY_BASE_QP;
+
+ uiProfileIdc = PRO_SCALABLE_BASELINE;
+ ++ pDlp;
+ ++ iIdxSpatial;
+ }
+ SetActualPicResolution();
+
+ return 0;
+}
+int32_t ParamTranscode (SEncParamExt& pCodingParam, const bool kbEnableRc = true) {
+ pCodingParam.fMaxFrameRate = WELS_CLIP3 (pCodingParam.fMaxFrameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);
+
+ iInputCsp = pCodingParam.iInputCsp; // color space of input sequence
uiFrameToBeCoded = (uint32_t) -
1; // frame to be encoded (at input frame rate), -1 dependents on length of input sequence
- iActualPicWidth = pCodingParam.iPicWidth;
- iActualPicHeight = pCodingParam.iPicHeight;
+ iPicWidth = pCodingParam.iPicWidth;
+ iPicHeight = pCodingParam.iPicHeight;
SUsedPicRect.iLeft = 0;
SUsedPicRect.iTop = 0;
- SUsedPicRect.iWidth = ((iActualPicWidth >> 1) << 1);
- SUsedPicRect.iHeight = ((iActualPicHeight >> 1) << 1);
+ SUsedPicRect.iWidth = ((iPicWidth >> 1) << 1);
+ SUsedPicRect.iHeight = ((iPicHeight >> 1) << 1);
/* Deblocking loop filter */
#ifdef MT_ENABLED
@@ -315,22 +337,22 @@
/* Enable int32_t term reference */
bEnableLongTermReference = pCodingParam.bEnableLongTermReference ? true : false;
- uiLtrMarkPeriod = pCodingParam.iLtrMarkPeriod;
+ iLtrMarkPeriod = pCodingParam.iLtrMarkPeriod;
/* For ssei information */
bEnableSSEI = true;
/* Layer definition */
- iNumDependencyLayer = (int8_t)WELS_CLIP3 (pCodingParam.iSpatialLayerNum, 1,
+ iSpatialLayerNum = (int8_t)WELS_CLIP3 (pCodingParam.iSpatialLayerNum, 1,
MAX_DEPENDENCY_LAYER); // number of dependency(Spatial/CGS) layers used to be encoded
pCodingParam.iTemporalLayerNum = (int8_t)WELS_CLIP3 (pCodingParam.iTemporalLayerNum, 1,
MAX_TEMPORAL_LEVEL); // safe valid iTemporalLayerNum
- iNumTemporalLayer = (int8_t)
+ iTemporalLayerNum = (int8_t)
pCodingParam.iTemporalLayerNum;//(int8_t)WELS_CLIP3(pCodingParam.iTemporalLayerNum, 1, MAX_TEMPORAL_LEVEL);// number of temporal layer specified
- uiGopSize = 1 << (iNumTemporalLayer - 1); // Override GOP size based temporal layer
- iDecompStages = iNumTemporalLayer - 1; // WELS_LOG2( uiGopSize );// GOP size dependency
- uiIntraPeriod = pCodingParam.iIntraPeriod;// intra period (multiple of GOP size as desired)
+ uiGopSize = 1 << (iTemporalLayerNum - 1); // Override GOP size based temporal layer
+ iDecompStages = iTemporalLayerNum - 1; // WELS_LOG2( uiGopSize );// GOP size dependency
+ uiIntraPeriod = pCodingParam.uiIntraPeriod;// intra period (multiple of GOP size as desired)
if (uiIntraPeriod == (uint32_t) (-1))
uiIntraPeriod = 0;
else if (uiIntraPeriod & uiGopSize) // none multiple of GOP size
@@ -340,7 +362,7 @@
iNumRefFrame = ((uiGopSize >> 1) > 1) ? ((uiGopSize >> 1) + iLTRRefNum) : (MIN_REF_PIC_COUNT + iLTRRefNum);
iNumRefFrame = WELS_CLIP3 (iNumRefFrame, MIN_REF_PIC_COUNT, MAX_REFERENCE_PICTURE_COUNT_NUM);
- uiLtrMarkPeriod = pCodingParam.iLtrMarkPeriod;
+ iLtrMarkPeriod = pCodingParam.iLtrMarkPeriod;
bPrefixNalAddingCtrl = pCodingParam.bPrefixNalAddingCtrl;
@@ -352,11 +374,11 @@
float fMaxFr = .0f;
uint8_t uiProfileIdc = PRO_BASELINE;
int8_t iIdxSpatial = 0;
- while (iIdxSpatial < iNumDependencyLayer) {
+ while (iIdxSpatial < iSpatialLayerNum) {
pDlp->uiProfileIdc = uiProfileIdc;
pCodingParam.sSpatialLayers[iIdxSpatial].fFrameRate = WELS_CLIP3 (pCodingParam.sSpatialLayers[iIdxSpatial].fFrameRate,
- MIN_FRAME_RATE, pCodingParam.fFrameRate);
+ MIN_FRAME_RATE, pCodingParam.fMaxFrameRate);
pDlp->fInputFrameRate =
pDlp->fOutputFrameRate = WELS_CLIP3 (pCodingParam.sSpatialLayers[iIdxSpatial].fFrameRate, MIN_FRAME_RATE,
MAX_FRAME_RATE);
@@ -373,13 +395,13 @@
//multi slice
- pDlp->sMso.uiSliceMode = (SliceMode)pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.uiSliceMode;
- pDlp->sMso.sSliceArgument.uiSliceSizeConstraint
+ pDlp->sSliceCfg.uiSliceMode = (SliceMode)pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.uiSliceMode;
+ pDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint
= (uint32_t) (pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.sSliceArgument.uiSliceSizeConstraint);
- pDlp->sMso.sSliceArgument.iSliceNum
+ pDlp->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->sMso.sSliceArgument.uiSliceMbNum,
+ memcpy (pDlp->sSliceCfg.sSliceArgument.uiSliceMbNum,
pCodingParam.sSpatialLayers[iIdxSpatial].sSliceCfg.sSliceArgument.uiSliceMbNum, // confirmed_safe_unsafe_usage
kiLesserSliceNum * sizeof (uint32_t)) ;
@@ -400,7 +422,7 @@
// assuming that the width/height ratio of all spatial layers are the same
void SetActualPicResolution() {
- int32_t iSpatialIdx = iNumDependencyLayer - 1;
+ int32_t iSpatialIdx = iSpatialLayerNum - 1;
SDLayerParam* pDlayer = &sDependencyLayers[iSpatialIdx];
for (; iSpatialIdx >= 0; iSpatialIdx --) {
@@ -426,7 +448,7 @@
uint8_t uiProfileIdc = PRO_BASELINE;
int8_t i = 0;
- while (i < iNumDependencyLayer) {
+ while (i < iSpatialLayerNum) {
const uint32_t kuiLogFactorInOutRate = GetLogFactor (pDlp->fOutputFrameRate, pDlp->fInputFrameRate);
const uint32_t kuiLogFactorMaxInRate = GetLogFactor (pDlp->fInputFrameRate, fMaxFrameRate);
int32_t iNotCodedMask = 0;
--- a/codec/encoder/core/inc/svc_enc_slice_segment.h
+++ b/codec/encoder/core/inc/svc_enc_slice_segment.h
@@ -80,18 +80,6 @@
#define JUMPPACKETSIZE_JUDGE(len,mb_idx,max_byte) ( (len) > JUMPPACKETSIZE_CONSTRAINT(max_byte) ) //( (mb_idx+1)%40/*16slice for compare*/ == 0 ) //
//cur_mb_idx is for early tests, can be omit in optimization
-typedef struct TagSliceArgument {
-uint32_t uiSliceMbNum[MAX_SLICES_NUM]; //will perform check on this array to decide specific slicing, see note
-uint32_t uiSliceSizeConstraint;
-int16_t iSliceNum;
-} SSliceArgument;
-
-typedef struct TagMulSliceOption { //interfaces about slicing from application layer
-SSliceArgument
-sSliceArgument; //according to uiSliceMode, decide which elements of this structure will actually takes effect
-SliceMode uiSliceMode;
-} SMulSliceOption;
-
/*!
* \brief SSlice context
*/
@@ -139,7 +127,7 @@
bool bFmoUseFlag,
int32_t iMbWidth,
int32_t iMbHeight,
- SMulSliceOption* pMulSliceOption,
+ SSliceConfig* pMulSliceOption,
void* pPpsArg);
@@ -206,7 +194,7 @@
* Get slice count for multiple slice segment
*
*/
-int32_t GetInitialSliceNum (const int32_t kiMbWidth, const int32_t kiMbHeight, SMulSliceOption* pMso);
+int32_t GetInitialSliceNum (const int32_t kiMbWidth, const int32_t kiMbHeight, SSliceConfig* pMso);
int32_t GetCurrentSliceNum (const SSliceCtx* kpSliceCtx);
//checking valid para
--- a/codec/encoder/core/src/deblocking.cpp
+++ b/codec/encoder/core/src/deblocking.cpp
@@ -734,7 +734,7 @@
int32_t iSliceCount = 0;
int32_t iSliceIdx = 0;
- if (SM_DYN_SLICE != pDlp->sMso.uiSliceMode) {
+ if (SM_DYN_SLICE != pDlp->sSliceCfg.uiSliceMode) {
iSliceCount = GetCurrentSliceNum (pCurLayer->pSliceEncCtx);
do {
DeblockingFilterSliceAvcbase (pCurLayer, pEnc->pFuncList, iSliceIdx);
--- a/codec/encoder/core/src/encoder.cpp
+++ b/codec/encoder/core/src/encoder.cpp
@@ -287,7 +287,7 @@
// perform scene change detection
if ((!pSvcParam->bEnableSceneChangeDetect) || pEncCtx->pVaa->bIdrPeriodFlag ||
- (kiSpatialNum < pSvcParam->iNumDependencyLayer)
+ (kiSpatialNum < pSvcParam->iSpatialLayerNum)
|| (pEncCtx->uiFrameIdxRc < (VGOP_SIZE << 1))) { // avoid too frequent I frame coding, rc control
bSceneChangeFlag = false;
} else {
@@ -294,8 +294,8 @@
bSceneChangeFlag = pEncCtx->pVaa->bSceneChangeFlag;
}
- //scene_changed_flag: RC enable && iSpatialNum == pSvcParam->iNumDependencyLayer
- //bIdrPeriodFlag: RC disable || iSpatialNum != pSvcParam->iNumDependencyLayer
+ //scene_changed_flag: RC enable && iSpatialNum == pSvcParam->iSpatialLayerNum
+ //bIdrPeriodFlag: RC disable || iSpatialNum != pSvcParam->iSpatialLayerNum
//pEncCtx->bEncCurFrmAsIdrFlag: 1. first frame should be IDR; 2. idr pause; 3. idr request
iFrameType = (pEncCtx->pVaa->bIdrPeriodFlag || bSceneChangeFlag
|| pEncCtx->bEncCurFrmAsIdrFlag) ? WELS_FRAME_TYPE_IDR : WELS_FRAME_TYPE_P;
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -88,7 +88,7 @@
assert (pCfg != NULL);
- for (i = 0; i < pCfg->iNumDependencyLayer; ++ i) {
+ for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
if (fDlp->fOutputFrameRate > fDlp->fInputFrameRate || (fDlp->fInputFrameRate >= -fEpsn
&& fDlp->fInputFrameRate <= fEpsn)
@@ -109,7 +109,7 @@
}
}
- for (i = 0; i < pCfg->iNumDependencyLayer; ++ i) {
+ for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
if (fDlp->fInputFrameRate > fMaxFrameRate)
fMaxFrameRate = fDlp->fInputFrameRate;
@@ -120,7 +120,7 @@
pCfg->fMaxFrameRate = fMaxFrameRate;
}
- for (i = 0; i < pCfg->iNumDependencyLayer; ++ i) {
+ for (i = 0; i < pCfg->iSpatialLayerNum; ++ i) {
SDLayerParam* fDlp = &pCfg->sDependencyLayers[i];
pLastSpatialParam = fDlp;
@@ -142,19 +142,19 @@
if (NULL == pCodingParam)
return 1;
- if (pCodingParam->iNumDependencyLayer < 1 || pCodingParam->iNumDependencyLayer > MAX_DEPENDENCY_LAYER) {
+ if (pCodingParam->iSpatialLayerNum < 1 || pCodingParam->iSpatialLayerNum > MAX_DEPENDENCY_LAYER) {
#if defined (_DEBUG)
- fprintf (stderr, "ParamValidationExt(), monitor invalid pCodingParam->iNumDependencyLayer: %d!\n",
- pCodingParam->iNumDependencyLayer);
+ fprintf (stderr, "ParamValidationExt(), monitor invalid pCodingParam->iSpatialLayerNum: %d!\n",
+ pCodingParam->iSpatialLayerNum);
#endif//#if _DEBUG
return 1;
}
- if (pCodingParam->iNumTemporalLayer < 1 || pCodingParam->iNumTemporalLayer > MAX_TEMPORAL_LEVEL) {
+ if (pCodingParam->iTemporalLayerNum < 1 || pCodingParam->iTemporalLayerNum > MAX_TEMPORAL_LEVEL) {
#if defined (_DEBUG)
- fprintf (stderr, "ParamValidationExt(), monitor invalid pCodingParam->iNumTemporalLayer: %d!\n",
- pCodingParam->iNumTemporalLayer);
+ fprintf (stderr, "ParamValidationExt(), monitor invalid pCodingParam->iTemporalLayerNum: %d!\n",
+ pCodingParam->iTemporalLayerNum);
#endif//#if _DEBUG
return 1;
}
@@ -201,7 +201,7 @@
pCodingParam->bDeblockingParallelFlag = false;
#endif//MT_ENABLED
- for (i = 0; i < pCodingParam->iNumDependencyLayer; ++ i) {
+ for (i = 0; i < pCodingParam->iSpatialLayerNum; ++ i) {
SDLayerParam* fDlp = &pCodingParam->sDependencyLayers[i];
const int32_t kiPicWidth = fDlp->iFrameWidth;
const int32_t kiPicHeight = fDlp->iFrameHeight;
@@ -224,9 +224,9 @@
return 1;
}
- if (fDlp->sMso.uiSliceMode >= SM_RESERVED) {
+ if (fDlp->sSliceCfg.uiSliceMode >= SM_RESERVED) {
#if defined (_DEBUG)
- fprintf (stderr, "ParamValidationExt(), invalid uiSliceMode (%d) settings!\n", fDlp->sMso.uiSliceMode);
+ fprintf (stderr, "ParamValidationExt(), invalid uiSliceMode (%d) settings!\n", fDlp->sSliceCfg.uiSliceMode);
#endif//#if _DEBUG
return 1;
}
@@ -234,102 +234,102 @@
//check pSlice settings under multi-pSlice
if (kiPicWidth <= 16 && kiPicHeight <= 16) {
//only have one MB, set to single_slice
- fDlp->sMso.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
}
- switch (fDlp->sMso.uiSliceMode) {
+ switch (fDlp->sSliceCfg.uiSliceMode) {
case SM_SINGLE_SLICE:
- fDlp->sMso.sSliceArgument.iSliceNum = 1;
- fDlp->sMso.sSliceArgument.uiSliceSizeConstraint = 0;
- fDlp->sMso.sSliceArgument.iSliceNum = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 0;
for (iIdx = 0; iIdx < MAX_SLICES_NUM; iIdx++) {
- fDlp->sMso.sSliceArgument.uiSliceMbNum[iIdx] = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0;
}
break;
case SM_FIXEDSLCNUM_SLICE: {
- fDlp->sMso.sSliceArgument.uiSliceSizeConstraint = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
iMbNumInFrame = iMbWidth * iMbHeight;
iMaxSliceNum = MAX_SLICES_NUM;
- if (fDlp->sMso.sSliceArgument.iSliceNum <= 0
- || fDlp->sMso.sSliceArgument.iSliceNum > iMaxSliceNum) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0
+ || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) {
#if defined (_DEBUG)
- fprintf (stderr, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sMso.sSliceArgument.iSliceNum);
+ fprintf (stderr, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
#endif//#if _DEBUG
return 1;
}
- if (fDlp->sMso.sSliceArgument.iSliceNum == 1) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
#if defined (_DEBUG)
fprintf (stderr,
"ParamValidationExt(), uiSliceNum(%d) you set for SM_FIXEDSLCNUM_SLICE, now turn to SM_SINGLE_SLICE type!\n",
- fDlp->sMso.sSliceArgument.iSliceNum);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
#endif//#if _DEBUG
- fDlp->sMso.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
break;
}
if (pCodingParam->bEnableRc) { // multiple slices verify with gom
//check uiSliceNum
- GomValidCheckSliceNum (iMbWidth, iMbHeight, (int32_t*)&fDlp->sMso.sSliceArgument.iSliceNum);
- assert (fDlp->sMso.sSliceArgument.iSliceNum > 1);
+ GomValidCheckSliceNum (iMbWidth, iMbHeight, (int32_t*)&fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
+ assert (fDlp->sSliceCfg.sSliceArgument.uiSliceNum > 1);
//set uiSliceMbNum with current uiSliceNum
- GomValidCheckSliceMbNum (iMbWidth, iMbHeight, &fDlp->sMso.sSliceArgument);
+ GomValidCheckSliceMbNum (iMbWidth, iMbHeight, &fDlp->sSliceCfg.sSliceArgument);
} else if (!CheckFixedSliceNumMultiSliceSetting (iMbNumInFrame,
- &fDlp->sMso.sSliceArgument)) { // verify interleave mode settings
+ &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
//check uiSliceMbNum with current uiSliceNum
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sMso.sSliceArgument.uiSliceMbNum[0]);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
#endif//#if _DEBUG
return 1;
}
// 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->sMso.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sMso.sSliceArgument.iSliceNum = 1;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
break;
case SM_RASTER_SLICE: {
- fDlp->sMso.sSliceArgument.uiSliceSizeConstraint = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
iMbNumInFrame = iMbWidth * iMbHeight;
iMaxSliceNum = MAX_SLICES_NUM;
- if (fDlp->sMso.sSliceArgument.uiSliceMbNum[0] <= 0) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0] <= 0) {
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sMso.sSliceArgument.uiSliceMbNum[0]);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
#endif//#if _DEBUG
return 1;
}
- if (!CheckRasterMultiSliceSetting (iMbNumInFrame, &fDlp->sMso.sSliceArgument)) { // verify interleave mode settings
+ if (!CheckRasterMultiSliceSetting (iMbNumInFrame, &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sMso.sSliceArgument.uiSliceMbNum[0]);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
#endif//#if _DEBUG
return 1;
}
- if (fDlp->sMso.sSliceArgument.iSliceNum <= 0
- || fDlp->sMso.sSliceArgument.iSliceNum > iMaxSliceNum) { // verify interleave mode settings
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0
+ || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { // verify interleave mode settings
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceNum (%d) in SM_RASTER_SLICE settings!\n",
- fDlp->sMso.sSliceArgument.iSliceNum);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
#endif//#if _DEBUG
return 1;
}
- if (fDlp->sMso.sSliceArgument.iSliceNum == 1) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) {
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), pSlice setting for SM_RASTER_SLICE now turn to SM_SINGLE_SLICE!\n");
#endif//#if _DEBUG
- fDlp->sMso.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
break;
}
#ifdef MT_ENABLED
- if (pCodingParam->bEnableRc && fDlp->sMso.sSliceArgument.iSliceNum > 1) {
+ if (pCodingParam->bEnableRc && fDlp->sSliceCfg.sSliceArgument.uiSliceNum > 1) {
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), WARNING: GOM based RC do not support SM_RASTER_SLICE!\n");
#endif//#if _DEBUG
@@ -337,14 +337,14 @@
#endif
// 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->sMso.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sMso.sSliceArgument.iSliceNum = 1;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
break;
case SM_ROWMB_SLICE: {
- fDlp->sMso.sSliceArgument.uiSliceSizeConstraint = 0;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0;
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
@@ -355,18 +355,18 @@
#endif//#if _DEBUG
return 1;
}
- fDlp->sMso.sSliceArgument.iSliceNum = iMbHeight;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = iMbHeight;
- if (fDlp->sMso.sSliceArgument.iSliceNum <= 0) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0) {
#if defined (_DEBUG)
- fprintf (stderr, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sMso.sSliceArgument.iSliceNum);
+ fprintf (stderr, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sSliceCfg.sSliceArgument.uiSliceNum);
#endif//#if _DEBUG
return 1;
}
- if (!CheckRowMbMultiSliceSetting (iMbWidth, &fDlp->sMso.sSliceArgument)) { // verify interleave mode settings
+ if (!CheckRowMbMultiSliceSetting (iMbWidth, &fDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceMbNum (%d) settings!\n",
- fDlp->sMso.sSliceArgument.uiSliceMbNum[0]);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]);
#endif//#if _DEBUG
return 1;
}
@@ -375,17 +375,17 @@
case SM_DYN_SLICE: {
iMbWidth = (kiPicWidth + 15) >> 4;
iMbHeight = (kiPicHeight + 15) >> 4;
- if (fDlp->sMso.sSliceArgument.uiSliceSizeConstraint <= 0) {
+ if (fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint <= 0) {
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid iSliceSize (%d) settings!\n",
- fDlp->sMso.sSliceArgument.uiSliceSizeConstraint);
+ fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint);
#endif//#if _DEBUG
return 1;
}
// 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->sMso.uiSliceMode = SM_SINGLE_SLICE;
- fDlp->sMso.sSliceArgument.iSliceNum = 1;
+ fDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE;
+ fDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1;
break;
}
}
@@ -394,7 +394,7 @@
#if defined (_DEBUG)
fprintf (stderr, "ParamValidationExt(), invalid uiSliceMode (%d) settings!\n",
- pCodingParam->sDependencyLayers[0].sMso.uiSliceMode);
+ pCodingParam->sDependencyLayers[0].sSliceCfg.uiSliceMode);
#endif//#if _DEBUG
return 1;
@@ -411,7 +411,7 @@
{
SDLayerParam* pLayerParam;
const float kfEpsn = 0.000001f;
- const int32_t kiNumLayer = pParam->iNumDependencyLayer;
+ const int32_t kiNumLayer = pParam->iSpatialLayerNum;
int32_t i;
const float kfMaxFrameRate = pParam->fMaxFrameRate;
float fRatio;
@@ -439,7 +439,7 @@
//but it is also possible to fulfill the bitrate of lower layer first
SDLayerParam* pLayerParam;
- const int32_t iNumLayers = pParam->iNumDependencyLayer;
+ const int32_t iNumLayers = pParam->iSpatialLayerNum;
int32_t i, iOrigTotalBitrate=0;
//read old BR
for (i=0;i<iNumLayers;i++) {
@@ -474,7 +474,7 @@
if (NULL == pParam || NULL == ppCtx || NULL == *ppCtx)
return 1;
- iNumDependencyLayers = pParam->iNumDependencyLayer;
+ iNumDependencyLayers = pParam->iSpatialLayerNum;
do {
SDLayerParam* pDLayer = &pParam->sDependencyLayers[iDIndex];
@@ -485,7 +485,7 @@
//Review this part and suggest no change, since the memory over-use
//(1) counts little to the overall performance
//(2) should not be critial even under mobile case
- if (SM_DYN_SLICE == pDLayer->sMso.uiSliceMode) {
+ if (SM_DYN_SLICE == pDLayer->sSliceCfg.uiSliceMode) {
iCountNumNals += MAX_SLICES_NUM;
// plus prefix NALs
if (iDIndex == 0)
@@ -497,10 +497,10 @@
#else//!MT_ENABLED || !PACKING_ONE_SLICE_PER_LAYER
assert (iCountNumNals - iOrgNumNals <= MAX_NAL_UNITS_IN_LAYER);
#endif//MT_ENABLED && PACKING_ONE_SLICE_PER_LAYER
- } else { /*if ( SM_SINGLE_SLICE != pDLayer->sMso.uiSliceMode )*/
+ } else { /*if ( SM_SINGLE_SLICE != pDLayer->sSliceCfg.uiSliceMode )*/
const int32_t kiNumOfSlice = GetInitialSliceNum ((pDLayer->iFrameWidth + 0x0f) >> 4,
(pDLayer->iFrameHeight + 0x0f) >> 4,
- &pDLayer->sMso);
+ &pDLayer->sSliceCfg);
// NEED check iCountNals value in case multiple slices is used
iCountNumNals += kiNumOfSlice; // for pSlice VCL NALs
@@ -575,7 +575,7 @@
*/
int32_t AllocSpatialPictures (sWelsEncCtx* pCtx, SWelsSvcCodingParam* pParam) {
CMemoryAlign* pMa = pCtx->pMemAlign;
- const int32_t kiDlayerCount = pParam->iNumDependencyLayer;
+ const int32_t kiDlayerCount = pParam->iSpatialLayerNum;
int32_t iDlayerIndex = 0;
// spatial pictures
@@ -605,7 +605,7 @@
void FreeSpatialPictures (sWelsEncCtx* pCtx) {
CMemoryAlign* pMa = pCtx->pMemAlign;
int32_t j = 0;
- while (j < pCtx->pSvcParam->iNumDependencyLayer) {
+ while (j < pCtx->pSvcParam->iSpatialLayerNum) {
uint8_t i = 0;
uint8_t uiRefNumInTemporal = pCtx->uiSpatialPicNum[j];
@@ -695,7 +695,7 @@
int32_t InitMbListD (sWelsEncCtx** ppCtx) {
- int32_t iNumDlayer = (*ppCtx)->pSvcParam->iNumDependencyLayer;
+ int32_t iNumDlayer = (*ppCtx)->pSvcParam->iSpatialLayerNum;
int32_t iMbSize[MAX_DEPENDENCY_LAYER] = { 0 };
int32_t iOverallMbNum = 0;
int32_t iMbWidth = 0;
@@ -811,7 +811,7 @@
pMa = (*ppCtx)->pMemAlign;
pParam = (*ppCtx)->pSvcParam;
- iDlayerCount = pParam->iNumDependencyLayer;
+ iDlayerCount = pParam->iSpatialLayerNum;
iNumRef = pParam->iNumRefFrame;
// highest_layers_in_temporal = 1 + WELS_MAX(pParam->iDecompStages, 1);
pStrideTab = (*ppCtx)->pStrideTab;
@@ -859,7 +859,7 @@
const int32_t kiMbW = (pDlayer->iFrameWidth + 0x0f) >> 4;
const int32_t kiMbH = (pDlayer->iFrameHeight + 0x0f) >> 4;
int32_t iMaxSliceNum = 1;
- const int32_t kiSliceNum = GetInitialSliceNum (kiMbW, kiMbH, &pDlayer->sMso);
+ const int32_t kiSliceNum = GetInitialSliceNum (kiMbW, kiMbH, &pDlayer->sSliceCfg);
if (iMaxSliceNum < kiSliceNum)
iMaxSliceNum = kiSliceNum;
@@ -868,7 +868,7 @@
WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pDqLayer), FreeMemorySvc (ppCtx))
// for dynamic slicing mode
- if (SM_DYN_SLICE == pDlayer->sMso.uiSliceMode) {
+ if (SM_DYN_SLICE == pDlayer->sSliceCfg.uiSliceMode) {
const int32_t iSize = pParam->iCountThreadsNum * sizeof (int32_t);
pDqLayer->pNumSliceCodedOfPartition = (int32_t*)pMa->WelsMallocz (iSize, "pNumSliceCodedOfPartition");
@@ -885,7 +885,7 @@
pDqLayer->iMbWidth = kiMbW;
pDqLayer->iMbHeight = kiMbH;
#ifndef MT_ENABLED
- if (SM_DYN_SLICE == pDlayer->sMso.uiSliceMode) { //wmalloc pSliceInLayer
+ if (SM_DYN_SLICE == pDlayer->sSliceCfg.uiSliceMode) { //wmalloc pSliceInLayer
SSlice* pSlice = NULL;
int32_t iSliceIdx = 0;
//wmalloc AVERSLICENUM_CONSTANT of pDqLayer->sLayerInfo.pSliceInLayer,
@@ -958,7 +958,7 @@
pDqLayer->bDeblockingParallelFlag = pParam->bDeblockingParallelFlag;
//deblocking parameter adjustment
- if (SM_SINGLE_SLICE == pDlayer->sMso.uiSliceMode) {
+ if (SM_SINGLE_SLICE == pDlayer->sSliceCfg.uiSliceMode) {
//iLoopFilterDisableIdc: will be 0 or 1 under single_slice
if (2 == pParam->iLoopFilterDisableIdc) {
pDqLayer->iLoopFilterDisableIdc = 0;
@@ -1037,7 +1037,7 @@
false,
pSps->iMbWidth,
pSps->iMbHeight,
- & (pDlayerParam->sMso),
+ & (pDlayerParam->sSliceCfg),
pPps);
if (iResult) {
WelsLog (*ppCtx, WELS_LOG_WARNING, "InitDqLayers(), InitSlicePEncCtx failed(%d)!", iResult);
@@ -1099,7 +1099,7 @@
return 1;
(*ppCtx)->pStrideTab = pPtr;
- iCntTid = pParam->iNumTemporalLayer > 1 ? 2 : 1;
+ iCntTid = pParam->iTemporalLayerNum > 1 ? 2 : 1;
iSpatialIdx = 0;
while (iSpatialIdx < kiNumSpatialLayers) {
@@ -1335,7 +1335,7 @@
int32_t iCountLayers = 0;
int32_t iResult = 0;
float fCompressRatioThr = .5f;
- const int32_t kiNumDependencyLayers = pParam->iNumDependencyLayer;
+ const int32_t kiNumDependencyLayers = pParam->iSpatialLayerNum;
const uint32_t kuiMvdInterTableSize = (kiNumDependencyLayers == 1 ? (1 + (648 << 1)) : (1 + (972 << 1)));
const uint32_t kuiMvdCacheAlginedSize = kuiMvdInterTableSize * sizeof (uint16_t);
int32_t iVclLayersBsSizeCount = 0;
@@ -1371,12 +1371,12 @@
return 1;
}
- iNonVclLayersBsSizeCount = SSEI_BUFFER_SIZE + pParam->iNumDependencyLayer * SPS_BUFFER_SIZE +
- (1 + pParam->iNumDependencyLayer) * PPS_BUFFER_SIZE;
+ iNonVclLayersBsSizeCount = SSEI_BUFFER_SIZE + pParam->iSpatialLayerNum * SPS_BUFFER_SIZE +
+ (1 + pParam->iSpatialLayerNum) * PPS_BUFFER_SIZE;
int32_t iLayerBsSize = 0;
iIndex = 0;
- while (iIndex < pParam->iNumDependencyLayer) {
+ while (iIndex < pParam->iSpatialLayerNum) {
SDLayerParam* fDlp = &pParam->sDependencyLayers[iIndex];
fCompressRatioThr = COMPRESS_RATIO_DECIDED_BY_RESOLUTION (fDlp->iFrameWidth, fDlp->iFrameHeight);
@@ -1664,16 +1664,17 @@
// pDq layers list
ilayer = 0;
if (NULL != pCtx->ppDqLayerList && pParam != NULL) {
- while (ilayer < pParam->iNumDependencyLayer) {
+ while (ilayer < pParam->iSpatialLayerNum) {
SDqLayer* pDq = pCtx->ppDqLayerList[ilayer];
SDLayerParam* pDlp = &pCtx->pSvcParam->sDependencyLayers[ilayer];
- const bool kbIsDynamicSlicing = (SM_DYN_SLICE == pDlp->sMso.uiSliceMode);
+ const bool kbIsDynamicSlicing = (SM_DYN_SLICE == pDlp->sSliceCfg.uiSliceMode);
+
// pDq layers
if (NULL != pDq) {
if (NULL != pDq->sLayerInfo.pSliceInLayer) {
int32_t iSliceIdx = 0;
- int32_t iSliceNum = GetInitialSliceNum (pDq->iMbWidth, pDq->iMbHeight, &pDlp->sMso);
+ int32_t iSliceNum = GetInitialSliceNum (pDq->iMbWidth, pDq->iMbHeight, &pDlp->sSliceCfg);
if (iSliceNum < 1)
iSliceNum = 1;
while (iSliceIdx < iSliceNum) {
@@ -1707,7 +1708,7 @@
// reference picture list extension
if (NULL != pCtx->ppRefPicListExt && pParam != NULL) {
ilayer = 0;
- while (ilayer < pParam->iNumDependencyLayer) {
+ while (ilayer < pParam->iSpatialLayerNum) {
SRefList* pRefList = pCtx->ppRefPicListExt[ilayer];
if (NULL != pRefList) {
int32_t iRef = 0;
@@ -1731,7 +1732,7 @@
// pSlice context list
if (NULL != pCtx->pSliceCtxList && pParam != NULL) {
ilayer = 0;
- while (ilayer < pParam->iNumDependencyLayer) {
+ while (ilayer < pParam->iSpatialLayerNum) {
SSliceCtx* pSliceCtx = &pCtx->pSliceCtxList[ilayer];
if (NULL != pSliceCtx)
UninitSlicePEncCtx (pSliceCtx, pMa);
@@ -1817,12 +1818,12 @@
}
int32_t InitSliceSettings (SWelsSvcCodingParam* pCodingParam, const int32_t kiCpuCores, int16_t* pMaxSliceCount) {
- int32_t iSpatialIdx = 0, iSpatialNum = pCodingParam->iNumDependencyLayer;
+ int32_t iSpatialIdx = 0, iSpatialNum = pCodingParam->iSpatialLayerNum;
int16_t iMaxSliceCount = 0;
do {
SDLayerParam* pDlp = &pCodingParam->sDependencyLayers[iSpatialIdx];
- SMulSliceOption* pMso = &pDlp->sMso;
+ SSliceConfig* pMso = &pDlp->sSliceCfg;
SSliceArgument* pSlcArg = &pMso->sSliceArgument;
const int32_t kiMbWidth = (pDlp->iFrameWidth + 15) >> 4;
const int32_t kiMbHeight = (pDlp->iFrameHeight + 15) >> 4;
@@ -1831,7 +1832,7 @@
#if defined(DYNAMIC_SLICE_ASSIGN)
int32_t iSliceNum = (SM_FIXEDSLCNUM_SLICE == pMso->uiSliceMode
|| SM_DYN_SLICE == pMso->uiSliceMode) ? kiCpuCores :
- pSlcArg->iSliceNum; // uiSliceNum per input has been validated at ParamValidationExt()
+ pSlcArg->uiSliceNum; // uiSliceNum per input has been validated at ParamValidationExt()
#else//!DYNAMIC_SLICE_ASSIGN
int32_t iSliceNum = (SM_DYN_SLICE == pMso->uiSliceMode) ? kiCpuCores :
pSlcArg->uiSliceNum; // uiSliceNum per input has been validated at ParamValidationExt()
@@ -1843,7 +1844,7 @@
// NOTE: Per design, in case MT/DYNAMIC_SLICE_ASSIGN enabled, for SM_FIXEDSLCNUM_SLICE mode,
// uiSliceNum of current spatial layer settings equals to uiCpuCores number; SM_DYN_SLICE mode,
// uiSliceNum intials as uiCpuCores also, stay tuned dynamically slicing in future
- pSlcArg->iSliceNum = iSliceNum; // used fixed one
+ pSlcArg->uiSliceNum = iSliceNum; // used fixed one
switch (pMso->uiSliceMode) {
case SM_DYN_SLICE:
@@ -2093,7 +2094,7 @@
#endif//ENABLE_TRACE_FILE
pCodingParam->DetermineTemporalSettings();
- iRet = AllocCodingParam (&pCtx->pSvcParam, pCtx->pMemAlign, pCodingParam->iNumDependencyLayer);
+ iRet = AllocCodingParam (&pCtx->pSvcParam, pCtx->pMemAlign, pCodingParam->iSpatialLayerNum);
if (iRet != 0) {
FreeMemorySvc (&pCtx);
return iRet;
@@ -2151,7 +2152,7 @@
void StatOverallEncodingExt (sWelsEncCtx* pCtx) {
int8_t i = 0;
int8_t j = 0;
- for (i = 0; i < pCtx->pSvcParam->iNumDependencyLayer; i++) {
+ for (i = 0; i < pCtx->pSvcParam->iSpatialLayerNum; i++) {
fprintf (stdout, "\nDependency layer : %d\n", i);
fprintf (stdout, "Quality layer : %d\n", j);
{
@@ -2563,8 +2564,8 @@
pCurDq->pDecPic = pDecPic;
- if (fDlp->sMso.uiSliceMode == SM_DYN_SLICE) // need get extra slices for update
- iSliceCount = GetInitialSliceNum (pCurDq->iMbWidth, pCurDq->iMbHeight, &fDlp->sMso);
+ if (fDlp->sSliceCfg.uiSliceMode == SM_DYN_SLICE) // need get extra slices for update
+ iSliceCount = GetInitialSliceNum (pCurDq->iMbWidth, pCurDq->iMbHeight, &fDlp->sSliceCfg);
else
iSliceCount = GetCurrentSliceNum (pCurDq->pSliceEncCtx);
assert (iSliceCount > 0);
@@ -2644,7 +2645,7 @@
if (P_SLICE == pCtx->eSliceType) {
if (kbBaseAvail) {
- if (pCtx->pSvcParam->iNumDependencyLayer == (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1)) { //
+ if (pCtx->pSvcParam->iSpatialLayerNum == (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1)) { //
pCtx->pFuncList->pfMotionSearch = WelsMotionEstimateSearchSad;
pCtx->pFuncList->pfFirstIntraMode = WelsMdFirstIntraMode;
pCtx->pFuncList->pfIntraFineMd = WelsMdIntraFinePartitionVaa;
@@ -2667,7 +2668,7 @@
pCtx->pFuncList->sSampleDealingFuncs.pfMeCost = pCtx->pFuncList->sSampleDealingFuncs.pfSampleSatd;
} else {
//case 3: pBase layer MD + encoding
- if (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1 == pCtx->pSvcParam->iNumDependencyLayer) {
+ if (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1 == pCtx->pSvcParam->iSpatialLayerNum) {
pCtx->pFuncList->pfMotionSearch = WelsMotionEstimateSearchSad;
pCtx->pFuncList->pfFirstIntraMode = WelsMdFirstIntraMode;
pCtx->pFuncList->pfIntraFineMd = WelsMdIntraFinePartitionVaa;
@@ -2690,7 +2691,7 @@
pCtx->pFuncList->sSampleDealingFuncs.pfMeCost = pCtx->pFuncList->sSampleDealingFuncs.pfSampleSatd;
}
} else if (I_SLICE == pCtx->eSliceType) {
- if (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1 == pCtx->pSvcParam->iNumDependencyLayer) {
+ if (pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1 == pCtx->pSvcParam->iSpatialLayerNum) {
pCtx->pFuncList->sSampleDealingFuncs.pfMdCost = pCtx->pFuncList->sSampleDealingFuncs.pfSampleSad;
pCtx->pFuncList->sSampleDealingFuncs.pfIntra16x16Combined3 =
pCtx->pFuncList->sSampleDealingFuncs.pfIntra16x16Combined3Sad;
@@ -3199,12 +3200,12 @@
// Encoding this picture might mulitiple sQualityStat layers potentially be encoded as followed
- switch (param_d->sMso.uiSliceMode) {
+ switch (param_d->sSliceCfg.uiSliceMode) {
case SM_FIXEDSLCNUM_SLICE: {
#if defined(MT_ENABLED) && defined(DYNAMIC_SLICE_ASSIGN)
if ((iCurDid > 0) && (pSvcParam->iMultipleThreadIdc > 1) &&
- (pSvcParam->sDependencyLayers[iCurDid].sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE
- && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[iCurDid].sMso.sSliceArgument.iSliceNum)
+ (pSvcParam->sDependencyLayers[iCurDid].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[iCurDid].sSliceCfg.sSliceArgument.uiSliceNum)
)
AdjustEnhanceLayer (pCtx, iCurDid);
#endif//MT_ENABLED && DYNAMIC_SLICE_ASSIGN
@@ -3235,7 +3236,7 @@
bAvcBased = (iCurDid == BASE_DEPENDENCY_ID);
pCtx->bNeedPrefixNalFlag = (bAvcBased &&
(pSvcParam->bPrefixNalAddingCtrl ||
- (pSvcParam->iNumDependencyLayer > 1)));
+ (pSvcParam->iSpatialLayerNum > 1)));
if (eFrameType == WELS_FRAME_TYPE_P) {
eNalType = bAvcBased ? NAL_UNIT_CODED_SLICE : NAL_UNIT_CODED_SLICE_EXT;
@@ -3281,7 +3282,7 @@
PreprocessSliceCoding (pCtx); // MUST be called after pfWelsRcPictureInit() and WelsInitCurrentLayer()
iLayerSize = 0;
- if (SM_SINGLE_SLICE == param_d->sMso.uiSliceMode) { // only one slice within a sQualityStat layer
+ if (SM_SINGLE_SLICE == param_d->sSliceCfg.uiSliceMode) { // only one slice within a sQualityStat layer
int32_t iSliceSize = 0;
if (pCtx->bNeedPrefixNalFlag) {
@@ -3310,9 +3311,9 @@
}
// for dynamic slicing single threading..
#ifndef MT_ENABLED
- else if (SM_DYN_SLICE == param_d->sMso.uiSliceMode)
+ else if (SM_DYN_SLICE == param_d->sSliceCfg.uiSliceMode)
#else // MT_ENABLED
- else if ((SM_DYN_SLICE == param_d->sMso.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1))
+ else if ((SM_DYN_SLICE == param_d->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1))
#endif//MT_ENABLED
{
const int32_t kiLastMbInFrame = pCtx->pCurDqLayer->pSliceEncCtx->iMbNumInFrame;
@@ -3322,7 +3323,7 @@
#if defined(MT_ENABLED)
int err = 0;
// THREAD_FULLY_FIRE_MODE/THREAD_PICK_UP_MODE for any mode of non-SM_DYN_SLICE
- if ((SM_DYN_SLICE != param_d->sMso.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) {
+ if ((SM_DYN_SLICE != param_d->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) {
iSliceCount = GetCurrentSliceNum (pCtx->pCurDqLayer->pSliceEncCtx);
if (iLayerNum +
#if defined(PACKING_ONE_SLICE_PER_LAYER)
@@ -3333,7 +3334,7 @@
>= MAX_LAYER_NUM_OF_FRAME) { // check available layer_bs_info for further writing as followed
WelsLog (pCtx, WELS_LOG_ERROR,
"WelsEncoderEncodeExt(), iLayerNum(%d) overflow(max:%d) at iDid= %d uiSliceMode= %d, iSliceCount= %d!",
- iLayerNum, MAX_LAYER_NUM_OF_FRAME, iCurDid, param_d->sMso.uiSliceMode, iSliceCount);
+ iLayerNum, MAX_LAYER_NUM_OF_FRAME, iCurDid, param_d->sSliceCfg.uiSliceMode, iSliceCount);
return -1;
}
if (iSliceCount <= 1) {
@@ -3363,7 +3364,7 @@
if (err) {
WelsLog (pCtx, WELS_LOG_ERROR,
"[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iCountThreadsNum= %d, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!\n",
- err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sMso.uiSliceMode, pSvcParam->iMultipleThreadIdc);
+ err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sSliceCfg.uiSliceMode, pSvcParam->iMultipleThreadIdc);
return -1;
}
@@ -3422,7 +3423,7 @@
if (err) {
WelsLog (pCtx, WELS_LOG_ERROR,
"[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iCountThreadsNum= %d, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!\n",
- err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sMso.uiSliceMode, pSvcParam->iMultipleThreadIdc);
+ err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sSliceCfg.uiSliceMode, pSvcParam->iMultipleThreadIdc);
return -1;
}
@@ -3499,7 +3500,7 @@
}
}
// THREAD_FULLY_FIRE_MODE && SM_DYN_SLICE
- else if ((SM_DYN_SLICE == param_d->sMso.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) {
+ else if ((SM_DYN_SLICE == param_d->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) {
const int32_t kiPartitionCnt = pCtx->iActiveThreadsNum; //pSvcParam->iCountThreadsNum;
#if defined(PACKING_ONE_SLICE_PER_LAYER)
ResetCountBsSizeInPartitions (pCtx->pSliceThreading->pCountBsSizeInPartition, kiPartitionCnt);
@@ -3514,7 +3515,7 @@
if (err) {
WelsLog (pCtx, WELS_LOG_ERROR,
"[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iCountThreadsNum= %d, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!\n",
- err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sMso.uiSliceMode, pSvcParam->iMultipleThreadIdc);
+ err, pSvcParam->iCountThreadsNum, iSliceCount, param_d->sSliceCfg.uiSliceMode, pSvcParam->iMultipleThreadIdc);
return -1;
}
@@ -3604,7 +3605,7 @@
#ifdef ENABLE_FRAME_DUMP
// Dump reconstruction picture for each sQualityStat layer
- if (iCurDid + 1 < pSvcParam->iNumDependencyLayer)
+ if (iCurDid + 1 < pSvcParam->iSpatialLayerNum)
DumpDependencyRec (fsnr, ¶m_d->sRecFileName[0], iCurDid);
#endif//ENABLE_FRAME_DUMP
@@ -3686,7 +3687,7 @@
#endif//STAT_OUTPUT
#if defined(MT_ENABLED) && defined(PACKING_ONE_SLICE_PER_LAYER)
- if (pSvcParam->iMultipleThreadIdc <= 1 || SM_SINGLE_SLICE == param_d->sMso.uiSliceMode) // sigle thread actually used
+ if (pSvcParam->iMultipleThreadIdc <= 1 || SM_SINGLE_SLICE == param_d->sSliceCfg.uiSliceMode) // sigle thread actually used
#else
if (1)
#endif//MT_ENABLED && PACKING_ONE_SLICE_PER_LAYER
@@ -3725,8 +3726,8 @@
}
#if defined(MT_ENABLED) && defined(DYNAMIC_SLICE_ASSIGN) && defined(TRY_SLICING_BALANCE)
- if (param_d->sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE && pSvcParam->iMultipleThreadIdc > 1 &&
- pSvcParam->iMultipleThreadIdc >= param_d->sMso.sSliceArgument.iSliceNum) {
+ if (param_d->sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE && pSvcParam->iMultipleThreadIdc > 1 &&
+ pSvcParam->iMultipleThreadIdc >= param_d->sSliceCfg.sSliceArgument.uiSliceNum) {
CalcSliceComplexRatio (pCtx->pSliceThreading->pSliceComplexRatio[iCurDid], pCtx->pCurDqLayer->pSliceEncCtx,
pCtx->pSliceThreading->pSliceConsumeTime[iCurDid]);
#if defined(MT_DEBUG)
@@ -3737,7 +3738,7 @@
++ iSpatialIdx;
- if (iCurDid + 1 < pSvcParam->iNumDependencyLayer) {
+ if (iCurDid + 1 < pSvcParam->iSpatialLayerNum) {
WelsSwapDqLayers (pCtx);
}
@@ -3777,17 +3778,17 @@
#if defined(MT_ENABLED) && defined(DYNAMIC_SLICE_ASSIGN)
if (pSvcParam->iMultipleThreadIdc > 1 && did_list[0] == BASE_DEPENDENCY_ID
- && pSvcParam->sDependencyLayers[0].sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE
- && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[0].sMso.sSliceArgument.iSliceNum
- && pSvcParam->sDependencyLayers[did_list[iSpatialNum - 1]].sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && pSvcParam->sDependencyLayers[0].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[0].sSliceCfg.sSliceArgument.uiSliceNum
+ && pSvcParam->sDependencyLayers[did_list[iSpatialNum - 1]].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
&& pSvcParam->iMultipleThreadIdc >= pSvcParam->sDependencyLayers[did_list[iSpatialNum -
- 1]].sMso.sSliceArgument.iSliceNum) {
+ 1]].sSliceCfg.sSliceArgument.uiSliceNum) {
AdjustBaseLayer (pCtx);
}
#endif//DYNAMIC_SLICE_ASSIGN
#ifdef ENABLE_FRAME_DUMP
- DumpRecFrame (fsnr, &pSvcParam->sDependencyLayers[pSvcParam->iNumDependencyLayer -
+ DumpRecFrame (fsnr, &pSvcParam->sDependencyLayers[pSvcParam->iSpatialLayerNum -
1].sRecFileName[0]); // pDecPic: final reconstruction output
#endif//ENABLE_FRAME_DUMP
@@ -3823,18 +3824,18 @@
/* Decide whether need reset for IDR frame based on adjusting prarameters changed */
/* Temporal levels, spatial settings and/ or quality settings changed need update parameter sets related. */
bNeedReset = (pOldParam == NULL) ||
- (pOldParam->iNumTemporalLayer != pNewParam->iNumTemporalLayer) ||
+ (pOldParam->iTemporalLayerNum != pNewParam->iTemporalLayerNum) ||
(pOldParam->uiGopSize != pNewParam->uiGopSize) ||
- (pOldParam->iNumDependencyLayer != pNewParam->iNumDependencyLayer) ||
+ (pOldParam->iSpatialLayerNum != pNewParam->iSpatialLayerNum) ||
(pOldParam->iDecompStages != pNewParam->iDecompStages) ||
- (pOldParam->iActualPicWidth != pNewParam->iActualPicWidth
- || pOldParam->iActualPicHeight != pNewParam->iActualPicHeight) ||
+ (pOldParam->iPicWidth != pNewParam->iPicWidth
+ || pOldParam->iPicHeight != pNewParam->iPicHeight) ||
(pOldParam->SUsedPicRect.iWidth != pNewParam->SUsedPicRect.iWidth
|| pOldParam->SUsedPicRect.iHeight != pNewParam->SUsedPicRect.iHeight) ||
(pOldParam->bEnableLongTermReference != pNewParam->bEnableLongTermReference);
if (!bNeedReset) { // Check its picture resolutions/quality settings respectively in each dependency layer
iIndexD = 0;
- assert (pOldParam->iNumDependencyLayer == pNewParam->iNumDependencyLayer);
+ assert (pOldParam->iSpatialLayerNum == pNewParam->iSpatialLayerNum);
do {
const SDLayerParam* kpOldDlp = &pOldParam->sDependencyLayers[iIndexD];
const SDLayerParam* kpNewDlp = &pNewParam->sDependencyLayers[iIndexD];
@@ -3850,8 +3851,8 @@
break;
}
- if (kpOldDlp->sMso.uiSliceMode != kpNewDlp->sMso.uiSliceMode ||
- kpOldDlp->sMso.sSliceArgument.iSliceNum != kpNewDlp->sMso.sSliceArgument.iSliceNum) {
+ if (kpOldDlp->sSliceCfg.uiSliceMode != kpNewDlp->sSliceCfg.uiSliceMode ||
+ kpOldDlp->sSliceCfg.sSliceArgument.uiSliceNum != kpNewDlp->sSliceCfg.sSliceArgument.uiSliceNum) {
bNeedReset = true;
break;
}
@@ -3874,7 +3875,7 @@
}
++ iIndexD;
- } while (iIndexD < pOldParam->iNumDependencyLayer);
+ } while (iIndexD < pOldParam->iSpatialLayerNum);
}
if (bNeedReset) {
@@ -3929,7 +3930,7 @@
/* int32_t term reference control */
pOldParam->bEnableLongTermReference = pNewParam->bEnableLongTermReference;
- pOldParam->uiLtrMarkPeriod = pNewParam->uiLtrMarkPeriod;
+ pOldParam->iLtrMarkPeriod = pNewParam->iLtrMarkPeriod;
// keep below values unchanged as before
pOldParam->bEnableSSEI = pNewParam->bEnableSSEI;
@@ -3977,7 +3978,7 @@
sizeof (pOldDlp->uiCodingIdx2TemporalId)); // confirmed_safe_unsafe_usage
++ iIndexD;
- } while (iIndexD < pOldParam->iNumDependencyLayer);
+ } while (iIndexD < pOldParam->iSpatialLayerNum);
}
/* Any else initialization/reset for rate control here? */
--- a/codec/encoder/core/src/ratectl.cpp
+++ b/codec/encoder/core/src/ratectl.cpp
@@ -114,7 +114,7 @@
fp_test_rc = fopen ("testRC.dat", "w");
fp_vgop = fopen ("vgop.dat", "w");
#endif
- for (j = 0; j < pEncCtx->pSvcParam->iNumDependencyLayer; j++) {
+ for (j = 0; j < pEncCtx->pSvcParam->iSpatialLayerNum; j++) {
SSliceCtx* pSliceCtx = &pEncCtx->pSliceCtxList[j];
pWelsSvcRc = &pEncCtx->pWelsSvcRc[j];
pDLayerParam = &pEncCtx->pSvcParam->sDependencyLayers[j];
@@ -167,9 +167,9 @@
RcInitLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign, 1 + pDLayerParam->iHighestTemporalId);
- bMultiSliceMode = ((SM_RASTER_SLICE == pDLayerParam->sMso.uiSliceMode) ||
- (SM_ROWMB_SLICE == pDLayerParam->sMso.uiSliceMode) ||
- (SM_DYN_SLICE == pDLayerParam->sMso.uiSliceMode));
+ bMultiSliceMode = ((SM_RASTER_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
+ (SM_ROWMB_SLICE == pDLayerParam->sSliceCfg.uiSliceMode) ||
+ (SM_DYN_SLICE == pDLayerParam->sSliceCfg.uiSliceMode));
if (bMultiSliceMode)
pWelsSvcRc->iNumberMbGom = pWelsSvcRc->iNumberMbFrame;
}
@@ -810,7 +810,7 @@
if (pEncCtx->pSvcParam->bEnableFrameSkip &&
- pEncCtx->uiDependencyId == pEncCtx->pSvcParam->iNumDependencyLayer - 1) {
+ pEncCtx->uiDependencyId == pEncCtx->pSvcParam->iSpatialLayerNum - 1) {
RcVBufferCalculationSkip (pEncCtx);
}
@@ -939,7 +939,7 @@
fclose (fp_vgop);
fp_vgop = NULL;
#endif
- for (i = 0; i < pEncCtx->pSvcParam->iNumDependencyLayer; i++) {
+ for (i = 0; i < pEncCtx->pSvcParam->iSpatialLayerNum; i++) {
pWelsSvcRc = &pEncCtx->pWelsSvcRc[i];
RcFreeLayerMemory (pWelsSvcRc, pEncCtx->pMemAlign);
}
--- a/codec/encoder/core/src/ref_list_mgr_svc.cpp
+++ b/codec/encoder/core/src/ref_list_mgr_svc.cpp
@@ -430,7 +430,7 @@
int32_t iSliceIdx = 0;
if (pCtx->pSvcParam->bEnableLongTermReference && pLtr->bLTRMarkEnable && pCtx->uiTemporalId == 0) {
- if (!pLtr->bReceivedT0LostFlag && pLtr->uiLtrMarkInterval > pCtx->pSvcParam->uiLtrMarkPeriod
+ if (!pLtr->bReceivedT0LostFlag && pLtr->uiLtrMarkInterval > pCtx->pSvcParam->iLtrMarkPeriod
&& CheckCurMarkFrameNumUsed (pCtx)) {
pLtr->bLTRMarkingFlag = true;
pLtr->bLTRMarkEnable = false;
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -353,7 +353,7 @@
pMa = (*ppCtx)->pMemAlign;
pPara = pCodingParam;
- iNumSpatialLayers = pPara->iNumDependencyLayer;
+ iNumSpatialLayers = pPara->iSpatialLayerNum;
iThreadNum = pPara->iCountThreadsNum;
iMaxSliceNum = (*ppCtx)->iMaxSliceCount;
@@ -399,8 +399,8 @@
#if defined(DYNAMIC_SLICE_ASSIGN) || defined(MT_DEBUG)
iIdx = 0;
while (iIdx < iNumSpatialLayers) {
- SMulSliceOption* pMso = &pPara->sDependencyLayers[iIdx].sMso;
- const int32_t kiSliceNum = pMso->sSliceArgument.iSliceNum;
+ SSliceConfig* pMso = &pPara->sDependencyLayers[iIdx].sSliceCfg;
+ const int32_t kiSliceNum = pMso->sSliceArgument.uiSliceNum;
if (pMso->uiSliceMode == SM_FIXEDSLCNUM_SLICE && pPara->iMultipleThreadIdc > 1
&& pPara->iMultipleThreadIdc >= kiSliceNum) {
pSmt->pSliceConsumeTime[iIdx] = (uint32_t*)pMa->WelsMallocz (kiSliceNum * sizeof (uint32_t), "pSliceConsumeTime[]");
@@ -638,7 +638,7 @@
}
#if defined(DYNAMIC_SLICE_ASSIGN) || defined(MT_DEBUG)
iIdx = 0;
- while (iIdx < pCodingParam->iNumDependencyLayer) {
+ while (iIdx < pCodingParam->iSpatialLayerNum) {
if (pSmt->pSliceConsumeTime[iIdx]) {
pMa->WelsFree (pSmt->pSliceConsumeTime[iIdx], "pSliceConsumeTime[]");
pSmt->pSliceConsumeTime[iIdx] = NULL;
@@ -688,7 +688,8 @@
SWelsSvcCodingParam* pCodingParam = pCtx->pSvcParam;
SDLayerParam* pDlp = &pCodingParam->sDependencyLayers[pCtx->uiDependencyId];
SWelsSliceBs* pSliceBs = NULL;
- const bool kbIsDynamicSlicingMode = (pDlp->sMso.uiSliceMode == SM_DYN_SLICE);
+ const bool kbIsDynamicSlicingMode = (pDlp->sSliceCfg.uiSliceMode == SM_DYN_SLICE);
+
int32_t iLayerSize = 0;
int32_t iNalIdxBase = pLbi->iNalCount;
int32_t iSliceIdx = 0;
@@ -944,7 +945,7 @@
eNalRefIdc = pEncPEncCtx->eNalPriority;
bNeedPrefix = pEncPEncCtx->bNeedPrefixNalFlag;
- if (pParamD->sMso.uiSliceMode != SM_DYN_SLICE) {
+ if (pParamD->sSliceCfg.uiSliceMode != SM_DYN_SLICE) {
int64_t iSliceStart = 0;
bool bDsaFlag = false;
iSliceIdx = pPrivateData->iSliceIndex;
@@ -952,9 +953,9 @@
pSliceBs = &pEncPEncCtx->pSliceBs[iSliceIdx];
#if defined(DYNAMIC_SLICE_ASSIGN) || defined(MT_DEBUG)
- bDsaFlag = (pParamD->sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE &&
+ bDsaFlag = (pParamD->sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE &&
pCodingParam->iMultipleThreadIdc > 1 &&
- pCodingParam->iMultipleThreadIdc >= pParamD->sMso.sSliceArgument.iSliceNum);
+ pCodingParam->iMultipleThreadIdc >= pParamD->sSliceCfg.sSliceArgument.uiSliceNum);
if (bDsaFlag)
iSliceStart = WelsTime();
#endif//DYNAMIC_SLICE_ASSIGN || MT_DEBUG
@@ -1376,10 +1377,11 @@
int32_t iNeedAdj = 1;
// uiSliceMode of referencing spatial should be SM_FIXEDSLCNUM_SLICE
// if using spatial base layer for complexity estimation
+
const bool kbModelingFromSpatial = (pCtx->pCurDqLayer->pRefLayer != NULL && iCurDid > 0)
- && (pCtx->pSvcParam->sDependencyLayers[iCurDid - 1].sMso.uiSliceMode == SM_FIXEDSLCNUM_SLICE
+ && (pCtx->pSvcParam->sDependencyLayers[iCurDid - 1].sSliceCfg.uiSliceMode == SM_FIXEDSLCNUM_SLICE
&& pCtx->pSvcParam->iMultipleThreadIdc >= pCtx->pSvcParam->sDependencyLayers[iCurDid -
- 1].sMso.sSliceArgument.iSliceNum);
+ 1].sSliceCfg.sSliceArgument.uiSliceNum);
if (kbModelingFromSpatial) { // using spatial base layer for complexity estimation
#ifdef TRY_SLICING_BALANCE
@@ -1457,7 +1459,7 @@
while (iSpatialIdx < iSpatialNum) {
const int32_t kiDid = pDidList[iSpatialIdx];
SDLayerParam* pDlp = &pPara->sDependencyLayers[kiDid];
- SMulSliceOption* pMso = &pDlp->sMso;
+ SMulSliceOption* pMso = &pDlp->sSliceCfg;
SDqLayer* pCurDq = pCtx->ppDqLayerList[kiDid];
SSliceCtx* pSliceCtx = pCurDq->pSliceEncCtx;
const uint32_t kuiCountSliceNum = pSliceCtx->iSliceNumInFrame;
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -66,7 +66,7 @@
*
* \return 0 - successful; none 0 - failed
*/
-int32_t AssignMbMapMultipleSlices (SSliceCtx* pSliceSeg, const SMulSliceOption* kpMso) {
+int32_t AssignMbMapMultipleSlices (SSliceCtx* pSliceSeg, const SSliceConfig* kpMso) {
if (NULL == pSliceSeg || SM_SINGLE_SLICE == pSliceSeg->uiSliceMode)
return 1;
@@ -123,7 +123,7 @@
//slice parameter check for SM_FIXEDSLCNUM_SLICE
bool CheckFixedSliceNumMultiSliceSetting (const int32_t kiMbNumInFrame, SSliceArgument* pSliceArg) {
int32_t* pSlicesAssignList = (int32_t*) & (pSliceArg->uiSliceMbNum[0]);
- const uint32_t kuiSliceNum = pSliceArg->iSliceNum;
+ const uint32_t kuiSliceNum = pSliceArg->uiSliceNum;
uint32_t uiSliceIdx = 0;
const int32_t kiMbNumPerSlice = kiMbNumInFrame / kuiSliceNum;
int32_t iNumMbLeft = kiMbNumInFrame;
@@ -143,7 +143,7 @@
//slice parameter check for SM_ROWMB_SLICE
bool CheckRowMbMultiSliceSetting (const int32_t kiMbWidth, SSliceArgument* pSliceArg) {
int32_t* pSlicesAssignList = (int32_t*) & (pSliceArg->uiSliceMbNum[0]);
- const uint32_t kuiSliceNum = pSliceArg->iSliceNum;
+ const uint32_t kuiSliceNum = pSliceArg->uiSliceNum;
uint32_t uiSliceIdx = 0;
if (NULL == pSlicesAssignList)
@@ -202,7 +202,7 @@
return false;
}
- pSliceArg->iSliceNum = iActualSliceCount;
+ pSliceArg->uiSliceNum = iActualSliceCount;
return true;
}
@@ -247,7 +247,7 @@
// GOM based RC related for uiSliceMbNum decision, only used at SM_FIXEDSLCNUM_SLICE
void GomValidCheckSliceMbNum (const int32_t kiMbWidth, const int32_t kiMbHeight, SSliceArgument* pSliceArg) {
uint32_t* pSlicesAssignList = & (pSliceArg->uiSliceMbNum[0]);
- const uint32_t kuiSliceNum = pSliceArg->iSliceNum;
+ const uint32_t kuiSliceNum = pSliceArg->uiSliceNum;
const int32_t kiMbNumInFrame = kiMbWidth * kiMbHeight;
const int32_t kiMbNumPerSlice = kiMbNumInFrame / kuiSliceNum;
int32_t iNumMbLeft = kiMbNumInFrame;
@@ -300,7 +300,7 @@
* Get slice count for multiple slice segment
*
*/
-int32_t GetInitialSliceNum (const int32_t kiMbWidth, const int32_t kiMbHeight, SMulSliceOption* pMso) {
+int32_t GetInitialSliceNum (const int32_t kiMbWidth, const int32_t kiMbHeight, SSliceConfig* pMso) {
if (NULL == pMso)
return -1;
@@ -309,7 +309,7 @@
case SM_FIXEDSLCNUM_SLICE:
case SM_RASTER_SLICE:
case SM_ROWMB_SLICE: {
- return pMso->sSliceArgument.iSliceNum;
+ return pMso->sSliceArgument.uiSliceNum;
}
case SM_DYN_SLICE: {
return AVERSLICENUM_CONSTRAINT;//at the beginning of dynamic slicing, set the uiSliceNum to be 1
@@ -336,7 +336,7 @@
*/
int32_t InitSliceSegment (SSliceCtx* pSliceSeg,
CMemoryAlign* pMa,
- SMulSliceOption* pMso,
+ SSliceConfig* pMso,
const int32_t kiMbWidth,
const int32_t kiMbHeight) {
const int32_t kiCountMbNum = kiMbWidth * kiMbHeight;
@@ -497,7 +497,7 @@
bool bFmoUseFlag,
int32_t iMbWidth,
int32_t iMbHeight,
- SMulSliceOption* pMso,
+ SSliceConfig* pMso,
void* pPpsArg) {
if (NULL == pSliceCtx)
return 1;
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -631,8 +631,9 @@
void WelsCodePSlice (sWelsEncCtx* pEncCtx, SSlice* pSlice) {
//pSlice-level init should be outside and before this function
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
+
const bool kbBaseAvail = pCurLayer->bBaseLayerAvailableFlag;
- const bool kbHighestSpatial = pEncCtx->pSvcParam->iNumDependencyLayer ==
+ const bool kbHighestSpatial = pEncCtx->pSvcParam->iSpatialLayerNum ==
(pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1);
//MD switch
@@ -649,8 +650,9 @@
void WelsCodePOverDynamicSlice (sWelsEncCtx* pEncCtx, SSlice* pSlice) {
//pSlice-level init should be outside and before this function
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
+
const bool kbBaseAvail = pCurLayer->bBaseLayerAvailableFlag;
- const bool kbHighestSpatial = pEncCtx->pSvcParam->iNumDependencyLayer ==
+ const bool kbHighestSpatial = pEncCtx->pSvcParam->iSpatialLayerNum ==
(pCurLayer->sLayerInfo.sNalHeaderExt.uiDependencyId + 1);
//MD switch
@@ -681,7 +683,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].sMso.uiSliceMode ==
+ const int32_t kiDynamicSliceFlag = (pEncCtx->pSvcParam->sDependencyLayers[pEncCtx->uiDependencyId].sSliceCfg.uiSliceMode ==
SM_DYN_SLICE);
assert (kiSliceIdx == pCurSlice->uiSliceIdx);
@@ -916,7 +918,7 @@
int32_t iCurMbIdx = -1;
int32_t iMbSkipRun = 0;
const int32_t kiTotalNumMb = pCurLayer->iMbWidth * pCurLayer->iMbHeight;
- const int32_t kiMvdInterTableSize = (pEncCtx->pSvcParam->iNumDependencyLayer == 1 ? 648 : 972);
+ const int32_t kiMvdInterTableSize = (pEncCtx->pSvcParam->iSpatialLayerNum == 1 ? 648 : 972);
const int32_t kiMvdInterTableStride = 1 + (kiMvdInterTableSize << 1);
uint16_t* pMvdCostTableInter = &pEncCtx->pMvdCostTableInter[kiMvdInterTableSize];
const int32_t kiSliceIdx = pSlice->uiSliceIdx;
@@ -999,7 +1001,7 @@
int32_t iNextMbIdx = kiSliceFirstMbXY;
int32_t iCurMbIdx = -1;
int32_t iMbSkipRun = 0;
- const int32_t kiMvdInterTableSize = (pEncCtx->pSvcParam->iNumDependencyLayer == 1 ? 648 : 972);
+ const int32_t kiMvdInterTableSize = (pEncCtx->pSvcParam->iSpatialLayerNum == 1 ? 648 : 972);
const int32_t kiMvdInterTableStride = 1 + (kiMvdInterTableSize << 1);
uint16_t* pMvdCostTableInter = &pEncCtx->pMvdCostTableInter[kiMvdInterTableSize];
const int32_t kiSliceIdx = pSlice->uiSliceIdx;
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -263,7 +263,7 @@
int32_t CWelsPreProcess::BuildSpatialPicList (sWelsEncCtx* pCtx, const SSourcePicture** kppSrcPicList,
const int32_t kiConfiguredLayerNum) {
SWelsSvcCodingParam* pSvcParam = pCtx->pSvcParam;
- int32_t iNumDependencyLayer = (int32_t)pSvcParam->iNumDependencyLayer;
+ int32_t iNumDependencyLayer = (int32_t)pSvcParam->iSpatialLayerNum;
int32_t iSpatialNum = 0;
if (!m_bInitDone) {
@@ -359,7 +359,7 @@
int32_t CWelsPreProcess::SingleLayerPreprocess (sWelsEncCtx* pCtx, const SSourcePicture* kpSrc,
Scaled_Picture* pScaledPicture) {
SWelsSvcCodingParam* pSvcParam = pCtx->pSvcParam;
- int8_t iDependencyId = pSvcParam->iNumDependencyLayer - 1;
+ int8_t iDependencyId = pSvcParam->iSpatialLayerNum - 1;
int32_t iPicturePos = pCtx->uiSpatialLayersInTemporal[iDependencyId] - 1;
SPicture* pSrcPic = NULL; // large
@@ -410,7 +410,7 @@
pCtx->pVaa->bSceneChangeFlag = DetectSceneChange (pDstPic, pRefPic);
}
- for (int32_t i = 0; i < pSvcParam->iNumDependencyLayer; i++) {
+ for (int32_t i = 0; i < pSvcParam->iSpatialLayerNum; i++) {
if (pSvcParam->sDependencyLayers[i].uiCodingIdx2TemporalId[pCtx->iCodingIndex & (pSvcParam->uiGopSize - 1)]
!= INVALID_TEMPORAL_ID) {
++ iActualSpatialLayerNum;
@@ -430,7 +430,7 @@
// pSrc is
// -- padded input pic, if downsample should be applied to generate highest layer, [if] block above
// -- highest layer, if no downsampling, [else] block above
- if (pSvcParam->iNumDependencyLayer > 1) {
+ if (pSvcParam->iSpatialLayerNum > 1) {
while (iDependencyId >= 0) {
pDlayerParam = &pSvcParam->sDependencyLayers[iDependencyId];
iTargetWidth = pDlayerParam->iFrameWidth;
@@ -468,7 +468,7 @@
const SSourcePicture* pSrc = NULL;
SPicture* pDstPic = NULL;
const int32_t iSpatialLayersCfgCount =
- pSvcParam->iNumDependencyLayer; // count number of spatial layers to be encoded in cfg
+ pSvcParam->iSpatialLayerNum; // count number of spatial layers to be encoded in cfg
int32_t i = 0;
int32_t j = -1;
@@ -498,7 +498,7 @@
++ i;
} while (i < kiSpatialNum);
- if (pSvcParam->bEnableSceneChangeDetect && (kiSpatialNum == pSvcParam->iNumDependencyLayer)
+ if (pSvcParam->bEnableSceneChangeDetect && (kiSpatialNum == pSvcParam->iSpatialLayerNum)
&& !pCtx->pVaa->bIdrPeriodFlag && !pCtx->bEncCurFrmAsIdrFlag) {
SPicture* pRef = pCtx->pLtr[0].bReceivedT0LostFlag ?
pCtx->pSpatialPic[0][pCtx->uiSpatialLayersInTemporal[0] + pCtx->pVaa->uiValidLongTermPicIdx] :
@@ -516,11 +516,11 @@
bool JudgeNeedOfScaling (SWelsSvcCodingParam* pParam, Scaled_Picture* pScaledPicture) {
const int32_t kiInputPicWidth = pParam->SUsedPicRect.iWidth;
const int32_t kiInputPicHeight = pParam->SUsedPicRect.iHeight;
- const int32_t kiDstPicWidth = pParam->sDependencyLayers[pParam->iNumDependencyLayer - 1].iActualWidth;
- const int32_t kiDstPicHeight = pParam->sDependencyLayers[pParam->iNumDependencyLayer - 1].iActualHeight;
+ const int32_t kiDstPicWidth = pParam->sDependencyLayers[pParam->iSpatialLayerNum - 1].iActualWidth;
+ const int32_t kiDstPicHeight = pParam->sDependencyLayers[pParam->iSpatialLayerNum - 1].iActualHeight;
bool bNeedDownsampling = true;
- int32_t iSpatialIdx = pParam->iNumDependencyLayer - 1;
+ int32_t iSpatialIdx = pParam->iSpatialLayerNum - 1;
if (kiDstPicWidth >= kiInputPicWidth && kiDstPicHeight >= kiInputPicHeight) {
iSpatialIdx --; // highest D layer do not need downsampling
@@ -566,7 +566,7 @@
int32_t CWelsPreProcess::InitLastSpatialPictures (sWelsEncCtx* pCtx) {
SWelsSvcCodingParam* pParam = pCtx->pSvcParam;
- const int32_t kiDlayerCount = pParam->iNumDependencyLayer;
+ const int32_t kiDlayerCount = pParam->iSpatialLayerNum;
int32_t iDlayerIndex = 0;
for (; iDlayerIndex < kiDlayerCount; iDlayerIndex++) {
--- a/codec/encoder/plus/inc/welsEncoderExt.h
+++ b/codec/encoder/plus/inc/welsEncoderExt.h
@@ -66,7 +66,7 @@
/*
* return: CM_RETURN: 0 - success; otherwise - failed;
*/
- virtual int EXTAPI Initialize (SVCEncodingParam* argv, const INIT_TYPE init_type);
+ virtual int EXTAPI Initialize (SEncParamBase* argv, const INIT_TYPE init_type);
virtual int EXTAPI Initialize2 (void* argv, const INIT_TYPE init_type);
virtual int EXTAPI Uninitialize();
--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -206,29 +206,49 @@
/*
* SVC Encoder Initialization
*/
-int CWelsH264SVCEncoder::Initialize (SVCEncodingParam* argv, const INIT_TYPE iInitType) {
- if (INIT_TYPE_PARAMETER_BASED != iInitType || NULL == argv) {
+int CWelsH264SVCEncoder::Initialize (SEncParamBase* argv, const INIT_TYPE iInitType) {
+
+
+ if ((INIT_TYPE_PARAMETER_BASED != iInitType && INIT_TYPE_PARAMETER_EXT != iInitType)|| NULL == argv) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), invalid iInitType= %d, argv= 0x%p\n",
iInitType, (void*)argv);
return cmInitParaError;
}
-
- if (m_bInitialFlag) {
+ if (m_bInitialFlag) {
WelsLog (m_pEncContext, WELS_LOG_WARNING, "CWelsH264SVCEncoder::Initialize(), reinitialize, m_bInitialFlag= %d\n",
m_bInitialFlag);
Uninitialize();
}
- SVCEncodingParam sEncodingParam;
SWelsSvcCodingParam sConfig (true);
+ if(iInitType == INIT_TYPE_PARAMETER_BASED)
+ {
+ SEncParamBase sEncodingParam;
+ memcpy (&sEncodingParam, argv, sizeof (SEncParamBase)); // confirmed_safe_unsafe_usage
- memcpy (&sEncodingParam, argv, sizeof (SVCEncodingParam)); // confirmed_safe_unsafe_usage
-
+ // Convert SEncParamBase into WelsSVCParamConfig here..
+ if (sConfig.ParamBaseTranscode (sEncodingParam, true)) {
+ WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
+ Uninitialize();
+ return cmInitParaError;
+ }
+ }
+ else if(iInitType == INIT_TYPE_PARAMETER_EXT)
+ {
+ SEncParamExt sEncodingParam;
+ memcpy (&sEncodingParam, argv, sizeof (SEncParamExt)); // confirmed_safe_unsafe_usage
+ // Convert SEncParamBase into WelsSVCParamConfig here..
+ if (sConfig.ParamTranscode (sEncodingParam, true)) {
+ WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
+ Uninitialize();
+ return cmInitParaError;
+ }
+ }
#ifdef REC_FRAME_COUNT
WelsLog (m_pEncContext, WELS_LOG_INFO, "CWelsH264SVCEncoder::Initialize, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
m_uiCountFrameNum, m_iCspInternal);
WelsLog (m_pEncContext, WELS_LOG_INFO,
- "coding_param->iPicWidth= %d;coding_param->iPicHeight= %d;coding_param->iTargetBitrate= %d;coding_param->iRCMode= %d;coding_param->iTemporalLayerNum= %d;coding_param->iSpatialLayerNum= %d;coding_param->fFrameRate= %.6ff;coding_param->iInputCsp= %d;coding_param->iKeyPicCodingMode= %d;coding_param->uiIntraPeriod= %d;coding_param->bEnableSpsPpsIdAddition = %d;coding_param->bPrefixNalAddingCtrl = %d;coding_param->bEnableDenoise= %d;coding_param->bEnableBackgroundDetection= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableFrameSkip= %d;coding_param->bEnableCropPic= %d;coding_param->bEnableLongTermReference= %d;coding_param->iLtrMarkPeriod= %d;\n",
+ "coding_param->iPicWidth= %d;coding_param->iPicHeight= %d;coding_param->iTargetBitrate= %d;coding_param->iRCMode= %d;coding_param->iTemporalLayerNum= %d;coding_param->iSpatialLayerNum= %d;coding_param->fFrameRate= %.6ff;coding_param->iInputCsp= %d;coding_param->uiIntraPeriod= %d;coding_param->bEnableSpsPpsIdAddition = %d;coding_param->bPrefixNalAddingCtrl = %d;coding_param->bEnableDenoise= %d;coding_param->bEnableBackgroundDetection= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableFrameSkip= %d;coding_param->bEnableCropPic= %d;coding_param->bEnableLongTermReference= %d;coding_param->iLtrMarkPeriod= %d;\n",
sEncodingParam.iPicWidth,
sEncodingParam.iPicHeight,
sEncodingParam.iTargetBitrate,
@@ -237,7 +257,6 @@
sEncodingParam.iSpatialLayerNum,
sEncodingParam.fFrameRate,
sEncodingParam.iInputCsp,
- sEncodingParam.iKeyPicCodingMode,
sEncodingParam.iIntraPeriod,
sEncodingParam.bEnableSpsPpsIdAddition,
sEncodingParam.bPrefixNalAddingCtrl,
@@ -267,21 +286,13 @@
++ i;
}
#endif//REC_FRAME_COUNT
-
- // Convert SVCEncodingParam into WelsSVCParamConfig here..
- if (sConfig.ParamTranscode (sEncodingParam, true)) {
- WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
- Uninitialize();
- return cmInitParaError;
- }
-
m_iSrcListSize = 1;
- return Initialize2 ((void*)&sConfig, INIT_TYPE_CONFIG_BASED);
+ return Initialize2 ((void*)&sConfig, INIT_TYPE_PARAMETER_BASED);
}
int CWelsH264SVCEncoder::Initialize2 (void* argv, const INIT_TYPE iInitType) {
- if (INIT_TYPE_CONFIG_BASED != iInitType || NULL == argv) {
+ if (INIT_TYPE_PARAMETER_BASED != iInitType || NULL == argv) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), invalid iInitType= %d, argv= 0x%p.\n",
iInitType, (void*)argv);
return cmInitParaError;
@@ -303,20 +314,20 @@
}
// Check valid parameters
- const int32_t iNumOfLayers = pCfg->iNumDependencyLayer;
+ const int32_t iNumOfLayers = pCfg->iSpatialLayerNum;
if (iNumOfLayers < 1 || iNumOfLayers > MAX_DEPENDENCY_LAYER) {
WelsLog (m_pEncContext, WELS_LOG_ERROR,
- "CWelsH264SVCEncoder::Initialize(), invalid iNumDependencyLayer= %d, valid at range of [1, %d].\n", iNumOfLayers,
+ "CWelsH264SVCEncoder::Initialize(), invalid iSpatialLayerNum= %d, valid at range of [1, %d].\n", iNumOfLayers,
MAX_DEPENDENCY_LAYER);
Uninitialize();
return cmInitParaError;
}
- if (pCfg->iNumTemporalLayer < 1)
- pCfg->iNumTemporalLayer = 1;
- if (pCfg->iNumTemporalLayer > MAX_TEMPORAL_LEVEL) {
+ if (pCfg->iTemporalLayerNum < 1)
+ pCfg->iTemporalLayerNum = 1;
+ if (pCfg->iTemporalLayerNum > MAX_TEMPORAL_LEVEL) {
WelsLog (m_pEncContext, WELS_LOG_ERROR,
- "CWelsH264SVCEncoder::Initialize(), invalid iNumTemporalLayer= %d, valid at range of [1, %d].\n",
- pCfg->iNumTemporalLayer, MAX_TEMPORAL_LEVEL);
+ "CWelsH264SVCEncoder::Initialize(), invalid iTemporalLayerNum= %d, valid at range of [1, %d].\n",
+ pCfg->iTemporalLayerNum, MAX_TEMPORAL_LEVEL);
Uninitialize();
return cmInitParaError;
}
@@ -366,17 +377,17 @@
pCfg->iNumRefFrame = WELS_CLIP3 (pCfg->iNumRefFrame, MIN_REF_PIC_COUNT, MAX_REFERENCE_PICTURE_COUNT_NUM);
- if (pCfg->uiLtrMarkPeriod == 0) {
- pCfg->uiLtrMarkPeriod = 30;
+ if (pCfg->iLtrMarkPeriod == 0) {
+ pCfg->iLtrMarkPeriod = 30;
}
const int32_t kiDecStages = WELS_LOG2 (pCfg->uiGopSize);
pCfg->iInputCsp = iColorspace;
- pCfg->iNumTemporalLayer = (int8_t) (1 + kiDecStages);
+ pCfg->iTemporalLayerNum = (int8_t) (1 + kiDecStages);
pCfg->iLoopFilterAlphaC0Offset = WELS_CLIP3 (pCfg->iLoopFilterAlphaC0Offset, -6, 6);
pCfg->iLoopFilterBetaOffset = WELS_CLIP3 (pCfg->iLoopFilterBetaOffset, -6, 6);
-// m_pSrcPicList = (SSourcePicture **)WelsMalloc( pCfg->iNumDependencyLayer * sizeof(SSourcePicture *), "m_pSrcPicList" );
+// m_pSrcPicList = (SSourcePicture **)WelsMalloc( pCfg->iSpatialLayerNum * sizeof(SSourcePicture *), "m_pSrcPicList" );
// prefer use new/delete pair due encoder intialization stage not start yet for CacheLineSize not detection here (16 or 64 not matched)
m_pSrcPicList = new SSourcePicture* [iNumOfLayers];
@@ -388,8 +399,8 @@
}
// decide property list size between INIT_TYPE_PARAMETER_BASED/INIT_TYPE_CONFIG_BASED
- m_iMaxPicWidth = pCfg->iActualPicWidth;
- m_iMaxPicHeight = pCfg->iActualPicHeight;
+ m_iMaxPicWidth = pCfg->iPicWidth;
+ m_iMaxPicHeight = pCfg->iPicHeight;
m_iSrcListSize = iNumOfLayers;
for (int32_t i = 0; i < m_iSrcListSize; ++ i) {
@@ -580,10 +591,10 @@
}
char strStreamFileName[128] = {0};
int32_t iLen = WelsSnprintf (strStreamFileName, 128, "adj%d_w%d.264", m_iSwitchTimes,
- m_pEncContext->pSvcParam->iActualPicWidth);
+ m_pEncContext->pSvcParam->iPicWidth);
m_pFileBs = WelsFopen (strStreamFileName, "wb");
WelsSnprintf (strStreamFileName, 128, "adj%d_w%d_size.iLen", m_iSwitchTimes,
- m_pEncContext->pSvcParam->iActualPicWidth);
+ m_pEncContext->pSvcParam->iPicWidth);
m_pFileBsSize = WelsFopen (strStreamFileName, "wb");
@@ -729,18 +740,18 @@
m_pEncContext->pSvcParam->uiIntraPeriod = (uint32_t)iValue;
}
break;
- case ENCODER_OPTION_SVC_ENCODE_PARAM: { // SVC Encoding Parameter
- SVCEncodingParam sEncodingParam;
+ case ENCODER_OPTION_SVC_ENCODE_PARAM_EXT: { // SVC Encoding Parameter
+ SEncParamExt sEncodingParam;
SWelsSvcCodingParam sConfig (true);
int32_t iInputColorspace = 0;
int32_t iTargetWidth = 0;
int32_t iTargetHeight = 0;
- memcpy (&sEncodingParam, pOption, sizeof (SVCEncodingParam)); // confirmed_safe_unsafe_usage
- WelsLog (m_pEncContext, WELS_LOG_INFO, "ENCODER_OPTION_SVC_ENCODE_PARAM, sEncodingParam.iInputCsp= 0x%x\n",
+ memcpy (&sEncodingParam, pOption, sizeof (SEncParamBase)); // confirmed_safe_unsafe_usage
+ WelsLog (m_pEncContext, WELS_LOG_INFO, "ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, sEncodingParam.iInputCsp= 0x%x\n",
sEncodingParam.iInputCsp);
WelsLog (m_pEncContext, WELS_LOG_INFO,
- "coding_param->iPicWidth= %d;coding_param->iPicHeight= %d;coding_param->iTargetBitrate= %d;coding_param->iRCMode= %d;coding_param->iPaddingFlag= %d;coding_param->iTemporalLayerNum= %d;coding_param->iSpatialLayerNum= %d;coding_param->fFrameRate= %.6ff;coding_param->iInputCsp= %d;coding_param->iKeyPicCodingMode= %d;coding_param->uiIntraPeriod= %d;coding_param->bEnableSpsPpsIdAddition = %d;coding_param->bPrefixNalAddingCtrl = %d;coding_param->bEnableDenoise= %d;coding_param->bEnableBackgroundDetection= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableCropPic= %d;coding_param->bEnableLongTermReference= %d;coding_param->iLtrMarkPeriod= %d;\n",
+ "coding_param->iPicWidth= %d;coding_param->iPicHeight= %d;coding_param->iTargetBitrate= %d;coding_param->iRCMode= %d;coding_param->iPaddingFlag= %d;coding_param->iTemporalLayerNum= %d;coding_param->iSpatialLayerNum= %d;coding_param->fFrameRate= %.6ff;coding_param->iInputCsp= %d;coding_param->uiIntraPeriod= %d;coding_param->bEnableSpsPpsIdAddition = %d;coding_param->bPrefixNalAddingCtrl = %d;coding_param->bEnableDenoise= %d;coding_param->bEnableBackgroundDetection= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableAdaptiveQuant= %d;coding_param->bEnableCropPic= %d;coding_param->bEnableLongTermReference= %d;coding_param->iLtrMarkPeriod= %d;\n",
sEncodingParam.iPicWidth,
sEncodingParam.iPicHeight,
sEncodingParam.iTargetBitrate,
@@ -748,10 +759,9 @@
sEncodingParam.iPaddingFlag,
sEncodingParam.iTemporalLayerNum,
sEncodingParam.iSpatialLayerNum,
- sEncodingParam.fFrameRate,
+ sEncodingParam.fMaxFrameRate,
sEncodingParam.iInputCsp,
- sEncodingParam.iKeyPicCodingMode,
- sEncodingParam.iIntraPeriod,
+ sEncodingParam.uiIntraPeriod,
sEncodingParam.bEnableSpsPpsIdAddition,
sEncodingParam.bPrefixNalAddingCtrl,
sEncodingParam.bEnableDenoise,
@@ -781,7 +791,7 @@
}
#ifdef OUTPUT_BIT_STREAM
if (sEncodingParam.sSpatialLayers[sEncodingParam.iSpatialLayerNum - 1].iVideoWidth !=
- m_pEncContext->pSvcParam->sDependencyLayers[m_pEncContext->pSvcParam->iNumDependencyLayer - 1].iFrameWidth) {
+ m_pEncContext->pSvcParam->sDependencyLayers[m_pEncContext->pSvcParam->iSpatialLayerNum - 1].iFrameWidth) {
++ m_iSwitchTimes;
m_bSwitch = true;
}
@@ -795,11 +805,11 @@
if (sConfig.ParamTranscode (sEncodingParam, true)) {
return cmInitParaError;
}
- if (sConfig.iNumDependencyLayer < 1) {
+ if (sConfig.iSpatialLayerNum < 1) {
return cmInitParaError;
}
- iTargetWidth = sConfig.iActualPicWidth;
- iTargetHeight = sConfig.iActualPicHeight;
+ iTargetWidth = sConfig.iPicWidth;
+ iTargetHeight = sConfig.iPicHeight;
if (m_pSrcPicList[0] == NULL) {
return cmInitParaError;
}
@@ -812,7 +822,7 @@
}
#ifdef REC_FRAME_COUNT
WelsLog (m_pEncContext, WELS_LOG_INFO,
- "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_SVC_ENCODE_PARAM, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
+ "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
m_uiCountFrameNum, m_iCspInternal);
#endif//REC_FRAME_COUNT
@@ -876,7 +886,7 @@
break;
case ENCOCER_LTR_MARKING_PERIOD: {
uint32_t iValue = * ((uint32_t*) (pOption));
- m_pEncContext->pSvcParam->uiLtrMarkPeriod = iValue;
+ m_pEncContext->pSvcParam->iLtrMarkPeriod = iValue;
}
break;
case ENCODER_OPTION_LTR: {
@@ -954,15 +964,25 @@
* ((int32_t*)pOption) = m_pEncContext->pSvcParam->uiIntraPeriod;
}
break;
- case ENCODER_OPTION_SVC_ENCODE_PARAM: { // SVC Encoding Parameter
+ case ENCODER_OPTION_SVC_ENCODE_PARAM_EXT: { // SVC Encoding Parameter
#ifdef REC_FRAME_COUNT
WelsLog (m_pEncContext, WELS_LOG_INFO,
- "CWelsH264SVCEncoder::GetOption():ENCODER_OPTION_SVC_ENCODE_PARAM, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
+ "CWelsH264SVCEncoder::GetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
m_uiCountFrameNum, m_iCspInternal);
#endif//REC_FRAME_COUNT
- memcpy (pOption, m_pEncContext->pSvcParam, sizeof (SWelsSvcCodingParam)); // confirmed_safe_unsafe_usage
+ memcpy (pOption, m_pEncContext->pSvcParam, sizeof (SEncParamExt)); // confirmed_safe_unsafe_usage
}
break;
+ case ENCODER_OPTION_SVC_ENCODE_PARAM_BASE: { // SVC Encoding Parameter
+#ifdef REC_FRAME_COUNT
+ WelsLog (m_pEncContext, WELS_LOG_INFO,
+ "CWelsH264SVCEncoder::GetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, m_uiCountFrameNum= %d, m_iCspInternal= 0x%x\n",
+ m_uiCountFrameNum, m_iCspInternal);
+#endif//REC_FRAME_COUNT
+ memcpy (pOption, m_pEncContext->pSvcParam, sizeof (SEncParamBase)); // confirmed_safe_unsafe_usage
+ }
+ break;
+
case ENCODER_OPTION_FRAME_RATE: { // Maximal input frame rate
#ifdef REC_FRAME_COUNT
WelsLog (m_pEncContext, WELS_LOG_INFO,
--- a/test/BaseEncoderTest.cpp
+++ b/test/BaseEncoderTest.cpp
@@ -7,32 +7,14 @@
static int InitWithParam(ISVCEncoder* encoder, int width,
int height, float frameRate) {
- SVCEncodingParam param;
- memset (¶m, 0, sizeof(SVCEncodingParam));
+ SEncParamBase param;
+ memset (¶m, 0, sizeof(SEncParamBase));
- param.sSpatialLayers[0].iVideoWidth = width;
- param.sSpatialLayers[0].iVideoHeight = height;
- param.sSpatialLayers[0].fFrameRate = frameRate;
- param.sSpatialLayers[0].iQualityLayerNum = 1;
- param.sSpatialLayers[0].iSpatialBitrate = 600000;
-
- SSliceConfig* sliceCfg = ¶m.sSpatialLayers[0].sSliceCfg;
- sliceCfg->sSliceArgument.uiSliceNum = 1;
- sliceCfg->sSliceArgument.uiSliceSizeConstraint = 1500;
- sliceCfg->sSliceArgument.uiSliceMbNum[0] = 960;
-
- param.fFrameRate = param.sSpatialLayers[0].fFrameRate;
- param.iPicWidth = param.sSpatialLayers[0].iVideoWidth;
- param.iPicHeight = param.sSpatialLayers[0].iVideoHeight;
+ param.fMaxFrameRate = frameRate;
+ param.iPicWidth = width;
+ param.iPicHeight = height;
param.iTargetBitrate = 5000000;
- param.iTemporalLayerNum = 3;
- param.iSpatialLayerNum = 1;
- param.bEnableBackgroundDetection = true;
- param.bEnableLongTermReference = true;
- param.iLtrMarkPeriod = 30;
param.iInputCsp = videoFormatI420;
- param.bEnableSpsPpsIdAddition = true;
-
return encoder->Initialize(¶m, INIT_TYPE_PARAMETER_BASED);
}
--- a/test/cpp_interface_test.cpp
+++ b/test/cpp_interface_test.cpp
@@ -22,7 +22,7 @@
*/
struct SVCEncoderImpl : public ISVCEncoder {
virtual ~SVCEncoderImpl() {}
- virtual int EXTAPI Initialize(SVCEncodingParam* pParam,
+ virtual int EXTAPI Initialize(SEncParamBase* pParam,
const INIT_TYPE kiInitType) {
EXPECT_TRUE(gThis == this);
return 1;
--- a/test/decode_encode_test.cpp
+++ b/test/decode_encode_test.cpp
@@ -104,8 +104,8 @@
}
static const DecodeEncodeFileParam kFileParamArray[] = {
- {"res/test_vd_1d.264", "41c672107cfe9e8e8a67b5d08cbd701f6c982ccd", 320, 192, 12.0f},
- {"res/test_vd_rc.264", "d546ea7c671b42503f8a46ba50bef2a3eaca4c5a", 320, 192, 12.0f},
+ {"res/test_vd_1d.264", "c04a5978eb715837c29463e79b6598a05136829f", 320, 192, 12.0f},
+ {"res/test_vd_rc.264", "40d8eb5a54d358c663f836c689a158c326de4b1c", 320, 192, 12.0f},
};
INSTANTIATE_TEST_CASE_P(DecodeEncodeFile, DecodeEncodeTest,
--- a/test/encoder_test.cpp
+++ b/test/encoder_test.cpp
@@ -65,15 +65,15 @@
static const EncodeFileParam kFileParamArray[] = {
{
"res/CiscoVT2people_320x192_12fps.yuv",
- "4df5751a59eb02153e086ade9b3ecfcb8845c30b", 320, 192, 12.0f
+ "06441376891cbc237a36e59b62131cd94ff9cb19", 320, 192, 12.0f
},
{
"res/CiscoVT2people_160x96_6fps.yuv",
- "6eb53b6bfdb95dfca0575bd3efe81aa58163951c", 160, 96, 6.0f
+ "4f3759fc44125b27a179ebff158dbba9e431bd0b", 160, 96, 6.0f
},
{
"res/Static_152_100.yuv",
- "c5af55647a5ead570bd5d96651e05ea699762b8e", 152, 100, 6.0f
+ "a004c7410a78bfe00af65ae7071ce1c485cf036e", 152, 100, 6.0f
},
};