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

📄 vui.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
// JVT-V068 HRD
**************************************************************************/
// JVT-V068 HRD {

#include "H264AVCCommonLib.h"
#include "H264AVCCommonLib/Vui.h"
#include "H264AVCCommonLib/SequenceParameterSet.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// h264 namespace begin
H264AVC_NAMESPACE_BEGIN


VUI::BitstreamRestriction::BitstreamRestriction( SequenceParameterSet* pcSPS ):
  m_bBitstreamRestrictionFlag           ( false ),
  m_bMotionVectorsOverPicBoundariesFlag ( true ),
  m_uiMaxBytesPerPicDenom               ( 0 ),
  m_uiMaxBitsPerMbDenom                 ( 1 ),
  m_uiLog2MaxMvLengthHorizontal         ( 16 ),
  m_uiLog2MaxMvLengthVertical           ( 16 ),
  m_uiMaxDecFrameReordering             ( pcSPS->getMaxDPBSize() ),
  m_uiMaxDecFrameBuffering              ( pcSPS->getMaxDPBSize() )
{
}


ErrVal VUI::BitstreamRestriction::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  RNOK( pcWriteIf->writeFlag( m_bBitstreamRestrictionFlag,              "VUI: bitstream_restriction_flag"));
  ROFRS( m_bBitstreamRestrictionFlag, Err::m_nOK );

  RNOK( pcWriteIf->writeFlag( getMotionVectorsOverPicBoundariesFlag(),  "VUI: motion_vectors_over_pic_boundaries_flag"));
  RNOK( pcWriteIf->writeUvlc( getMaxBytesPerPicDenom(),                 "VUI: max_bytes_per_pic_denom"));
  RNOK( pcWriteIf->writeUvlc( getMaxBitsPerMbDenom(),                   "VUI: max_bits_per_mb_denom"));
  RNOK( pcWriteIf->writeUvlc( getLog2MaxMvLengthHorizontal(),           "VUI: log2_max_mv_length_horizontal"));
  RNOK( pcWriteIf->writeUvlc( getLog2MaxMvLengthVertical(),             "VUI: log2_max_mv_length_vertical"));
  RNOK( pcWriteIf->writeUvlc( getMaxDecFrameReordering(),               "VUI: max_dec_frame_reordering"));
  RNOK( pcWriteIf->writeUvlc( getMaxDecFrameBuffering(),                "VUI: max_dec_frame_buffering"));
  return Err::m_nOK;
}


ErrVal VUI::BitstreamRestriction::read( HeaderSymbolReadIf *pcReadIf )
{
  RNOKS( pcReadIf->getFlag( m_bBitstreamRestrictionFlag,           "VUI: bitstream_restriction_flag"));
  ROFRS( m_bBitstreamRestrictionFlag, Err::m_nOK );

  RNOKS( pcReadIf->getFlag( m_bMotionVectorsOverPicBoundariesFlag, "VUI: motion_vectors_over_pic_boundaries_flag"));

  RNOKS( pcReadIf->getUvlc( m_uiMaxBytesPerPicDenom,               "VUI: max_bytes_per_pic_denom"));
  ROTRS( m_uiMaxBytesPerPicDenom > 16, Err::m_nInvalidParameter );

  RNOKS( pcReadIf->getUvlc( m_uiMaxBitsPerMbDenom,                 "VUI: max_bits_per_mb_denom"));
  ROTRS( m_uiMaxBitsPerMbDenom > 16, Err::m_nInvalidParameter );

  RNOKS( pcReadIf->getUvlc( m_uiLog2MaxMvLengthHorizontal,         "VUI: log2_max_mv_length_horizontal"));
  ROTRS( m_uiLog2MaxMvLengthHorizontal > 16, Err::m_nInvalidParameter );

  RNOKS( pcReadIf->getUvlc( m_uiLog2MaxMvLengthVertical,           "VUI: log2_max_mv_length_vertical"));
  ROTRS( m_uiLog2MaxMvLengthVertical > 16, Err::m_nInvalidParameter );

  RNOKS( pcReadIf->getUvlc( m_uiMaxDecFrameReordering,             "VUI: max_dec_frame_reordering"));

  UInt uiTmp;
  RNOKS( pcReadIf->getUvlc( uiTmp,                                 "VUI: max_dec_frame_buffering"));
  ROTRS(uiTmp>16, Err::m_nInvalidParameter);
  ROTRS(getMaxDecFrameReordering() > uiTmp, Err::m_nInvalidParameter);
  setMaxDecFrameBuffering(uiTmp);

  return Err::m_nOK;
}


