From cd5928d3976809011076ef94a06db1563b6902a7 Mon Sep 17 00:00:00 2001 From: Sijia Chen Date: Tue, 11 Nov 2014 16:12:38 -0800 Subject: [PATCH] fix a calculation of fAverageFrameRate --- codec/encoder/plus/src/welsEncoderExt.cpp | 8 +++++--- test/encoder/EncUT_EncoderExt.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/codec/encoder/plus/src/welsEncoderExt.cpp b/codec/encoder/plus/src/welsEncoderExt.cpp index 9ab5be80..f01dfa21 100644 --- a/codec/encoder/plus/src/welsEncoderExt.cpp +++ b/codec/encoder/plus/src/welsEncoderExt.cpp @@ -616,9 +616,11 @@ void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, EVid pStatistics->uiSkippedFrameCount += (kbCurrentFrameSkipped ? 1 : 0); // rate control related - if (0 != m_pEncContext->uiStartTimestamp && kiCurrentFrameTs > m_pEncContext->uiStartTimestamp + 800) { - pStatistics->fAverageFrameRate = (float) (pStatistics->uiInputFrameCount * 1000 / - (kiCurrentFrameTs - m_pEncContext->uiStartTimestamp)); + if (0 != m_pEncContext->uiStartTimestamp) { + if (kiCurrentFrameTs > m_pEncContext->uiStartTimestamp + 800) { + pStatistics->fAverageFrameRate = (static_cast (pStatistics->uiInputFrameCount) * 1000 / + (kiCurrentFrameTs - m_pEncContext->uiStartTimestamp)); + } } else { m_pEncContext->uiStartTimestamp = kiCurrentFrameTs; } diff --git a/test/encoder/EncUT_EncoderExt.cpp b/test/encoder/EncUT_EncoderExt.cpp index b4c22b87..a5ca43ce 100644 --- a/test/encoder/EncUT_EncoderExt.cpp +++ b/test/encoder/EncUT_EncoderExt.cpp @@ -124,6 +124,7 @@ void EncoderInterfaceTest::EncodeOneIDRandP (ISVCEncoder* pPtrEnc) { EXPECT_EQ (iResult, static_cast (cmResultSuccess)); EXPECT_EQ (sFbi.eFrameType, static_cast (videoFrameTypeIDR)); + pSrcPic->uiTimeStamp += 30; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast (cmResultSuccess)); EXPECT_NE (sFbi.eFrameType, static_cast (videoFrameTypeIDR)); @@ -687,6 +688,7 @@ void EncoderInterfaceTest::ChangeResolutionAndCheckStatistics (const SEncParamBa // 3, code one frame PrepareOneSrcFrame(); + pSrcPic->uiTimeStamp = 30 * pEncoderStatistics->uiInputFrameCount; iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); EXPECT_EQ (iResult, static_cast (cmResultSuccess)); iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, pEncoderStatistics); @@ -738,6 +740,14 @@ TEST_F (EncoderInterfaceTest, GetStatistics) { sEncParamBase.iPicHeight = (sEncParamBase.iPicHeight % 16) + 1; //try 1~16 ChangeResolutionAndCheckStatistics (sEncParamBase, &sEncoderStatistics); + // try timestamp and frame rate + pSrcPic->uiTimeStamp = 1000; + iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi); + EXPECT_EQ (iResult, static_cast (cmResultSuccess)); + iResult = pPtrEnc->GetOption (ENCODER_OPTION_GET_STATISTICS, &sEncoderStatistics); + EXPECT_EQ (iResult, static_cast (cmResultSuccess)); + EXPECT_EQ (static_cast (sEncoderStatistics.fAverageFrameRate), sEncoderStatistics.uiInputFrameCount); + // 4, change log interval int32_t iInterval = 0; iResult = pPtrEnc->GetOption (ENCODER_OPTION_STATISTICS_LOG_INTERVAL, &iInterval);