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

📄 extractor.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		  pcNewViewScalSei->setOpConstraintSet1Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet1Flag( OldOpId ) );
		  pcNewViewScalSei->setOpConstraintSet2Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet2Flag( OldOpId ) );
		  pcNewViewScalSei->setOpConstraintSet3Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet3Flag( OldOpId ) );
		  pcNewViewScalSei->setOpLevelIdc( uiNumNewOps, pcOldViewScalSei->getOpLevelIdc( OldOpId ) );
		}
		else
		  pcNewViewScalSei->setProfileLevelInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
	  }
	  else
		pcNewViewScalSei->setProfileLevelInfoSrcOpIdDelta( uiNumNewOps, 0 );

	  if( pcOldViewScalSei->getBitRateInfoPresentFlag( i ) )
	  {
		pcNewViewScalSei->setAvgBitrate( uiNumNewOps, pcOldViewScalSei->getAvgBitrate( i ) );
		pcNewViewScalSei->setMaxBitrate( uiNumNewOps, pcOldViewScalSei->getMaxBitrate( i ) );
		pcNewViewScalSei->setMaxBitrateCalcWindow( uiNumNewOps, pcOldViewScalSei->getMaxBitrateCalcWindow( i ) );
	  }

	  if( pcOldViewScalSei->getFrmRateInfoPresentFlag( i ) )
	  {
		pcNewViewScalSei->setConstantFrmRateIdc( uiNumNewOps, pcOldViewScalSei->getConstantFrmRateIdc( i ) );
		pcNewViewScalSei->setAvgFrmRate( uiNumNewOps, pcOldViewScalSei->getAvgFrmRate( i ) );
	  }
	  else if( pcOldViewScalSei->getFrmRateInfoSrcOpIdDela( i ) )
	  {
		UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getFrmRateInfoSrcOpIdDela( i );
	    for( j = 0; j< uiNumOps; j++ )
		  if( OldOpId == uiOperationPointId[j] )
		    break;

		if( j == uiNumOps )
		{
		  pcNewViewScalSei->setFrmRateInfoPresentFlag( uiNumNewOps, true );
		  pcNewViewScalSei->setConstantFrmRateIdc( uiNumNewOps, pcOldViewScalSei->getConstantFrmRateIdc( OldOpId ) );
		  pcNewViewScalSei->setAvgFrmRate( uiNumNewOps, pcOldViewScalSei->getAvgFrmRate( OldOpId ) );
		}
		else
		  pcNewViewScalSei->setFrmRateInfoSrcOpIdDela( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
	  }
	  else
		pcNewViewScalSei->setFrmRateInfoSrcOpIdDela( uiNumNewOps, 0 );

	  if( pcOldViewScalSei->getOpDependencyInfoPresentFlag( i ) )
	  {
		pcNewViewScalSei->setNumDirectlyDependentOps( uiNumNewOps, pcOldViewScalSei->getNumDirectlyDependentOps( i ) );
		for( UInt ui = 0; ui < pcOldViewScalSei->getNumDirectlyDependentOps( i ); ui++ )
		{
		  UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getDirectlyDependentOpIdDeltaMinus1( i, ui ) - 1;
	      for( j = 0; j< uiNumOps; j++ )
		    if( OldOpId == uiOperationPointId[j] )
		      break;
		  pcNewViewScalSei->setDirectlyDependentOpIdDeltaMinus1( uiNumNewOps, ui, uiNumNewOps - uiOldOpToNewOp[OldOpId] - 1 );
		}
	  }
	  else if( pcOldViewScalSei->getOpDependencyInfoSrcOpIdDelta( i ) )
	  {
		UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getOpDependencyInfoSrcOpIdDelta( i );
	    for( j = 0; j< uiNumOps; j++ )
		  if( OldOpId == uiOperationPointId[j] )
		    break;

		if( j == uiNumOps )
		{
		  pcNewViewScalSei->setNumDirectlyDependentOps( uiNumNewOps, pcOldViewScalSei->getNumDirectlyDependentOps( OldOpId ) );
		  for( UInt ui = 0; ui < pcOldViewScalSei->getNumDirectlyDependentOps( i ); ui++ )
		  {
		    UInt OldOpId1 = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getDirectlyDependentOpIdDeltaMinus1( OldOpId, ui ) - 1;
	        for( j = 0; j< uiNumOps; j++ )
		      if( OldOpId1 == uiOperationPointId[j] )
		        break;
		    pcNewViewScalSei->setDirectlyDependentOpIdDeltaMinus1( uiNumNewOps, ui, uiNumNewOps - uiOldOpToNewOp[OldOpId1] - 1 );
		  }
		}
		else
		  pcNewViewScalSei->setOpDependencyInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] ); 
	  }
	  else
		pcNewViewScalSei->setOpDependencyInfoSrcOpIdDelta( uiNumNewOps, 0 );

	  if( pcOldViewScalSei->getInitParameterSetsInfoPresentFlag( i ) )
	  {
		pcNewViewScalSei->setNumInitSeqParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitSeqParameterSetMinus1( i ) );
		for( j = 0; j <= pcOldViewScalSei->getNumInitSeqParameterSetMinus1(i); j++)
		  pcNewViewScalSei->setInitSeqParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitSeqParameterSetIdDelta( i, j ) );

		pcNewViewScalSei->setNumInitPicParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitPicParameterSetMinus1( i ) );
		for( j = 0; j <= pcOldViewScalSei->getNumInitPicParameterSetMinus1(i); j++)
		  pcNewViewScalSei->setInitPicParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitPicParameterSetIdDelta( i, j ) );
	  }
	  else if( pcOldViewScalSei->getInitParameterSetsInfoSrcOpIdDelta( i ) )
	  {
		UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getInitParameterSetsInfoSrcOpIdDelta( i );
	    for( j = 0; j< uiNumOps; j++ )
		  if( OldOpId == uiOperationPointId[j] )
		    break;

		if( j == uiNumOps )
		{
		  pcNewViewScalSei->setNumInitSeqParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitSeqParameterSetMinus1( OldOpId ) );
		  for( j = 0; j <= pcOldViewScalSei->getNumInitSeqParameterSetMinus1(OldOpId); j++)
		    pcNewViewScalSei->setInitSeqParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitSeqParameterSetIdDelta( OldOpId, j ) );

		  pcNewViewScalSei->setNumInitPicParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitPicParameterSetMinus1( OldOpId ) );
		  for( j = 0; j <= pcOldViewScalSei->getNumInitPicParameterSetMinus1(OldOpId); j++)
		    pcNewViewScalSei->setInitPicParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitPicParameterSetIdDelta( OldOpId, j ) );
		}
		else
		  pcNewViewScalSei->setInitParameterSetsInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] ); 

	  }
	  else
	    pcNewViewScalSei->setInitParameterSetsInfoSrcOpIdDelta( uiNumNewOps, 0 );

	  uiNumNewOps++;
	}
	
	RNOK( xWriteViewScalSEIToBuffer( pcNewViewScalSei, pcBinData ) );
  }

  return Err::m_nOK;

}

