⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h264avcencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:

    m_cUnWrittenSPS.pop_front();
  }
  else
  {
    if( ! m_cUnWrittenPPS.empty() )
    {
      RNOK( m_pcNalUnitEncoder->initNalUnit( pcExtBinDataAccessor ) );
      PictureParameterSet& rcPPS = *m_cUnWrittenPPS.front();
      RNOK( m_pcNalUnitEncoder->write( rcPPS ) )
      RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );

      if( m_pcCodingParameter->getNumberOfLayers() )
      {
        UInt  uiSPSId = rcPPS.getSeqParameterSetId();
        SequenceParameterSet* pcSPS;
        RNOK( m_pcParameterSetMng->get( pcSPS, uiSPSId, rcPPS.referencesSubsetSPS() ) );

        UInt  uiLayer = pcSPS->getDependencyId();
        UInt  uiSize  = pcExtBinDataAccessor->size();
        RNOK( m_apcLayerEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
      }
      
      m_cUnWrittenPPS.pop_front();
    }
    else
    {
      AF();
      rbMoreSets = false;
      return Err::m_nERR;
    }
  }

  rbMoreSets = !(m_cUnWrittenSPS.empty() && m_cUnWrittenPPS.empty());
  return Err::m_nOK;
}



ErrVal
H264AVCEncoder::process( ExtBinDataAccessorList&  rcExtBinDataAccessorList,
                         PicBuffer*               apcOriginalPicBuffer    [MAX_LAYERS],
                         PicBuffer*               apcReconstructPicBuffer [MAX_LAYERS],
                         PicBufferList*           apcPicBufferOutputList,
                         PicBufferList*           apcPicBufferUnusedList )
{
  UInt  uiHighestLayer  = m_pcCodingParameter->getNumberOfLayers() - 1;
  UInt  uiTargetSize    = ( 1 << m_pcCodingParameter->getLayerParameters(uiHighestLayer).getDecompositionStages() ) + ( m_apcLayerEncoder[uiHighestLayer]->firstGOPCoded() ? 0 : 1 );

  //===== fill lists =====
  for( UInt uiLayer = 0; uiLayer <= uiHighestLayer; uiLayer++ )
  {
    if( apcOriginalPicBuffer[ uiLayer ] )
    {
      ROF( apcReconstructPicBuffer[ uiLayer ] );
      m_acOrgPicBufferList  [ uiLayer ].push_back( apcOriginalPicBuffer   [ uiLayer ] );
      m_acRecPicBufferList  [ uiLayer ].push_back( apcReconstructPicBuffer[ uiLayer ] );
    }
    else if( apcReconstructPicBuffer[ uiLayer ] )
    {
      apcPicBufferUnusedList[ uiLayer ].push_back( apcReconstructPicBuffer[ uiLayer ] );
    }
  }

  //===== encoding of GOP =====
  ROT( m_acOrgPicBufferList[uiHighestLayer].size() >  uiTargetSize );
  if ( m_acOrgPicBufferList[uiHighestLayer].size() == uiTargetSize )
  {
    RNOK( xProcessGOP( apcPicBufferOutputList, apcPicBufferUnusedList ) );
  }

  //===== update data accessor list =====
  m_cAccessUnitDataList.emptyNALULists( rcExtBinDataAccessorList );

  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::finish( ExtBinDataAccessorList&  rcExtBinDataAccessorList,
                        PicBufferList*           apcPicBufferOutputList,
                        PicBufferList*           apcPicBufferUnusedList,
                        UInt&                    ruiNumCodedFrames,
                        Double&                  rdHighestLayerOutputRate )
{
  //===== encode GOP =====
  RNOK( xProcessGOP( apcPicBufferOutputList, apcPicBufferUnusedList ) );

  //===== update data accessor list =====
  m_cAccessUnitDataList.emptyNALULists( rcExtBinDataAccessorList );

  //===== finish encoding =====
  if( m_pcCodingParameter->getCGSSNRRefinement() == 1 )
  {
    for( UInt uiLayer = 1; uiLayer <= m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
    {
      if( uiLayer == m_pcCodingParameter->getNumberOfLayers() || m_apcLayerEncoder[uiLayer]->getQualityLevelCGSSNR() == 0 ) //last layer is highest quality layer
      {
        RNOK( m_apcLayerEncoder[uiLayer-1]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate, m_aaadFinalFramerate, m_aaadSeqBits ) );
        UInt uiLayerCGSSNR = m_apcLayerEncoder[uiLayer-1]->getLayerCGSSNR();
        m_adAvgBitrate[uiLayerCGSSNR] = m_apcLayerEncoder[uiLayer-1]->m_dAvgBitrate;
      }
    }
  }
  else
  {
    for( UInt uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
    {
      RNOK( m_apcLayerEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate, m_aaadFinalFramerate, m_aaadSeqBits ) );
      //JVT-W051 {
      m_adAvgBitrate[uiLayer] = m_apcLayerEncoder[uiLayer]->m_dAvgBitrate;
      //JVT-W051 }
    }
  }
  printf("\n");

  return Err::m_nOK;
}

//JVT-W051 {
ErrVal 
H264AVCEncoder::xCalMaxBitrate(UInt uiLayer)
{	
  //UInt uiDecompositionStages = m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages();
  UInt uiCurrIdx = 0;
  UInt uiTimeWindowSize =  (UInt)(m_pcCodingParameter->getLayerParameters(uiLayer).m_dOutputFrameRate+0.5);
  UInt uiFrameNumInGOP = m_uiFrameNumInGOP[uiLayer];
  UInt uiBaseLayerId = m_pcCodingParameter->getLayerParameters(uiLayer).getBaseLayerId();
  UInt uiBaseQualityLevel = m_pcCodingParameter->getLayerParameters(uiLayer).getBaseQualityLevel();
  if ( uiBaseQualityLevel > 3 )
  {
    uiBaseQualityLevel = 3;
  }
  for ( uiCurrIdx = 0; uiCurrIdx < uiFrameNumInGOP; uiCurrIdx++ )
  {
    if ( uiLayer )
    {
      m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][0] += m_aaadFrameInGOPBits[uiCurrIdx][uiBaseLayerId][uiBaseQualityLevel];
    }

    for ( UInt uiFGSLayer = 1; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
    {
      m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer] += m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer-1];
    }
  }
  if ( ( m_uiCodeFrameNum[uiLayer] - uiFrameNumInGOP ) < uiTimeWindowSize )
  {
    for ( uiCurrIdx = 0; (uiCurrIdx < uiFrameNumInGOP) && (m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx < uiTimeWindowSize); uiCurrIdx ++ )
    {
      for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
      {
        m_aaadFrameInTimeWindowBits[m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx][uiLayer][uiFGSLayer] = 
          m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer];
      }
    }
    //add
    for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
    {
      m_aadMaxBitrate[uiLayer][uiFGSLayer] = 0;
      for ( UInt i = 0; i < uiTimeWindowSize; i++ )
      {
        m_aadMaxBitrate[uiLayer][uiFGSLayer] += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
      }
      m_aadMaxBitrate[uiLayer][uiFGSLayer] = m_aadMaxBitrate[uiLayer][uiFGSLayer]*uiTimeWindowSize/(m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx);
    }
    //add

    if ((uiCurrIdx < uiFrameNumInGOP) || (m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx == uiTimeWindowSize))
    {
      for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
      {
        m_aadMaxBitrate[uiLayer][uiFGSLayer] = 0;
        for ( UInt i = 0; i < uiTimeWindowSize; i++ )
        {
          m_aadMaxBitrate[uiLayer][uiFGSLayer] += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
        }
        //m_aadMaxBitrate[uiLayer][uiFGSLayer] = m_aadMaxBitrate[uiLayer][uiFGSLayer];
      }
      for ( UInt uiCurrAUIdx = uiCurrIdx; uiCurrAUIdx < uiFrameNumInGOP; uiCurrAUIdx++ )
      {
        for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
        {
          UInt i = 0;
          for (i = 0; i < uiTimeWindowSize-1; i++)
          {
            m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer] = m_aaadFrameInTimeWindowBits[i+1][uiLayer][uiFGSLayer];
          }
          m_aaadFrameInTimeWindowBits[uiTimeWindowSize-1][uiLayer][uiFGSLayer] = m_aaadFrameInGOPBits[uiCurrAUIdx][uiLayer][uiFGSLayer];
          Double dTmpMaxBitrate = 0;
          for (i = 0; i < uiTimeWindowSize; i++)
          {
            dTmpMaxBitrate += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
          }
          dTmpMaxBitrate = dTmpMaxBitrate;
          if (dTmpMaxBitrate > m_aadMaxBitrate[uiLayer][uiFGSLayer])
          {
            m_aadMaxBitrate[uiLayer][uiFGSLayer] = dTmpMaxBitrate;
          }
        }				
      }
    }
  }
  else
  {
    for ( uiCurrIdx = 0; uiCurrIdx < uiFrameNumInGOP; uiCurrIdx ++ )
    {
      for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
      {
        UInt i = 0;
        for (i = 0; i < uiTimeWindowSize-1; i++)
        {
          m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer] = m_aaadFrameInTimeWindowBits[i+1][uiLayer][uiFGSLayer];
        }
        m_aaadFrameInTimeWindowBits[uiTimeWindowSize-1][uiLayer][uiFGSLayer] = m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer];
        Double dTmpMaxBitrate = 0;
        for (i = 0; i < uiTimeWindowSize; i++)
        {
          dTmpMaxBitrate += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
        }
        dTmpMaxBitrate = dTmpMaxBitrate;
        if (dTmpMaxBitrate > m_aadMaxBitrate[uiLayer][uiFGSLayer])
        {
          m_aadMaxBitrate[uiLayer][uiFGSLayer] = dTmpMaxBitrate;
        }
      }
    }

  }
  return Err::m_nOK;
}
//JVT-W051 }

