History

fix decodestatus uiEcRatio calc bug

dong zhang committed 11 years ago

Commit ecc8ae61 parent 065c3a74 files · +15 −19Browse files

Showing the changes to codec/decoder (4 of 4 files). Show all

Unified · Split

4 files
  1. codec/decoder/core/inc/decoder_context.h +2 −0
  2. codec/decoder/core/src/decoder_core.cpp +2 −1
  3. codec/decoder/core/src/error_concealment.cpp +8 −14
  4. codec/decoder/plus/src/welsDecoderExt.cpp +3 −4
codec/decoder/core/inc/decoder_context.h+2−0
@@ -400,6 +400,8 @@ SWelsCabacCtx pCabacCtx[WELS_CONTEXT_COUNT]; · 399 unmodified lines
400400 PWelsCabacDecEngine pCabacDecEngine;
401401 double dDecTime;
402402 SDecoderStatistics sDecoderStatistics;// For real time debugging
403+int32_t iMbEcedNum;
404+int32_t iMbNum;
403405 int32_t iECMVs[16][2];
404406 PPicture pECRefPic[16];
405407 unsigned long long uiTimeStamp;
codec/decoder/core/src/decoder_core.cpp+2−1
@@ -1683,7 +1683,8 @@ static void WriteBackActiveParameters (PWelsDecoderContext pCtx) { · 1682 unmodified lines
16831683 int32_t ConstructAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferInfo* pDstInfo) {
16841684 int32_t iErr;
16851685 PAccessUnit pCurAu = pCtx->pAccessUnitList;
1686−
1686+ pCtx->iMbEcedNum = 0;
1687+ pCtx->iMbNum = 0;
16871688 pCtx->bAuReadyFlag = false;
16881689 pCtx->bLastHasMmco5 = false;
16891690 bool bTmpNewSeqBegin = CheckNewSeqBeginAndUpdateActiveLayerSps (pCtx);
codec/decoder/core/src/error_concealment.cpp+8−14
@@ -82,6 +82,8 @@ void DoErrorConFrameCopy (PWelsDecoderContext pCtx) { · 81 unmodified lines
8282 uint32_t uiHeightInPixelY = (pCtx->pSps->iMbHeight) << 4;
8383 int32_t iStrideY = pDstPic->iLinesize[0];
8484 int32_t iStrideUV = pDstPic->iLinesize[1];
85+ pCtx->iMbNum = pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight;
86+ pCtx->iMbEcedNum = pCtx->iMbNum;
8587 if ((pCtx->eErrorConMethod == ERROR_CON_FRAME_COPY) && (pCtx->pCurDqLayer->sLayerInfo.sNalHeaderExt.bIdrFlag))
8688 pSrcPic = NULL; //no cross IDR method, should fill in data instead of copy
8789 if (pSrcPic == NULL) { //no ref pic, assign specific data to picture
@@ -105,10 +107,10 @@ void DoErrorConSliceCopy (PWelsDecoderContext pCtx) { · 17 unmodified lines
105107 if ((pCtx->eErrorConMethod == ERROR_CON_SLICE_COPY) && (pCtx->pCurDqLayer->sLayerInfo.sNalHeaderExt.bIdrFlag))
106108 pSrcPic = NULL; //no cross IDR method, should fill in data instead of copy
107109
108− int32_t iMbNum = pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight;
110+ pCtx->iMbNum = pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight;
109111 //uint8_t *pDstData[3], *pSrcData[3];
110112 bool* pMbCorrectlyDecodedFlag = pCtx->pCurDqLayer->pMbCorrectlyDecodedFlag;
111− int32_t iMbEcedNum = 0;
113+ pCtx->iMbEcedNum = 0;
112114 //Do slice copy late
113115 int32_t iMbXyIndex;
114116 uint8_t* pSrcData, *pDstData;
@@ -118,7 +120,7 @@ void DoErrorConSliceCopy (PWelsDecoderContext pCtx) { · 3 unmodified lines
118120 for (int32_t iMbX = 0; iMbX < iMbWidth; ++iMbX) {
119121 iMbXyIndex = iMbY * iMbWidth + iMbX;
120122 if (!pMbCorrectlyDecodedFlag[iMbXyIndex]) {
121− iMbEcedNum++;
123+ pCtx->iMbEcedNum++;
122124 if (pSrcPic != NULL) {
123125 iSrcStride = pSrcPic->iLinesize[0];
124126 //Y component
@@ -156,10 +158,6 @@ void DoErrorConSliceCopy (PWelsDecoderContext pCtx) { · 31 unmodified lines
156158 } //!pMbCorrectlyDecodedFlag[iMbXyIndex]
157159 } //iMbX
158160 } //iMbY
159−
160− if (!pCtx->bFreezeOutput)
161− pCtx->sDecoderStatistics.uiAvgEcRatio = (pCtx->sDecoderStatistics.uiAvgEcRatio * pCtx->sDecoderStatistics.uiEcFrameNum)
162− + ((iMbEcedNum * 100) / iMbNum) ;
163161 }
164162
165163 //Do error concealment using slice MV copy method
@@ -368,9 +366,9 @@ void DoErrorConSliceMVCopy (PWelsDecoderContext pCtx) { · 202 unmodified lines
368366 PPicture pDstPic = pCtx->pDec;
369367 PPicture pSrcPic = pCtx->pPreviousDecodedPictureInDpb;
370368
371− int32_t iMbNum = pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight;
369+ pCtx->iMbNum = pCtx->pSps->iMbWidth * pCtx->pSps->iMbHeight;
372370 bool* pMbCorrectlyDecodedFlag = pCtx->pCurDqLayer->pMbCorrectlyDecodedFlag;
373− int32_t iMbEcedNum = 0;
371+ pCtx->iMbEcedNum = 0;
374372 int32_t iMbXyIndex;
375373 uint8_t* pDstData;
376374 uint32_t iDstStride = pDstPic->iLinesize[0];
@@ -395,7 +393,7 @@ void DoErrorConSliceMVCopy (PWelsDecoderContext pCtx) { · 18 unmodified lines
395393 for (int32_t iMbX = 0; iMbX < iMbWidth; ++iMbX) {
396394 iMbXyIndex = iMbY * iMbWidth + iMbX;
397395 if (!pMbCorrectlyDecodedFlag[iMbXyIndex]) {
398− iMbEcedNum++;
396+ pCtx->iMbEcedNum++;
399397 if (pSrcPic != NULL) {
400398 DoMbECMvCopy (pCtx, pDstPic, pSrcPic, iMbXyIndex, iMbX, iMbY, &sMCRefMem);
401399 } else { //pSrcPic == NULL
@@ -422,10 +420,6 @@ void DoErrorConSliceMVCopy (PWelsDecoderContext pCtx) { · 20 unmodified lines
422420 } //!pMbCorrectlyDecodedFlag[iMbXyIndex]
423421 } //iMbX
424422 } //iMbY
425−
426− if (!pCtx->bFreezeOutput)
427− pCtx->sDecoderStatistics.uiAvgEcRatio = (pCtx->sDecoderStatistics.uiAvgEcRatio * pCtx->sDecoderStatistics.uiEcFrameNum)
428− + ((iMbEcedNum * 100) / iMbNum) ;
429423 }
430424
431425 //Mark erroneous frame as Ref Pic into DPB
codec/decoder/plus/src/welsDecoderExt.cpp+3−4
@@ -385,6 +385,8 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc, · 384 unmodified lines
385385 const int kiSrcLen,
386386 unsigned char** ppDst,
387387 SBufferInfo* pDstInfo) {
388+ m_pDecContext->iMbEcedNum = 0;
389+ m_pDecContext->iMbNum = 0;
388390 if (CheckBsBuffer (m_pDecContext, kiSrcLen)) {
389391 return dsOutOfMemory;
390392 }
@@ -464,10 +466,6 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc, · 73 unmodified lines
464466 if ((m_pDecContext->eErrorConMethod != ERROR_CON_DISABLE) && (pDstInfo->iBufferStatus == 1)) {
465467 //TODO after dec status updated
466468 m_pDecContext->iErrorCode |= dsDataErrorConcealed;
467− if (m_pDecContext->eErrorConMethod == ERROR_CON_FRAME_COPY)
468−
469− m_pDecContext->sDecoderStatistics.uiAvgEcRatio = (m_pDecContext->sDecoderStatistics.uiAvgEcRatio *
470− m_pDecContext->sDecoderStatistics.uiEcFrameNum) + 100;
471469
472470 //
473471 if ((m_pDecContext->sDecoderStatistics.uiWidth != (unsigned int) pDstInfo->UsrData.sSystemBuffer.iWidth)
@@ -482,6 +480,7 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc, · 8 unmodified lines
482480 ResetDecStatNums (&m_pDecContext->sDecoderStatistics);
483481 m_pDecContext->sDecoderStatistics.uiDecodedFrameCount++;
484482 }
483+ m_pDecContext->sDecoderStatistics.uiAvgEcRatio = m_pDecContext->iMbEcedNum == 0 ? (m_pDecContext->sDecoderStatistics.uiAvgEcRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) :((m_pDecContext->sDecoderStatistics.uiAvgEcRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) + ((m_pDecContext->iMbEcedNum * 100) / m_pDecContext->iMbNum));
485484 m_pDecContext->sDecoderStatistics.uiEcFrameNum++;
486485 m_pDecContext->sDecoderStatistics.uiAvgEcRatio = m_pDecContext->sDecoderStatistics.uiAvgEcRatio /
487486 m_pDecContext->sDecoderStatistics.uiEcFrameNum;

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