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

📄 h264avcencoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  //    pcScalableSEI->setQlNumMinus1(i, 0);

  //    for (j=0; j <= pcScalableSEI->getQlNumMinus1(i); j++)
  //    {
  //      UInt uiQlId = j;//could be changed
  //      pcScalableSEI->setQlId(i,j,uiQlId);
  //      Int32 uilayerProfileLevelIdc = 0;
  //      {
  //        UInt uilayerProfileIdc = m_uiProfileIdc[uiQlDependencyId];
  //        UInt uiLayerLevelIdc = m_uiLevelIdc[uiQlDependencyId];
  //        Bool bLayerConstraintSet0Flag = m_bConstraint0Flag[uiQlDependencyId];
  //        Bool bLayerConstraintSet1Flag = m_bConstraint1Flag[uiQlDependencyId];
  //        Bool bLayerConstraintSet2Flag = m_bConstraint2Flag[uiQlDependencyId];
  //        Bool bLayerConstraintSet3Flag = m_bConstraint3Flag[uiQlDependencyId];					
  //        uilayerProfileLevelIdc += uilayerProfileIdc;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
  //        uilayerProfileLevelIdc += bLayerConstraintSet0Flag;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
  //        uilayerProfileLevelIdc += bLayerConstraintSet1Flag;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
  //        uilayerProfileLevelIdc += bLayerConstraintSet2Flag;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
  //        uilayerProfileLevelIdc += bLayerConstraintSet3Flag;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 4;
  //        uilayerProfileLevelIdc = uilayerProfileLevelIdc << 8;
  //        uilayerProfileLevelIdc += uiLayerLevelIdc;
  //      }
  //      pcScalableSEI->setQlProfileLevelIdx(i,j,uilayerProfileLevelIdc);


  //      pcScalableSEI->setQlAvgBitrate(i,j,(UInt)(m_adAvgBitrate[uiQlDependencyId]+0.5));
  //      pcScalableSEI->setQlMaxBitrate(i,j,(UInt)(m_aadMaxBitrate[uiQlDependencyId][uiQlId]+0.5));
  //    }
  //  }
  //}
  //JVT-W051 }
  pcScalableSEI->setPriorityLayerInfoPresentFlag(true);
  if ( pcScalableSEI->getPriorityLayerInfoPresentFlag() ) 
  {
    UInt uiPrNumdIdMinus1 = m_pcCodingParameter->getNumberOfLayers ()-1;
    pcScalableSEI->setPrNumdIdMinus1( uiPrNumdIdMinus1 );
    for ( i=0; i <= pcScalableSEI->getPrNumdIdMinus1(); i++ )
    {
      UInt uiPrDependencyId = i;//could be changed
      pcScalableSEI->setPrDependencyId(i, uiPrDependencyId);
      pcScalableSEI->setPrNumMinus1(i, 0);

      for (j=0; j <= pcScalableSEI->getPrNumMinus1(i); j++)
      {
        UInt uiPrId = j;//could be changed
        pcScalableSEI->setPrId(i,j,uiPrId);
        Int32 uilayerProfileLevelIdc = 0;
        {
          UInt uilayerProfileIdc = m_uiProfileIdc[uiPrDependencyId];
          UInt uiLayerLevelIdc = m_uiLevelIdc[uiPrDependencyId];
          Bool bLayerConstraintSet0Flag = m_bConstraint0Flag[uiPrDependencyId];
          Bool bLayerConstraintSet1Flag = m_bConstraint1Flag[uiPrDependencyId];
          Bool bLayerConstraintSet2Flag = m_bConstraint2Flag[uiPrDependencyId];
          Bool bLayerConstraintSet3Flag = m_bConstraint3Flag[uiPrDependencyId];					
          uilayerProfileLevelIdc += uilayerProfileIdc;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
          uilayerProfileLevelIdc += bLayerConstraintSet0Flag;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
          uilayerProfileLevelIdc += bLayerConstraintSet1Flag;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
          uilayerProfileLevelIdc += bLayerConstraintSet2Flag;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
          uilayerProfileLevelIdc += bLayerConstraintSet3Flag;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 4;
          uilayerProfileLevelIdc = uilayerProfileLevelIdc << 8;
          uilayerProfileLevelIdc += uiLayerLevelIdc;
        }
        pcScalableSEI->setPrProfileLevelIdx(i,j,uilayerProfileLevelIdc);


        pcScalableSEI->setPrAvgBitrateBPS(i,j,m_adAvgBitrate[uiPrDependencyId]);
        pcScalableSEI->setPrMaxBitrateBPS(i,j,m_aadMaxBitrate[uiPrDependencyId][uiPrId]);
      }
    }
  }
  //SEI changes update }
  //JVT-W053
  const char *ucTemp = "http://svc.com";
  strcpy( pcScalableSEI->getPriorityIdSetUri(), ucTemp);
  //JVT-W053

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

  return Err::m_nOK;

}



