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

📄 h264avcencoder.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  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

//SEI {
ErrVal H264AVCEncoder::writeNestingSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits) 
{
	SEI::ScalableNestingSei* pcScalableNestingSei;
	RNOK( SEI::ScalableNestingSei::create(pcScalableNestingSei) );

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

		// assign value, may be changed here
		uiNumPicturesMinus1 = 1;
		UInt *uiPicId = new UInt[uiNumPicturesMinus1+1];
        uiPicId[0] = 0;
		uiPicId[1] = 1;
        
		pcScalableNestingSei->setNumPicturesMinus1( uiNumPicturesMinus1 );
		for( UInt uiIndex = 0; uiIndex <= uiNumPicturesMinus1; uiIndex++ )
		{
			pcScalableNestingSei->setPicId( uiIndex, uiPicId[uiIndex] );
		}
		pcScalableNestingSei->setTemporalId( 0 );
		delete uiPicId;
	}
	//deal with the following SEI message in nesting SEI message
	//may be changed here, here take snap_shot_sei as an example
	SEI::FullframeSnapshotSei *pcSnapShotSEI;
	RNOK( SEI::FullframeSnapshotSei::create( pcSnapShotSEI ) );
	pcSnapShotSEI->setSnapShotId(0);

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

	RNOK( pcSnapShotSEI->destroy() );
	RNOK( pcScalableNestingSei->destroy() );
	return Err::m_nOK;
}

ErrVal H264AVCEncoder::writeActiveViewInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits ) 
{
	SEI::ActiveViewInfoSei* pcActiveViewInfoSei;
	RNOK( SEI::ActiveViewInfoSei::create(pcActiveViewInfoSei) );

	//===== set message =====
	//may be changed here
	Bool bOpPresentFlag = false;

	pcActiveViewInfoSei->setOpPresentFlag( bOpPresentFlag );
	if( bOpPresentFlag )
	{
		UInt uiOperationPointId = 0;
		pcActiveViewInfoSei->setOperationPointId(uiOperationPointId);
	}
	else
	{		
		UInt uiNumActiveViewsMinus1;

		// assign value, may be changed here
    uiNumActiveViewsMinus1 = m_pcCodingParameter->getSpsMVC()->getNumViewMinus1();
    UInt *uiViewCodingOrder = m_pcCodingParameter->getSpsMVC()->getViewCodingOrder();
	UInt *uiViewId = new UInt[uiNumActiveViewsMinus1+1];
	UInt uiIndex;

    for( uiIndex = 0; uiIndex <= uiNumActiveViewsMinus1; uiIndex++ )
    {
      uiViewId[uiIndex] = uiViewCodingOrder[uiIndex];
    }

		pcActiveViewInfoSei->setNumActiveViewsMinus1( uiNumActiveViewsMinus1 );
		for( uiIndex = 0; uiIndex <= uiNumActiveViewsMinus1; uiIndex++ )
		{
			pcActiveViewInfoSei->setViewId( uiIndex, uiViewId[uiIndex] );
		}
		delete uiViewId;
	}

	UInt              uiBits = 0;
	SEI::MessageList  cSEIMessageList;
	cSEIMessageList.push_back                 ( pcActiveViewInfoSei );
	RNOK ( m_pcNalUnitEncoder->initNalUnit    ( pcExtBinDataAccessor ) );
	RNOK ( m_pcNalUnitEncoder->write	      ( cSEIMessageList ) );
	RNOK ( m_pcNalUnitEncoder->closeNalUnit   ( uiBits ) );
	dSeqBits[0] += uiBits+4*8;
	return Err::m_nOK;
}

ErrVal H264AVCEncoder::writeMultiviewSceneInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits ) // SEI JVT-W060
{
	SEI::MultiviewSceneInfoSei* pcMultiviewSceneInfoSei;
	RNOK( SEI::MultiviewSceneInfoSei::create(pcMultiviewSceneInfoSei) );

	//===== set message =====
	pcMultiviewSceneInfoSei->setMaxDisparity(m_pcCodingParameter->getMaxDisparity());

	
	UInt              uiBits = 0;
	SEI::MessageList  cSEIMessageList;
	cSEIMessageList.push_back                 ( pcMultiviewSceneInfoSei );
	RNOK ( m_pcNalUnitEncoder->initNalUnit    ( pcExtBinDataAccessor ) );
	RNOK ( m_pcNalUnitEncoder->write	      ( cSEIMessageList ) );
	RNOK ( m_pcNalUnitEncoder->closeNalUnit   ( uiBits ) );
	dSeqBits[0] += uiBits+4*8;
	return Err::m_nOK;
}

