708 lines · 24.7 KB · C++
RawDownload
      }    }     if (m_pDecContext->bPrintFrameErrorTraceFlag) {      WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "decode failed, failure type:%d \n",               m_pDecContext->iErrorCode);      m_pDecContext->bPrintFrameErrorTraceFlag = false;    } else {      m_pDecContext->iIgnoredErrorInfoPacketCount ++;      if (m_pDecContext->iIgnoredErrorInfoPacketCount == INT_MAX) {        WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_WARNING, "continuous error reached INT_MAX! Restart as 0.");        m_pDecContext->iIgnoredErrorInfoPacketCount = 0;      }    }    if ((m_pDecContext->eErrorConMethod != ERROR_CON_DISABLE) && (pDstInfo->iBufferStatus == 1)) {      //TODO after dec status updated      m_pDecContext->iErrorCode |= dsDataErrorConcealed;       //      if ((m_pDecContext->sDecoderStatistics.uiWidth != (unsigned int) pDstInfo->UsrData.sSystemBuffer.iWidth)          || (m_pDecContext->sDecoderStatistics.uiHeight != (unsigned int) pDstInfo->UsrData.sSystemBuffer.iHeight)) {        m_pDecContext->sDecoderStatistics.uiResolutionChangeTimes++;        m_pDecContext->sDecoderStatistics.uiWidth = pDstInfo->UsrData.sSystemBuffer.iWidth;        m_pDecContext->sDecoderStatistics.uiHeight = pDstInfo->UsrData.sSystemBuffer.iHeight;       }      m_pDecContext->sDecoderStatistics.uiDecodedFrameCount++;      if (m_pDecContext->sDecoderStatistics.uiDecodedFrameCount == 0) { //exceed max value of uint32_t        ResetDecStatNums (&m_pDecContext->sDecoderStatistics);        m_pDecContext->sDecoderStatistics.uiDecodedFrameCount++;      }      int32_t iMbConcealedNum = m_pDecContext->iMbEcedNum + m_pDecContext->iMbEcedPropNum;      m_pDecContext->sDecoderStatistics.uiAvgEcRatio = m_pDecContext->iMbNum == 0 ?          (m_pDecContext->sDecoderStatistics.uiAvgEcRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) : ((                m_pDecContext->sDecoderStatistics.uiAvgEcRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) + ((                      iMbConcealedNum * 100) / m_pDecContext->iMbNum));      m_pDecContext->sDecoderStatistics.uiAvgEcPropRatio = m_pDecContext->iMbNum == 0 ?          (m_pDecContext->sDecoderStatistics.uiAvgEcPropRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) : ((                m_pDecContext->sDecoderStatistics.uiAvgEcPropRatio * m_pDecContext->sDecoderStatistics.uiEcFrameNum) + ((                      m_pDecContext->iMbEcedPropNum * 100) / m_pDecContext->iMbNum));      m_pDecContext->sDecoderStatistics.uiEcFrameNum += (iMbConcealedNum == 0 ? 0 : 1);      m_pDecContext->sDecoderStatistics.uiAvgEcRatio = m_pDecContext->sDecoderStatistics.uiEcFrameNum == 0 ? 0 :          m_pDecContext->sDecoderStatistics.uiAvgEcRatio / m_pDecContext->sDecoderStatistics.uiEcFrameNum;      m_pDecContext->sDecoderStatistics.uiAvgEcPropRatio = m_pDecContext->sDecoderStatistics.uiEcFrameNum == 0 ? 0 :          m_pDecContext->sDecoderStatistics.uiAvgEcPropRatio / m_pDecContext->sDecoderStatistics.uiEcFrameNum;    }    iEnd = WelsTime();    m_pDecContext->dDecTime += (iEnd - iStart) / 1e3;    return (DECODING_STATE) m_pDecContext->iErrorCode;  }  // else Error free, the current codec works well   if (pDstInfo->iBufferStatus == 1) {     m_pDecContext->sDecoderStatistics.uiDecodedFrameCount++;    if (m_pDecContext->sDecoderStatistics.uiDecodedFrameCount == 0) { //exceed max value of uint32_t      ResetDecStatNums (&m_pDecContext->sDecoderStatistics);      m_pDecContext->sDecoderStatistics.uiDecodedFrameCount++;    }     if ((m_pDecContext->sDecoderStatistics.uiWidth != (unsigned int) pDstInfo->UsrData.sSystemBuffer.iWidth)        || (m_pDecContext->sDecoderStatistics.uiHeight != (unsigned int) pDstInfo->UsrData.sSystemBuffer.iHeight)) {      m_pDecContext->sDecoderStatistics.uiResolutionChangeTimes++;      m_pDecContext->sDecoderStatistics.uiWidth = pDstInfo->UsrData.sSystemBuffer.iWidth;      m_pDecContext->sDecoderStatistics.uiHeight = pDstInfo->UsrData.sSystemBuffer.iHeight;    }  }  iEnd = WelsTime();  m_pDecContext->dDecTime += (iEnd - iStart) / 1e3;  return dsErrorFree;} DECODING_STATE CWelsDecoder::DecodeParser (const unsigned char* kpSrc,    const int kiSrcLen,    SParserBsInfo* pDstInfo) {  if (CheckBsBuffer (m_pDecContext, kiSrcLen)) {    return dsOutOfMemory;  }  if (kiSrcLen > 0 && kpSrc != NULL) {#ifdef OUTPUT_BITSTREAM    if (m_pFBS) {      WelsFwrite (kpSrc, sizeof (unsigned char), kiSrcLen, m_pFBS);      WelsFflush (m_pFBS);    }#endif//OUTPUT_BIT_STREAM    m_pDecContext->bEndOfStreamFlag = false;  } else {    //For application MODE, the error detection should be added for safe.    //But for CONSOLE MODE, when decoding LAST AU, kiSrcLen==0 && kpSrc==NULL.    m_pDecContext->bEndOfStreamFlag = true;    m_pDecContext->bInstantDecFlag = true;  }   m_pDecContext->iErrorCode = dsErrorFree; //initialize at the starting of AU decoding.  m_pDecContext->eErrorConMethod = ERROR_CON_DISABLE; //add protection to disable EC here.  if (!m_pDecContext->bFramePending) { //frame complete    m_pDecContext->pParserBsInfo->iNalNum = 0;    memset (m_pDecContext->pParserBsInfo->iNalLenInByte, 0, MAX_NAL_UNITS_IN_LAYER);  }  pDstInfo->iNalNum = 0;  pDstInfo->iSpsWidthInPixel = pDstInfo->iSpsHeightInPixel = 0;  if (pDstInfo) {    m_pDecContext->uiTimeStamp = pDstInfo->uiInBsTimeStamp;    pDstInfo->uiOutBsTimeStamp = 0;  } else {    m_pDecContext->uiTimeStamp = 0;  }  WelsDecodeBs (m_pDecContext, kpSrc, kiSrcLen, NULL, NULL, pDstInfo);  if (!m_pDecContext->bFramePending && m_pDecContext->pParserBsInfo->iNalNum) {    memcpy (pDstInfo, m_pDecContext->pParserBsInfo, sizeof (SParserBsInfo));  }   m_pDecContext->bInstantDecFlag = false; //reset no-delay flag   return (DECODING_STATE) m_pDecContext->iErrorCode;} DECODING_STATE CWelsDecoder::DecodeFrame (const unsigned char* kpSrc,    const int kiSrcLen,    unsigned char** ppDst,    int* pStride,    int& iWidth,    int& iHeight) {  DECODING_STATE eDecState = dsErrorFree;  SBufferInfo    DstInfo;   memset (&DstInfo, 0, sizeof (SBufferInfo));  DstInfo.UsrData.sSystemBuffer.iStride[0] = pStride[0];  DstInfo.UsrData.sSystemBuffer.iStride[1] = pStride[1];  DstInfo.UsrData.sSystemBuffer.iWidth = iWidth;  DstInfo.UsrData.sSystemBuffer.iHeight = iHeight;   eDecState = DecodeFrame2 (kpSrc, kiSrcLen, ppDst, &DstInfo);  if (eDecState == dsErrorFree) {    pStride[0] = DstInfo.UsrData.sSystemBuffer.iStride[0];    pStride[1] = DstInfo.UsrData.sSystemBuffer.iStride[1];    iWidth     = DstInfo.UsrData.sSystemBuffer.iWidth;    iHeight    = DstInfo.UsrData.sSystemBuffer.iHeight;  }   return eDecState;} DECODING_STATE CWelsDecoder::DecodeFrameEx (const unsigned char* kpSrc,    const int kiSrcLen,    unsigned char* pDst,    int iDstStride,    int& iDstLen,    int& iWidth,    int& iHeight,    int& iColorFormat) {  DECODING_STATE state = dsErrorFree;   return state;}  } // namespace WelsDec  using namespace WelsDec;/**       WelsGetDecoderCapability*       @return: DecCapability information*/int WelsGetDecoderCapability (SDecoderCapability* pDecCapability) {  memset (pDecCapability, 0, sizeof (SDecoderCapability));  pDecCapability->iProfileIdc = 66; //Baseline  pDecCapability->iProfileIop = 0xE0; //11100000b  pDecCapability->iLevelIdc = 32; //level_idc = 3.2  pDecCapability->iMaxMbps = 216000; //from level_idc = 3.2  pDecCapability->iMaxFs = 5120; //from level_idc = 3.2  pDecCapability->iMaxCpb = 20000; //from level_idc = 3.2  pDecCapability->iMaxDpb = 20480; //from level_idc = 3.2  pDecCapability->iMaxBr = 20000; //from level_idc = 3.2  pDecCapability->bRedPicCap = 0; //not support redundant pic   return ERR_NONE;}/* WINAPI is indeed in prefix due to sync to application layer callings!! */ /**   WelsCreateDecoder*   @return:    success in return 0, otherwise failed.*/long WelsCreateDecoder (ISVCDecoder** ppDecoder) {   if (NULL == ppDecoder) {    return ERR_INVALID_PARAMETERS;  }   *ppDecoder = new CWelsDecoder();   if (NULL == *ppDecoder) {    return ERR_MALLOC_FAILED;  }   return ERR_NONE;} /**   WelsDestroyDecoder*/void WelsDestroyDecoder (ISVCDecoder* pDecoder) {  if (NULL != pDecoder) {    delete (CWelsDecoder*)pDecoder;  }}

Lines 501–708 of 708. Previous lines

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