📄 sei.cpp
字号:
uiStart = pcWriteTestIf->getNumberOfWrittenBits();
RNOK( pcTop->write( pcWriteTestIf ) );
uiBits = pcWriteTestIf->getNumberOfWrittenBits() - uiStart;
AOT( (uiBits & 7) > 0 );
uiSize += (uiBits>>3); // Scalable Nesting Sei Payload Size
//Then write actual SEI message
uiStart = pcWriteIf->getNumberOfWrittenBits();
RNOK( xWritePayloadHeader( pcWriteIf, SCALABLE_NESTING_SEI, uiSize ) );
RNOK( pcTop->write( pcWriteIf ) );
RNOK( xWritePayloadHeader( pcWriteIf, pcBottom->getMessageType(), uiNestedSeiSize ) );
RNOK( pcBottom->write( pcWriteIf ) );
uiBits = pcWriteIf->getNumberOfWrittenBits() - uiStart;
UInt uiAlignedBits = 8 - (uiBits&7);
if( uiAlignedBits != 0 && uiAlignedBits != 8)
{
RNOK( pcWriteIf->writeCode( 1<<(uiAlignedBits-1), uiAlignedBits, "SEI: alignment_bits" ) );
}
delete pcTop;
delete pcBottom;
return Err::m_nOK;
}
// JVT-V068 }
ErrVal
SEI::xRead( HeaderSymbolReadIf* pcReadIf,
SEIMessage*& rpcSEIMessage
// JVT-V068 {
,ParameterSetMng* pcParameterSetMng
// JVT-V068 }
)
{
MessageType eMessageType = RESERVED_SEI;
UInt uiSize = 0;
RNOK( xReadPayloadHeader( pcReadIf, eMessageType, uiSize) );
// special handling for bit stream extractor
if( pcParameterSetMng == 0 && ( eMessageType == PIC_TIMING || eMessageType == BUFFERING_PERIOD ) )
{
RNOK( xCreate( rpcSEIMessage, eMessageType, pcParameterSetMng, uiSize ) );
UInt uiDummy;
while (uiSize--)
{
pcReadIf->getCode(uiDummy, 8, "SEI: Byte ignored.");
}
RNOK( pcReadIf->readByteAlign() );
return Err::m_nOK;
}
RNOK( xCreate( rpcSEIMessage, eMessageType, pcParameterSetMng, uiSize ) )
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;
}
// JVT-T073 {
ErrVal
SEI::xWriteNesting( HeaderSymbolWriteIf* pcWriteIf,
HeaderSymbolWriteIf* pcWriteTestIf,
SEIMessage* pcSEIMessage,
UInt& uiBits )
{
UInt uiStart = uiBits;
if( uiBits == 0 ) // write the following SEI message
{
uiBits += 16; //including SEI_type and SEI_payload_size bits, can be changed here for type>0xff
RNOK( pcSEIMessage->write( pcWriteTestIf ) );
uiBits = pcWriteTestIf->getNumberOfWrittenBits() - uiStart;
if( uiBits/8 >0xff )
uiBits += 8;
return Err::m_nOK;
}
else
{
RNOK( pcSEIMessage->write( pcWriteTestIf ) );
uiBits = pcWriteTestIf->getNumberOfWrittenBits();
return Err::m_nOK;
}
}
// JVT-T073 }
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,
// JVT-V068 {
ParameterSetMng*& rpcParameterSetMng,
// JVT-V068 }
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);//SEI changes update
case PRIORITYLEVEL_SEI: return PriorityLevelSEI::create((PriorityLevelSEI*&) rpcSEIMessage);//SEI changes update
//}}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 }
// JVT-W062
case TL0_DEP_REP_IDX_SEI: return Tl0DepRepIdxSei::create( (Tl0DepRepIdxSei*&) rpcSEIMessage);
// JVT-T073 {
case SCALABLE_NESTING_SEI: return ScalableNestingSei::create( (ScalableNestingSei*&) rpcSEIMessage );
// JVT-T073 }
// JVT-V068 {
case AVC_COMPATIBLE_HRD_SEI:
return AVCCompatibleHRD::create( (AVCCompatibleHRD*&)rpcSEIMessage, NULL );
case PIC_TIMING:
return PicTiming::create( (PicTiming*&)rpcSEIMessage, rpcParameterSetMng );
case BUFFERING_PERIOD:
return BufferingPeriod::create( (BufferingPeriod*&) rpcSEIMessage, rpcParameterSetMng );
// JVT-V068 }
// JVT-W049 {
case REDUNDANT_PIC_SEI:
return RedundantPicSei::create( (RedundantPicSei*&) rpcSEIMessage );
// JVT-W049 }
//JVT-W052 wxwan
case INTEGRITY_CHECK_SEI: return IntegrityCheckSEI::create((IntegrityCheckSEI*&) rpcSEIMessage );
//JVT-W052 wxwan
//JVT-X032 {
case TL_SWITCHING_POINT_SEI:
return TLSwitchingPointSei::create((TLSwitchingPointSei*&) rpcSEIMessage );
//JVT-X032 }
default :
ROT(1);
}
//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;
}
//////////////////////////////////////////////////////////////////////////
//
// 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -