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
225 225
226 //related to Statistics226 //related to Statistics
227 int64_t uiStartTimestamp;227 int64_t uiStartTimestamp;
228 SEncoderStatistics sEncoderStatistics;228 SEncoderStatistics sEncoderStatistics[MAX_DEPENDENCY_LAYER];
229 int32_t iStatisticsLogInterval;229 int32_t iStatisticsLogInterval;
230 int64_t iLastStatisticsLogTs;230 int64_t iLastStatisticsLogTs;
231 int64_t iTotalEncodedBytes;231 int64_t iTotalEncodedBytes[MAX_DEPENDENCY_LAYER];
232 int64_t iLastStatisticsBytes;232 int64_t iLastStatisticsBytes[MAX_DEPENDENCY_LAYER];
233 int64_t iLastStatisticsFrameCount;233 int64_t iLastStatisticsFrameCount[MAX_DEPENDENCY_LAYER];
234 234
235 int32_t iEncoderError;235 int32_t iEncoderError;
236 WELS_MUTEX mutexEncoderError;236 WELS_MUTEX mutexEncoderError;
codec/encoder/core/src/encoder_ext.cpp+22−14
@@ -3412,7 +3412,7 @@ int32_t ForceCodingIDR (sWelsEncCtx* pCtx) { · 3411 unmodified lines
3412 pCtx->bCheckWindowStatusRefreshFlag = false;3412 pCtx->bCheckWindowStatusRefreshFlag = false;
3413 3413
3414 WelsLog (&pCtx->sLogCtx, WELS_LOG_INFO, "ForceCodingIDR at InputFrameCount=%d\n",3414 WelsLog (&pCtx->sLogCtx, WELS_LOG_INFO, "ForceCodingIDR at InputFrameCount=%d\n",
3415 pCtx->sEncoderStatistics.uiInputFrameCount);3415 pCtx->sEncoderStatistics[0].uiInputFrameCount);
3416 return 0;3416 return 0;
3417}3417}
3418 3418
@@ -3435,7 +3435,7 @@ int32_t WelsEncoderEncodeParameterSets (sWelsEncCtx* pCtx, void* pDst) { · 16 unmodified lines
3435 pLayerBsInfo->uiQualityId = 0;3435 pLayerBsInfo->uiQualityId = 0;
3436 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3436 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3437 pLayerBsInfo->iNalCount = iCountNal;3437 pLayerBsInfo->iNalCount = iCountNal;
3438 3438 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3439 //pCtx->eLastNalPriority = NRI_PRI_HIGHEST;3439 //pCtx->eLastNalPriority = NRI_PRI_HIGHEST;
3440 pFbi->iLayerNum = 1;3440 pFbi->iLayerNum = 1;
3441 pFbi->eFrameType = videoFrameTypeInvalid;3441 pFbi->eFrameType = videoFrameTypeInvalid;
@@ -3473,7 +3473,7 @@ int32_t WriteSsvcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 31 unmodified lines
3473 pLayerBsInfo->uiQualityId = 0;3473 pLayerBsInfo->uiQualityId = 0;
3474 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3474 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3475 pLayerBsInfo->iNalCount = iCountNal;3475 pLayerBsInfo->iNalCount = iCountNal;
3476 3476 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3477 //point to next pLayerBsInfo3477 //point to next pLayerBsInfo
3478 ++ pLayerBsInfo;3478 ++ pLayerBsInfo;
3479 ++ pCtx->pOut->iLayerBsIndex;3479 ++ pCtx->pOut->iLayerBsIndex;
@@ -3514,7 +3514,7 @@ int32_t WriteSavcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 34 unmodified lines
3514 pLayerBsInfo->uiQualityId = 0;3514 pLayerBsInfo->uiQualityId = 0;
3515 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3515 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3516 pLayerBsInfo->iNalCount = iCountNal;3516 pLayerBsInfo->iNalCount = iCountNal;
3517 3517 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3518 //point to next pLayerBsInfo3518 //point to next pLayerBsInfo
3519 ++ pLayerBsInfo;3519 ++ pLayerBsInfo;
3520 ++ pCtx->pOut->iLayerBsIndex;3520 ++ pCtx->pOut->iLayerBsIndex;
@@ -3547,7 +3547,7 @@ int32_t WriteSavcParaset (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 26 unmodified lines
3547 pLayerBsInfo->uiQualityId = 0;3547 pLayerBsInfo->uiQualityId = 0;
3548 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3548 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3549 pLayerBsInfo->iNalCount = iCountNal;3549 pLayerBsInfo->iNalCount = iCountNal;
3550 3550 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3551 //point to next pLayerBsInfo3551 //point to next pLayerBsInfo
3552 ++ pLayerBsInfo;3552 ++ pLayerBsInfo;
3553 ++ pCtx->pOut->iLayerBsIndex;3553 ++ pCtx->pOut->iLayerBsIndex;
@@ -3595,7 +3595,7 @@ int32_t WriteSavcParaset_Listing (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 41 unmodified lines
3595 pLayerBsInfo->uiQualityId = 0;3595 pLayerBsInfo->uiQualityId = 0;
3596 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3596 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3597 pLayerBsInfo->iNalCount = iCountNal;3597 pLayerBsInfo->iNalCount = iCountNal;
3598 3598 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3599 //point to next pLayerBsInfo3599 //point to next pLayerBsInfo
3600 ++ pLayerBsInfo;3600 ++ pLayerBsInfo;
3601 ++ pCtx->pOut->iLayerBsIndex;3601 ++ pCtx->pOut->iLayerBsIndex;
@@ -3630,7 +3630,7 @@ int32_t WriteSavcParaset_Listing (sWelsEncCtx* pCtx, const int32_t kiSpatialNum, · 28 unmodified lines
3630 pLayerBsInfo->uiQualityId = 0;3630 pLayerBsInfo->uiQualityId = 0;
3631 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;3631 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
3632 pLayerBsInfo->iNalCount = iCountNal;3632 pLayerBsInfo->iNalCount = iCountNal;
3633 3633 pLayerBsInfo->eFrameType = videoFrameTypeIDR;
3634 //point to next pLayerBsInfo3634 //point to next pLayerBsInfo
3635 ++ pLayerBsInfo;3635 ++ pLayerBsInfo;
3636 ++ pCtx->pOut->iLayerBsIndex;3636 ++ pCtx->pOut->iLayerBsIndex;
@@ -3745,6 +3745,9 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 108 unmodified lines
3745 pCtx->bCurFrameMarkedAsSceneLtr = false;3745 pCtx->bCurFrameMarkedAsSceneLtr = false;
3746 pFbi->iLayerNum = 0; // for initialization3746 pFbi->iLayerNum = 0; // for initialization
3747 pFbi->uiTimeStamp = pSrcPic->uiTimeStamp;3747 pFbi->uiTimeStamp = pSrcPic->uiTimeStamp;
3748 for (int32_t iNalIdx = 0; iNalIdx < MAX_LAYER_NUM_OF_FRAME; iNalIdx++) {
3749 pFbi->sLayerInfo[iNalIdx].eFrameType = videoFrameTypeSkip;
3750 }
3748 // perform csc/denoise/downsample/padding, generate spatial layers3751 // perform csc/denoise/downsample/padding, generate spatial layers
3749 iSpatialNum = pCtx->pVpp->BuildSpatialPicList (pCtx, pSrcPic);3752 iSpatialNum = pCtx->pVpp->BuildSpatialPicList (pCtx, pSrcPic);
3750 if (pCtx->pFuncList->pfRc.pfWelsUpdateMaxBrWindowStatus) {3753 if (pCtx->pFuncList->pfRc.pfWelsUpdateMaxBrWindowStatus) {
@@ -3953,12 +3956,14 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 202 unmodified lines
3953 pLayerBsInfo->uiTemporalId = iCurTid;3956 pLayerBsInfo->uiTemporalId = iCurTid;
3954 pLayerBsInfo->uiQualityId = 0;3957 pLayerBsInfo->uiQualityId = 0;
3955 pLayerBsInfo->iNalCount = ++ iNalIdxInLayer;3958 pLayerBsInfo->iNalCount = ++ iNalIdxInLayer;
3959 pLayerBsInfo->eFrameType = eFrameType;
3956 }3960 }
3957 // for dynamic slicing single threading..3961 // for dynamic slicing single threading..
3958 else if ((SM_SIZELIMITED_SLICE == pParam->sSliceArgument.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1)) {3962 else if ((SM_SIZELIMITED_SLICE == pParam->sSliceArgument.uiSliceMode) && (pSvcParam->iMultipleThreadIdc <= 1)) {
3959 const int32_t kiLastMbInFrame = pCtx->pCurDqLayer->sSliceEncCtx.iMbNumInFrame;3963 const int32_t kiLastMbInFrame = pCtx->pCurDqLayer->sSliceEncCtx.iMbNumInFrame;
3960 pCtx->iEncoderError = WelsCodeOnePicPartition (pCtx, pFbi, pLayerBsInfo, &iNalIdxInLayer, &iLayerSize, 0,3964 pCtx->iEncoderError = WelsCodeOnePicPartition (pCtx, pFbi, pLayerBsInfo, &iNalIdxInLayer, &iLayerSize, 0,
3961 kiLastMbInFrame, 0);3965 kiLastMbInFrame, 0);
3966 pLayerBsInfo->eFrameType = eFrameType;
3962 WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)3967 WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
3963 } else {3968 } else {
3964 //other multi-slice uiSliceMode3969 //other multi-slice uiSliceMode
@@ -3984,7 +3989,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 19 unmodified lines
3984 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;3989 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;
3985 pLayerBsInfo->uiQualityId = 0;3990 pLayerBsInfo->uiQualityId = 0;
3986 pLayerBsInfo->iNalCount = 0;3991 pLayerBsInfo->iNalCount = 0;
3987 3992 pLayerBsInfo->eFrameType = eFrameType;
3988 pCtx->pTaskManage->ExecuteTasks();3993 pCtx->pTaskManage->ExecuteTasks();
3989 if (pCtx->iEncoderError) {3994 if (pCtx->iEncoderError) {
3990 WelsLog (pLogCtx, WELS_LOG_ERROR,3995 WelsLog (pLogCtx, WELS_LOG_ERROR,
@@ -4035,7 +4040,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 44 unmodified lines
4035 pLbi->uiTemporalId = pCtx->uiTemporalId;4040 pLbi->uiTemporalId = pCtx->uiTemporalId;
4036 pLbi->uiQualityId = 0;4041 pLbi->uiQualityId = 0;
4037 pLbi->iNalCount = 0;4042 pLbi->iNalCount = 0;
4038 4043 pLbi->eFrameType = eFrameType;
4039 int32_t iIdx = 0;4044 int32_t iIdx = 0;
4040 while (iIdx < kiPartitionCnt) {4045 while (iIdx < kiPartitionCnt) {
4041 pCtx->pSliceThreading->pThreadPEncCtx[iIdx].pFrameBsInfo = pFbi;4046 pCtx->pSliceThreading->pThreadPEncCtx[iIdx].pFrameBsInfo = pFbi;
@@ -4103,6 +4108,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 61 unmodified lines
4103 pLayerBsInfo->uiTemporalId = iCurTid;4108 pLayerBsInfo->uiTemporalId = iCurTid;
4104 pLayerBsInfo->uiQualityId = 0;4109 pLayerBsInfo->uiQualityId = 0;
4105 pLayerBsInfo->iNalCount = iNalIdxInLayer;4110 pLayerBsInfo->iNalCount = iNalIdxInLayer;
4111 pLayerBsInfo->eFrameType = eFrameType;
4106 }4112 }
4107 }4113 }
4108 4114
@@ -4281,6 +4287,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 172 unmodified lines
4281 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;4287 pLayerBsInfo->uiLayerType = NON_VIDEO_CODING_LAYER;
4282 pLayerBsInfo->iNalCount = 1;4288 pLayerBsInfo->iNalCount = 1;
4283 pLayerBsInfo->pNalLengthInByte[0] = iPaddingNalSize;4289 pLayerBsInfo->pNalLengthInByte[0] = iPaddingNalSize;
4290 pLayerBsInfo->eFrameType = eFrameType;
4284 ++ pLayerBsInfo;4291 ++ pLayerBsInfo;
4285 ++ pCtx->pOut->iLayerBsIndex;4292 ++ pCtx->pOut->iLayerBsIndex;
4286 pLayerBsInfo->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer;4293 pLayerBsInfo->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer;
@@ -4314,6 +4321,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 27 unmodified lines
4314 "WelsEncoderEncodeExt(), Logic Error Found in Preprocess updating. ForceCodingIDR!");4321 "WelsEncoderEncodeExt(), Logic Error Found in Preprocess updating. ForceCodingIDR!");
4315 //the above is to set the next frame IDR4322 //the above is to set the next frame IDR
4316 pFbi->eFrameType = eFrameType;4323 pFbi->eFrameType = eFrameType;
4324 pLayerBsInfo->eFrameType = eFrameType;
4317 return ENC_RETURN_CORRECTED;4325 return ENC_RETURN_CORRECTED;
4318 }4326 }
4319 4327
@@ -4326,9 +4334,10 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 6 unmodified lines
4326 if (ENC_RETURN_CORRECTED == pCtx->iEncoderError) {4334 if (ENC_RETURN_CORRECTED == pCtx->iEncoderError) {
4327 pCtx->pVpp->UpdateSpatialPictures (pCtx, pSvcParam, iCurTid, (pSpatialIndexMap + iSpatialIdx)->iDid);4335 pCtx->pVpp->UpdateSpatialPictures (pCtx, pSvcParam, iCurTid, (pSpatialIndexMap + iSpatialIdx)->iDid);
4328 ForceCodingIDR (pCtx);4336 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!");
4330 //the above is to set the next frame IDR4338 //the above is to set the next frame IDR
4331 pFbi->eFrameType = eFrameType;4339 pFbi->eFrameType = eFrameType;
4340 pLayerBsInfo->eFrameType = eFrameType;
4332 return ENC_RETURN_CORRECTED;4341 return ENC_RETURN_CORRECTED;
4333 }4342 }
4334 4343
@@ -4509,7 +4518,8 @@ int32_t WelsEncoderParamAdjust (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pNewPa · 174 unmodified lines
4509 int32_t iTmpPpsIdList[MAX_DQ_LAYER_NUM * MAX_PPS_COUNT];4518 int32_t iTmpPpsIdList[MAX_DQ_LAYER_NUM * MAX_PPS_COUNT];
4510 uint16_t uiTmpIdrPicId = (*ppCtx)->uiIdrPicId;//this is for LTR!4519 uint16_t uiTmpIdrPicId = (*ppCtx)->uiIdrPicId;//this is for LTR!
4511 4520
4512 SEncoderStatistics sTempEncoderStatistics = (*ppCtx)->sEncoderStatistics;4521 SEncoderStatistics sTempEncoderStatistics[MAX_DEPENDENCY_LAYER];
4522 memcpy (sTempEncoderStatistics, (*ppCtx)->sEncoderStatistics, sizeof (sTempEncoderStatistics));
4513 4523
4514 SExistingParasetList sExistingParasetList;4524 SExistingParasetList sExistingParasetList;
4515 SExistingParasetList* pExistingParasetList = NULL;4525 SExistingParasetList* pExistingParasetList = NULL;
@@ -4568,8 +4578,7 @@ int32_t WelsEncoderParamAdjust (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pNewPa · 52 unmodified lines
4568 (*ppCtx)->uiIdrPicId = uiTmpIdrPicId;4578 (*ppCtx)->uiIdrPicId = uiTmpIdrPicId;
4569 4579
4570 //for sEncoderStatistics4580 //for sEncoderStatistics
4571 (*ppCtx)->sEncoderStatistics = sTempEncoderStatistics;4581 memcpy ((*ppCtx)->sEncoderStatistics, sTempEncoderStatistics, sizeof (sTempEncoderStatistics));
4572
4573 //load back the needed structure for eSpsPpsIdStrategy4582 //load back the needed structure for eSpsPpsIdStrategy
4574 if ((CONSTANT_ID != iOldSpsPpsIdStrategy) && (CONSTANT_ID != pNewParam->eSpsPpsIdStrategy)) {4583 if ((CONSTANT_ID != iOldSpsPpsIdStrategy) && (CONSTANT_ID != pNewParam->eSpsPpsIdStrategy)) {
4575 memcpy ((*ppCtx)->sPSOVector.sParaSetOffsetVariable, sTmpPsoVariable,4584 memcpy ((*ppCtx)->sPSOVector.sParaSetOffsetVariable, sTmpPsoVariable,
@@ -4934,7 +4943,6 @@ int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx, · 358 unmodified lines
4934 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;4943 pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId;
4935 pLayerBsInfo->uiQualityId = 0;4944 pLayerBsInfo->uiQualityId = 0;
4936 pLayerBsInfo->iNalCount = iNalIdxInLayer;4945 pLayerBsInfo->iNalCount = iNalIdxInLayer;
4937
4938 return ENC_RETURN_SUCCESS;4946 return ENC_RETURN_SUCCESS;
4939}4947}
4940} // namespace WelsEnc4948} // namespace WelsEnc
codec/encoder/plus/inc/welsEncoderExt.h+2−2
@@ -99,8 +99,8 @@ class CWelsH264SVCEncoder : public ISVCEncoder { · 98 unmodified lines
99 private:99 private:
100 int InitializeInternal (SWelsSvcCodingParam* argv);100 int InitializeInternal (SWelsSvcCodingParam* argv);
101 void TraceParamInfo(SEncParamExt *pParam);101 void TraceParamInfo(SEncParamExt *pParam);
102 void LogStatistics (const int64_t kiCurrentFrameTs);102 void LogStatistics (const int64_t kiCurrentFrameTs,int32_t iMaxDid);
103 void UpdateStatistics(const int64_t kiCurrentFrameTs, EVideoFrameType eFrameType, const int32_t kiCurrentFrameSize, const int64_t kiCurrentFrameMs);103 void UpdateStatistics(const int64_t kiCurrentFrameTs, SFrameBSInfo* pBsInfo, const int64_t kiCurrentFrameMs);
104 104
105 sWelsEncCtx* m_pEncContext;105 sWelsEncCtx* m_pEncContext;
106 106
codec/encoder/plus/src/welsEncoderExt.cpp+119−95
@@ -412,7 +412,7 @@ int CWelsH264SVCEncoder ::EncodeFrameInternal (const SSourcePicture* pSrcPic, S · 411 unmodified lines
412 return cmUnknownReason;412 return cmUnknownReason;
413 }413 }
414 414
415 UpdateStatistics (pSrcPic->uiTimeStamp, pBsInfo->eFrameType, pBsInfo->iFrameSizeInBytes, kiCurrentFrameMs);415 UpdateStatistics (pSrcPic->uiTimeStamp, pBsInfo, kiCurrentFrameMs);
416 416
417 ///////////////////for test417 ///////////////////for test
418#ifdef OUTPUT_BIT_STREAM418#ifdef OUTPUT_BIT_STREAM
@@ -481,7 +481,7 @@ int CWelsH264SVCEncoder::ForceIntraFrame (bool bIDR) { · 62 unmodified lines
481 481
482 ForceCodingIDR (m_pEncContext);482 ForceCodingIDR (m_pEncContext);
483 483
484 m_pEncContext->sEncoderStatistics.uiIDRReqNum++;484 m_pEncContext->sEncoderStatistics[0].uiIDRReqNum++;
485 485
486 return 0;486 return 0;
487}487}
@@ -545,102 +545,125 @@ void CWelsH264SVCEncoder::TraceParamInfo (SEncParamExt* pParam) { · 57 unmodified lines
545 }545 }
546}546}
547 547
548void CWelsH264SVCEncoder::LogStatistics (const int64_t kiCurrentFrameTs) {548void CWelsH264SVCEncoder::LogStatistics (const int64_t kiCurrentFrameTs, int32_t iMaxDid) {
549 SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics);549 for (int32_t iDid = 0; iDid <= iMaxDid; iDid++) {
550 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,550 SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[iDid]);
551 "EncoderStatistics: %dx%d, SpeedInMs: %f, fAverageFrameRate=%f, "551 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
552 "LastFrameRate=%f, LatestBitRate=%d, LastFrameQP=%d, uiInputFrameCount=%d, uiSkippedFrameCount=%d, "552 "EncoderStatistics: SpatialId = %d,%dx%d, SpeedInMs: %f, fAverageFrameRate=%f, "
553 "uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=NA, iTotalEncodedBytes=%" PRId64553 "LastFrameRate=%f, LatestBitRate=%d, LastFrameQP=%d, uiInputFrameCount=%d, uiSkippedFrameCount=%d, "
554 " at Ts = %" PRId64,554 "uiResolutionChangeTimes=%d, uIDRReqNum=%d, uIDRSentNum=%d, uLTRSentNum=NA, iTotalEncodedBytes=%" PRId64
555 pStatistics->uiWidth, pStatistics->uiHeight,555 " at Ts = %" PRId64,
556 pStatistics->fAverageFrameSpeedInMs, pStatistics->fAverageFrameRate,556 iDid, pStatistics->uiWidth, pStatistics->uiHeight,
557 pStatistics->fLatestFrameRate, pStatistics->uiBitRate, pStatistics->uiAverageFrameQP,557 pStatistics->fAverageFrameSpeedInMs, pStatistics->fAverageFrameRate,
558 pStatistics->uiInputFrameCount, pStatistics->uiSkippedFrameCount,558 pStatistics->fLatestFrameRate, pStatistics->uiBitRate, pStatistics->uiAverageFrameQP,
559 pStatistics->uiResolutionChangeTimes, pStatistics->uiIDRReqNum, pStatistics->uiIDRSentNum,559 pStatistics->uiInputFrameCount, pStatistics->uiSkippedFrameCount,
560 m_pEncContext->iTotalEncodedBytes, kiCurrentFrameTs);560 pStatistics->uiResolutionChangeTimes, pStatistics->uiIDRReqNum, pStatistics->uiIDRSentNum,
561 m_pEncContext->iTotalEncodedBytes[iDid], kiCurrentFrameTs);
562 }
561}563}
562 564
563void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, EVideoFrameType eFrameType,565void CWelsH264SVCEncoder::UpdateStatistics (const int64_t kiCurrentFrameTs, SFrameBSInfo* pBsInfo,
564 const int32_t kiCurrentFrameSize, const int64_t kiCurrentFrameMs) {566 const int64_t kiCurrentFrameMs) {
565 SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics);
566 567
567 int32_t iMaxDid = m_pEncContext->pSvcParam->iSpatialLayerNum - 1;568 int32_t iMaxDid = m_pEncContext->pSvcParam->iSpatialLayerNum - 1;
568 if ((0 != pStatistics->uiWidth && 0 != pStatistics->uiHeight)569 SLayerBSInfo* pLayerInfo = &pBsInfo->sLayerInfo[0];
569 && (pStatistics->uiWidth != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth570 for (int32_t iDid = 0; iDid <= iMaxDid; iDid++) {
570 || pStatistics->uiHeight != (unsigned int) m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight)) {571 EVideoFrameType eFrameType = videoFrameTypeInvalid;
571 pStatistics->uiResolutionChangeTimes ++;572 int32_t kiCurrentFrameSize = 0;
572 }573 if (pBsInfo->eFrameType == videoFrameTypeSkip) {
573 pStatistics->uiWidth = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualWidth;574 eFrameType = videoFrameTypeSkip;
574 pStatistics->uiHeight = m_pEncContext->pSvcParam->sDependencyLayers[iMaxDid].iActualHeight;575 } else {
575 576 for (int32_t iLayerNum = 0; iLayerNum < pBsInfo->iLayerNum; iLayerNum++) {
576 const bool kbCurrentFrameSkipped = (videoFrameTypeSkip == eFrameType);577 pLayerInfo = &pBsInfo->sLayerInfo[iLayerNum];
577 pStatistics->uiInputFrameCount ++;578 if ((pLayerInfo->uiLayerType == VIDEO_CODING_LAYER) && (pLayerInfo->uiSpatialId == iDid)) {
578 pStatistics->uiSkippedFrameCount += (kbCurrentFrameSkipped ? 1 : 0);579 eFrameType = pLayerInfo->eFrameType;
579 int32_t iProcessedFrameCount = pStatistics->uiInputFrameCount - pStatistics->uiSkippedFrameCount;580 for (int32_t iNalIdx = 0; iNalIdx < pLayerInfo->iNalCount; iNalIdx++) {
580 if (!kbCurrentFrameSkipped && iProcessedFrameCount != 0) {581 kiCurrentFrameSize += pLayerInfo->pNalLengthInByte[iNalIdx];
581 pStatistics->fAverageFrameSpeedInMs += (kiCurrentFrameMs - pStatistics->fAverageFrameSpeedInMs) / iProcessedFrameCount;582 }
582 }583 }
583 584 }
584 // rate control related585
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));
589 }586 }
590 } else {587 SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[iDid]);
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;
596 588
597 if (videoFrameTypeIDR == eFrameType || videoFrameTypeI == eFrameType) {
598 pStatistics->uiIDRSentNum ++;
599 }
600 if (m_pEncContext->pLtr->bLTRMarkingFlag) {
601 pStatistics->uiLTRSentNum ++;
602 }
603 589
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 }
605 624
606 const int32_t kiDeltaFrames = static_cast<int32_t> (pStatistics->uiInputFrameCount -625 m_pEncContext->iTotalEncodedBytes[iDid] += kiCurrentFrameSize;
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);
616 626
617 if (WELS_ABS (pStatistics->fLatestFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {627 const int32_t kiDeltaFrames = static_cast<int32_t> (pStatistics->uiInputFrameCount -
618 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,628 m_pEncContext->iLastStatisticsFrameCount[iDid]);
619 "Actual input fLatestFrameRate = %f is quite different from framerate in setting %f, please check setting or timestamp unit (ms), cur_Ts = %"629 if (kiDeltaFrames > (m_pEncContext->pSvcParam->fMaxFrameRate * 2)) {
620 PRId64 " start_Ts = %" PRId64,630 const int64_t kiTimeDiff = kiCurrentFrameTs - pStatistics->iStatisticsTs;
621 pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, kiCurrentFrameTs,631 if (kiTimeDiff) {
622 static_cast<int64_t> (pStatistics->iStatisticsTs));632 pStatistics->fLatestFrameRate = static_cast<float> ((pStatistics->uiInputFrameCount -
623 }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);
624 637
625 if (m_pEncContext->pSvcParam->iRCMode == RC_QUALITY_MODE || m_pEncContext->pSvcParam->iRCMode == RC_BITRATE_MODE) {638 if (WELS_ABS (pStatistics->fLatestFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {
626 if ((pStatistics->fLatestFrameRate > 0)
627 && WELS_ABS (m_pEncContext->pSvcParam->fMaxFrameRate - pStatistics->fLatestFrameRate) > 5) {
628 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING,639 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",640 "Actual input fLatestFrameRate = %f is quite different from framerate in setting %f, please check setting or timestamp unit (ms), cur_Ts = %"
630 pStatistics->fLatestFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate);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 }
631 }653 }
632 }654 }
633 }
634 655
635 // update variables656 // update variables
636 pStatistics->iStatisticsTs = kiCurrentFrameTs;657 pStatistics->iStatisticsTs = kiCurrentFrameTs;
637 m_pEncContext->iLastStatisticsBytes = m_pEncContext->iTotalEncodedBytes;658 m_pEncContext->iLastStatisticsBytes[iDid] = m_pEncContext->iTotalEncodedBytes[iDid];
638 m_pEncContext->iLastStatisticsFrameCount = pStatistics->uiInputFrameCount;659 m_pEncContext->iLastStatisticsFrameCount[iDid] = pStatistics->uiInputFrameCount;
639 660
640 //TODO: the following statistics will be calculated and added later661 //TODO: the following statistics will be calculated and added later
641 //pStatistics->uiLTRSentNum662 //pStatistics->uiLTRSentNum
663 }
642 }664 }
643 if (m_pEncContext->iStatisticsLogInterval > 0) {665 if (m_pEncContext->iStatisticsLogInterval > 0) {
666 SEncoderStatistics* pStatistics = & (m_pEncContext->sEncoderStatistics[0]);
644 const int64_t kiTimeDiff = kiCurrentFrameTs - m_pEncContext->iLastStatisticsLogTs;667 const int64_t kiTimeDiff = kiCurrentFrameTs - m_pEncContext->iLastStatisticsLogTs;
645 if ((kiTimeDiff > m_pEncContext->iStatisticsLogInterval) || (0 == pStatistics->uiInputFrameCount % 300)) {668 if ((kiTimeDiff > m_pEncContext->iStatisticsLogInterval) || (0 == pStatistics->uiInputFrameCount % 300)) {
646 if (WELS_ABS (pStatistics->fAverageFrameRate - m_pEncContext->pSvcParam->fMaxFrameRate) > 30) {669 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
650 pStatistics->fAverageFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, m_pEncContext->uiStartTimestamp);673 pStatistics->fAverageFrameRate, m_pEncContext->pSvcParam->fMaxFrameRate, m_pEncContext->uiStartTimestamp);
651 }674 }
652 675
653 LogStatistics (kiCurrentFrameTs);676 LogStatistics (kiCurrentFrameTs, iMaxDid);
654 m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;677 m_pEncContext->iLastStatisticsLogTs = kiCurrentFrameTs;
655 }678 }
656 }679 }
@@ -788,7 +811,7 @@ int CWelsH264SVCEncoder::SetOption (ENCODER_OPTION eOptionId, void* pOption) { · 131 unmodified lines
788 //LogStatistics811 //LogStatistics
789 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,812 WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
790 "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, LogStatisticsBeforeNewEncoding");813 "CWelsH264SVCEncoder::SetOption():ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, LogStatisticsBeforeNewEncoding");
791 LogStatistics (m_pEncContext->iLastStatisticsLogTs);814 LogStatistics (m_pEncContext->iLastStatisticsLogTs, sEncodingParam.iSpatialLayerNum - 1);
792 }815 }
793 break;816 break;
794 case ENCODER_OPTION_FRAME_RATE: { // Maximal input frame rate817 case ENCODER_OPTION_FRAME_RATE: { // Maximal input frame rate
@@ -1214,22 +1237,23 @@ int CWelsH264SVCEncoder::GetOption (ENCODER_OPTION eOptionId, void* pOption) { · 419 unmodified lines
1214 break;1237 break;
1215 case ENCODER_OPTION_GET_STATISTICS: {1238 case ENCODER_OPTION_GET_STATISTICS: {
1216 SEncoderStatistics* pStatistics = (static_cast<SEncoderStatistics*> (pOption));1239 SEncoderStatistics* pStatistics = (static_cast<SEncoderStatistics*> (pOption));
1217 pStatistics->uiWidth = m_pEncContext->sEncoderStatistics.uiWidth;1240 SEncoderStatistics* pEncStatistics = &m_pEncContext->sEncoderStatistics[m_pEncContext->pSvcParam->iSpatialLayerNum - 1];
1218 pStatistics->uiHeight = m_pEncContext->sEncoderStatistics.uiHeight;1241 pStatistics->uiWidth = pEncStatistics->uiWidth;
1219 pStatistics->fAverageFrameSpeedInMs = m_pEncContext->sEncoderStatistics.fAverageFrameSpeedInMs;1242 pStatistics->uiHeight = pEncStatistics->uiHeight;
1243 pStatistics->fAverageFrameSpeedInMs = pEncStatistics->fAverageFrameSpeedInMs;
1220 1244
1221 // rate control related1245 // rate control related
1222 pStatistics->fAverageFrameRate = m_pEncContext->sEncoderStatistics.fAverageFrameRate;1246 pStatistics->fAverageFrameRate = pEncStatistics->fAverageFrameRate;
1223 pStatistics->fLatestFrameRate = m_pEncContext->sEncoderStatistics.fLatestFrameRate;1247 pStatistics->fLatestFrameRate = pEncStatistics->fLatestFrameRate;
1224 pStatistics->uiBitRate = m_pEncContext->sEncoderStatistics.uiBitRate;1248 pStatistics->uiBitRate = pEncStatistics->uiBitRate;
1225 1249
1226 pStatistics->uiInputFrameCount = m_pEncContext->sEncoderStatistics.uiInputFrameCount;1250 pStatistics->uiInputFrameCount = pEncStatistics->uiInputFrameCount;
1227 pStatistics->uiSkippedFrameCount = m_pEncContext->sEncoderStatistics.uiSkippedFrameCount;1251 pStatistics->uiSkippedFrameCount = pEncStatistics->uiSkippedFrameCount;
1228 1252
1229 pStatistics->uiResolutionChangeTimes = m_pEncContext->sEncoderStatistics.uiResolutionChangeTimes;1253 pStatistics->uiResolutionChangeTimes = pEncStatistics->uiResolutionChangeTimes;
1230 pStatistics->uiIDRReqNum = m_pEncContext->sEncoderStatistics.uiIDRReqNum;1254 pStatistics->uiIDRReqNum = pEncStatistics->uiIDRReqNum;
1231 pStatistics->uiIDRSentNum = m_pEncContext->sEncoderStatistics.uiIDRSentNum;1255 pStatistics->uiIDRSentNum = pEncStatistics->uiIDRSentNum;
1232 pStatistics->uiLTRSentNum = m_pEncContext->sEncoderStatistics.uiLTRSentNum;1256 pStatistics->uiLTRSentNum = pEncStatistics->uiLTRSentNum;
1233 }1257 }
1234 break;1258 break;
1235 case ENCODER_OPTION_STATISTICS_LOG_INTERVAL: {1259 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