History

Merge pull request #2325 from ruil2/trace1

separate each layer trace output

HaiboZhu committed 10 years ago

Commit b940e2c2 parents 737548f d4f979c4 files · +147 −115Browse files

Unified · Split

4 files
  1. codec/encoder/core/inc/encoder_context.h +4 −4
  2. codec/encoder/core/src/encoder_ext.cpp +22 −14
  3. codec/encoder/plus/inc/welsEncoderExt.h +2 −2
  4. codec/encoder/plus/src/welsEncoderExt.cpp +119 −95
codec/encoder/core/inc/encoder_context.h+4−4
@@ -225,12 +225,12 @@ typedef struct TagWelsEncCtx { · 224 unmodified lines
225225
226226 //related to Statistics
227227 int64_t uiStartTimestamp;
228− SEncoderStatistics sEncoderStatistics;
228+ SEncoderStatistics sEncoderStatistics[MAX_DEPENDENCY_LAYER];
229229 int32_t iStatisticsLogInterval;
230230 int64_t iLastStatisticsLogTs;
231− int64_t iTotalEncodedBytes;
232− int64_t iLastStatisticsBytes;
233− int64_t iLastStatisticsFrameCount;
231+ int64_t iTotalEncodedBytes[MAX_DEPENDENCY_LAYER];
232+ int64_t iLastStatisticsBytes[MAX_DEPENDENCY_LAYER];
233+ int64_t iLastStatisticsFrameCount[MAX_DEPENDENCY_LAYER];
234234
235235 int32_t iEncoderError;
236236 WELS_MUTEX mutexEncoderError;
codec/encoder/core/src/encoder_ext.cpp+22−14
@@ -3412,7 +3412,7 @@ int32_t ForceCodingIDR (sWelsEncCtx* pCtx) { · 3411 unmodified lines
34123412 pCtx->bCheckWindowStatusRefreshFlag = false;
34133413
34143414 WelsLog (&pCtx->sLogCtx, WELS_LOG_INFO, "ForceCodingIDR at InputFrameCount=%d\n",
3415− pCtx->sEncoderStatistics.uiInputFrameCount);
3415+ pCtx->sEncoderStatistics[0].uiInputFrameCount);
34163416 return 0;
34173417 }
34183418
@@ -3435,7 +3435,7 @@ int32_t WelsEncoderEncodeParameterSets (sWelsEncCtx* pCtx, void* pDst) { · 16 unmodified lines
34353435 pLayerBsInfo->uiQualityId = 0;
34363436 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
34373437 pLayerBsInfo->iNalCount = iCountNal;
3438−
3438+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
34393439 //pCtx->eLastNalPriority = NRI_PRI_HIGHEST;
34403440 pFbi->iLayerNum = 1;
34413441 pFbi->eFrameType = videoFrameTypeInvalid;
@@ -3473,7 +3473,7 @@ int32_t WriteSsvcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 31 unmodified lines
34733473 pLayerBsInfo->uiQualityId = 0;
34743474 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
34753475 pLayerBsInfo->iNalCount = iCountNal;
3476−
3476+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
34773477 //point to next pLayerBsInfo
34783478 ++ pLayerBsInfo;
34793479 ++ pCtx->pOut->iLayerBsIndex;
@@ -3514,7 +3514,7 @@ int32_t WriteSavcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 34 unmodified lines
35143514 pLayerBsInfo->uiQualityId = 0;
35153515 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
35163516 pLayerBsInfo->iNalCount = iCountNal;
3517−
3517+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
35183518 //point to next pLayerBsInfo
35193519 ++ pLayerBsInfo;
35203520 ++ pCtx->pOut->iLayerBsIndex;
@@ -3547,7 +3547,7 @@ int32_t WriteSavcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 26 unmodified lines
35473547 pLayerBsInfo->uiQualityId = 0;
35483548 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
35493549 pLayerBsInfo->iNalCount = iCountNal;
3550−
3550+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
35513551 //point to next pLayerBsInfo
35523552 ++ pLayerBsInfo;
35533553 ++ pCtx->pOut->iLayerBsIndex;
@@ -3595,7 +3595,7 @@ int32_t WriteSavcParaset_Listing (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 41 unmodified lines
35953595 pLayerBsInfo->uiQualityId = 0;
35963596 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
35973597 pLayerBsInfo->iNalCount = iCountNal;
3598−
3598+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
35993599 //point to next pLayerBsInfo
36003600 ++ pLayerBsInfo;
36013601 ++ pCtx->pOut->iLayerBsIndex;
@@ -3630,7 +3630,7 @@ int32_t WriteSavcParaset_Listing (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 28 unmodified lines
36303630 pLayerBsInfo->uiQualityId = 0;
36313631 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
36323632 pLayerBsInfo->iNalCount = iCountNal;
3633−
3633+ pLayerBsInfo->eFrameType = videoFrameTypeIDR;
36343634 //point to next pLayerBsInfo
36353635 ++ pLayerBsInfo;
36363636 ++ pCtx->pOut->iLayerBsIndex;
@@ -3745,6 +3745,9 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 108 unmodified lines
37453745 pCtx->bCurFrameMarkedAsSceneLtr = false;
37463746 pFbi->iLayerNum = 0; // for initialization
37473747 pFbi->uiTimeStamp = pSrcPic->uiTimeStamp;
3748+ for (int32_t iNalIdx = 0; iNalIdx < MAX_LAYER_NUM_OF_FRAME; iNalIdx++) {
3749+ pFbi->sLayerInfo[iNalIdx].eFrameType = videoFrameTypeSkip;
3750+ }
37483751 // perform csc/denoise/downsample/padding, generate spatial layers
37493752 iSpatialNum = pCtx->pVpp->BuildSpatialPicList (pCtx, pSrcPic);
37503753 if (pCtx->pFuncList->pfRc.pfWelsUpdateMaxBrWindowStatus) {
@@ -3953,12 +3956,14 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 202 unmodified lines
39533956 pLayerBsInfo->uiTemporalId = iCurTid;
39543957 pLayerBsInfo->uiQualityId = 0;
39553958 pLayerBsInfo->iNalCount = ++ iNalIdxInLayer;
3959+ pLayerBsInfo->eFrameType = eFrameType;
39563960 }
39573961 // for dynamic slicing single threading..
39583962 else if ((SM_SIZELIMITED_SLICE == pParam->sSliceArgument.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1)) {
39593963 const int32_t kiLastMbInFrame = pCtx->pCurDqLayer->sSliceEncCtx.iMbNumInFrame;
39603964 pCtx->iEncoderError = WelsCodeOnePicPartition (pCtx, pFbi, pLayerBsInfo, &iNalIdxInLayer, &iLayerSize, 0,
39613965 kiLastMbInFrame, 0);
3966+ pLayerBsInfo->eFrameType = eFrameType;
39623967 WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
39633968 } else {
39643969 //other multi-slice uiSliceMode
@@ -3984,7 +3989,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 19 unmodified lines
39843989 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;
39853990 pLayerBsInfo->uiQualityId = 0;
39863991 pLayerBsInfo->iNalCount = 0;
3987−
3992+ pLayerBsInfo->eFrameType = eFrameType;
39883993 pCtx->pTaskManage->ExecuteTasks();
39893994 if (pCtx->iEncoderError) {
39903995 WelsLog (pLogCtx, WELS_LOG_ERROR,
@@ -4035,7 +4040,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 44 unmodified lines
40354040 pLbi->uiTemporalId = pCtx->uiTemporalId;
40364041 pLbi->uiQualityId = 0;
40374042 pLbi->iNalCount = 0;
4038−
4043+ pLbi->eFrameType = eFrameType;
40394044 int32_t iIdx = 0;
40404045 while (iIdx < kiPartitionCnt) {
40414046 pCtx->pSliceThreading->pThreadPEncCtx[iIdx].pFrameBsInfo = pFbi;
@@ -4103,6 +4108,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 61 unmodified lines
41034108 pLayerBsInfo->uiTemporalId = iCurTid;
41044109 pLayerBsInfo->uiQualityId = 0;
41054110 pLayerBsInfo->iNalCount = iNalIdxInLayer;
4111+ pLayerBsInfo->eFrameType = eFrameType;
41064112 }
41074113 }
41084114
@@ -4281,6 +4287,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 172 unmodified lines
42814287 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
42824288 pLayerBsInfo->iNalCount = 1;
42834289 pLayerBsInfo->pNalLengthInByte[0] = iPaddingNalSize;
4290+ pLayerBsInfo->eFrameType = eFrameType;
42844291 ++ pLayerBsInfo;
42854292 ++ pCtx->pOut->iLayerBsIndex;
42864293 pLayerBsInfo->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer;
@@ -4314,6 +4321,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 27 unmodified lines
43144321 "WelsEncoderEncodeExt(), Logic Error Found in Preprocess updating. ForceCodingIDR!");
43154322 //the above is to set the next frame IDR
43164323 pFbi->eFrameType = eFrameType;
4324+ pLayerBsInfo->eFrameType = eFrameType;
43174325 return ENC_RETURN_CORRECTED;
43184326 }
43194327
@@ -4326,9 +4334,10 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 6 unmodified lines
43264334 if (ENC_RETURN_CORRECTED == pCtx->iEncoderError) {
43274335 pCtx->pVpp->UpdateSpatialPictures (pCtx, pSvcParam, iCurTid, (pSpatialIndexMap + iSpatialIdx)->iDid);
43284336 ForceCodingIDR (pCtx);
4329− WelsLog (pLogCtx, WELS_LOG_WARNING, "WelsEncoderEncodeExt(), Logic Error Found in temporal level. ForceCodingIDR!");
4337+ WelsLog (pLogCtx, WELS_LOG_ERROR, "WelsEncoderEncodeExt(), Logic Error Found in temporal level. ForceCodingIDR!");
43304338 //the above is to set the next frame IDR
43314339 pFbi->eFrameType = eFrameType;
4340+ pLayerBsInfo->eFrameType = eFrameType;
43324341 return ENC_RETURN_CORRECTED;
43334342 }
43344343
@@ -4509,7 +4518,8 @@ int32_t WelsEncoderParamAdjust (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pNewPa · 174 unmodified lines
45094518 int32_t iTmpPpsIdList[MAX_DQ_LAYER_NUM * MAX_PPS_COUNT];
45104519 uint16_t uiTmpIdrPicId = (*ppCtx)->uiIdrPicId;//this is for LTR!
45114520
4512− SEncoderStatistics sTempEncoderStatistics = (*ppCtx)->sEncoderStatistics;
4521+ SEncoderStatistics sTempEncoderStatistics[MAX_DEPENDENCY_LAYER];
4522+ memcpy (sTempEncoderStatistics, (*ppCtx)->sEncoderStatistics, sizeof (sTempEncoderStatistics));
45134523
45144524 SExistingParasetList sExistingParasetList;
45154525 SExistingParasetList* pExistingParasetList = NULL;
@@ -4568,8 +4578,7 @@ int32_t WelsEncoderParamAdjust (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pNewPa · 52 unmodified lines
45684578 (*ppCtx)->uiIdrPicId = uiTmpIdrPicId;
45694579
45704580 //for sEncoderStatistics
4571− (*ppCtx)->sEncoderStatistics = sTempEncoderStatistics;
4572−
4581+ memcpy ((*ppCtx)->sEncoderStatistics, sTempEncoderStatistics, sizeof (sTempEncoderStatistics));
45734582 //load back the needed structure for eSpsPpsIdStrategy
45744583 if ((CONSTANT_ID != iOldSpsPpsIdStrategy) && (CONSTANT_ID != pNewParam->eSpsPpsIdStrategy)) {
45754584 memcpy ((*ppCtx)->sPSOVector.sParaSetOffsetVariable, sTmpPsoVariable,
@@ -4934,7 +4943,6 @@ int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx, · 358 unmodified lines
49344943 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;
49354944 pLayerBsInfo->uiQualityId = 0;
49364945 pLayerBsInfo->iNalCount = iNalIdxInLayer;
4937−
49384946 return ENC_RETURN_SUCCESS;
49394947 }
49404948 } // namespace WelsEnc
codec/encoder/plus/inc/welsEncoderExt.h+2−2
@@ -99,8 +99,8 @@ class CWelsH264SVCEncoder : public ISVCEncoder { · 98 unmodified lines
9999 private:
100100 int InitializeInternal (SWelsSvcCodingParam* argv);
101101 void TraceParamInfo(SEncParamExt *pParam);
102− void LogStatistics (const int64_t kiCurrentFrameTs);
103− void UpdateStatistics(const int64_t kiCurrentFrameTs, EVideoFrameType eFrameType, const int32_t kiCurrentFrameSize, const int64_t kiCurrentFrameMs);
102+ void LogStatistics (const int64_t kiCurrentFrameTs,int32_t iMaxDid);
103+ void UpdateStatistics(const int64_t kiCurrentFrameTs, SFrameBSInfo* pBsInfo, const int64_t kiCurrentFrameMs);
104104
105105 sWelsEncCtx* m_pEncContext;
106106
codec/encoder/plus/src/welsEncoderExt.cpp+119−95
@@ -412,7 +412,7 @@ int CWelsH264SVCEncoder ::EncodeFrameInternal (const SSourcePicture* pSrcPic, S · 411 unmodified lines
412412 return cmUnknownReason;
413413 }
414414
415− UpdateStatistics (pSrcPic->uiTimeStamp, pBsInfo->eFrameType, pBsInfo->iFrameSizeInBytes, kiCurrentFrameMs);
415+ UpdateStatistics (pSrcPic->uiTimeStamp, pBsInfo, kiCurrentFrameMs);
416416
417417 ///////////////////for test
418418 #ifdef OUTPUT_BIT_STREAM
@@ -481,7 +481,7 @@ int CWelsH264SVCEncoder::ForceIntraFrame (bool bIDR) { · 62 unmodified lines
481481
482482 ForceCodingIDR (m_pEncContext);
483483
484− m_pEncContext->sEncoderStatistics.uiIDRReqNum++;
484+ m_pEncContext->sEncoderStatistics[0].uiIDRReqNum++;
485485
486486 return 0;
487487 }
@@ -545,102 +545,125 @@ void CWelsH264SVCEncoder::TraceParamInfo (SEncParamExt* pParam) { · 57 unmodified lines
545545 }
546546 }
547547
548−void CWelsH264SVCEncoder::LogStatistics (const int64_t kiCurrentFrameTs) {
549− SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics);
550− WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
551− "EncoderStatistics: %dx%d, SpeedInMs: %f, fAverageFrameRate=%f, "
552− "LastFrameRate=%f, LatestBitRate=%d, LastFrameQP=%d, uiInputFrameCount=%d, uiSkippedFrameCount=%d, "
553− "uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=NA, iTotalEncodedBytes=%" PRId64
554− " at Ts = %" PRId64,
555− pStatistics->uiWidth, pStatistics->uiHeight,
556− pStatistics->fAverageFrameSpeedInMs, pStatistics->fAverageFrameRate,
557− pStatistics->fLatestFrameRate, pStatistics->uiBitRate, pStatistics->uiAverageFrameQP,
558− pStatistics->uiInputFrameCount, pStatistics->uiSkippedFrameCount,
559− pStatistics->uiResolutionChangeTimes, pStatistics->uiIDRReqNum, pStatistics->uiIDRSentNum,
560− m_pEncContext->iTotalEncodedBytes, kiCurrentFrameTs);
548+void CWelsH264SVCEncoder::LogStatistics (const int64_t kiCurrentFrameTs, int32_t iMaxDid) {
549+ for (int32_t iDid = 0; iDid <= iMaxDid; iDid++) {
550+ SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[iDid]);
551+ WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
552+ "EncoderStatistics: SpatialId = %d,%dx%d, SpeedInMs: %f, fAverageFrameRate=%f, "
553+ "LastFrameRate=%f, LatestBitRate=%d, LastFrameQP=%d, uiInputFrameCount=%d, uiSkippedFrameCount=%d, "
554+ "uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=NA, iTotalEncodedBytes=%" PRId64
555+ " at Ts = %" PRId64,
556+ iDid, pStatistics->uiWidth, pStatistics->uiHeight,
557+ pStatistics->fAverageFrameSpeedInMs, pStatistics->fAverageFrameRate,
558+ pStatistics->fLatestFrameRate, pStatistics->uiBitRate, pStatistics->uiAverageFrameQP,
559+ pStatistics->uiInputFrameCount, pStatistics->uiSkippedFrameCount,
560+ pStatistics->uiResolutionChangeTimes, pStatistics->uiIDRReqNum, pStatistics->uiIDRSentNum,
561+ m_pEncContext->iTotalEncodedBytes[iDid], kiCurrentFrameTs);
562+ }
561563 }
562564
563−void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, EVideoFrameType eFrameType,
564− const int32_t kiCurrentFrameSize, const int64_t kiCurrentFrameMs) {
565− SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics);
565+void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, SFrameBSInfo* pBsInfo,
566+ const int64_t kiCurrentFrameMs) {
566567
567568 int32_t iMaxDid = m_pEncContext->pSvcParam->iSpatialLayerNum - 1;
568− if ((0 != pStatistics->uiWidth && 0 != pStatistics->uiHeight)
569− && (pStatistics->uiWidth != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth
570− || pStatistics->uiHeight != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight)) {
571− pStatistics->uiResolutionChangeTimes ++;
572− }
573− pStatistics->uiWidth = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth;
574− pStatistics->uiHeight = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight;
575−
576− const bool kbCurrentFrameSkipped = (videoFrameTypeSkip == eFrameType);
577− pStatistics->uiInputFrameCount ++;
578− pStatistics->uiSkippedFrameCount += (kbCurrentFrameSkipped ? 1 : 0);
579− int32_t iProcessedFrameCount = pStatistics->uiInputFrameCount - pStatistics->uiSkippedFrameCount;
580− if (!kbCurrentFrameSkipped && iProcessedFrameCount != 0) {
581− pStatistics->fAverageFrameSpeedInMs += (kiCurrentFrameMs - pStatistics->fAverageFrameSpeedInMs) / iProcessedFrameCount;
582− }
583−
584− // rate control related
585− if (0 != m_pEncContext->uiStartTimestamp) {
586− if (kiCurrentFrameTs > m_pEncContext->uiStartTimestamp + 800) {
587− pStatistics->fAverageFrameRate = (static_cast<float> (pStatistics->uiInputFrameCount) * 1000 /
588− (kiCurrentFrameTs - m_pEncContext->uiStartTimestamp));
569+ SLayerBSInfo* pLayerInfo = &pBsInfo->sLayerInfo[0];
570+ for (int32_t iDid = 0; iDid <= iMaxDid; iDid++) {
571+ EVideoFrameType eFrameType = videoFrameTypeInvalid;
572+ int32_t kiCurrentFrameSize = 0;
573+ if (pBsInfo->eFrameType == videoFrameTypeSkip) {
574+ eFrameType = videoFrameTypeSkip;
575+ } else {
576+ for (int32_t iLayerNum = 0; iLayerNum < pBsInfo->iLayerNum; iLayerNum++) {
577+ pLayerInfo = &pBsInfo->sLayerInfo[iLayerNum];
578+ if ((pLayerInfo->uiLayerType == VIDEO_CODING_LAYER) && (pLayerInfo->uiSpatialId == iDid)) {
579+ eFrameType = pLayerInfo->eFrameType;
580+ for (int32_t iNalIdx = 0; iNalIdx < pLayerInfo->iNalCount; iNalIdx++) {
581+ kiCurrentFrameSize += pLayerInfo->pNalLengthInByte[iNalIdx];
582+ }
583+ }
584+ }
585+
589586 }
590− } else {
591− m_pEncContext->uiStartTimestamp = kiCurrentFrameTs;
592− }
593− //pStatistics->fLatestFrameRate = m_pEncContext->pWelsSvcRc->fLatestFrameRate; //TODO: finish the calculation in RC
594− //pStatistics->uiBitRate = m_pEncContext->pWelsSvcRc->iActualBitRate; //TODO: finish the calculation in RC
595− pStatistics->uiAverageFrameQP = m_pEncContext->pWelsSvcRc->iAverageFrameQp;
587+ SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[iDid]);
596588
597− if (videoFrameTypeIDR == eFrameType || videoFrameTypeI == eFrameType) {
598− pStatistics->uiIDRSentNum ++;
599− }
600− if (m_pEncContext->pLtr->bLTRMarkingFlag) {
601− pStatistics->uiLTRSentNum ++;
602− }
603589
604− m_pEncContext->iTotalEncodedBytes += kiCurrentFrameSize;
590+ if ((0 != pStatistics->uiWidth && 0 != pStatistics->uiHeight)
591+ && (pStatistics->uiWidth != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iDid].iActualWidth
592+ || pStatistics->uiHeight != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iDid].iActualHeight)) {
593+ pStatistics->uiResolutionChangeTimes ++;
594+ }
595+ pStatistics->uiWidth = m_pEncContext->pSvcParam->sDependencyLayers[iDid].iActualWidth;
596+ pStatistics->uiHeight = m_pEncContext->pSvcParam->sDependencyLayers[iDid].iActualHeight;
597+
598+ const bool kbCurrentFrameSkipped = (videoFrameTypeSkip == eFrameType);
599+ pStatistics->uiInputFrameCount ++;
600+ pStatistics->uiSkippedFrameCount += (kbCurrentFrameSkipped ? 1 : 0);
601+ int32_t iProcessedFrameCount = pStatistics->uiInputFrameCount - pStatistics->uiSkippedFrameCount;
602+ if (!kbCurrentFrameSkipped && iProcessedFrameCount != 0) {
603+ pStatistics->fAverageFrameSpeedInMs += (kiCurrentFrameMs - pStatistics->fAverageFrameSpeedInMs) / iProcessedFrameCount;
604+ }
605+ // rate control related
606+ if (0 != m_pEncContext->uiStartTimestamp) {
607+ if (kiCurrentFrameTs > m_pEncContext->uiStartTimestamp + 800) {
608+ pStatistics->fAverageFrameRate = (static_cast<float> (pStatistics->uiInputFrameCount) * 1000 /
609+ (kiCurrentFrameTs - m_pEncContext->uiStartTimestamp));
610+ }
611+ } else {
612+ m_pEncContext->uiStartTimestamp = kiCurrentFrameTs;
613+ }
614+ //pStatistics->fLatestFrameRate = m_pEncContext->pWelsSvcRc->fLatestFrameRate; //TODO: finish the calculation in RC
615+ //pStatistics->uiBitRate = m_pEncContext->pWelsSvcRc->iActualBitRate; //TODO: finish the calculation in RC
616+ pStatistics->uiAverageFrameQP = m_pEncContext->pWelsSvcRc->iAverageFrameQp;
617+
618+ if (videoFrameTypeIDR == eFrameType || videoFrameTypeI == eFrameType) {
619+ pStatistics->uiIDRSentNum ++;
620+ }
621+ if (m_pEncContext->pLtr->bLTRMarkingFlag) {
622+ pStatistics->uiLTRSentNum ++;
623+ }
605624
606− const int32_t kiDeltaFrames = static_cast<int32_t> (pStatistics->uiInputFrameCount -
607− m_pEncContext->iLastStatisticsFrameCount);
608− if (kiDeltaFrames > (m_pEncContext->pSvcParam->fMaxFrameRate * 2)) {
609− const int64_t kiTimeDiff = kiCurrentFrameTs - pStatistics->iStatisticsTs;
610− if (kiTimeDiff) {
611− pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount -
612− m_pEncContext->iLastStatisticsFrameCount) * 1000 /
613− kiTimeDiff);
614− pStatistics->uiBitRate = static_cast<unsigned int> ((m_pEncContext->iTotalEncodedBytes -
615− m_pEncContext->iLastStatisticsBytes) * 8 * 1000 / kiTimeDiff);
625+ m_pEncContext->iTotalEncodedBytes[iDid] += kiCurrentFrameSize;
616626
617− if (WELS_ABS (pStatistics->fLatestFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
618− WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,
619− "Actual input fLatestFrameRate = %f is quite different from framerate in setting %f, please check setting or timestamp unit (ms), cur_Ts = %"
620− PRId64 " start_Ts = %" PRId64,
621− pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, kiCurrentFrameTs,
622− static_cast<int64_t> (pStatistics->iStatisticsTs));
623− }
627+ const int32_t kiDeltaFrames = static_cast<int32_t> (pStatistics->uiInputFrameCount -
628+ m_pEncContext->iLastStatisticsFrameCount[iDid]);
629+ if (kiDeltaFrames > (m_pEncContext->pSvcParam->fMaxFrameRate * 2)) {
630+ const int64_t kiTimeDiff = kiCurrentFrameTs - pStatistics->iStatisticsTs;
631+ if (kiTimeDiff) {
632+ pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount -
633+ m_pEncContext->iLastStatisticsFrameCount[iDid]) * 1000 /
634+ kiTimeDiff);
635+ pStatistics->uiBitRate = static_cast<unsigned int> ((m_pEncContext->iTotalEncodedBytes[iDid] -
636+ m_pEncContext->iLastStatisticsBytes[iDid]) * 8 * 1000 / kiTimeDiff);
624637
625− if (m_pEncContext->pSvcParam->iRCMode == RC_QUALITY_MODE || m_pEncContext->pSvcParam->iRCMode == RC_BITRATE_MODE) {
626− if ((pStatistics->fLatestFrameRate > 0)
627− && WELS_ABS (m_pEncContext->pSvcParam->fMaxFrameRate - pStatistics->fLatestFrameRate) > 5) {
638+ if (WELS_ABS (pStatistics->fLatestFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
628639 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,
629− "Actual input framerate %f is different from framerate in setting %f, suggest to use other rate control modes",
630− pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate);
640+ "Actual input fLatestFrameRate = %f is quite different from framerate in setting %f, please check setting or timestamp unit (ms), cur_Ts = %"
641+ PRId64 " start_Ts = %" PRId64,
642+ pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, kiCurrentFrameTs,
643+ static_cast<int64_t> (pStatistics->iStatisticsTs));
644+ }
645+
646+ if (m_pEncContext->pSvcParam->iRCMode == RC_QUALITY_MODE || m_pEncContext->pSvcParam->iRCMode == RC_BITRATE_MODE) {
647+ if ((pStatistics->fLatestFrameRate > 0)
648+ && WELS_ABS (m_pEncContext->pSvcParam->fMaxFrameRate - pStatistics->fLatestFrameRate) > 5) {
649+ WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,
650+ "Actual input framerate %f is different from framerate in setting %f, suggest to use other rate control modes",
651+ pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate);
652+ }
631653 }
632654 }
633− }
634655
635− // update variables
636− pStatistics->iStatisticsTs = kiCurrentFrameTs;
637− m_pEncContext->iLastStatisticsBytes = m_pEncContext->iTotalEncodedBytes;
638− m_pEncContext->iLastStatisticsFrameCount = pStatistics->uiInputFrameCount;
656+ // update variables
657+ pStatistics->iStatisticsTs = kiCurrentFrameTs;
658+ m_pEncContext->iLastStatisticsBytes[iDid] = m_pEncContext->iTotalEncodedBytes[iDid];
659+ m_pEncContext->iLastStatisticsFrameCount[iDid] = pStatistics->uiInputFrameCount;
639660
640− //TODO: the following statistics will be calculated and added later
641− //pStatistics->uiLTRSentNum
661+ //TODO: the following statistics will be calculated and added later
662+ //pStatistics->uiLTRSentNum
663+ }
642664 }
643665 if (m_pEncContext->iStatisticsLogInterval > 0) {
666+ SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[0]);
644667 const int64_t kiTimeDiff = kiCurrentFrameTs - m_pEncContext->iLastStatisticsLogTs;
645668 if ((kiTimeDiff > m_pEncContext->iStatisticsLogInterval) || (0 == pStatistics->uiInputFrameCount % 300)) {
646669 if (WELS_ABS (pStatistics->fAverageFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
@@ -650,7 +673,7 @@ void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, EVid · 3 unmodified lines
650673 pStatistics->fAverageFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, m_pEncContext->uiStartTimestamp);
651674 }
652675
653− LogStatistics (kiCurrentFrameTs);
676+ LogStatistics (kiCurrentFrameTs, iMaxDid);
654677 m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;
655678 }
656679 }
@@ -788,7 +811,7 @@ int CWelsH264SVCEncoder::SetOption (ENCODER_OPTION eOptionId, void* pOption) { · 131 unmodified lines
788811 //LogStatistics
789812 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
790813 "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, LogStatisticsBeforeNewEncoding");
791− LogStatistics (m_pEncContext->iLastStatisticsLogTs);
814+ LogStatistics (m_pEncContext->iLastStatisticsLogTs, sEncodingParam.iSpatialLayerNum - 1);
792815 }
793816 break;
794817 case ENCODER_OPTION_FRAME_RATE: { // Maximal input frame rate
@@ -1214,22 +1237,23 @@ int CWelsH264SVCEncoder::GetOption (ENCODER_OPTION eOptionId, void* pOption) { · 419 unmodified lines
12141237 break;
12151238 case ENCODER_OPTION_GET_STATISTICS: {
12161239 SEncoderStatistics* pStatistics = (static_cast<SEncoderStatistics*> (pOption));
1217− pStatistics->uiWidth = m_pEncContext->sEncoderStatistics.uiWidth;
1218− pStatistics->uiHeight = m_pEncContext->sEncoderStatistics.uiHeight;
1219− pStatistics->fAverageFrameSpeedInMs = m_pEncContext->sEncoderStatistics.fAverageFrameSpeedInMs;
1240+ SEncoderStatistics* pEncStatistics = &m_pEncContext->sEncoderStatistics[m_pEncContext->pSvcParam->iSpatialLayerNum - 1];
1241+ pStatistics->uiWidth = pEncStatistics->uiWidth;
1242+ pStatistics->uiHeight = pEncStatistics->uiHeight;
1243+ pStatistics->fAverageFrameSpeedInMs = pEncStatistics->fAverageFrameSpeedInMs;
12201244
12211245 // rate control related
1222− pStatistics->fAverageFrameRate = m_pEncContext->sEncoderStatistics.fAverageFrameRate;
1223− pStatistics->fLatestFrameRate = m_pEncContext->sEncoderStatistics.fLatestFrameRate;
1224− pStatistics->uiBitRate = m_pEncContext->sEncoderStatistics.uiBitRate;
1246+ pStatistics->fAverageFrameRate = pEncStatistics->fAverageFrameRate;
1247+ pStatistics->fLatestFrameRate = pEncStatistics->fLatestFrameRate;
1248+ pStatistics->uiBitRate = pEncStatistics->uiBitRate;
12251249
1226− pStatistics->uiInputFrameCount = m_pEncContext->sEncoderStatistics.uiInputFrameCount;
1227− pStatistics->uiSkippedFrameCount = m_pEncContext->sEncoderStatistics.uiSkippedFrameCount;
1250+ pStatistics->uiInputFrameCount = pEncStatistics->uiInputFrameCount;
1251+ pStatistics->uiSkippedFrameCount = pEncStatistics->uiSkippedFrameCount;
12281252
1229− pStatistics->uiResolutionChangeTimes = m_pEncContext->sEncoderStatistics.uiResolutionChangeTimes;
1230− pStatistics->uiIDRReqNum = m_pEncContext->sEncoderStatistics.uiIDRReqNum;
1231− pStatistics->uiIDRSentNum = m_pEncContext->sEncoderStatistics.uiIDRSentNum;
1232− pStatistics->uiLTRSentNum = m_pEncContext->sEncoderStatistics.uiLTRSentNum;
1253+ pStatistics->uiResolutionChangeTimes = pEncStatistics->uiResolutionChangeTimes;
1254+ pStatistics->uiIDRReqNum = pEncStatistics->uiIDRReqNum;
1255+ pStatistics->uiIDRSentNum = pEncStatistics->uiIDRSentNum;
1256+ pStatistics->uiLTRSentNum = pEncStatistics->uiLTRSentNum;
12331257 }
12341258 break;
12351259 case ENCODER_OPTION_STATISTICS_LOG_INTERVAL: {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t