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

📄 h264avcencoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	  LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
    UInt uiFgsMotionMode = rcBaseLayer.getFGSMotionMode();
	  Double dNumFGSLayers = rcBaseLayer.getNumFGSLayers();

	// ICU/ETRI FGS_MOT Bug Fix
	if (0 == uiFgsMotionMode || 0 == dNumFGSLayers)
  {	
		pcMbDataCtrlEL = pcMbDataCtrl;
  }

  return Err::m_nOK;
}

ErrVal
H264AVCEncoder::getBaseLayerSH( SliceHeader*& rpcSliceHeader,
                                UInt          uiBaseLayerId,
                                Int           iPoc,
														    PicType      ePicType  )
{
  ROF( uiBaseLayerId < MAX_LAYERS );

  RNOK( m_apcMCTFEncoder[uiBaseLayerId]->getBaseLayerSH( rpcSliceHeader, iPoc, ePicType  ) );
  return Err::m_nOK;
}


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


ErrVal
H264AVCEncoder::init( MCTFEncoder*      apcMCTFEncoder[MAX_LAYERS],
                      ParameterSetMng*  pcParameterSetMng,
                      PocCalculator*    pcPocCalculator,
                      NalUnitEncoder*   pcNalUnitEncoder,
                      ControlMngIf*     pcControlMng,
                      CodingParameter*  pcCodingParameter,
                      FrameMng*         pcFrameMng)
{
  ROT( NULL == apcMCTFEncoder );
  ROT( NULL == pcFrameMng );
  ROT( NULL == pcParameterSetMng );
  ROT( NULL == pcPocCalculator );
  ROT( NULL == pcNalUnitEncoder );
  ROT( NULL == pcControlMng );
  ROT( NULL == pcCodingParameter );

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

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

  m_cAccessUnitList.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_pcFrameMng                  = NULL;
  m_bInitDone                   = false;
  m_bVeryFirstCall              = true;
  m_bScalableSeiMessage         = true;
  m_bTraceEnable                = false;  

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

  m_cAccessUnitList.clear();

  return Err::m_nOK;
}



//{{Quality level estimation and modified truncation- JVTO044 and m12007
//France Telecom R&D-(nathalie.cammas@francetelecom.com)
ErrVal H264AVCEncoder::writeQualityLevelInfosSEI(ExtBinDataAccessor* pcExtBinDataAccessor, UInt* uiaQualityLevel, UInt *uiaDelta, UInt uiNumLevels, UInt uiLayer ) 
{
	//===== create message =====
  SEI::QualityLevelSEI* pcQualityLevelSEI;
  RNOK( SEI::QualityLevelSEI::create( pcQualityLevelSEI ) );

  //===== set message =====
  pcQualityLevelSEI->setNumLevel(uiNumLevels);
  pcQualityLevelSEI->setDependencyId(uiLayer);

  UInt ui;
  for(ui= 0; ui < uiNumLevels; ui++)
  {
	  pcQualityLevelSEI->setQualityLevel(ui,uiaQualityLevel[ui]);
	  pcQualityLevelSEI->setDeltaBytesRateOfLevel(ui,uiaDelta[ui]);
  }
  
  //===== write message =====
  UInt              uiBits = 0;
  SEI::MessageList  cSEIMessageList;
  cSEIMessageList.push_back                       ( pcQualityLevelSEI );
  RNOK( m_pcNalUnitEncoder  ->initNalUnit         ( pcExtBinDataAccessor ) );
  RNOK( m_pcNalUnitEncoder  ->write               ( cSEIMessageList ) );
  RNOK( m_pcNalUnitEncoder  ->closeNalUnit        ( uiBits ) );

  return Err::m_nOK;
}
//}}Quality level estimation and modified truncation- JVTO044 and m12007

// 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];
        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] );
		}
		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_apcMCTFEncoder[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; //JVT-S036 lsj
	UInt uiInputLayers = m_pcCodingParameter->getNumberOfLayers ();
	UInt uiLayerNum = 0;	//total scalable layer numbers
	for ( UInt 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.getNotCodedMCTFStages();
// *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;
		UInt uiTotalFGSLevel  = (UInt)rcLayer.getNumFGSLayers () + 1;
		uiLayerNum += uiActTempLevel * uiTotalFGSLevel;

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

	//===== get framerate information ===
	Double *dFramerate = dGetFramerate();
  
	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.getNotCodedMCTFStages() + 1;
		 UInt uiTotalFGSLevel = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? 1 : (UInt)rcLayer.getNumFGSLayers () + 1);

		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
				  if( uiNumScalableLayer == 0 )
				 {//JVT-S036 lsj
					 bSubRegionLayerFlag = true;
					 bProfileLevelInfoPresentFlag = true;
					 bInitParameterSetsInfoPresentFlag = true;		
				 }
				  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);
          m_aaauiScalableLayerId[uiDependencyID][uiCurrTempLevel][uiQualityLevel] = uiNumScalableLayer;
			
					UInt uiSimplePriorityId = 0;
					Bool bDiscardableFlag  = false;
					if( uiCurrFGSLevel > rcLayer.getNumFGSLayers() || rcLayer.isDiscardable() ) // bugfix replace
						bDiscardableFlag = true;
					pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);
					pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, bDiscardableFlag);
					pcScalableSEI->setTemporalLevel(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);

				  pcScalableSEI->setExactInterlayerPredFlag(uiNumScalableLayer, bExactInterayerPredFlag);//JVT-S036 lsj

				  if(pcScalableSEI->getProfileLevelInfoPresentFlag(uiNumScalableLayer))
				  {

⌨️ 快捷键说明

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