sei.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,519 行 · 第 1/5 页
CPP
1,519 行
ErrVal
//SEI::xRead( HeaderSymbolReadIf* pcReadIf,
// SEIMessage*& rpcSEIMessage)
SEI::xRead( HeaderSymbolReadIf* pcReadIf,
SEIMessage*& rpcSEIMessage /*, UInt NumViewsMinus1 */) // SEI JVT-W060 Nov. 30
{
MessageType eMessageType = RESERVED_SEI;
UInt uiSize = 0;
RNOK( xReadPayloadHeader( pcReadIf, eMessageType, uiSize) );
RNOK( xCreate( rpcSEIMessage, eMessageType, uiSize ) )
// rpcSEIMessage->NumOfViewMinus1 = NumViewsMinus1; // SEI JVT-W060 Nov. 30
//JVT-W080, omit parsing
if( eMessageType == PARALLEL_DEC_SEI )
{
ParallelDecodingSEI* pcPdSEI = (ParallelDecodingSEI*)rpcSEIMessage;
return Err::m_nOK;
}
//~JVT-W080
RNOK( rpcSEIMessage->read( pcReadIf ) );
RNOK( pcReadIf->readByteAlign() );
return Err::m_nOK;
}
ErrVal
SEI::xWrite( HeaderSymbolWriteIf* pcWriteIf,
HeaderSymbolWriteIf* pcWriteTestIf,
SEIMessage* pcSEIMessage )
{
UInt uiStart = pcWriteTestIf->getNumberOfWrittenBits();
RNOK( pcSEIMessage->write( pcWriteTestIf ) );
UInt uiBits = pcWriteTestIf->getNumberOfWrittenBits() - uiStart;
UInt uiSize = (uiBits+7)/8;
RNOK( xWritePayloadHeader( pcWriteIf, pcSEIMessage->getMessageType(), uiSize ) );
RNOK( pcSEIMessage->write( pcWriteIf ) );
UInt uiAlignedBits = 8 - (uiBits&7);
if( uiAlignedBits != 0 && uiAlignedBits != 8)
{
RNOK( pcWriteIf->writeCode( 1<<(uiAlignedBits-1), uiAlignedBits, "SEI: alignment_bits" ) );
}
return Err::m_nOK;
}
ErrVal
SEI::xReadPayloadHeader( HeaderSymbolReadIf* pcReadIf,
MessageType& reMessageType,
UInt& ruiSize)
{
{ // type
UInt uiTemp = 0xFF;
UInt uiSum = 0;
while( 0xFF == uiTemp )
{
RNOK( pcReadIf->getCode( uiTemp, 8, "SEI: payload type") );
uiSum += uiTemp;
}
reMessageType = (RESERVED_SEI <= uiSum ) ? RESERVED_SEI : MessageType( uiSum );
}
{ // size
UInt uiTemp = 0xFF;
UInt uiSum = 0;
while( 0xFF == uiTemp )
{
RNOK( pcReadIf->getCode( uiTemp, 8, "SEI: payload size") );
uiSum += uiTemp;
}
ruiSize = uiSum;
}
return Err::m_nOK;
}
ErrVal
SEI::xCreate( SEIMessage*& rpcSEIMessage,
MessageType eMessageType,
UInt uiSize )
{
switch( eMessageType )
{
case SUB_SEQ_INFO: return SubSeqInfo ::create( (SubSeqInfo*&) rpcSEIMessage );
case SCALABLE_SEI: return ScalableSei::create( (ScalableSei*&) rpcSEIMessage );
case SUB_PIC_SEI: return SubPicSei::create ( (SubPicSei*&) rpcSEIMessage );
case MOTION_SEI: return MotionSEI::create( (MotionSEI*&) rpcSEIMessage );
//{{Quality level estimation and modified truncation- JVTO044 and m12007
//France Telecom R&D-(nathalie.cammas@francetelecom.com)
case QUALITYLEVEL_SEI: return QualityLevelSEI::create((QualityLevelSEI*&) rpcSEIMessage);
//}}Quality level estimation and modified truncation- JVTO044 and m12007
case NON_REQUIRED_SEI: return NonRequiredSei::create((NonRequiredSei*&) rpcSEIMessage);
// JVT-S080 LMI {
case SCALABLE_SEI_LAYERS_NOT_PRESENT: return ScalableSeiLayersNotPresent::create( (ScalableSeiLayersNotPresent*&) rpcSEIMessage );
case SCALABLE_SEI_DEPENDENCY_CHANGE: return ScalableSeiDependencyChange::create( (ScalableSeiDependencyChange*&) rpcSEIMessage );
// JVT-S080 LMI }
case SCALABLE_NESTING_SEI: return ScalableNestingSei::create( (ScalableNestingSei*&) rpcSEIMessage ); // SEI
case ACTIVE_VIEWINFO_SEI: return ActiveViewInfoSei::create( (ActiveViewInfoSei*&) rpcSEIMessage ); //SEI
case VIEW_SCALABILITY_INFO_SEI: return ViewScalabilityInfoSei ::create( (ViewScalabilityInfoSei*&) rpcSEIMessage ); //SEI
case MULTIVIEW_SCENE_INFO_SEI: return MultiviewSceneInfoSei::create( (MultiviewSceneInfoSei*&) rpcSEIMessage ); //SEI JVT-W060
case MULTIVIEW_ACQUISITION_INFO_SEI: return MultiviewAcquisitionInfoSei::create( (MultiviewAcquisitionInfoSei*&) rpcSEIMessage ); //SEI JVT-W060
//JVT-W080
case PARALLEL_DEC_SEI: return ParallelDecodingSEI::create(( ParallelDecodingSEI*&) rpcSEIMessage );
//~JVT-W080
default : return ReservedSei::create( (ReservedSei*&) rpcSEIMessage, uiSize );
}
//return Err::m_nOK;
}
ErrVal
SEI::xWritePayloadHeader( HeaderSymbolWriteIf* pcWriteIf,
MessageType eMessageType,
UInt uiSize )
{
{ // type
UInt uiTemp = eMessageType;
UInt uiByte = 0xFF;
while( 0xFF == uiByte )
{
uiByte = (0xFF > uiTemp) ? uiTemp : 0xff;
uiTemp -= 0xFF;
RNOK( pcWriteIf->writeCode( uiByte, 8, "SEI: payload type") );
}
}
{ // size
UInt uiTemp = uiSize;
UInt uiByte = 0xFF;
while( 0xFF == uiByte )
{
uiByte = (0xFF > uiTemp) ? uiTemp : 0xff;
uiTemp -= 0xFF;
RNOK( pcWriteIf->writeCode( uiByte, 8, "SEI: payload size") );
}
}
return Err::m_nOK;
}
ErrVal
SEI::ReservedSei::create( ReservedSei*& rpcReservedSei,
UInt uiSize )
{
rpcReservedSei = new ReservedSei (uiSize);
ROT( NULL == rpcReservedSei );
return Err::m_nOK;
}
ErrVal
SEI::ReservedSei::write( HeaderSymbolWriteIf* pcWriteIf )
{
AF();
return Err::m_nOK;
}
ErrVal
SEI::ReservedSei::read( HeaderSymbolReadIf* pcReadIf )
{
AF();
return Err::m_nOK;
}
//////////////////////////////////////////////////////////////////////////
//
// S U B S E Q U E N C E S E I
//
//////////////////////////////////////////////////////////////////////////
ErrVal
SEI::SubSeqInfo::create( SubSeqInfo*& rpcSEIMessage )
{
SubSeqInfo* pcSubSeqInfo = new SubSeqInfo();
rpcSEIMessage = pcSubSeqInfo;
ROT( NULL == rpcSEIMessage )
return Err::m_nOK;
}
ErrVal
SEI::SubSeqInfo::write( HeaderSymbolWriteIf* pcWriteIf )
{
RNOK( pcWriteIf->writeUvlc( m_uiSubSeqLayerNum, "SubSeqSEI: sub_seq_layer_num") );
RNOK( pcWriteIf->writeUvlc( m_uiSubSeqId, "SubSeqSEI: sub_seq_layer_id") );
RNOK( pcWriteIf->writeFlag( m_bFirstRefPicFlag, "SubSeqSEI: first_ref_pic_flag" ) );
RNOK( pcWriteIf->writeFlag( m_bLeadingNonRefPicFlag, "SubSeqSEI: leading_non_ref_pic_flag" ) );
RNOK( pcWriteIf->writeFlag( m_bLastPicFlag, "SubSeqSEI: last_pic_flag" ) );
RNOK( pcWriteIf->writeFlag( m_bSubSeqFrameNumFlag, "SubSeqSEI: sub_seq_frame_num_flag" ) );
if( m_bSubSeqFrameNumFlag )
{
RNOK( pcWriteIf->writeUvlc( m_uiSubSeqFrameNum, "SubSeqSEI: sub_seq_frame_num") );
}
return Err::m_nOK;
}
ErrVal
SEI::SubSeqInfo::read ( HeaderSymbolReadIf* pcReadIf )
{
RNOK( pcReadIf->getUvlc( m_uiSubSeqLayerNum, "SubSeqSEI: sub_seq_layer_num") );
RNOK( pcReadIf->getUvlc( m_uiSubSeqId, "SubSeqSEI: sub_seq_layer_id") );
RNOK( pcReadIf->getFlag( m_bFirstRefPicFlag, "SubSeqSEI: first_ref_pic_flag" ) );
RNOK( pcReadIf->getFlag( m_bLeadingNonRefPicFlag, "SubSeqSEI: leading_non_ref_pic_flag" ) );
RNOK( pcReadIf->getFlag( m_bLastPicFlag, "SubSeqSEI: last_pic_flag" ) );
RNOK( pcReadIf->getFlag( m_bSubSeqFrameNumFlag, "SubSeqSEI: sub_seq_frame_num_flag" ) );
if( m_bSubSeqFrameNumFlag )
{
RNOK( pcReadIf->getUvlc( m_uiSubSeqFrameNum, "SubSeqSEI: sub_seq_frame_num") );
}
return Err::m_nOK;
}
ErrVal
SEI::SubSeqInfo::init( UInt uiSubSeqLayerNum,
UInt uiSubSeqId,
Bool bFirstRefPicFlag,
Bool bLeadingNonRefPicFlag,
Bool bLastPicFlag,
Bool bSubSeqFrameNumFlag,
UInt uiSubSeqFrameNum )
{
m_uiSubSeqLayerNum = uiSubSeqLayerNum;
m_uiSubSeqId = uiSubSeqId;
m_bFirstRefPicFlag = bFirstRefPicFlag;
m_bLeadingNonRefPicFlag = bLeadingNonRefPicFlag;
m_bLastPicFlag = bLastPicFlag;
m_bSubSeqFrameNumFlag = bSubSeqFrameNumFlag;
m_uiSubSeqFrameNum = uiSubSeqFrameNum;
return Err::m_nOK;
}
//////////////////////////////////////////////////////////////////////////
//
// S C A L A B L E S E I
//
//////////////////////////////////////////////////////////////////////////
SEI::ScalableSei::ScalableSei ()
: SEIMessage ( SCALABLE_SEI )
, m_num_layers_minus1 ( 0 )
{
::memset( m_layer_id, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
// ::memset( m_fgs_layer_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) ); //JVT-S036
::memset( m_sub_pic_layer_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_sub_region_layer_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_iroi_slice_division_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) ); //JVT-S036
::memset( m_profile_level_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_bitrate_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_frm_rate_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_frm_size_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_layer_dependency_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_init_parameter_sets_info_present_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_exact_interlayer_pred_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) ); //JVT-S036
::memset( m_layer_profile_idc, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
::memset( m_layer_constraint_set0_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_layer_constraint_set1_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_layer_constraint_set2_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_layer_constraint_set3_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );
::memset( m_layer_level_idc, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
//JVT-S036 start
::memset( m_profile_level_info_src_layer_id_delta, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );//
::memset( m_simple_priority_id, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );//
::memset( m_discardable_flag, 0x00, MAX_SCALABLE_LAYERS*sizeof(Bool) );//
::memset( m_temporal_level, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
::memset( m_dependency_id, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
::memset( m_quality_level, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
::memset( m_avg_bitrate, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );
::memset( m_max_bitrate_layer, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );//
::memset( m_max_bitrate_decoded_picture, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );//
::memset( m_max_bitrate_calc_window, 0x00, MAX_SCALABLE_LAYERS*sizeof(UInt) );//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?