h264avcencoder.cpp

来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,655 行 · 第 1/5 页

CPP
1,655
字号
	  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


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
	{
		Bool bH264AVCCompatible = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
		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   = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max( 0, (Int)uiTotalTempLevel - 1 );
		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 = (UInt)rcLayer.getNumFGSLayers () + 1;
		//Bool bFGSLayerFlag = uiTotalFGSLevel > 1; //JVT-S036 lsj
		Bool bH264AVCCompatible = ( uiCurrLayer == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
		Bool bSubSeq            = ( uiCurrLayer == 0 && m_pcCodingParameter->getBaseLayerMode() > 1 );
// *LMH(20060203): Fix Bug due to underflow (Replace)
		//UInt uiMinTempLevel     = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max(0,uiTotalTempLevel - 2);
		UInt uiMinTempLevel     = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max(0, (Int)uiTotalTempLevel - 2);

		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 bInitParameterSetsInfoPresentFlag = false;		//may be changed //JVT-S036 lsj
				  Bool bExactInterayerPredFlag = true;			//JVT-S036 lsj may be changed
          // JVT-S054 (REMOVE)
  				//Bool bIroiSliceDivisionFlag = false;  //JVT-S036 lsj
				  pcScalableSEI->setLayerId(uiNumScalableLayer, uiNumScalableLayer);
	//JVT-S036 lsj start
				  //pcScalableSEI->setFGSlayerFlag(uiNumScalableLayer, bFGSLayerFlag); 
				  //pcScalableSEI->setSubPicLayerFlag(uiNumScalableLayer,0);				  
					UInt uiTempLevel = uiCurrTempLevel; //BUG_FIX_FT_01_2006
					UInt uiDependencyID = uiCurrLayer;
					UInt uiQualityLevel = uiCurrFGSLevel;
	// BUG_FIX liuhui{
					m_aaauiScalableLayerId[uiCurrLayer][uiCurrTempLevel][uiCurrFGSLevel] = uiNumScalableLayer;
	// BUG_FIX liuhui}					
					UInt uiSimplePriorityId = 0;
					Bool bDiscardableFlag  = false;
					if( uiCurrFGSLevel > rcLayer.getNumFGSLayers() )
						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))
				  {
					  UInt uilayerProfileIdc = 0;	//may be changed
					  Bool bLayerConstraintSet0Flag = false;	//may be changed
					  Bool bH264AVCCompatibleTmp  = m_pcCodingParameter->getBaseLayerMode() > 0 && uiCurrLayer == 0;
					  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

					  pcScalableSEI->setLayerProfileIdc(uiNumScalableLayer, uilayerProfileIdc);
					  pcScalableSEI->setLayerConstraintSet0Flag(uiNumScalableLayer, bLayerConstraintSet0Flag);
					  pcScalableSEI->setLayerConstraintSet1Flag(uiNumScalableLayer, bLayerConstraintSet1Flag);
					  pcScalableSEI->setLayerConstraintSet2Flag(uiNumScalableLayer, bLayerConstraintSet2Flag);
					  pcScalableSEI->setLayerConstraintSet3Flag(uiNumScalableLayer, bLayerConstraintSet3Flag);
					  pcScalableSEI->setLayerLevelIdc(uiNumScalableLayer, uiLayerLevelIdc);
				  }
				  else
				  {//JVT-S036 lsj
					  UInt bProfileLevelInfoSrcLayerIdDelta = 0;  //may be changed

					  pcScalableSEI->setProfileLevelInfoSrcLayerIdDelta(uiNumScalableLayer, bProfileLevelInfoSrcLayerIdDelta);
				  }


	/*			  if(pcScalableSEI->getDecodingDependencyInfoPresentFlag(uiNumScalableLayer))
				  {
					  //UInt uiTempLevel = uiCurrTempLevel - uiMinTempLevel;
					  UInt uiTempLevel = uiCurrTempLevel; //BUG_FIX_FT_01_2006
					  UInt uiDependencyID = uiCurrLayer;
					  UInt uiQualityLevel = uiCurrFGSLevel;
// BUG_FIX liuhui{
					  m_aaauiScalableLayerId[uiCurrLayer][uiCurrTempLevel][uiCurrFGSLevel] = uiNumScalableLayer;
// BUG_FIX liuhui}
					 
					  UInt uiSimplePriorityId = 0;
					  Bool uiDiscardableFlag  = false;

					  pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);
					  pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, uiDiscardableFlag);
			
					  pcScalableSEI->setTemporalLevel(uiNumScalableLayer, uiTempLevel);
					  pcScalableSEI->setDependencyId(uiNumScalableLayer, uiDependencyID);
					  pcScalableSEI->setQualityLevel(uiNumScalableLayer, uiQualityLevel);
				  }
 JVT-S036 lsj */
				  if(pcScalableSEI->getBitrateInfoPresentFlag(uiNumScalableLayer))
				  {
// BUG_FIX liuhui{
					  UInt uiAvgBitrate = (UInt)( m_aaadSingleLayerBitrate[uiCurrLayer][uiCurrTempLevel][uiCurrFGSLevel]+0.5 );
// BUG_FIX liuhui}
					//JVT-S036 lsj start
					  UInt uiMaxBitrateLayer = 0;	//should be changed
					  UInt uiMaxBitrateDecodedPicture = 0;	//should be changed
					  UInt uiMaxBitrateCalcWindow = 0; //should be changed

					  pcScalableSEI->setAvgBitrate(uiNumScalableLayer, uiAvgBitrate);
					  pcScalableSEI->setMaxBitrateLayer(uiNumScalableLayer, uiMaxBitrateLayer);
					  pcScalableSEI->setMaxBitrateDecodedPicture(uiNumScalableLayer, uiMaxBitrateDecodedPicture);
					  pcScalableSEI->setMaxBitrateCalcWindow(uiNumScalableLayer, uiMaxBitrateCalcWindow);
				    //JVT-S036 lsj end
				  }

				  if(pcScalableSEI->getFrmRateInfoPresentFlag(uiNumScalableLayer))
				  {
					  UInt uiConstantFrmRateIdc = 0;
					  UInt uiAvgFrmRate = (UInt)( 256*dFramerate[uiTotalScalableLayer] + 0.5 );

					  pcScalableSEI->setConstantFrmRateIdc(uiNumScalableLayer, uiConstantFrmRateIdc);
					  pcScalableSEI->setAvgFrmRate(uiNumScalableLayer, uiAvgFrmRate);
				  }
				  else
				  {//JVT-S036 lsj
					  UInt  bFrmRateInfoSrcLayerIdDelta = 0;  //may be changed

					  pcScalableSEI->setFrmRateInfoSrcLayerIdDelta(uiNumScalableLayer, bFrmRateInfoSrcLayerIdDelta);
				  }

				  if(pcScalableSEI->getFrmSizeInfoPresentFlag(uiNumScalableLayer))
				  {
					  UInt uiFrmWidthInMbsMinus1 = rcLayer.getFrameWidth()/16 - 1;
					  UInt uiFrmHeightInMbsMinus1 = rcLayer.getFrameHeight()/16 - 1;

					  pcScalableSEI->setFrmWidthInMbsMinus1(uiNumScalableLayer, uiFrmWidthInMbsMinus1);
					  pcScalableSEI->setFrmHeightInMbsMinus1(uiNumScalableLayer, uiFrmHeightInMbsMinus1);
				  }
				  else
				  {//JVT-S036 lsj
					  UInt  bFrmSizeInfoSrcLayerIdDelta = 0;  //may be changed

					  pcScalableSEI->setFrmSizeInfoSrcLayerIdDelta(uiNumScalableLayer, bFrmSizeInfoSrcLayerIdDelta);
				  }

				  if(pcScalableSEI->getSubRegionLayerFlag(uiNumScalableLayer))
				  {
					  UInt uiBaseRegionLayerId = 0;
					  Bool bDynamicRectFlag = false;

					  pcScalableSEI->setBaseRegionLayerId(uiNumScalableLayer, uiBaseRegionLayerId);
					  pcScalableSEI->setDynamicRectFlag(uiNumScalableLayer, bDynamicRectFlag);
					  if(pcScalableSEI->getDynamicRectFlag(uiNumScalableLayer))
					  {
						  UInt uiHorizontalOffset = 0;
						  UInt uiVerticalOffset = 0;
						  UInt uiRegionWidth = 0;
						  UInt uiRegionHeight = 0;
						  pcScalableSEI->setHorizontalOffset(uiNumScalableLayer, uiHorizontalOffset);
						  pcScalableSEI->setVerticalOffset(uiNumScalableLayer, uiVerticalOffset);
						  pcScalableSEI->setRegionWidth(uiNumScalableLayer, uiRegionWidth);
						  pcScalableSEI->setRegionHeight(uiNumScalableLayer, uiRegionHeight);
					  }
				  }
				 else
				  {//JVT-S036 lsj
					  UInt  bSubRegionInfoSrcLayerIdDelta = 0; //may be changed

					  pcScalableSEI->setSubRegionInfoSrcLayerIdDelta(uiNumScalableLayer, bSubRegionInfoSrcLayerIdDelta);
				  }

			  //JVT-S036 lsj start
				  if( pcScalableSEI->getSubPicLayerFlag( uiNumScalableLayer ) )
				  {
					  UInt RoiId = 1;//should be changed
					  pcScalableSEI->setRoiId( uiNumScalableLayer, RoiId );
				  }
				  if( pcScalableSEI->getIroiSliceDivisionInfoPresentFlag( uiNumScalableLayer ) )
				  {
            // JVT-S054 (REPLACE) ->
            /*
					  UInt bIroiSliceDivisionType = 0; //may be changed
					  UInt bNumSliceMinus1 = 1;
					  pcScalableSEI->setIroiSliceDivisionType( uiNumScalableLayer, bIroiSliceDivisionType );
					  if( bIroiSliceDivisionType == 0 )
					  {
						  UInt bGridSliceWidthInMbsMinus1 = 0; //should be changed
						  UInt bGridSliceHeightInMbsMinus1 = 0; //should be changed
						  pcScalableSEI->setGridSliceWidthInMbsMinus1( uiNumScalableLayer, bGridSliceWidthInMbsMinus1 );
						  pcScalableSEI->setGridSliceHeightInMbsMinus1( uiNumScalableLayer, bGridSliceHeightInMbsMinus1 );
					  }
					  else if( bIroiSliceDivisionType == 1 )
					  {
						  bNumSliceMinus1 = 1; //should be changed
						  pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, bNumSliceMinus1);
						  for ( j = 0; j <= bNumSliceMinus1; j++ )
						  {
							  UInt bFirstMbInSlice = 1;//should be changed
							  UInt bSliceWidthInMbsMinus1 = 1;//should be changed
							  UInt bSliceHeightInMbsMinus1 = 1;//should be changed
							  pcScalableSEI->setFirstMbInSlice( uiNumScalableLayer, j, bFirstMbInSlice );
							  pcScalableSEI->setSliceWidthInMbsMinus1( uiNumScalableLayer, j, bSliceWidthInMbsMinus1 );
							  pcScalableSEI->setSliceHeightInMbsMinus1( uiNumScalableLayer, j, bSliceHeightInMbsMinus1 );
						  }
					  }
					  else if( bIroiSliceDivisionType == 2 )
					  {
						  pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, bNumSliceMinus1 );
						  UInt uiFrameHeightInMb = pcScalableSEI->getFrmHeightInMbsMinus1( uiNumScalableLayer ) + 1;
						  UInt uiFrameWidthInMb  = pcScalableSEI->getFrmWidthInMbsMinus1(uiNumScalableLayer ) + 1;
						  UInt uiPicSizeInMbs = uiFrameHeightInMb * uiFrameWidthInMb;
						  for ( j = 0; j < uiPicSizeInMbs; j++)
						  {
							  UInt bSliceId = 1; //should be changed
							  pcScalableSEI->setSliceId( uiNumScalableLayer, j, bSliceId );
						  }
					  }
            */
					  pcScalableSEI->setIroiSliceDivisionType( uiNumScalableLayer, rcLayer.m_uiSliceDivisionType );
            if (rcLayer.m_uiSliceDivisionType == 0)
					  {
						  pcScalableSEI->setGridSliceWidthInMbsMinus1( uiNumScalableLayer, rcLayer.m_puiGridSliceWidthInMbsMinus1[0] );
						  pcScalableSEI->setGridSliceHeightInMbsMinus1( uiNumScalableLayer, rcLayer.m_puiGridSliceHeightInMbsMinus1[0] );
					  }
            else if (rcLayer.m_uiSliceDivisionType == 1)
					  {
						  pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, rcLayer.m_uiNumSliceMinus1 );
						  for ( j = 0; j <= rcLayer.m_uiNumSliceMinus1; j++ )
						  {
							  pcScalableSEI->setFirstMbInSlice( uiNumScalableLayer, j, rcLayer.m_puiFirstMbInSlice[j] );
							  pcScalableSEI->setSliceWidthInMbsMinus1( uiNumScalableLayer, j, rcLayer.m_puiGridSliceWidthInMbsMinus1[j] );
							  pcScalableSEI->setSliceHeightInMbsMinus1( uiNumScalableLayer, j, rcLayer.m_puiGridSliceHeightInMbsMinus1[j] );
						  }
					  }
            else if (rcLayer.m_uiSliceDivisionType == 2)
					  {
						  pcScalableSEI->setNumSliceMinus1( uiNumScalableLayer, rcLayer.m_uiNumSliceMinus1 );
						  UInt uiFrameHeightInMb = pcScalableSEI->getFrmHeightInMbsMinus1( uiNumScalableLayer ) + 1;
						  UInt uiFrameWidthInMb  = pcScalableSEI->getFrmWidthInMbsMinus1(uiNumScalableLayer ) + 1;
						  UInt uiPicSizeInMbs = uiFrameHeightInMb * uiFrameWidthInMb;
						  for ( j = 0; j < uiPicSizeInMbs; j++)
						  {
							  pcScalableSEI->setSliceId( uiNumScalableLayer, j, rcLayer.m_puiSliceId[j] );
						  }
					  }
            // JVT-S054 (REPLACE) <-
				  }
			  //JVT-S036 lsj end

				  if(pcScalableSEI->getLayerDependencyInfoPresentFlag(uiNumScalableLayer))
				  {
// BUG_FIX liuhui{
					{
					  UInt uiDelta;

⌨️ 快捷键说明

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