From 6021ff3908a39cd2996650a85dbcea09a6c8cb52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 26 Feb 2014 22:03:56 +0200 Subject: [PATCH 1/3] Refactor initializing defaults in a SEncParamExt to a separate function --- codec/encoder/core/inc/param_svc.h | 111 ++++++++++++++++------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/codec/encoder/core/inc/param_svc.h b/codec/encoder/core/inc/param_svc.h index b4646bbe..7847fca8 100644 --- a/codec/encoder/core/inc/param_svc.h +++ b/codec/encoder/core/inc/param_svc.h @@ -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(¶m, 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); From c7ff8876bb228e9aea34db890d22ac87e940cb87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 26 Feb 2014 22:08:41 +0200 Subject: [PATCH 2/3] Add a new public method for initializing SEncParamExt to default values This simplifies forward source compatibility when new fields are added to SEncParamExt - when new fields are added to SEncParamExt, this method makes sure those fields are initialized to the default value - otherwise all API users would have to manually check SEncParamExt every time it is updated to make sure there's no new fields that should be set to a nonzero value by default (e.g. like bEnableFrameSkip). --- codec/api/svc/codec_api.h | 4 ++++ codec/encoder/plus/inc/welsEncoderExt.h | 2 ++ codec/encoder/plus/src/welsEncoderExt.cpp | 5 +++++ test/c_interface_test.c | 1 + test/cpp_interface_test.cpp | 4 ++++ 5 files changed, 16 insertions(+) diff --git a/codec/api/svc/codec_api.h b/codec/api/svc/codec_api.h index 22737b86..9c941c20 100644 --- a/codec/api/svc/codec_api.h +++ b/codec/api/svc/codec_api.h @@ -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); diff --git a/codec/encoder/plus/inc/welsEncoderExt.h b/codec/encoder/plus/inc/welsEncoderExt.h index 22e3bd01..9e91ff4e 100644 --- a/codec/encoder/plus/inc/welsEncoderExt.h +++ b/codec/encoder/plus/inc/welsEncoderExt.h @@ -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(); /* diff --git a/codec/encoder/plus/src/welsEncoderExt.cpp b/codec/encoder/plus/src/welsEncoderExt.cpp index dc299ae4..4a30ddd7 100644 --- a/codec/encoder/plus/src/welsEncoderExt.cpp +++ b/codec/encoder/plus/src/welsEncoderExt.cpp @@ -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 */ diff --git a/test/c_interface_test.c b/test/c_interface_test.c index bf62bd11..113552b8 100644 --- a/test/c_interface_test.c +++ b/test/c_interface_test.c @@ -12,6 +12,7 @@ typedef void(*CheckFunc)(int, int, const char*); void CheckEncoderInterface(ISVCEncoder* p, CheckFunc check) { CHECK(1, p, Initialize); CHECK(2, p, InitializeExt); + CHECK(10, p, GetDefaultParams); CHECK(3, p, Uninitialize); CHECK(4, p, EncodeFrame); CHECK(5, p, EncodeParameterSets); diff --git a/test/cpp_interface_test.cpp b/test/cpp_interface_test.cpp index 12a61e58..8ab5789d 100644 --- a/test/cpp_interface_test.cpp +++ b/test/cpp_interface_test.cpp @@ -30,6 +30,10 @@ struct SVCEncoderImpl : public ISVCEncoder { EXPECT_TRUE(gThis == this); return 2; } + virtual int EXTAPI GetDefaultParams(SEncParamExt* pParam) { + EXPECT_TRUE(gThis == this); + return 10; + } virtual int EXTAPI Uninitialize() { EXPECT_TRUE(gThis == this); return 3; From a5f5b37a25837f1f66f5910d93d3681599636f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Wed, 26 Feb 2014 22:13:59 +0200 Subject: [PATCH 3/3] Renumber vtable entries in the C ABI test --- test/c_interface_test.c | 16 ++++++++-------- test/cpp_interface_test.cpp | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/test/c_interface_test.c b/test/c_interface_test.c index 113552b8..197da4a6 100644 --- a/test/c_interface_test.c +++ b/test/c_interface_test.c @@ -12,14 +12,14 @@ typedef void(*CheckFunc)(int, int, const char*); void CheckEncoderInterface(ISVCEncoder* p, CheckFunc check) { CHECK(1, p, Initialize); CHECK(2, p, InitializeExt); - CHECK(10, p, GetDefaultParams); - 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) { diff --git a/test/cpp_interface_test.cpp b/test/cpp_interface_test.cpp index 8ab5789d..f9bee979 100644 --- a/test/cpp_interface_test.cpp +++ b/test/cpp_interface_test.cpp @@ -32,37 +32,37 @@ struct SVCEncoderImpl : public ISVCEncoder { } virtual int EXTAPI GetDefaultParams(SEncParamExt* pParam) { EXPECT_TRUE(gThis == this); - return 10; + return 3; } virtual int EXTAPI Uninitialize() { EXPECT_TRUE(gThis == this); - return 3; + 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; } };