ref: 8e39cb3a3af8014505d496b89a4a815f6472a482
parent: c592d18dfd6e9de18fd87c2fd11460a965f88ccb
parent: 8028fe7130e55b0815cdefdaa811cb69bac7376e
author: sijchen <[email protected]>
date: Sun Nov 30 14:39:18 EST 2014
Merge pull request #1575 from ruil2/set_param add SetOption(ENCODER_OPTION_SVC_ENCODE_PARAM_BASE,&base) for encoder
--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -642,10 +642,11 @@
int64_t iTimeDiff = kiCurrentFrameTs - m_pEncContext->iLastStatisticsLogTs;
if ((iTimeDiff > m_pEncContext->iStatisticsLogInterval) || (0 == pStatistics->uiInputFrameCount % 300)) {
if (iTimeDiff) {
- pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount - m_pEncContext->iLastStatisticsFrameCount) * 1000 /
- iTimeDiff);
+ pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount -
+ m_pEncContext->iLastStatisticsFrameCount) * 1000 /
+ iTimeDiff);
pStatistics->uiBitRate = static_cast<unsigned int> ((m_pEncContext->iTotalEncodedBits -
- m_pEncContext->iLastStatisticsBits) * 1000 / iTimeDiff);
+ m_pEncContext->iLastStatisticsBits) * 1000 / iTimeDiff);
}
// update variables
@@ -727,6 +728,30 @@
m_pEncContext->pSvcParam->uiIntraPeriod = (uint32_t)iValue;
}
break;
+ case ENCODER_OPTION_SVC_ENCODE_PARAM_BASE: { // SVC Encoding Parameter
+ SEncParamBase sEncodingParam;
+ SWelsSvcCodingParam sConfig;
+ int32_t iTargetWidth = 0;
+ int32_t iTargetHeight = 0;
+
+ memcpy (&sEncodingParam, pOption, sizeof (SEncParamBase)); // confirmed_safe_unsafe_usage
+ if (sConfig.ParamBaseTranscode (sEncodingParam)) {
+ return cmInitParaError;
+ }
+ /* New configuration available here */
+ iTargetWidth = sConfig.iPicWidth;
+ iTargetHeight = sConfig.iPicHeight;
+ if (m_iMaxPicWidth != iTargetWidth
+ || m_iMaxPicHeight != iTargetHeight) {
+ m_iMaxPicWidth = iTargetWidth;
+ m_iMaxPicHeight = iTargetHeight;
+ }
+ if (WelsEncoderParamAdjust (&m_pEncContext, &sConfig)) {
+ return cmInitParaError;
+ }
+ }
+ break;
+
case ENCODER_OPTION_SVC_ENCODE_PARAM_EXT: { // SVC Encoding Parameter
SEncParamExt sEncodingParam;
SWelsSvcCodingParam sConfig;
--- a/test/encoder/EncUT_EncoderExt.cpp
+++ b/test/encoder/EncUT_EncoderExt.cpp
@@ -482,6 +482,37 @@
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
}
+TEST_F (EncoderInterfaceTest, BaseParamSettingTest) {
+ SEncParamBase sEncParamBase;
+ GetValidEncParamBase (&sEncParamBase);
+
+ int iResult = pPtrEnc->Initialize (&sEncParamBase);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+ if (iResult != cmResultSuccess) {
+ fprintf (stderr, "Unexpected ParamBase? \
+ iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n",
+ sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight,
+ sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate);
+ }
+
+ PrepareOneSrcFrame();
+
+ iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+ EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
+
+ GetValidEncParamBase (&sEncParamBase);
+ iResult = pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, &sEncParamBase);
+
+ PrepareOneSrcFrame();
+
+ iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+
+ iResult = pPtrEnc->Uninitialize();
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+}
+
TEST_F (EncoderInterfaceTest, BasicInitializeTestFalse) {
int iResult;
SEncParamBase sEncParamBase;