ref: 6a2a4efef66f625a4fe15be1bff7dc5caaf5c4c8
parent: ea9b80adb39ef55185a282cfd68b423bb5a3f036
author: Sijia Chen <[email protected]>
date: Fri Oct 24 10:39:50 EDT 2014
fix names to keep consistent of style improve UT to cover more cases under GetStatistics
--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -461,8 +461,8 @@
} SParserBsInfo, PParserBsInfo;
typedef struct TagVideoEncoderStatistics {
- unsigned int uWidth; // the width of encoded frame
- unsigned int uHeight; // the height of encoded frame
+ unsigned int uiWidth; // the width of encoded frame
+ unsigned int uiHeight; // the height of encoded frame
//following standard, will be 16x aligned, if there are multiple spatial, this is of the highest
float fAverageFrameSpeedInMs; // Average_Encoding_Time
@@ -475,14 +475,14 @@
unsigned int uiSkippedFrameCount; // number of frames
unsigned int uiResolutionChangeTimes; // uiResolutionChangeTimes
- unsigned int uIDRReqNum; // number of IDR requests
- unsigned int uIDRSentNum; // number of actual IDRs sent
- unsigned int uLTRSentNum; // number of LTR sent/marked
+ unsigned int uiIDRReqNum; // number of IDR requests
+ unsigned int uiIDRSentNum; // number of actual IDRs sent
+ unsigned int uiLTRSentNum; // number of LTR sent/marked
} SEncoderStatistics; // in building, coming soon
typedef struct TagVideoDecoderStatistics {
- unsigned int uWidth; // the width of encode/decode frame
- unsigned int uHeight; // the height of encode/decode frame
+ unsigned int uiWidth; // the width of encode/decode frame
+ unsigned int uiHeight; // the height of encode/decode frame
float fAverageFrameSpeedInMs; // Average_Decoding_Time
unsigned int uiDecodedFrameCount; // number of frames
@@ -489,9 +489,9 @@
unsigned int uiResolutionChangeTimes; // uiResolutionChangeTimes
unsigned int
uiAvgEcRatio; // when EC is on, the average ratio of correct or EC areas, can be an indicator of reconstruction quality
- unsigned int uIDRReqNum; // number of actual IDR request
- unsigned int uLTRReqNum; // number of actual LTR request
- unsigned int uIDRRecvNum; // number of actual IDR received
+ unsigned int uiIDRReqNum; // number of actual IDR request
+ unsigned int uiLTRReqNum; // number of actual LTR request
+ unsigned int uiIDRRecvNum; // number of actual IDR received
} SDecoderStatistics; // in building, coming soon
#endif//WELS_VIDEO_CODEC_APPLICATION_DEFINITION_H__
--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -598,13 +598,13 @@
SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics);
int32_t iMaxDid = m_pEncContext->pSvcParam->iSpatialLayerNum - 1;
- if ((0 != pStatistics->uWidth && 0 != pStatistics->uHeight)
- && (pStatistics->uWidth != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth
- || pStatistics->uHeight != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight)) {
+ if ((0 != pStatistics->uiWidth && 0 != pStatistics->uiHeight)
+ && (pStatistics->uiWidth != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth
+ || pStatistics->uiHeight != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight)) {
pStatistics->uiResolutionChangeTimes ++;
}
- pStatistics->uWidth = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth;
- pStatistics->uHeight = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight;
+ pStatistics->uiWidth = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth;
+ pStatistics->uiHeight = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight;
int32_t iProcessedFrameCount = pStatistics->uiInputFrameCount - pStatistics->uiSkippedFrameCount;
const bool kbCurrentFrameSkipped = (videoFrameTypeSkip == eFrameType);
@@ -626,21 +626,24 @@
pStatistics->uiBitRate = m_pEncContext->pWelsSvcRc->iActualBitRate; //TODO: finish the calculation in RC
if (videoFrameTypeIDR == eFrameType || videoFrameTypeI == eFrameType) {
- pStatistics->uIDRSentNum ++;
+ pStatistics->uiIDRSentNum ++;
}
if (m_pEncContext->pLtr->bLTRMarkingFlag) {
- pStatistics->uLTRSentNum ++;
+ pStatistics->uiLTRSentNum ++;
}
- //TODO: update uIDRSentNum in forceIDR
+ //TODO: update uiIDRReqNum in forceIDR
if (m_pEncContext->iStatisticsLogInterval > 0) {
if (WELS_ABS (kiCurrentFrameTs - m_pEncContext->iLastStatisticsLogTs) > m_pEncContext->iStatisticsLogInterval) {
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
- "EncoderStatistics: %dx%d, SpeedInMs: %f, AverFrameRate=%f, LastFrameRate=%f, LatestBitRate=%d, uiInputFrameCount=%d, uiSkippedFrameCount=%d, uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=%d",
- pStatistics->uWidth, pStatistics->uHeight, pStatistics->fAverageFrameSpeedInMs,
- pStatistics->fAverageFrameRate, pStatistics->fLatestFrameRate, pStatistics->uiBitRate,
+ "EncoderStatistics: %dx%d, SpeedInMs: %f, AverFrameRate=%f, LastFrameRate=NA, LatestBitRate=NA, uiInputFrameCount=%d, uiSkippedFrameCount=%d, uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=NA",
+ pStatistics->uiWidth, pStatistics->uiHeight,
+ pStatistics->fAverageFrameSpeedInMs, pStatistics->fAverageFrameRate,
pStatistics->uiInputFrameCount, pStatistics->uiSkippedFrameCount,
- pStatistics->uiResolutionChangeTimes, pStatistics->uIDRReqNum, pStatistics->uIDRSentNum, pStatistics->uLTRSentNum);
+ pStatistics->uiResolutionChangeTimes, pStatistics->uiIDRSentNum, pStatistics->uiLTRSentNum);
+ //TODO: the following statistics will be calculated and added later
+ //pStatistics->fLatestFrameRate, pStatistics->uiBitRate,
+ //pStatistics->uiIDRReqNum,
m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;
}
}
@@ -1103,8 +1106,8 @@
break;
case ENCODER_OPTION_GET_STATISTICS: {
SEncoderStatistics* pStatistics = (static_cast<SEncoderStatistics*> (pOption));
- pStatistics->uWidth = m_pEncContext->sEncoderStatistics.uWidth;
- pStatistics->uHeight = m_pEncContext->sEncoderStatistics.uHeight;
+ pStatistics->uiWidth = m_pEncContext->sEncoderStatistics.uiWidth;
+ pStatistics->uiHeight = m_pEncContext->sEncoderStatistics.uiHeight;
pStatistics->fAverageFrameSpeedInMs = m_pEncContext->sEncoderStatistics.fAverageFrameSpeedInMs;
// rate control related
@@ -1116,9 +1119,9 @@
pStatistics->uiSkippedFrameCount = m_pEncContext->sEncoderStatistics.uiSkippedFrameCount;
pStatistics->uiResolutionChangeTimes = m_pEncContext->sEncoderStatistics.uiResolutionChangeTimes;
- pStatistics->uIDRReqNum = m_pEncContext->sEncoderStatistics.uIDRReqNum;
- pStatistics->uIDRSentNum = m_pEncContext->sEncoderStatistics.uIDRSentNum;
- pStatistics->uLTRSentNum = m_pEncContext->sEncoderStatistics.uLTRSentNum;
+ pStatistics->uiIDRReqNum = m_pEncContext->sEncoderStatistics.uiIDRReqNum;
+ pStatistics->uiIDRSentNum = m_pEncContext->sEncoderStatistics.uiIDRSentNum;
+ pStatistics->uiLTRSentNum = m_pEncContext->sEncoderStatistics.uiLTRSentNum;
}
break;
case ENCODER_OPTION_STATISTICS_LOG_INTERVAL: {
--- a/test/encoder/EncUT_EncoderExt.cpp
+++ b/test/encoder/EncUT_EncoderExt.cpp
@@ -64,6 +64,7 @@
void EncodeOneFrame (SEncParamBase* pEncParamBase);
void PrepareOneSrcFrame();
void EncodeOneIDRandP (ISVCEncoder* pPtrEnc);
+ void ChangeResolutionAndCheckStatistics (const SEncParamBase& sEncParamBase, SEncoderStatistics* pEncoderStatistics);
public:
ISVCEncoder* pPtrEnc;
@@ -662,6 +663,46 @@
//TODO
}
+void EncoderInterfaceTest::ChangeResolutionAndCheckStatistics (const SEncParamBase& sEncParamBase,
+ SEncoderStatistics* pEncoderStatistics) {
+ unsigned int uiExistingFrameCount = pEncoderStatistics->uiInputFrameCount;
+ unsigned int uiExistingIDR = pEncoderStatistics->uiIDRSentNum;
+ unsigned int uiExistingResolutionChange = pEncoderStatistics->uiResolutionChangeTimes;
+
+ // 1, get the existing param
+ int iResult = pPtrEnc->GetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+
+ // 2, change setting
+ unsigned int uiKnownResolutionChangeTimes = uiExistingResolutionChange;
+ bool bCheckIDR = false;
+ if (pParamExt->iPicWidth != sEncParamBase.iPicWidth || pParamExt->iPicHeight != sEncParamBase.iPicHeight) {
+ uiKnownResolutionChangeTimes += 1;
+ bCheckIDR = true;
+ }
+ pParamExt->iPicWidth = pParamExt->sSpatialLayers[0].iVideoWidth = sEncParamBase.iPicWidth;
+ pParamExt->iPicHeight = pParamExt->sSpatialLayers[0].iVideoHeight = sEncParamBase.iPicHeight;
+ pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+
+ // 3, code one frame
+ PrepareOneSrcFrame();
+ iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+ iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, pEncoderStatistics);
+ EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+
+ EXPECT_EQ (pEncoderStatistics->uiInputFrameCount, uiExistingFrameCount + 1);
+ EXPECT_EQ (pEncoderStatistics->uiResolutionChangeTimes, uiKnownResolutionChangeTimes);
+ if (bCheckIDR) {
+ EXPECT_EQ (pEncoderStatistics->uiIDRSentNum, uiExistingIDR + 1);
+ }
+
+ EXPECT_EQ (pEncoderStatistics->uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth));
+ EXPECT_EQ (pEncoderStatistics->uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight));
+}
+
+
TEST_F (EncoderInterfaceTest, GetStatistics) {
SEncParamBase sEncParamBase;
GetValidEncParamBase (&sEncParamBase);
@@ -682,41 +723,20 @@
iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics);
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
EXPECT_EQ (sEncoderStatistics.uiInputFrameCount, static_cast<unsigned int> (2));
- EXPECT_EQ (sEncoderStatistics.uIDRSentNum, static_cast<unsigned int> (1));
+ EXPECT_EQ (sEncoderStatistics.uiIDRSentNum, static_cast<unsigned int> (1));
EXPECT_EQ (sEncoderStatistics.uiResolutionChangeTimes, static_cast<unsigned int> (0));
- EXPECT_EQ (sEncoderStatistics.uWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth));
- EXPECT_EQ (sEncoderStatistics.uHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight));
+ EXPECT_EQ (sEncoderStatistics.uiWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth));
+ EXPECT_EQ (sEncoderStatistics.uiHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight));
// try param change
- // 1, get the existing
- pPtrEnc->GetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt);
- EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
-
- // 2, change the reoslution
GetValidEncParamBase (&sEncParamBase);
- int32_t knownResolutionChangeTimes = 0;
- if (pParamExt->iPicWidth != sEncParamBase.iPicWidth || pParamExt->iPicHeight != sEncParamBase.iPicHeight) {
- knownResolutionChangeTimes = 1;
- }
- pParamExt->iPicWidth = pParamExt->sSpatialLayers[0].iVideoWidth = sEncParamBase.iPicWidth;
- pParamExt->iPicHeight = pParamExt->sSpatialLayers[0].iVideoHeight = sEncParamBase.iPicHeight;
- pPtrEnc->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParamExt);
- EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
+ ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics);
- // 3, code one frame
- PrepareOneSrcFrame();
- iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
- EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
- iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics);
- EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
-
- EXPECT_EQ (sEncoderStatistics.uiInputFrameCount, static_cast<unsigned int> (3));
- EXPECT_EQ (sEncoderStatistics.uIDRSentNum, static_cast<unsigned int> (2));
- EXPECT_EQ (sEncoderStatistics.uiResolutionChangeTimes, static_cast<unsigned int> (knownResolutionChangeTimes));
-
- EXPECT_EQ (sEncoderStatistics.uWidth, static_cast<unsigned int> (sEncParamBase.iPicWidth));
- EXPECT_EQ (sEncoderStatistics.uHeight, static_cast<unsigned int> (sEncParamBase.iPicHeight));
+ GetValidEncParamBase (&sEncParamBase);
+ sEncParamBase.iPicWidth = (sEncParamBase.iPicWidth % 16) + 1; //try 1~16
+ sEncParamBase.iPicHeight = (sEncParamBase.iPicHeight % 16) + 1; //try 1~16
+ ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics);
// 4, change log interval
int32_t iInterval = 0;