ErrVal H264AVCEncoder::writeMultiviewAcquisitionInfoSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor, Double* dSeqBits ) // SEI JVT-W060, JVT-Z038
{
	SEI::MultiviewAcquisitionInfoSei* pcMultiviewAcquisitionInfoSei;
	RNOK( SEI::MultiviewAcquisitionInfoSei::create(pcMultiviewAcquisitionInfoSei) );
	UInt uiIndex;
	int i,j;

	Bool IntParaFlag=false;
	Bool ExtParaFlag=false;

	UInt NumViewsMinus1 = m_pcCodingParameter->getNumViewMinus1();
	pcMultiviewAcquisitionInfoSei->initialize_memory(NumViewsMinus1+1);
	//===== set message =====
	pcMultiviewAcquisitionInfoSei->setIntrinsicParamFlag(IntParaFlag=m_pcCodingParameter->getIntrinsicParamFlag());
	if (IntParaFlag)
	{
		pcMultiviewAcquisitionInfoSei->setIntrinsicParamsEqual(m_pcCodingParameter->getIntrinsicParamsEqual());
		pcMultiviewAcquisitionInfoSei->setPrecFocalLength(m_pcCodingParameter->getPrecFocalLength());
		pcMultiviewAcquisitionInfoSei->setPrecPrincipalPoint(m_pcCodingParameter->getPrecPrincipalPoint());
		pcMultiviewAcquisitionInfoSei->setPrecRadialDistortion(m_pcCodingParameter->getPrecRadialDistortion());
		

		for (uiIndex=0; uiIndex<= NumViewsMinus1; uiIndex++)
		{
			pcMultiviewAcquisitionInfoSei->setSignFocalLengthX(uiIndex,m_pcCodingParameter->getSignFocalLengthX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setSignFocalLengthY(uiIndex,m_pcCodingParameter->getSignFocalLengthY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setSignPrincipalPointX(uiIndex,m_pcCodingParameter->getSignPrincipalPointX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setSignPrincipalPointY(uiIndex,m_pcCodingParameter->getSignPrincipalPointY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setSignRadialDistortion(uiIndex,m_pcCodingParameter->getSignRadialDistortion(uiIndex));

			pcMultiviewAcquisitionInfoSei->setExponentFocalLengthX(uiIndex,m_pcCodingParameter->getExponentFocalLengthX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setExponentFocalLengthY(uiIndex,m_pcCodingParameter->getExponentFocalLengthY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setExponentPrincipalPointX(uiIndex,m_pcCodingParameter->getExponentPrincipalPointX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setExponentPrincipalPointY(uiIndex,m_pcCodingParameter->getExponentPrincipalPointY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setExponentRadialDistortion(uiIndex,m_pcCodingParameter->getExponentRadialDistortion(uiIndex));
		
			pcMultiviewAcquisitionInfoSei->setMantissaFocalLengthX(uiIndex,m_pcCodingParameter->getMantissaFocalLengthX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setMantissaFocalLengthY(uiIndex,m_pcCodingParameter->getMantissaFocalLengthY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setMantissaPrincipalPointX(uiIndex,m_pcCodingParameter->getMantissaPrincipalPointX(uiIndex));
			pcMultiviewAcquisitionInfoSei->setMantissaPrincipalPointY(uiIndex,m_pcCodingParameter->getMantissaPrincipalPointY(uiIndex));
			pcMultiviewAcquisitionInfoSei->setMantissaRadialDistortion(uiIndex,m_pcCodingParameter->getMantissaRadialDistortion(uiIndex));
		
		}
	} 

	pcMultiviewAcquisitionInfoSei->setExtrinsicParamFlag(ExtParaFlag=m_pcCodingParameter->getExtrinsicParamFlag());
	if (ExtParaFlag)
	{
		pcMultiviewAcquisitionInfoSei->setPrecRotationParam(m_pcCodingParameter->getPrecRotationParam());
		pcMultiviewAcquisitionInfoSei->setPrecTranslationParam(m_pcCodingParameter->getPrecTranslationParam());
		
		for (uiIndex=0; uiIndex<= NumViewsMinus1; uiIndex++)
		{
			for (i=0; i<3; i++)
			{
				pcMultiviewAcquisitionInfoSei->setSignTranslationParam(uiIndex,i,m_pcCodingParameter->getSignTranslationParam(uiIndex,i));
				pcMultiviewAcquisitionInfoSei->setExponentTranslationParam(uiIndex,i,m_pcCodingParameter->getExponentTranslationParam(uiIndex,i));
				pcMultiviewAcquisitionInfoSei->setMantissaTranslationParam(uiIndex,i,m_pcCodingParameter->getMantissaTranslationParam(uiIndex,i));
				for (j=0; j<3; j++) {
					pcMultiviewAcquisitionInfoSei->setSignRotationParam(uiIndex,i,j,m_pcCodingParameter->getSignRotationParam(uiIndex,i,j));
					pcMultiviewAcquisitionInfoSei->setExponentRotationParam(uiIndex,i,j,m_pcCodingParameter->getExponentRotationParam(uiIndex,i,j));
					pcMultiviewAcquisitionInfoSei->setMantissaRotationParam(uiIndex,i,j,m_pcCodingParameter->getMantissaRotationParam(uiIndex,i,j));
				}
			}
				
		}
	}

	
	UInt              uiBits = 0;
	SEI::MessageList  cSEIMessageList;
	cSEIMessageList.push_back                 ( pcMultiviewAcquisitionInfoSei );
	RNOK ( m_pcNalUnitEncoder->initNalUnit    ( pcExtBinDataAccessor ) );
	RNOK ( m_pcNalUnitEncoder->write	      ( cSEIMessageList ) );
	RNOK ( m_pcNalUnitEncoder->closeNalUnit   ( uiBits ) );
	dSeqBits[0] += uiBits+4*8;
  	m_pcCodingParameter->release_memory();
	return Err::m_nOK;
}

ErrVal H264AVCEncoder::writeViewScalInfoSEIMessage(ExtBinDataAccessor *pcExtBinDataAccessor, 
												   Double* dBitRate, 
												   Double* dFrameRate,
												   Double  dMaxRate)
{
  SEI::ViewScalabilityInfoSei* pcViewScalInfoSei;
  RNOK( SEI::ViewScalabilityInfoSei::create(pcViewScalInfoSei) );

  //==set message==
  UInt i, j;
 // UInt uiNumViews = m_pcCodingParameter->getSpsMVC()->getNumViewMinus1() + 1 ; 
  UInt uiNumOperationPointsMinus1 = 0;
  UInt uiCurrViewId = m_pcCodingParameter->getCurentViewId();
  pcViewScalInfoSei->setNumOperationPointsMinus1( uiNumOperationPointsMinus1 );
  for( i = 0; i <= uiNumOperationPointsMinus1; i++ )
  {
    UInt uiOperationPointId, uiPriorityId, uiTemporalId, uiNumActiveViewsMinus1;

	uiOperationPointId = i;
	uiTemporalId = m_pcCodingParameter->getDecompositionStages();
	uiPriorityId = uiCurrViewId == 0 ? uiTemporalId : ( uiTemporalId+uiCurrViewId%2+1 );
	uiNumActiveViewsMinus1 = 0;

	pcViewScalInfoSei->setOperationPointId( i, uiOperationPointId );
	pcViewScalInfoSei->setPriorityId( i, uiPriorityId );
	pcViewScalInfoSei->setTemporalId( i, uiTemporalId );
	pcViewScalInfoSei->setNumActiveViewsMinus1( i, uiNumActiveViewsMinus1 );
    
	for( j = 0; j <= uiNumActiveViewsMinus1; j++)
	{
	  UInt uiViewId = uiCurrViewId;
	  pcViewScalInfoSei->setViewId( i, j, uiViewId );
	}

	Bool bProfileLevelInfoPresentFlag, bBitRateInfoPresentFlag, bFrmRateInfoPresentFlag;
	Bool bOpDependencyInfoPresentFlag, bInitParameterSetsInfoPresentFlag;

	bProfileLevelInfoPresentFlag = false;
	bBitRateInfoPresentFlag = true;
	bFrmRateInfoPresentFlag = true;//may be changed
	bOpDependencyInfoPresentFlag = false;
	bInitParameterSetsInfoPresentFlag = false;
	pcViewScalInfoSei->setProfileLevelInfoPresentFlag( i, bProfileLevelInfoPresentFlag );
	pcViewScalInfoSei->setBitRateInfoPresentFlag( i, bBitRateInfoPresentFlag );
	pcViewScalInfoSei->setFrmRateInfoPresentFlag( i, bFrmRateInfoPresentFlag );
	pcViewScalInfoSei->setOpDependencyInfoPresentFlag( i, bOpDependencyInfoPresentFlag );
	pcViewScalInfoSei->setInitParameterSetsInfoPresentFlag( i, bInitParameterSetsInfoPresentFlag );

⌨️ 快捷键说明

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