ErrVal
Extractor::xExtractOperationPoints()
{
	UInt  uiOpId	    = m_pcExtractorParameter->getOpId();
    Bool  bApplyToNext  = false;
	Bool  bKeep			= true;
    Bool  bEOS          = false;
	UInt  uiNewNumViews = 0;

	UInt uiViewId[MAX_VIEWS];
	::memset( uiViewId, 0x00, MAX_VIEWS*sizeof(UInt) );

	RNOK( m_pcH264AVCPacketAnalyzer->init() );

	while( ! bEOS )
	{
	  //========== get packet ==============
	  BinData * pcBinData;
	  Bool bWriteBinData = true;

	  RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
	  if( bEOS )
	  {
	    RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
        pcBinData = NULL;
	    continue;
	  }
	  //===== get packet description ======
	  h264::SEI::SEIMessage*  pcSEIMessage = 0;
	  h264::PacketDescription cPacketDescription;
	  RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcSEIMessage ) );
	  if( pcSEIMessage )
	  {
	    if( pcSEIMessage->getMessageType() != h264::SEI::VIEW_SCALABILITY_INFO_SEI )
	       bWriteBinData = false;
   	
		RNOK( xChangeViewScalSEIMessage( pcBinData, pcSEIMessage, uiOpId, uiViewId, &uiNewNumViews ) );
	  }
  	  delete pcSEIMessage;

	  if( bWriteBinData ) 			
	  {
		//============ get packet size ===========
		while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
		{
			RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
		}

		//============ set parameters ===========

		bApplyToNext = cPacketDescription.ApplyToNext;
		if( !cPacketDescription.ParameterSet && cPacketDescription.NalUnitType != NAL_UNIT_SEI)
		{
		  UInt uiView; 
		  for( uiView = 0; uiView < uiNewNumViews; uiView++ )
			if( uiViewId[uiView] == cPacketDescription.ViewId )
				break;
		  if( uiView < uiNewNumViews )
			bKeep = true;
		  else
			bKeep = false;
		}
    
        //============ write and release packet ============
        if( bKeep )
        {
          RNOK( m_pcWriteBitstream->writePacket( &m_cBinDataStartCode ) );
          RNOK( m_pcWriteBitstream->writePacket( pcBinData ) );
        }
      }

	  RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
	}
	
	RNOK( m_pcH264AVCPacketAnalyzer->uninit() );

	return Err::m_nOK;
}