// JVT-S080 LMI {
ErrVal
H264AVCEncoder::xWriteScalableSEILayersNotPresent( ExtBinDataAccessor* pcExtBinDataAccessor, UInt uiNumLayers, UInt* uiLayerId)
{
  UInt i, uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  SEI::ScalableSeiLayersNotPresent* pcScalableSeiLayersNotPresent;
  RNOK(SEI::ScalableSeiLayersNotPresent::create(pcScalableSeiLayersNotPresent) );
  pcScalableSeiLayersNotPresent->setNumLayers( uiNumLayers );
  for (i=0; i < uiNumLayers; i++)
  pcScalableSeiLayersNotPresent->setLayerId( i, uiLayerId[i] );
  cSEIMessageList.push_back                       ( pcScalableSeiLayersNotPresent );
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );
  RNOK( m_apcLayerEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );

  return Err::m_nOK;
}

ErrVal
H264AVCEncoder::xWriteScalableSEIDependencyChange( ExtBinDataAccessor* pcExtBinDataAccessor, UInt uiNumLayers, UInt* uiLayerId, Bool* pbLayerDependencyInfoPresentFlag, 
                          UInt* uiNumDirectDependentLayers, UInt** puiDirectDependentLayerIdDeltaMinus1, UInt* puiLayerDependencyInfoSrcLayerIdDeltaMinus1)
{
  UInt uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  SEI::ScalableSeiDependencyChange* pcScalableSeiDependencyChange;
  RNOK(SEI::ScalableSeiDependencyChange::create(pcScalableSeiDependencyChange) );
  pcScalableSeiDependencyChange->setNumLayersMinus1(uiNumLayers-1);
    UInt uiLayer, uiDirectLayer;

  for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
  {
    pcScalableSeiDependencyChange->setDependencyId( uiLayer, uiLayerId[uiLayer]);
    pcScalableSeiDependencyChange->setLayerDependencyInfoPresentFlag( uiLayer, pbLayerDependencyInfoPresentFlag[uiLayer] );
    if ( pcScalableSeiDependencyChange->getLayerDependencyInfoPresentFlag( uiLayer ) )
    {
          pcScalableSeiDependencyChange->setNumDirectDependentLayers( uiLayer, uiNumDirectDependentLayers[uiLayer] );
      for ( uiDirectLayer = 0; uiDirectLayer < pcScalableSeiDependencyChange->getNumDirectDependentLayers( uiLayer ); uiDirectLayer++)
              pcScalableSeiDependencyChange->setDirectDependentLayerIdDeltaMinus1( uiLayer, uiDirectLayer,  puiDirectDependentLayerIdDeltaMinus1[uiLayer][uiDirectLayer] );
    }
    else
            pcScalableSeiDependencyChange->setLayerDependencyInfoSrcLayerIdDeltaMinus1( uiLayer, puiLayerDependencyInfoSrcLayerIdDeltaMinus1[uiLayer] );
  }


  cSEIMessageList.push_back                       ( pcScalableSeiDependencyChange );
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );
  RNOK( m_apcLayerEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );

  return Err::m_nOK;
}
//  JVT-S080 LMI }

ErrVal
H264AVCEncoder::xWriteSubPicSEI ( ExtBinDataAccessor* pcExtBinDataAccessor )
{
  SEI::SubPicSei* pcSubPicSEI;
  RNOK( SEI::SubPicSei::create( pcSubPicSEI ) );

  //===== set message =====
  UInt uiScalableLayerId = 0;	//should be changed
  pcSubPicSEI->setDependencyId( uiScalableLayerId );
  
  //===== write message =====
  UInt              uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  cSEIMessageList.push_back                       ( pcSubPicSEI );
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );

  return Err::m_nOK;
}


