Merge pull request #362 from mstorsjo/encoder-default-params

Add a new public method for initializing SEncParamExt to default values
This commit is contained in:
ruil2 2014-02-27 17:38:16 +08:00
commit 9319f879e4
6 changed files with 90 additions and 65 deletions

View File

@ -59,6 +59,8 @@ class ISVCEncoder {
virtual int EXTAPI Initialize (const SEncParamBase* pParam) = 0;
virtual int EXTAPI InitializeExt (const SEncParamExt* pParam) = 0;
virtual int EXTAPI GetDefaultParams (SEncParamExt* pParam) = 0;
virtual int EXTAPI Uninitialize() = 0;
/*
@ -142,6 +144,8 @@ struct ISVCEncoderVtbl {
int (*Initialize) (ISVCEncoder*, const SEncParamBase* pParam);
int (*InitializeExt) (ISVCEncoder*, const SEncParamExt* pParam);
int (*GetDefaultParams) (ISVCEncoder*, SEncParamExt* pParam);
int (*Uninitialize) (ISVCEncoder*);
int (*EncodeFrame) (ISVCEncoder*, const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo);

View File

@ -137,13 +137,67 @@ TagWelsSvcCodingParam (const bool kbEnableRc = true) {
}
~TagWelsSvcCodingParam() {}
void FillDefault (const bool kbEnableRc) {
uiGopSize = 1; // GOP size (at maximal frame rate: 16)
uiIntraPeriod = 0; // intra period (multiple of GOP size as desired)
iNumRefFrame = MIN_REF_PIC_COUNT; // number of reference frame used
static void FillDefault (SEncParamExt& param, const bool kbEnableRc) {
memset(&param, 0, sizeof(param));
param.uiIntraPeriod = 0; // intra period (multiple of GOP size as desired)
param.iNumRefFrame = MIN_REF_PIC_COUNT; // number of reference frame used
param.iPicWidth = 0; // actual input picture width
param.iPicHeight = 0; // actual input picture height
param.fMaxFrameRate = MAX_FRAME_RATE; // maximal frame rate [Hz / fps]
param.iInputCsp = videoFormatI420; // input sequence color space in default
param.uiFrameToBeCoded = (uint32_t) - 1; // frame to be encoded (at input frame rate)
param.iTargetBitrate = 0; // overall target bitrate introduced in RC module
#ifdef MT_ENABLED
param.iMultipleThreadIdc = 0; // auto to detect cpu cores inside
#else
param.iMultipleThreadIdc =
1; // 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#endif//MT_ENABLED
param.iCountThreadsNum = 1; // # derived from disable_multiple_slice_idc (=0 or >1) means;
param.iLTRRefNum = 0;
param.iLtrMarkPeriod = 30; //the min distance of two int32_t references
param.bEnableSSEI = true;
param.bEnableFrameCroppingFlag = true; // enable frame cropping flag: true alwayse in application
// false: Streaming Video Sharing; true: Video Conferencing Meeting;
/* Deblocking loop filter */
param.iLoopFilterDisableIdc = 1; // 0: on, 1: off, 2: on except for slice boundaries
param.iLoopFilterAlphaC0Offset = 0; // AlphaOffset: valid range [-6, 6], default 0
param.iLoopFilterBetaOffset = 0; // BetaOffset: valid range [-6, 6], default 0
param.iInterLayerLoopFilterDisableIdc = 1; // Employed based upon inter-layer, same comment as above
param.iInterLayerLoopFilterAlphaC0Offset = 0; // InterLayerLoopFilterAlphaC0Offset
param.iInterLayerLoopFilterBetaOffset = 0; // InterLayerLoopFilterBetaOffset
/* Rate Control */
param.bEnableRc = kbEnableRc;
param.iRCMode = 0;
param.iPaddingFlag = 0;
param.bEnableDenoise = false; // denoise control
param.bEnableSceneChangeDetect = true; // scene change detection control
param.bEnableBackgroundDetection = true; // background detection control
param.bEnableAdaptiveQuant = true; // adaptive quantization control
param.bEnableFrameSkip = true; // frame skipping
param.bEnableLongTermReference = false; // long term reference control
param.bEnableSpsPpsIdAddition = true; // pSps pPps id addition control
param.bPrefixNalAddingCtrl = true; // prefix NAL adding control
param.iSpatialLayerNum = 1; // number of dependency(Spatial/CGS) layers used to be encoded
param.iTemporalLayerNum = 1; // number of temporal layer specified
param.iMaxQp = 51;
param.iMinQp = 0;
param.iUsageType = 0;
}
void FillDefault (const bool kbEnableRc) {
FillDefault(*this, kbEnableRc);
uiGopSize = 1; // GOP size (at maximal frame rate: 16)
iPicWidth = 0; // actual input picture width
iPicHeight = 0; // actual input picture height
SUsedPicRect.iLeft =
SUsedPicRect.iTop =
SUsedPicRect.iWidth =
@ -151,57 +205,12 @@ void FillDefault (const bool kbEnableRc) {
pCurPath = NULL; // record current lib path such as:/pData/pData/com.wels.enc/lib/
fMaxFrameRate = MAX_FRAME_RATE; // maximal frame rate [Hz / fps]
iInputCsp = videoFormatI420; // input sequence color space in default
uiFrameToBeCoded = (uint32_t) - 1; // frame to be encoded (at input frame rate)
iTargetBitrate = 0; // overall target bitrate introduced in RC module
bDeblockingParallelFlag = false; // deblocking filter parallelization control flag
#ifdef MT_ENABLED
iMultipleThreadIdc = 0; // auto to detect cpu cores inside
#else
iMultipleThreadIdc =
1; // 1 # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads;
#endif//MT_ENABLED
iCountThreadsNum = 1; // # derived from disable_multiple_slice_idc (=0 or >1) means;
iLTRRefNum = 0;
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)
bEnableSSEI = true;
bEnableFrameCroppingFlag = true; // enable frame cropping flag: true alwayse in application
// false: Streaming Video Sharing; true: Video Conferencing Meeting;
iDecompStages = 0; // GOP size dependency, unknown here and be revised later
/* Deblocking loop filter */
iLoopFilterDisableIdc = 1; // 0: on, 1: off, 2: on except for slice boundaries
iLoopFilterAlphaC0Offset = 0; // AlphaOffset: valid range [-6, 6], default 0
iLoopFilterBetaOffset = 0; // BetaOffset: valid range [-6, 6], default 0
iInterLayerLoopFilterDisableIdc = 1; // Employed based upon inter-layer, same comment as above
iInterLayerLoopFilterAlphaC0Offset = 0; // InterLayerLoopFilterAlphaC0Offset
iInterLayerLoopFilterBetaOffset = 0; // InterLayerLoopFilterBetaOffset
/* Rate Control */
bEnableRc = kbEnableRc;
iRCMode = 0;
iPaddingFlag = 0;
bEnableDenoise = false; // denoise control
bEnableSceneChangeDetect = true; // scene change detection control
bEnableBackgroundDetection = true; // background detection control
bEnableAdaptiveQuant = true; // adaptive quantization control
bEnableFrameSkip = true; // frame skipping
bEnableLongTermReference = false; // long term reference control
bEnableSpsPpsIdAddition = true; // pSps pPps id addition control
bPrefixNalAddingCtrl = true; // prefix NAL adding control
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);