ErrVal
Extractor::xDisplayOperationPoints()
{
    Bool  bEOS = false;
	h264::SEI::ViewScalabilityInfoSei*  pcViewScalInfoSei = 0;

	RNOK( m_pcH264AVCPacketAnalyzer->init() );
    BinData * pcBinData;
	RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
	if( bEOS )
	{
	  RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
	  return Err::m_nERR;
	}
	//========== initialize (View Scal Info SEI message shall be the first packet of the stream) ===========
	h264::SEI::SEIMessage*  pcSEIMessage = 0;
	h264::PacketDescription cPacketDescription;
	RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcSEIMessage ) );
    if( pcSEIMessage->getMessageType() != h264::SEI::VIEW_SCALABILITY_INFO_SEI )
	{
 	  printf("No View Scalability Info SEI Message!\n\nExtractor exit.\n\n");
	  exit(0);
	}

	pcViewScalInfoSei = (h264::SEI::ViewScalabilityInfoSei* )pcSEIMessage;
	
	UInt uiNumOperationPoints = pcViewScalInfoSei->getNumOperationPointsMinus1() + 1;
	printf("\nTotal number of operation points: %d\n", uiNumOperationPoints);
	for( UInt i = 0; i < uiNumOperationPoints; i++ )
	{
	  printf("\nNO.%d of opertion points: \n", i);
	
	  UInt uiOperationPointId = pcViewScalInfoSei->getOperationPointId(i);
	  printf("Operation Point Id: %d\n", uiOperationPointId);

	  UInt uiPriorityId = pcViewScalInfoSei->getPriorityId(i);
	  printf("Priority Id: %d\n", uiPriorityId);

	  UInt uiTemporalId = pcViewScalInfoSei->getTemporalId(i);
	  printf("Temporal Id: %d\n", uiTemporalId);

	  UInt uiNumActiveViewsMinus1 = pcViewScalInfoSei->getNumActiveViewsMinus1(i);
	  printf("Number of active views: %d\n", uiNumActiveViewsMinus1+1);
	  for( UInt j = 0; j <= uiNumActiveViewsMinus1; j++ )
	  {
	    UInt viewid = pcViewScalInfoSei->getViewId( i, j );
		printf("View_Id[%d]: %d\n", j, viewid);
	  }
	  
	  if( pcViewScalInfoSei->getProfileLevelInfoPresentFlag(i) )
	  {
		printf( "Op Profile Idc: %d\n", pcViewScalInfoSei->getOpProfileIdc(i) );
		printf( "Op Constraint Set0 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet0Flag(i) );
		printf( "Op Constraint Set1 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet1Flag(i) );
		printf( "Op Constraint Set2 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet2Flag(i) );
		printf( "Op Constraint Set3 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet3Flag(i) );
		printf( "Op Level Idc: %d\n", pcViewScalInfoSei->getOpLevelIdc(i) );
	  }
	  else if( pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta(i) )
	  {
	    UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta(i);
		printf( "The profile and level information is the same as that of the operation point id %d\n", uiRefOpId );
	  }
	  else
	    printf("No profile and level information.\n");

	  if( pcViewScalInfoSei->getBitRateInfoPresentFlag(i) )
	  {
		printf( "Avg Bitrate: %d\n", pcViewScalInfoSei->getAvgBitrate(i) );
		printf( "Max Bitrate: %d\n", pcViewScalInfoSei->getMaxBitrate(i) );
		printf( "Max Bitrate Calc Window: %d\n", pcViewScalInfoSei->getMaxBitrateCalcWindow(i) );
      }
	  else
	    printf("No bitrate information.\n");

	  if( pcViewScalInfoSei->getFrmRateInfoPresentFlag(i) )
	  {
		printf( "Constant Frame rate Idc: %d\n", pcViewScalInfoSei->getConstantFrmRateIdc(i) );
		printf( "Avg Frame rate: %d\n", pcViewScalInfoSei->getAvgFrmRate(i) );
	  }
	  else if( pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela(i) )
	  {
	    UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela(i);
		printf( "The frame rate information is the same as that of the operation point id %d\n", uiRefOpId );
	  }
	  else
	    printf("No frame rate information.\n");

	  if( pcViewScalInfoSei->getOpDependencyInfoPresentFlag(i) )
	  {
	    UInt uiNumDirectlyDependentOps = pcViewScalInfoSei->getNumDirectlyDependentOps(i);
		printf("Number of Directly Dependent Operation points: %d\n", uiNumDirectlyDependentOps);
		for( UInt j = 0; j < uiNumDirectlyDependentOps; j++ )
		{
		  UInt uiOpId = uiOperationPointId - pcViewScalInfoSei->getDirectlyDependentOpIdDeltaMinus1(i, j) - 1;
		  printf("NO%d of the dependent operation points(operation point id): %d\n", j+1, uiOpId);
		}
	  }
	  else if( pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta(i) )
	  {
	    UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta(i);
		printf( "The OpDependency information is the same as that of the operation point id %d\n", uiRefOpId );
	  }
	  else
	    printf("No OpDependency information.\n");

	  if( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag(i) )
	  {
	    UInt uiNumInitSeqParameterSetMinus1 = pcViewScalInfoSei->getNumInitSeqParameterSetMinus1(i);
		printf("Number of SPS required: %d\n", uiNumInitSeqParameterSetMinus1+1 );
		for( UInt j = 0; j <= uiNumInitSeqParameterSetMinus1; j++ )
			printf("NO%d of the SPS required: %d\n", j, pcViewScalInfoSei->getInitSeqParameterSetIdDelta(i,j));

		UInt uiNumInitPicParameterSetMinus1 = pcViewScalInfoSei->getNumInitPicParameterSetMinus1(i);
		printf("Number of PPS required: %d\n", uiNumInitPicParameterSetMinus1+1 );
		for( UInt j = 0; j <= uiNumInitPicParameterSetMinus1; j++ )
			printf("NO%d of the PPS required: %d\n", j, pcViewScalInfoSei->getInitPicParameterSetIdDelta(i,j));
	  }
	  else if( pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta(i) )
	  {
	    UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta(i);
		printf( "The SPS/PPS required information is the same as that of the operation point id %d\n", uiRefOpId );
	  }
	  else
	    printf("No SPS/PPS required information.\n\n");
    
	}
	delete pcSEIMessage;

	RNOK( m_pcH264AVCPacketAnalyzer->uninit() );

	//----- reset input file -----
	RNOKS( static_cast<ReadBitstreamFile*>(m_pcReadBitstream)->uninit() );
    RNOKS( static_cast<ReadBitstreamFile*>(m_pcReadBitstream)->init  ( m_pcExtractorParameter->getInFile() ) );

    return Err::m_nOK;
}

⌨️ 快捷键说明

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