ErrVal
H264AVCEncoder::xProcessGOP( PicBufferList* apcPicBufferOutputList,
                             PicBufferList* apcPicBufferUnusedList )
{
  UInt uiAUIndex, uiLayer; 

  //===== init GOP =====
  for( uiLayer = 0; uiLayer <  m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
  {
    m_apcLayerEncoder[uiLayer]->setLayerCGSSNR           ( m_pcCodingParameter->getLayerParameters( uiLayer ).getLayerCGSSNR           () );
    m_apcLayerEncoder[uiLayer]->setQualityLevelCGSSNR    ( m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR    () );
    m_apcLayerEncoder[uiLayer]->setBaseLayerCGSSNR       ( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseLayerCGSSNR       () );
    m_apcLayerEncoder[uiLayer]->setBaseQualityLevelCGSSNR( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseQualityLevelCGSSNR() );

    RNOK( m_apcLayerEncoder[uiLayer]->initGOP( m_cAccessUnitDataList.getAccessUnitData( MSYS_UINT_MAX ), m_acOrgPicBufferList[uiLayer] ) );
  }

  //JVT-W052
  if(m_pcCodingParameter->getIntegrityCheckSEIEnable() && m_pcCodingParameter->getCGSSNRRefinement())
  {
    for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
    {
      m_uiNumofCGS[m_apcLayerEncoder[uiLayer]->getLayerCGSSNR()] = m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR() + m_pcCodingParameter->getLayerParameters( uiLayer ).getNumberOfQualityLevelsCGSSNR() - 1;
      m_uicrcVal  [m_apcLayerEncoder[uiLayer]->getLayerCGSSNR()] = 0xffff;
    }
  }
  //JVT-W052

  //===== loop over access units in GOP, and layers inside access units =====
  for( uiAUIndex = 0; uiAUIndex <= 64; uiAUIndex++ )
  {																																									//JVT-W052
    if(m_pcCodingParameter->getIntegrityCheckSEIEnable() && m_pcCodingParameter->getCGSSNRRefinement())//JVT-W052
      RNOK( SEI::IntegrityCheckSEI::create( m_pcIntegrityCheckSEI ) );							//JVT-W052
    for( uiLayer   = 0; uiLayer   <  m_pcCodingParameter->getNumberOfLayers(); uiLayer  ++ )
    {
      if( m_pcCodingParameter->getNonRequiredEnable() )
      {
        if( uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1 )   m_apcLayerEncoder[ uiLayer ]->setNonRequiredWrite( 2 );
        else                                                            m_apcLayerEncoder[ uiLayer ]->setNonRequiredWrite( 1 );
      }
      //JVT-W051 {
      m_bIsFirstGOP = false;
      if ( m_apcLayerEncoder[uiLayer]->firstGOPCoded() == false )
      {
        m_bIsFirstGOP = true;
      }
      //JVT-W051 }
      RNOK( m_apcLayerEncoder[uiLayer]->process( uiAUIndex,
                                                m_cAccessUnitDataList.getAccessUnitData( uiAUIndex ),
                                                m_acOrgPicBufferList  [uiLayer],
                                                m_acRecPicBufferList  [uiLayer],
                                                apcPicBufferUnusedList[uiLayer],
                                                m_pcParameterSetMng ) );
      //JVT-W051 {
      m_aaadFrameInGOPBits[uiAUIndex][uiLayer][0] = m_apcLayerEncoder[uiLayer]->m_dFrameBits;
      if ( uiLayer == 0 && uiAUIndex == 0 )
      {
        m_aaadFrameInGOPBits[uiAUIndex][uiLayer][0] += (Double)m_apcLayerEncoder[uiLayer]->xGetParameterSetBits();
      }
      if ( m_bIsFirstGOP )
      {			
        m_uiProfileIdc[uiLayer] = m_apcLayerEncoder[uiLayer]->m_uiProfileIdc;
        m_uiLevelIdc[uiLayer] = m_apcLayerEncoder[uiLayer]->m_uiLevelIdc;
        m_bConstraint0Flag[uiLayer] = m_apcLayerEn

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -