📄 vui.cpp
字号:
/**************************************************************************
// 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 + -