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

📄 h264avcencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                                  PicType       ePicType,
                                  UInt				  uiTemporalId )
{
  ROF ( uiBaseLayerId < MAX_LAYERS );

  RNOK( m_apcLayerEncoder[uiBaseLayerId]->getBaseLayerData( rcELSH,
                                                            pcFrame, 
                                                            pcResidual, 
                                                            pcMbDataCtrl,
                                                            pcMbDataCtrlEL,
                                                            bSpatialScalability, 
                                                            bMotion,
                                                            ePicType,
                                                            uiTemporalId ) );

  pcMbDataCtrlEL = pcMbDataCtrl;
  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::getBaseLayerResidual( Frame*&      pcResidual,
                                      UInt            uiBaseLayerId)
{
  pcResidual = m_apcLayerEncoder[uiBaseLayerId]->getBaseLayerResidual();  
  return Err::m_nOK;
}


UInt
H264AVCEncoder::getNewBits( UInt uiBaseLayerId )
{
  ROFRS( uiBaseLayerId < MAX_LAYERS, 0 );
  return m_apcLayerEncoder[uiBaseLayerId]->getNewBits();
}


ErrVal
H264AVCEncoder::init( LayerEncoder*     apcLayerEncoder[MAX_LAYERS],
                      ParameterSetMng*  pcParameterSetMng,
                      PocCalculator*    pcPocCalculator,
                      NalUnitEncoder*   pcNalUnitEncoder,
                      ControlMngIf*     pcControlMng,
                      CodingParameter*  pcCodingParameter,
                      // JVT-V068 {
                      StatBuf<Scheduler*, MAX_SCALABLE_LAYERS>* apcScheduler 
                      // JVT-V068 }
                      )
{
  ROT( NULL == apcLayerEncoder );
  ROT( NULL == pcParameterSetMng );
  ROT( NULL == pcPocCalculator );
  ROT( NULL == pcNalUnitEncoder );
  ROT( NULL == pcControlMng );
  ROT( NULL == pcCodingParameter );

  m_pcParameterSetMng = pcParameterSetMng;
  m_pcPocCalculator   = pcPocCalculator;
  m_pcNalUnitEncoder  = pcNalUnitEncoder;
  m_pcControlMng      = pcControlMng;
  m_pcCodingParameter = pcCodingParameter;

  // JVT-V068 {
  m_apcScheduler = apcScheduler;
  m_apcScheduler->setAll( 0 );
  // JVT-V068 }

  UInt uiLayer;
  for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
  {
    ROT( NULL == apcLayerEncoder[uiLayer] );
    m_apcLayerEncoder[uiLayer] = apcLayerEncoder[uiLayer];
  }
  for( ; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    m_apcLayerEncoder[uiLayer] = 0;
  }

  m_cAccessUnitDataList.clear();

  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::uninit()
{
  m_cUnWrittenSPS.clear();
  m_cUnWrittenPPS.clear();
  m_pcParameterSetMng           = NULL;
  m_pcPocCalculator             = NULL;
  m_pcNalUnitEncoder            = NULL;
  m_pcControlMng                = NULL;
  m_pcCodingParameter           = NULL;
  m_bInitDone                   = false;
  m_bVeryFirstCall              = true;
  m_bScalableSeiMessage         = true;
  m_bTraceEnable                = false;  

  for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    m_apcLayerEncoder    [uiLayer] = NULL;
    m_acOrgPicBufferList[uiLayer]   .clear();
    m_acRecPicBufferList[uiLayer]   .clear();
  }

  m_cAccessUnitDataList.clear();

  return Err::m_nOK;
}

// JVT-T073 {
ErrVal H264AVCEncoder::writeNestingSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor ) 
{
  SEI::ScalableNestingSei* pcScalableNestingSei;
  RNOK( SEI::ScalableNestingSei::create(pcScalableNestingSei) );

  //===== set message =====
  //may be changed here
  Bool bAllPicturesInAuFlag = 0;
    pcScalableNestingSei->setAllPicturesInAuFlag( bAllPicturesInAuFlag );
  if( bAllPicturesInAuFlag  == 0 )
  {
    UInt uiNumPictures;

    // assign value, may be changed here
    uiNumPictures = 1;
    ROT( uiNumPictures == 0 );
    UInt *uiDependencyId = new UInt[uiNumPictures];
    UInt *uiQualityLevel = new UInt[uiNumPictures];
    UInt uiTemporalId = 0;
    uiDependencyId[0] = 0;
    uiQualityLevel[0] = 0;

    pcScalableNestingSei->setNumPictures( uiNumPictures );
    for( UInt uiIndex = 0; uiIndex < uiNumPictures; uiIndex++ )
    {
      pcScalableNestingSei->setDependencyId( uiIndex, uiDependencyId[uiIndex] );
      pcScalableNestingSei->setQualityLevel( uiIndex, uiQualityLevel[uiIndex] );
    }
    pcScalableNestingSei->setTemporalId( uiTemporalId );
    delete uiDependencyId;
    delete uiQualityLevel;
  }
  //deal with the following SEI message in nesting SEI message
  //may be changed here, here take scene_info_sei as an example
  SEI::SceneInfoSei *pcSceneInfoSEI;
  RNOK( SEI::SceneInfoSei::create( pcSceneInfoSEI ) );

  UInt              uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  cSEIMessageList.push_back                 ( pcScalableNestingSei );
  cSEIMessageList.push_back                 ( pcSceneInfoSEI );
  RNOK ( m_pcNalUnitEncoder->initNalUnit    ( pcExtBinDataAccessor ) );
  RNOK ( m_pcNalUnitEncoder->writeNesting   ( cSEIMessageList ) );
  RNOK ( m_pcNalUnitEncoder->closeNalUnit   ( uiBits ) );
  RNOK( m_apcLayerEncoder[0]->addParameterSetBits ( uiBits+4*8 ) );

  RNOK( pcSceneInfoSEI->destroy() );
  RNOK( pcScalableNestingSei->destroy() );
  return Err::m_nOK;
}
// JVT-T073 }

