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

📄 h264avcencoder.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				  }

				  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 
					  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 
					  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 
					  UInt  bSubRegionInfoSrcLayerIdDelta = 0; //may be changed

					  pcScalableSEI->setSubRegionInfoSrcLayerIdDelta(uiNumScalableLayer, bSubRegionInfoSrcLayerIdDelta);
				  }

			  //JVT-S036  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  end

				  if(pcScalableSEI->getLayerDependencyInfoPresentFlag(uiNumScalableLayer))
				  {
// BUG_FIX liuhui{
					{
					  UInt uiDelta;
					  if( uiCurrFGSLevel ) // FGS layer, Q != 0
					  {
					    uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel, uiCurrFGSLevel-1 );
						pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036 
						pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
						if( uiCurrTempLevel- uiMinTempLevel ) // T != 0
						{
						  uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
						  pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036 
						  pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 2 );
						}
					  }
					  else if( ( uiCurrTempLevel- uiMinTempLevel ) ) // Q = 0, T != 0					    
					  {
					    uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
						pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036 
						pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
						if( uiCurrLayer ) // D != 0, T != 0, Q = 0
						{
						  UInt uiBaseLayerId = rcLayer.getBaseLayerId();
						  LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
						  UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
						  UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
						  uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
						  if( uiBaseLayerId == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) // AVC-COMPATIBLE
						  {
						    UInt uiBaseTempLevel = max( 0, rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() - 1 );
							if( uiCurrTempLevel-uiMinTempLevel >= uiBaseTempLevel )
							{
							  if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
							  {
							  uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
							   pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036 
							  pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
							  }
							}
							else 
							{
							  if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel ) )
							  { //this should always be true
							    uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel );
							    pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036 
							    pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
							  }
							}
						  }
						  else //non-AVC mode
						  {
						    if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
							{
						      uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
						      pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036 
						      pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
							}
						  }
						}
					  }
					  else if ( uiCurrLayer ) // D != 0,T = 0, Q = 0
					  {
						UInt uiBaseLayerId = rcLayer.getBaseLayerId();
						LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
						UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
						UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
						uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
						if( uiBaseLayerId == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) //AVC-COMPATIBLE
						{
						  Int iBaseTempLevel = max( 0, (Int)( rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() ) - 1 );
						  uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, (UInt)iBaseTempLevel, (UInt)uiBaseQualityLevel );
						}
						else
						  uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
						pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036 
						pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
					  }
				      else // base layer, no dependency layers
					  {
						pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 0 );
					  }
					}
// BUG_FIX liuhui}
				  }
				  else
				  {//JVT-S036 
					  UInt uiLayerDependencyInfoSrcLayerIdDelta = 0; //may be changed

					  pcScalableSEI->setLayerDependencyInfoSrcLayerIdDelta( uiNumScalableLayer, uiLayerDependencyInfoSrcLayerIdDelta);
				  }

				  if(pcScalableSEI->getInitParameterSetsInfoPresentFlag(uiNumScalableLayer))
				  {
        	  UInt uiNumInitSPSMinus1 = 0;	//should be changed
					  UInt uiNumInitPPSMinus1 = 0;	//should be changed
					  pcScalableSEI->setNumInitSeqParameterSetMinus1(uiNumScalableLayer, uiNumInitSPSMinus1);
					  pcScalableSEI->setNumInitPicParameterSetMinus1(uiNumScalableLayer, uiNumInitPPSMinus1);
					  for( j = 0; j <= pcScalableSEI->getNumInitSPSMinus1(uiNumScalableLayer); j++)
					  {
						  UInt uiDelta = 0; //should be changed
						  pcScalableSEI->setInitSeqParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
					  }
					  for( j = 0; j <= pcScalableSEI->getNumInitPPSMinus1(uiNumScalableLayer); j++)
					  {
						  UInt uiDelta = 0; //should be changed
						  pcScalableSEI->setInitPicParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
					  }
				  }
				  else
				  {//JVT-S036 
					  UInt bInitParameterSetsInfoSrcLayerIdDelta = 0;  //may be changed

					  pcScalableSEI->setInitParameterSetsInfoSrcLayerIdDelta( uiNumScalableLayer, bInitParameterSetsInfoSrcLayerIdDelta );
				  }

				  uiNumScalableLayer++;
				}
				uiTotalScalableLayer++;
			}
		}

	}

	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_apcMCTFEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );

	return Err::m_nOK;

}

//JVT-T054{
ErrVal
H264AVCEncoder::xWriteScalableSEICGSSNR( ExtBinDataAccessor* pcExtBinDataAccessor )
{

	//===== create message =====
	SEI::ScalableSei* pcScalableSEI;
	RNOK(SEI::ScalableSei::create(pcScalableSEI) );


	//===== set message =====
	UInt j; //JVT-S036 
	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();
		UInt uiMinTempLevel   = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max( 0, (Int)uiTotalTempLevel - 1 );
		UInt uiActTempLevel   = uiTotalTempLevel - uiMinTempLevel + 1;
		//UInt uiTotalFGSLevel  = (UInt)rcLayer.getNumFGSLayers () + 1; //mwi. variable not used.

⌨️ 快捷键说明

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