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

📄 sei.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:

  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 + -