ErrVal
H264AVCEncoder::xWriteScalableSEI( ExtBinDataAccessor* pcExtBinDataAccessor )
{
  //===== create message =====
  SEI::ScalableSei* pcScalableSEI;
  RNOK(SEI::ScalableSei::create(pcScalableSEI) );


  //===== set message =====
  UInt j = 0; //JVT-S036 lsj
  UInt i = 0;
  UInt uiInputLayers = m_pcCodingParameter->getNumberOfLayers ();
  UInt uiLayerNum = 0;	//total scalable layer numbers
  for ( i = 0; i < uiInputLayers; i++ )	//calculate total scalable layer numbers
  {
//bug-fix suffix{{
    //Bool bH264AVCCompatible = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
    //Bool bH264AVCCompatible = ( i == 0 );
//bug-fix suffix}}
    //Bool bSubSeq            = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 1 );

    LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( i );
    UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedStages    ();
// *LMH(20060203): Fix Bug due to underflow (Replace)
    //UInt uiMinTempLevel   = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max( 0, uiTotalTempLevel - 1 );
    UInt uiMinTempLevel   = 0; //bugfix replace
    UInt uiActTempLevel   = uiTotalTempLevel - uiMinTempLevel + 1;
    uiLayerNum += uiActTempLevel * rcLayer.getNumberOfQualityLevelsCGSSNR();

    pcScalableSEI->setROINum ( i, rcLayer.getNumROI() );
    pcScalableSEI->setROIID  ( i, rcLayer.getROIID() );
    pcScalableSEI->setSGID  ( i, rcLayer.getSGID() );
    pcScalableSEI->setSLID  ( i, rcLayer.getSLID() );
  }

  UInt uiNumLayersMinus1 = uiLayerNum - 1;
  pcScalableSEI->setNumLayersMinus1 ( uiNumLayersMinus1 );

  UInt uiNumScalableLayer = 0;
  for ( UInt uiCurrLayer = 0; uiCurrLayer < uiInputLayers; uiCurrLayer++)
  {
    LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( uiCurrLayer );
    UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedStages    () + 1;
    UInt uiTotalFGSLevel = rcLayer.getNumberOfQualityLevelsCGSSNR();
    UInt uiMinTempLevel     = 0; //bugfix replace

    for ( UInt uiCurrTempLevel = 0; uiCurrTempLevel < uiTotalTempLevel; uiCurrTempLevel++ )
    {
      for ( UInt uiCurrFGSLevel = 0; uiCurrFGSLevel < uiTotalFGSLevel; uiCurrFGSLevel++ )
      {
        if( uiCurrTempLevel >= uiMinTempLevel )
        {
          //Bool bSubPicLayerFlag = false;
          Bool bSubRegionLayerFlag = false;
          Bool bProfileLevelInfoPresentFlag = false;
          //Bool bInitParameterSetsInfoPresentFlag = false;		//may be changed  //JVT-S036 lsj//SEI changes update
          Bool bParameterSetsInfoPresentFlag = false;		//may be changed  //JVT-S036 lsj//SEI changes update
					if( uiNumScalableLayer == 0 )
          {//JVT-S036 lsj
            bSubRegionLayerFlag = true;
            bProfileLevelInfoPresentFlag = true;
            //bInitParameterSetsInfoPresentFlag = true;	//SEI changes update
            bParameterSetsInfoPresentFlag = true;	//SEI changes update
          }
          Bool bBitrateInfoPresentFlag = true;
          Bool bFrmRateInfoPresentFlag = true;//rcLayer.getInputFrameRate () > 0;
          Bool bFrmSizeInfoPresentFlag = true;
// BUG_FIX liuhui{
          Bool bLayerDependencyInfoPresentFlag = true;			//may be changed
// BUG_FIX liuhui}
          Bool bExactInterayerPredFlag = true;			//JVT-S036 lsj may be changed
          pcScalableSEI->setLayerId(uiNumScalableLayer, uiNumScalableLayer);

          UInt uiTempLevel = uiCurrTempLevel; //BUG_FIX_FT_01_2006
          UInt uiDependencyID = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? rcLayer.getLayerCGSSNR() : uiCurrLayer);
          UInt uiQualityLevel = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? rcLayer.getQualityLevelCGSSNR() + uiCurrFGSLevel : uiCurrFGSLevel);
          m_aaauiScalableLayerId[uiDependencyID][uiCurrTempLevel][uiQualityLevel] = uiNumScalableLayer;
      
          //UInt uiSimplePriorityId = 0;//SEI changes update
					UInt uiPriorityId = 0;//SEI changes update
          Bool bDiscardableFlag  = false;
          if( uiCurrFGSLevel > 0 || rcLayer.isDiscardable() ) // bugfix replace
            bDiscardableFlag = true;
          //pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);//SEI update
          pcScalableSEI->setPriorityId(uiNumScalableLayer, uiPriorityId);//SEI update
          pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, bDiscardableFlag);
          pcScalableSEI->setTemporalId(uiNumScalableLayer, uiTempLevel);
          pcScalableSEI->setDependencyId(uiNumScalableLayer, uiDependencyID);
          pcScalableSEI->setQualityLevel(uiNumScalableLayer, uiQualityLevel);				
   //JVT-S036 lsj end
          pcScalableSEI->setSubRegionLayerFlag(uiNumScalableLayer, bSubRegionLayerFlag);
          // JVT-S054 (REPLACE)
          //pcScalableSEI->setIroiSliceDivisionInfoPresentFlag(uiNumScalableLayer, bIroiSliceDivisionFlag); //JVT-S036 lsj
          pcScalableSEI->setIroiSliceDivisionInfoPresentFlag(uiNumScalableLayer, rcLayer.m_bSliceDivisionFlag);
          pcScalableSEI->setProfileLevelInfoPresentFlag(uiNumScalableLayer, bProfileLevelInfoPresentFlag);
          pcScalableSEI->setBitrateInfoPresentFlag(uiNumScalableLayer, bBitrateInfoPresentFlag);
          pcScalableSEI->setFrmRateInfoPresentFlag(uiNumScalableLayer, bFrmRateInfoPresentFlag);
          pcScalableSEI->setFrmSizeInfoPresentFlag(uiNumScalableLayer, bFrmSizeInfoPresentFlag);
          pcScalableSEI->setLayerDependencyInfoPresentFlag(uiNumScalableLayer, bLayerDependencyInfoPresentFlag);
          //pcScalableSEI->setInitParameterSetsInfoPresentFlag(uiNumScalableLayer, bInitParameterSetsInfoPresentFlag);//SEI changes update
          pcScalableSEI->setParameterSetsInfoPresentFlag(uiNumScalableLayer, bParameterSetsInfoPresentFlag);//SEI changes update

          pcScalableSEI->setExactInterlayerPredFlag(uiNumScalableLayer, bExactInterayerPredFlag);//JVT-S036 lsj
          //JVT-W046 {
          //pcScalableSEI->setAvcLayerConversionFlag(uiNumScalableLayer, 0); //default: 0, could be changed
					pcScalableSEI->setLayerConversionFlag(uiNumScalableLayer, 0); //default: 0, could be changed SEI changes update
          //JVT-W046 }
          //JVT-W047
          if(m_apcLayerEncoder[0]->m_bOutputFlag)
            pcScalableSEI->setLayerOutputFlag(uiNumScalableLayer,true);
          else
            pcScalableSEI->setLayerOutputFlag(uiNumScalableLayer,false);
          //JVT-W047

          if(pcScalableSEI->getProfileLevelInfoPresentFlag(uiNumScalableLayer))
          {
            UInt uilayerProfileIdc = 0;	//may be changed
            Bool bLayerConstraintSet0Flag = false;	//may be changed
//bug-fix suffix{{
//					  Bool bH264AVCCompatibleTmp  = m_pcCodingParameter->getBaseLayerMode() > 0 && uiCurrLayer == 0;
            Bool bH264AVCCompatibleTmp  = ( uiCurrLayer == 0 );
//bug-fix suffix}}
            Bool bLayerConstraintSet1Flag = ( bH264AVCCompatibleTmp ? 1 : 0 );	//may be changed
            Bool bLayerConstraintSet2Flag = false;	//may be changed
            Bool bLayerConstraintSet3Flag = false;	//may be changed
            UInt uiLayerLevelIdc = 0;		//may be changed
            //JVT-W051 {
            uilayerProfileIdc = m_uiProfileIdc[uiCurrLayer];
            uiLayerLevelIdc = m_uiLevelIdc[uiCurrLayer];
            bLayerConstraintSet0Flag = m_bConstraint0Flag[uiCurrLayer];
            bLayerConstraintSet1Flag = m_bConstraint1Flag[uiCurrLayer];
            bLayerConstraintSet2Flag = m_bConstraint2Flag[uiCurrLayer];
            bLayerConstraintSet3Flag = m_bConstraint3Flag[uiCurrLayer];

⌨️ 快捷键说明

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