ErrVal
H264AVCEncoder::xWriteSubPicSEI ( ExtBinDataAccessor* pcExtBinDataAccessor, UInt layer_id )
{
  SEI::SubPicSei* pcSubPicSEI;
  RNOK( SEI::SubPicSei::create( pcSubPicSEI ) );

  //===== set message =====
  pcSubPicSEI->setDependencyId( layer_id );
  
  //===== write message =====
  UInt              uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  cSEIMessageList.push_back                       ( pcSubPicSEI );
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );

  return Err::m_nOK;
}

// Scalable SEI for ROI ICU/ETRI
ErrVal
H264AVCEncoder::xWriteMotionSEI( ExtBinDataAccessor* pcExtBinDataAccessor, UInt sg_id ) 
{
  //===== create message =====
  SEI::MotionSEI* pcMotionSEI;
  RNOK( SEI::MotionSEI::create( pcMotionSEI) );

  pcMotionSEI->setSliceGroupId(sg_id);


  //===== write message =====
  UInt              uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  cSEIMessageList.push_back                       ( pcMotionSEI);
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );

  return Err::m_nOK;
}

ErrVal
H264AVCEncoder::writeParameterSets( ExtBinDataAccessor* pcExtBinDataAccessor, 
                                    SequenceParameterSet*& rpcAVCSPS, 
                                    Bool &rbMoreSets )
{
  if( m_bVeryFirstCall )
  {
    m_bVeryFirstCall = false;

    RNOK( xInitParameterSets() );
    if( m_bScalableSeiMessage )
      RNOK( xWriteScalableSEI( pcExtBinDataAccessor ) );

    LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( 0 );
    if (0 < rcLayer.getNumROI())
      m_bWrteROISEI = true;
    else
      m_bWrteROISEI = false;
    m_loop_roi_sei=0;

    return Err::m_nOK;
  }
  else
    m_bScalableSeiMessage = true;

  UInt uiNumLayer = m_pcCodingParameter->getNumberOfLayers();
  
  if(m_bWrteROISEI)
  {
  LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( m_loop_roi_sei/2 );
  {
    if(((m_loop_roi_sei+1)/2) >= uiNumLayer )
    {
    m_bWrteROISEI = false;
    }

    if(m_loop_roi_sei%2)
    {			
    RNOK( xWriteMotionSEI( pcExtBinDataAccessor,rcLayer.getSGID()[0] ) );    m_loop_roi_sei++; return Err::m_nOK;
    }
    else
    {
      RNOK( xWriteSubPicSEI( pcExtBinDataAccessor, rcLayer.getSLID()[0] ) );    m_loop_roi_sei++; return Err::m_nOK;
    }
    }		
  }
    
  UInt uiBits;

  if( ! m_cUnWrittenSPS.empty() )
  {
    RNOK( m_pcNalUnitEncoder->initNalUnit( pcExtBinDataAccessor ) );
    SequenceParameterSet& rcSPS = *m_cUnWrittenSPS.front();
    
    if( rcSPS.getMbAdaptiveFrameFieldFlag() )
    {
      rcSPS.setFrameMbsOnlyFlag( false );
    }
    
    RNOK( m_pcNalUnitEncoder->write( rcSPS ) );
    RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );

    if( m_pcCodingParameter->getNumberOfLayers() )
    {
      UInt  uiLayer = rcSPS.getDependencyId();
      UInt  uiSize  = pcExtBinDataAccessor->size();
      RNOK( m_apcLayerEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
    }
    
// JVT-V068 {
    if ( (m_pcCodingParameter->getEnableNalHRD() || m_pcCodingParameter->getEnableVclHRD()) && 
         rcSPS.getProfileIdc() != SCALABLE_BASELINE_PROFILE &&
         rcSPS.getProfileIdc() != SCALABLE_HIGH_PROFILE )
    {
      rpcAVCSPS = &rcSPS;
    }
// JVT-V068 }

⌨️ 快捷键说明

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