shithub: openh264

Download patch

ref: e1f73c641322dd1ba30925c5442ae457b97b95df
parent: b90f8fc914b3372a22b76d870373090011e99c3c
author: ruil2 <[email protected]>
date: Thu Mar 22 13:31:10 EDT 2018

fix bitrate overflow issue when running for long time

--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -378,7 +378,8 @@
     return cmInitParaError;
   }
   if (kpSrcPic->iColorFormat != videoFormatI420) {
-    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "CWelsH264SVCEncoder::EncodeFrame(), wrong iColorFormat %d", kpSrcPic->iColorFormat);
+    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "CWelsH264SVCEncoder::EncodeFrame(), wrong iColorFormat %d",
+             kpSrcPic->iColorFormat);
     return cmInitParaError;
   }
 
@@ -385,7 +386,8 @@
   const int32_t kiEncoderReturn = EncodeFrameInternal (kpSrcPic, pBsInfo);
 
   if (kiEncoderReturn != cmResultSuccess) {
-    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "CWelsH264SVCEncoder::EncodeFrame(), kiEncoderReturn %d", kiEncoderReturn);
+    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "CWelsH264SVCEncoder::EncodeFrame(), kiEncoderReturn %d",
+             kiEncoderReturn);
     return kiEncoderReturn;
   }
 
@@ -644,11 +646,10 @@
                                   pStatistics->iLastStatisticsFrameCount);
     if (kiDeltaFrames > (m_pEncContext->pSvcParam->fMaxFrameRate * 2)) {
       if (kiTimeDiff >= m_pEncContext->iStatisticsLogInterval) {
+        float fTimeDiffSec = kiTimeDiff / 1000.0;
         pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount -
-                                        pStatistics->iLastStatisticsFrameCount) * 1000 /
-                                        kiTimeDiff);
-        pStatistics->uiBitRate = static_cast<unsigned int> ((pStatistics->iTotalEncodedBytes -
-                                 pStatistics->iLastStatisticsBytes) * 8 * 1000 / kiTimeDiff);
+                                        pStatistics->iLastStatisticsFrameCount) / fTimeDiffSec);
+        pStatistics->uiBitRate = static_cast<unsigned int> ((pStatistics->iTotalEncodedBytes) * 8  / fTimeDiffSec);
 
         if (WELS_ABS (pStatistics->fLatestFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
           WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,
@@ -669,7 +670,9 @@
         // update variables
         pStatistics->iLastStatisticsBytes = pStatistics->iTotalEncodedBytes;
         pStatistics->iLastStatisticsFrameCount = pStatistics->uiInputFrameCount;
-
+        m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;
+        LogStatistics (kiCurrentFrameTs, iMaxDid);
+        pStatistics->iTotalEncodedBytes = 0;
         //TODO: the following statistics will be calculated and added later
         //pStatistics->uiLTRSentNum
 
@@ -676,20 +679,7 @@
       }
     }
   }
-  if (((m_pEncContext->iStatisticsLogInterval > 0) && (kiTimeDiff >= m_pEncContext->iStatisticsLogInterval))
-      || (0 == iMaxInputFrame % 300)) {
 
-    if ((iMaxFrameRate > 0) && WELS_ABS (iMaxFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
-      WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,
-               "Actual input framerate fAverageFrameRate = %f is quite different from framerate in setting %f, please check setting or timestamp unit (ms), start_Ts = %"
-               PRId64,
-               iMaxFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, m_pEncContext->uiStartTimestamp);
-    }
-
-    LogStatistics (kiCurrentFrameTs, iMaxDid);
-    m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;
-  }
-
 }
 
 /************************************************************************
@@ -727,7 +717,7 @@
     int32_t iValue = * ((int32_t*)pOption);
     WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
              "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_IDR_INTERVAL iValue = %d", iValue);
-    if ( iValue <= -1 ) {
+    if (iValue <= -1) {
       iValue = 0;
     }
     if (iValue == (int32_t)m_pEncContext->pSvcParam->uiIntraPeriod) {
@@ -735,7 +725,8 @@
     }
     m_pEncContext->pSvcParam->uiIntraPeriod = (uint32_t)iValue;
     WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
-             "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_IDR_INTERVAL uiIntraPeriod updated to %d", m_pEncContext->pSvcParam->uiIntraPeriod);
+             "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_IDR_INTERVAL uiIntraPeriod updated to %d",
+             m_pEncContext->pSvcParam->uiIntraPeriod);
   }
   break;
   case ENCODER_OPTION_SVC_ENCODE_PARAM_BASE: { // SVC Encoding Parameter