VUI::AspectRatioInfo::AspectRatioInfo():
  m_bAspectRatioInfoPresentFlag   ( false ),
  m_uiAspectRatioIdc              ( 0 ),
  m_uiSarWith                     ( 0 ),
  m_uiSarHeight                   ( 0 )
{
}

VUI::VideoSignalType::VideoSignalType():
  m_bVideoSignalTypePresentFlag   ( false ),
  m_uiVideoFormat                 ( 5 ),
  m_bVideoFullRangeFlag           ( false ),
  m_bColourDescriptionPresentFlag ( false ),
  m_uiColourPrimaries             ( 2 ),
  m_uiTransferCharacteristics     ( 2 ),
  m_uiMatrixCoefficients          ( 2 )
{
}

VUI::ChromaLocationInfo::ChromaLocationInfo():
  m_bChromaLocationInfoPresentFlag( false ),
  m_uiChromaLocationFrame         ( 0 ),
  m_uiChromaLocationField         ( 0 )
{
}

VUI::TimingInfo::TimingInfo():
  m_uiNumUnitsInTick              ( 0 ),
  m_uiTimeScale                   ( 0 ),
  m_bFixedFrameRateFlag           ( 0 )
{
}

ErrVal VUI::AspectRatioInfo::read( HeaderSymbolReadIf *pcReadIf )
{
  RNOKS( pcReadIf->getFlag( m_bAspectRatioInfoPresentFlag,       "VUI: aspect_ratio_info_present_flag"));
  ROFRS( m_bAspectRatioInfoPresentFlag, Err::m_nOK );

  RNOKS( pcReadIf->getCode( m_uiAspectRatioIdc, 8,               "VUI: aspect_ratio_idc"));

  if( m_uiAspectRatioIdc == 0xFF ) //Extendet_SAR
  {
    RNOKS( pcReadIf->getCode( m_uiSarWith, 16,                   "VUI: sar_width"));
    ROTRS(0 == m_uiSarWith, Err::m_nInvalidParameter);

    RNOKS( pcReadIf->getCode( m_uiSarHeight, 16,                 "VUI: sar_height"));
    ROTRS(0 == m_uiSarHeight, Err::m_nInvalidParameter);
  }
  return Err::m_nOK;
}

ErrVal VUI::VideoSignalType::read( HeaderSymbolReadIf *pcReadIf )
{
  RNOKS( pcReadIf->getFlag( m_bVideoSignalTypePresentFlag,       "VUI: video_signal_type_present_flag"));
  ROFRS( m_bVideoSignalTypePresentFlag, Err::m_nOK );

  RNOKS( pcReadIf->getCode( m_uiVideoFormat, 3,                  "VUI: video_format"));
  RNOKS( pcReadIf->getFlag( m_bVideoFullRangeFlag,               "VUI: video_full_range_flag"));
  RNOKS( pcReadIf->getFlag( m_bColourDescriptionPresentFlag,     "VUI: colour_description_present_flag"));

  if( getColourDescriptionPresentFlag() )
  {
    RNOKS( pcReadIf->getCode( m_uiColourPrimaries, 8,            "VUI: colour_primaries"));
    RNOKS( pcReadIf->getCode( m_uiTransferCharacteristics, 8,    "VUI: transfer_characteristics"));
    RNOKS( pcReadIf->getCode( m_uiMatrixCoefficients, 8,         "VUI: matrix_coefficients"));
  }
  return Err::m_nOK;
}

ErrVal VUI::ChromaLocationInfo::read( HeaderSymbolReadIf *pcReadIf )
{
  RNOKS( pcReadIf->getFlag( m_bChromaLocationInfoPresentFlag,    "VUI: chroma_location_info_present_flag"));
  ROFRS( m_bChromaLocationInfoPresentFlag, Err::m_nOK );

  RNOKS( pcReadIf->getUvlc( m_uiChromaLocationFrame,             "VUI: chroma_location_frame"));
  ROTRS( m_uiChromaLocationFrame>3, Err::m_nInvalidParameter);
  RNOKS( pcReadIf->getUvlc( m_uiChromaLocationField,             "VUI: chroma_location_field"));
  ROTRS( m_uiChromaLocationField>3, Err::m_nInvalidParameter);
  return Err::m_nOK;
}

