sei.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,519 行 · 第 1/5 页

CPP
1,519
字号
	  }

	  if( m_uiInitPicParameterSetIdDelta[i] != NULL )
	  {
	    free( m_uiInitPicParameterSetIdDelta[i] );
		m_uiInitPicParameterSetIdDelta[i] = NULL;
	  }
	}
}

ErrVal
SEI::ViewScalabilityInfoSei::create( ViewScalabilityInfoSei*& rpcSeiMessage )
{
	rpcSeiMessage = new ViewScalabilityInfoSei();
	ROT( NULL == rpcSeiMessage )
		return Err::m_nOK;
}

ErrVal
SEI::ViewScalabilityInfoSei::destroy()
{
	delete this;
	return Err::m_nOK;
}

ErrVal
SEI::ViewScalabilityInfoSei::write( HeaderSymbolWriteIf *pcWriteIf )
{
  UInt i=0,j=0;

  RNOK( pcWriteIf->writeUvlc( m_uiNumOperationPointsMinus1, "ViewScalabilityInfoSei: num_operation_points_minus1" ) );

  for( i = 0; i <= m_uiNumOperationPointsMinus1; i++ )
  {
	RNOK( pcWriteIf->writeUvlc( m_uiOperationPointId[i], "ViewScalabilityInfoSei: operation_point_id" ) );
	RNOK( pcWriteIf->writeCode( m_uiPriorityId[i], 5, "ViewScalabilityInfoSei: priority_id" ) );
	RNOK( pcWriteIf->writeCode( m_uiTemporalId[i], 3, "ViewScalabilityInfoSei: temporal_id" ) );
	RNOK( pcWriteIf->writeUvlc( m_uiNumActiveViewsMinus1[i], "ViewScalabilityInfoSei: num_active_views_minus1" ) );

	for( j = 0; j <= m_uiNumActiveViewsMinus1[i]; j++ )
	{
	  RNOK( pcWriteIf->writeUvlc( m_uiViewId[i][j], "ViewScalabilityInfoSei: view_id" ) );
	}

	RNOK( pcWriteIf->writeFlag( m_bProfileLevelInfoPresentFlag[i], "ViewScalabilityInfoSei: profile_level_info_present_flag" ) );
	RNOK( pcWriteIf->writeFlag( m_bBitRateInfoPresentFlag[i], "ViewScalabilityInfoSei: bitrate_info_present_flag" ) );
	RNOK( pcWriteIf->writeFlag( m_bFrmRateInfoPresentFlag[i], "ViewScalabilityInfoSei: frm_rate_info_present_flag" ) );
	RNOK( pcWriteIf->writeFlag( m_bOpDependencyInfoPresentFlag[i], "ViewScalabilityInfoSei: op_dependency_info_present_flag" ) );
	RNOK( pcWriteIf->writeFlag( m_bInitParameterSetsInfoPresentFlag[i], "ViewScalabilityInfoSei: init_parameter_sets_info_present_flag" ) );

	if( m_bProfileLevelInfoPresentFlag[i] )
	{
	  RNOK( pcWriteIf->writeCode( m_uiOpProfileIdc[i], 8, "ViewScalabilityInfoSei: op_profile_idc" ) );
	  RNOK( pcWriteIf->writeFlag( m_bOpConstraintSet0Flag[i], "ViewScalabilityInfoSei: op_constraint_set0_flag" ) );
	  RNOK( pcWriteIf->writeFlag( m_bOpConstraintSet1Flag[i], "ViewScalabilityInfoSei: op_constraint_set1_flag" ) );
	  RNOK( pcWriteIf->writeFlag( m_bOpConstraintSet2Flag[i], "ViewScalabilityInfoSei: op_constraint_set2_flag" ) );
	  RNOK( pcWriteIf->writeFlag( m_bOpConstraintSet3Flag[i], "ViewScalabilityInfoSei: op_constraint_set3_flag" ) );
	  RNOK( pcWriteIf->writeCode( 0, 4, "ViewScalabilityInfoSei: reserved_zero_4bits" ) );
	  RNOK( pcWriteIf->writeCode( m_uiOpLevelIdc[i], 8, "ViewScalabilityInfoSei: op_level_idc" ) );
	}
	else
	  RNOK( pcWriteIf->writeUvlc( m_uiProfileLevelInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: profile_level_info_src_op_id_delta" ) );
	
	if( m_bBitRateInfoPresentFlag[i] )
	{
	  RNOK( pcWriteIf->writeCode( m_uiAvgBitrate[i], 16, "ViewScalabilityInfoSei: avg_bitrate" ) );
	  RNOK( pcWriteIf->writeCode( m_uiMaxBitrate[i], 16, "ViewScalabilityInfoSei: max_bitrate" ) );
	  RNOK( pcWriteIf->writeCode( m_uiMaxBitrateCalcWindow[i], 16, "ViewScalabilityInfoSei: max_bitrate_calc_window" ) );
	}

	if( m_bFrmRateInfoPresentFlag[i] )
	{
	  RNOK( pcWriteIf->writeCode( m_uiConstantFrmRateIdc[i], 2, "ViewScalabilityInfoSei: constant_frm_rate_idc" ) );
	  RNOK( pcWriteIf->writeCode( m_uiAvgFrmRate[i], 16, "ViewScalabilityInfoSei: avg_frm_rate" ) );
	}
	else
	  RNOK( pcWriteIf->writeUvlc( m_uiFrmRateInfoSrcOpIdDela[i], "ViewScalabilityInfoSei: frm_rate_info_src_op_id_delta" ) );

	if( m_bOpDependencyInfoPresentFlag[i] )
	{
	  RNOK( pcWriteIf->writeUvlc( m_uiNumDirectlyDependentOps[i], "ViewScalabilityInfoSei: num_directly_dependent_ops" ) );
	  for( j = 0; j < m_uiNumDirectlyDependentOps[i]; j++ )
	    RNOK( pcWriteIf->writeUvlc( m_uiDirectlyDependentOpIdDeltaMinus1[i][j], "ViewScalabilityInfoSei: directly_dependent_op_id_delta_minus1" ) );
	}
	else
	  RNOK( pcWriteIf->writeUvlc( m_uiOpDependencyInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: op_dependency_info_src_op_id_delta" ) );

	if( m_bInitParameterSetsInfoPresentFlag[i] )
	{
	  RNOK( pcWriteIf->writeUvlc( m_uiNumInitSeqParameterSetMinus1[i], "ViewScalabilityInfoSei: num_init_seq_parameter_set_minus1" ) );
	  for( j = 0; j <= m_uiNumInitSeqParameterSetMinus1[i]; j++ )
	    RNOK( pcWriteIf->writeUvlc( m_uiInitSeqParameterSetIdDelta[i][j], "ViewScalabilityInfoSei: init_seq_parameter_set_id_delta" ) );

	  RNOK( pcWriteIf->writeUvlc( m_uiNumInitPicParameterSetMinus1[i], "ViewScalabilityInfoSei: num_init_pic_parameter_set_minus1" ) );
	  for( j = 0; j <= m_uiNumInitPicParameterSetMinus1[i]; j++ )
	    RNOK( pcWriteIf->writeUvlc( m_uiInitPicParameterSetIdDelta[i][j], "ViewScalabilityInfoSei: init_pic_parameter_set_id_delta" ) );
	}
	else
	  RNOK( pcWriteIf->writeUvlc( m_uiInitParameterSetsInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: init_parameter_sets_info_src_op_id_delta" ) );
  }
  return Err::m_nOK;

}

ErrVal
SEI::ViewScalabilityInfoSei::read( HeaderSymbolReadIf *pcReadIf )
{
  UInt i=0,j=0;
  UInt ReservedBit;

  RNOK( pcReadIf->getUvlc( m_uiNumOperationPointsMinus1, "ViewScalabilityInfoSei: num_operation_points_minus1" ) );

  for( i = 0; i <= m_uiNumOperationPointsMinus1; i++ )
  {
	RNOK( pcReadIf->getUvlc( m_uiOperationPointId[i], "ViewScalabilityInfoSei: operation_point_id" ) );
	RNOK( pcReadIf->getCode( m_uiPriorityId[i], 5, "ViewScalabilityInfoSei: priority_id" ) );
	RNOK( pcReadIf->getCode( m_uiTemporalId[i], 3, "ViewScalabilityInfoSei: temporal_id" ) );
	RNOK( pcReadIf->getUvlc( m_uiNumActiveViewsMinus1[i], "ViewScalabilityInfoSei: num_active_views_minus1" ) );

	if( m_uiViewId[i] != NULL )
	  free( m_uiViewId[i] );
	m_uiViewId[i] = (UInt*)malloc( ( m_uiNumActiveViewsMinus1[i]+1 )*sizeof(UInt) );

	for( j = 0; j <= m_uiNumActiveViewsMinus1[i]; j++ )
	{
	  RNOK( pcReadIf->getUvlc( m_uiViewId[i][j], "ViewScalabilityInfoSei: view_id" ) );
	}

	RNOK( pcReadIf->getFlag( m_bProfileLevelInfoPresentFlag[i], "ViewScalabilityInfoSei: profile_level_info_present_flag" ) );
	RNOK( pcReadIf->getFlag( m_bBitRateInfoPresentFlag[i], "ViewScalabilityInfoSei: bitrate_info_present_flag" ) );
	RNOK( pcReadIf->getFlag( m_bFrmRateInfoPresentFlag[i], "ViewScalabilityInfoSei: frm_rate_info_present_flag" ) );
	RNOK( pcReadIf->getFlag( m_bOpDependencyInfoPresentFlag[i], "ViewScalabilityInfoSei: op_dependency_info_present_flag" ) );
	RNOK( pcReadIf->getFlag( m_bInitParameterSetsInfoPresentFlag[i], "ViewScalabilityInfoSei: init_parameter_sets_info_present_flag" ) );

	if( m_bProfileLevelInfoPresentFlag[i] )
	{
	  RNOK( pcReadIf->getCode( m_uiOpProfileIdc[i], 8, "ViewScalabilityInfoSei: op_profile_idc" ) );
	  RNOK( pcReadIf->getFlag( m_bOpConstraintSet0Flag[i], "ViewScalabilityInfoSei: op_constraint_set0_flag" ) );
	  RNOK( pcReadIf->getFlag( m_bOpConstraintSet1Flag[i], "ViewScalabilityInfoSei: op_constraint_set1_flag" ) );
	  RNOK( pcReadIf->getFlag( m_bOpConstraintSet2Flag[i], "ViewScalabilityInfoSei: op_constraint_set2_flag" ) );
	  RNOK( pcReadIf->getFlag( m_bOpConstraintSet3Flag[i], "ViewScalabilityInfoSei: op_constraint_set3_flag" ) );
	  RNOK( pcReadIf->getCode( ReservedBit, 4, "ViewScalabilityInfoSei: reserved_zero_4bits" ) );
	  RNOK( pcReadIf->getCode( m_uiOpLevelIdc[i], 8, "ViewScalabilityInfoSei: op_level_idc" ) );
	}
	else
	  RNOK( pcReadIf->getUvlc( m_uiProfileLevelInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: profile_level_info_src_op_id_delta" ) );
	
	if( m_bBitRateInfoPresentFlag[i] )
	{
	  RNOK( pcReadIf->getCode( m_uiAvgBitrate[i], 16, "ViewScalabilityInfoSei: avg_bitrate" ) );
	  RNOK( pcReadIf->getCode( m_uiMaxBitrate[i], 16, "ViewScalabilityInfoSei: max_bitrate" ) );
	  RNOK( pcReadIf->getCode( m_uiMaxBitrateCalcWindow[i], 16, "ViewScalabilityInfoSei: max_bitrate_calc_window" ) );
	}

	if( m_bFrmRateInfoPresentFlag[i] )
	{
	  RNOK( pcReadIf->getCode( m_uiConstantFrmRateIdc[i], 2, "ViewScalabilityInfoSei: constant_frm_rate_idc" ) );
	  RNOK( pcReadIf->getCode( m_uiAvgFrmRate[i], 16, "ViewScalabilityInfoSei: avg_frm_rate" ) );
	}
	else
	  RNOK( pcReadIf->getUvlc( m_uiFrmRateInfoSrcOpIdDela[i], "ViewScalabilityInfoSei: frm_rate_info_src_op_id_delta" ) );

	if( m_bOpDependencyInfoPresentFlag[i] )
	{
	  RNOK( pcReadIf->getUvlc( m_uiNumDirectlyDependentOps[i], "ViewScalabilityInfoSei: num_directly_dependent_ops" ) );

	  if( m_uiDirectlyDependentOpIdDeltaMinus1[i] != NULL )
	    free( m_uiDirectlyDependentOpIdDeltaMinus1[i] );
	  m_uiDirectlyDependentOpIdDeltaMinus1[i] = (UInt*)malloc( ( m_uiNumDirectlyDependentOps[i]+1 ) * sizeof(UInt) );

	  for( j = 0; j < m_uiNumDirectlyDependentOps[i]; j++ )
	    RNOK( pcReadIf->getUvlc( m_uiDirectlyDependentOpIdDeltaMinus1[i][j], "ViewScalabilityInfoSei: directly_dependent_op_id_delta_minus1" ) );
	}
	else
	  RNOK( pcReadIf->getUvlc( m_uiOpDependencyInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: op_dependency_info_src_op_id_delta" ) );

	if( m_bInitParameterSetsInfoPresentFlag[i] )
	{
	  RNOK( pcReadIf->getUvlc( m_uiNumInitSeqParameterSetMinus1[i], "ViewScalabilityInfoSei: num_init_seq_parameter_set_minus1" ) );

	  if( m_uiInitSeqParameterSetIdDelta[i] != NULL )
	    free( m_uiInitSeqParameterSetIdDelta[i] );
	  m_uiInitSeqParameterSetIdDelta[i] = (UInt*)malloc( ( m_uiNumInitSeqParameterSetMinus1[i]+1 ) * sizeof(UInt) );

	  for( j = 0; j <= m_uiNumInitSeqParameterSetMinus1[i]; j++ )
	    RNOK( pcReadIf->getUvlc( m_uiInitSeqParameterSetIdDelta[i][j], "ViewScalabilityInfoSei: init_seq_parameter_set_id_delta" ) );

	  RNOK( pcReadIf->getUvlc( m_uiNumInitPicParameterSetMinus1[i], "ViewScalabilityInfoSei: num_init_pic_parameter_set_minus1" ) );

	  if( m_uiInitPicParameterSetIdDelta[i] != NULL )
	    free( m_uiInitPicParameterSetIdDelta[i] );
	  m_uiInitPicParameterSetIdDelta[i] = (UInt*)malloc( ( m_uiNumInitPicParameterSetMinus1[i]+1 ) * sizeof(UInt) );

	  for( j = 0; j <= m_uiNumInitPicParameterSetMinus1[i]; j++ )
	    RNOK( pcReadIf->getUvlc( m_uiInitPicParameterSetIdDelta[i][j], "ViewScalabilityInfoSei: init_pic_parameter_set_id_delta" ) );
	}
	else
	  RNOK( pcReadIf->getUvlc( m_uiInitParameterSetsInfoSrcOpIdDelta[i], "ViewScalabilityInfoSei: init_parameter_sets_info_src_op_id_delta" ) );
  }
  return Err::m_nOK;

}
//JVT-W035 {
//////////////////////////////////////////////////////////////////////////
//
//			SCALABLE NESTING SEI
//
//////////////////////////////////////////////////////////////////////////
ErrVal
SEI::ScalableNestingSei::create( ScalableNestingSei* &rpcSeiMessage )
{
    rpcSeiMessage = new ScalableNestingSei();
	ROT( NULL == rpcSeiMessage );
	return Err::m_nOK;
}
ErrVal
SEI::ScalableNestingSei::destroy()
{
    delete this;
	return Err::m_nOK;
}

ErrVal
SEI::ScalableNestingSei::write( HeaderSymbolWriteIf *pcWriteIf )
{
    UInt uiStartBits  = pcWriteIf->getNumberOfWrittenBits();
	UInt uiPayloadSize = 0;
	UInt uiIndex;
	RNOK( pcWriteIf->writeFlag( m_bAllPicturesInAuFlag, " ScalableNestingSei:AllPicturesInAuFlag " ) );
	if( m_bAllPicturesInAuFlag == 0 )
	{
		RNOK( pcWriteIf->writeUvlc( m_uiNumPicturesMinus1, "ScalableNestingSei:NumPicturesMinus1" ) );
		for( uiIndex = 0; uiIndex <= m_uiNumPicturesMinus1; uiIndex++ )
		{
			RNOK( pcWriteIf->writeCode( m_uiPicId[uiIndex], 10, " ScalableNestingSei:uiPicId " ) );
		}
		RNOK( pcWriteIf->writeCode( m_uiTemporalId, 3, " ScalableNestingSei:uiTemporalId " ) );
	}
	UInt uiBits = pcWriteIf->getNumberOfWrittenBits()-uiStartBits;
	UInt uiBitsMod8 = uiBits%8;
	if( uiBitsMod8 )
	{
		RNOK( pcWriteIf->writeCode(0, 8-uiBitsMod8, "SeiNestingZeroBits" ) );
	}
	uiBits = pcWriteIf->getNumberOfWrittenBits();
	uiPayloadSize = (uiBits+7)/8;

	return Err::m_nOK;
}

ErrVal
SEI::ScalableNestingSei::read( HeaderSymbolReadIf *pcReadIf )
{
	RNOK( pcReadIf->getFlag( m_bAllPicturesInAuFlag, " ScalableNestingSei:AllPicturesInAuFlag " ) );
	if( m_bAllPicturesInAuFlag == 0 )
	{
		RNOK( pcReadIf->getUvlc( m_uiNumPicturesMinus1, "ScalableNestingSei:NumPicturesMinus1" ) );
		for( UInt uiIndex = 0; uiIndex <= m_uiNumPicturesMinus1; uiIndex++ )
		{
			RNOK( pcReadIf->getCode( m_uiPicId[uiIndex], 10, " ScalableNestingSei:uiPicId " ) );
		}	
    	RNOK( pcReadIf->getCode( m_uiTemporalId, 3, " ScalableNestingSei:uiTemporalId " ) );
	}
	RNOK( pcReadIf->readZeroByteAlign() ); //nesting_zero_bit

	//Read the following SEI message
	UInt uiType, uiPayloadSize;
	while(1)
	{
		RNOK( pcReadIf->getCode( uiType, 8, " ScalableNestingSei:SEI type" ) );
		if( uiType != 0xff )
			break;
	}
	while(1)
	{
		RNOK( pcReadIf->getCode( uiPayloadSize, 8, " ScalableNestingSei:SEI payloadSize" ) );
		if( uiPayloadSize != 0xff )
			break;
	}
	switch( uiType )
	{
	case FULLFRAME_SNAPSHOT_SEI:
		{
			SEI::FullframeSnapshotSei* pcFullframeSnapshotSei;
			RNOK( SEI::FullframeSnapshotSei::create(pcFullframeSnapshotSei) );
			RNOK( pcFullframeSnapshotSei->read(pcReadIf) );			
			m_pcSEIMessage = pcFullframeSnapshotSei;
		//	RNOK( pcFullframeSnapshotSei->destroy() );  
			break;
		}
	//more case can be added here
	default:
		break;
	}

	return Err::m_nOK;
}

//Full Frame Snapshot sei message, simplified
ErrVal
SEI::FullframeSnapshotSei::create( FullframeSnapshotSei* &rpcSeiMessage )
{
    rpcSeiMessage = new FullframeSnapshotSei();
	ROT( NULL == rpcSeiMessage );

⌨️ 快捷键说明

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