View File

@ -69,6 +69,8 @@ class CWelsH264SVCEncoder : public ISVCEncoder {
virtual int EXTAPI Initialize (const SEncParamBase* argv);
virtual int EXTAPI InitializeExt (const SEncParamExt* argv);
virtual int EXTAPI GetDefaultParams (SEncParamExt* argv);
virtual int EXTAPI Uninitialize();
/*

View File

@ -197,6 +197,11 @@ void CWelsH264SVCEncoder::InitEncoder (void) {
/* Interfaces override from ISVCEncoder */
int CWelsH264SVCEncoder::GetDefaultParams (SEncParamExt* argv) {
SWelsSvcCodingParam::FillDefault(*argv, true);
return cmResultSuccess;
}
/*
* SVC Encoder Initialization
*/

View File

@ -12,13 +12,14 @@ typedef void(*CheckFunc)(int, int, const char*);
void CheckEncoderInterface(ISVCEncoder* p, CheckFunc check) {
CHECK(1, p, Initialize);
CHECK(2, p, InitializeExt);
CHECK(3, p, Uninitialize);
CHECK(4, p, EncodeFrame);
CHECK(5, p, EncodeParameterSets);
CHECK(6, p, PauseFrame);
CHECK(7, p, ForceIntraFrame);
CHECK(8, p, SetOption);
CHECK(9, p, GetOption);
CHECK(3, p, GetDefaultParams);
CHECK(4, p, Uninitialize);
CHECK(5, p, EncodeFrame);
CHECK(6, p, EncodeParameterSets);
CHECK(7, p, PauseFrame);
CHECK(8, p, ForceIntraFrame);
CHECK(9, p, SetOption);
CHECK(10, p, GetOption);
}
void CheckDecoderInterface(ISVCDecoder* p, CheckFunc check) {

View File

@ -30,35 +30,39 @@ struct SVCEncoderImpl : public ISVCEncoder {
EXPECT_TRUE(gThis == this);
return 2;
}
virtual int EXTAPI Uninitialize() {
virtual int EXTAPI GetDefaultParams(SEncParamExt* pParam) {
EXPECT_TRUE(gThis == this);
return 3;
}
virtual int EXTAPI Uninitialize() {
EXPECT_TRUE(gThis == this);
return 4;
}
virtual int EXTAPI EncodeFrame(const SSourcePicture* kpSrcPic,
SFrameBSInfo* pBsInfo) {
EXPECT_TRUE(gThis == this);
return 4;
return 5;
}
virtual int EXTAPI EncodeParameterSets(SFrameBSInfo* pBsInfo) {
EXPECT_TRUE(gThis == this);
return 5;
return 6;
}
virtual int EXTAPI PauseFrame(const SSourcePicture* kpSrcPic,
SFrameBSInfo* pBsInfo) {
EXPECT_TRUE(gThis == this);
return 6;
return 7;
}
virtual int EXTAPI ForceIntraFrame(bool bIDR) {
EXPECT_TRUE(gThis == this);
return 7;
return 8;
}
virtual int EXTAPI SetOption(ENCODER_OPTION eOptionId, void* pOption) {
EXPECT_TRUE(gThis == this);
return 8;
return 9;
}
virtual int EXTAPI GetOption(ENCODER_OPTION eOptionId, void* pOption) {
EXPECT_TRUE(gThis == this);
return 9;
return 10;
}
};