ErrVal VUI::TimingInfo::read( HeaderSymbolReadIf *pcReadIf )
{
  RNOKS( pcReadIf->getFlag( m_bTimingInfoPresentFlag,            "VUI: timing_info_present_flag"));
  ROFRS( m_bTimingInfoPresentFlag, Err::m_nOK );

  RNOKS( pcReadIf->getCode( m_uiNumUnitsInTick, 32,              "VUI: num_units_in_tick"));
  RNOKS( pcReadIf->getCode( m_uiTimeScale, 32,                   "VUI: time_scale"));
  RNOKS( pcReadIf->getFlag( m_bFixedFrameRateFlag,               "VUI: fixed_frame_rate_flag"));
  return Err::m_nOK;
}

ErrVal VUI::AspectRatioInfo::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  RNOK( pcWriteIf->writeFlag( m_bAspectRatioInfoPresentFlag,    "VUI: aspect_ratio_info_present_flag"));
  ROFRS( m_bAspectRatioInfoPresentFlag, Err::m_nOK );

  RNOK( pcWriteIf->writeCode( m_uiAspectRatioIdc, 8,            "VUI: aspect_ratio_idc"));

  if( 0xFF == m_uiAspectRatioIdc ) //Extendet_SAR
  {
    RNOK( pcWriteIf->writeCode( m_uiSarWith, 16,                "VUI: sar_width"));
    RNOK( pcWriteIf->writeCode( m_uiSarHeight, 16,              "VUI: sar_height"));
  }
  return Err::m_nOK;
}

ErrVal VUI::VideoSignalType::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  RNOK( pcWriteIf->writeFlag( m_bVideoSignalTypePresentFlag,    "VUI: video_signal_type_present_flag"));
  ROFRS( m_bVideoSignalTypePresentFlag, Err::m_nOK );

  RNOK( pcWriteIf->writeCode( m_uiVideoFormat, 3,               "VUI: video_format"));
  RNOK( pcWriteIf->writeFlag( m_bVideoFullRangeFlag,            "VUI: video_full_range_flag"));
  RNOK( pcWriteIf->writeFlag( m_bColourDescriptionPresentFlag,  "VUI: colour_description_present_flag"));
  if( m_bColourDescriptionPresentFlag )
  {
    RNOK( pcWriteIf->writeCode( m_uiColourPrimaries, 8,         "VUI: colour_primaries"));
    RNOK( pcWriteIf->writeCode( m_uiTransferCharacteristics, 8, "VUI: transfer_characteristics"));
    RNOK( pcWriteIf->writeCode( m_uiMatrixCoefficients, 8,      "VUI: matrix_coefficients"));
  }
  return Err::m_nOK;
}

ErrVal VUI::ChromaLocationInfo::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  RNOK( pcWriteIf->writeFlag( m_bChromaLocationInfoPresentFlag, "VUI: chroma_location_info_present_flag"));
  ROFRS( m_bChromaLocationInfoPresentFlag, Err::m_nOK );

  RNOK( pcWriteIf->writeUvlc( m_uiChromaLocationFrame,          "VUI: chroma_location_frame"));
  RNOK( pcWriteIf->writeUvlc( m_uiChromaLocationField,          "VUI: chroma_location_field"));
  return Err::m_nOK;
}

ErrVal VUI::TimingInfo::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  RNOK( pcWriteIf->writeFlag( m_bTimingInfoPresentFlag,         "VUI: timing_info_present_flag"));
  ROFRS( m_bTimingInfoPresentFlag, Err::m_nOK );

  RNOK( pcWriteIf->writeCode( m_uiNumUnitsInTick, 32,           "VUI: num_units_in_tick"));
  RNOK( pcWriteIf->writeCode( m_uiTimeScale, 32,                "VUI: time_scale"));
  RNOK( pcWriteIf->writeFlag( m_bFixedFrameRateFlag,            "VUI: fixed_frame_rate_flag"));
  return Err::m_nOK;
}


VUI::VUI( SequenceParameterSet* pcSPS):
  m_bVuiParametersPresentFlag     ( false ),
  m_bOverscanInfoPresentFlag      ( false ),
  m_bOverscanAppropriateFlag      ( false ),

⌨️ 快捷键说明

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