📄 sequenceparameterset.cpp
字号:
m_eProfileIdc = Profile ( uiTmp );
ROT ( m_eProfileIdc != BASELINE_PROFILE &&
m_eProfileIdc != MAIN_PROFILE &&
m_eProfileIdc != EXTENDED_PROFILE &&
m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != SCALABLE_BASELINE_PROFILE &&
m_eProfileIdc != SCALABLE_HIGH_PROFILE );
RNOK ( pcReadIf->getFlag( m_bConstrainedSet0Flag, "SPS: constraint_set0_flag" ) ); //VB-JV 04/08
RNOK ( pcReadIf->getFlag( m_bConstrainedSet1Flag, "SPS: constraint_set1_flag" ) ); //VB-JV 04/08
RNOK ( pcReadIf->getFlag( m_bConstrainedSet2Flag, "SPS: constraint_set2_flag" ) ); //VB-JV 04/08
RNOK ( pcReadIf->getFlag( m_bConstrainedSet3Flag, "SPS: constraint_set3_flag" ) ); //VB-JV 04/08
RNOK ( pcReadIf->getCode( uiTmp, 4, "SPS: reserved_zero_4bits" ) );
ROT ( uiTmp );
RNOK ( pcReadIf->getCode( m_uiLevelIdc, 8, "SPS: level_idc" ) );
RNOK ( pcReadIf->getUvlc( m_uiSeqParameterSetId, "SPS: seq_parameter_set_id" ) );
//--- fidelity range extension syntax ---
RNOK ( xReadFrext( pcReadIf ) );
RNOK ( pcReadIf->getUvlc( uiTmp, "SPS: log2_max_frame_num_minus_4" ) );
ROT ( uiTmp > 12 );
setLog2MaxFrameNum( uiTmp + 4 );
RNOK ( xReadPicOrderCntInfo( pcReadIf ) );
RNOK( pcReadIf->getUvlc( m_uiNumRefFrames, "SPS: num_ref_frames" ) );
RNOK( pcReadIf->getFlag( m_bGapsInFrameNumValueAllowedFlag, "SPS: gaps_in_frame_num_value_allowed_flag" ) );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: pic_width_in_mbs_minus1" ) );
setFrameWidthInMbs ( 1 + uiTmp );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: pic_height_in_map_units_minus1" ) );
RNOK( pcReadIf->getFlag( m_bFrameMbsOnlyFlag, "SPS: frame_mbs_only_flag" ) );
if( getFrameMbsOnlyFlag() )
{
setFrameHeightInMbs( uiTmp+1 );
setMbAdaptiveFrameFieldFlag( false );
}
else
{
setFrameHeightInMbs( (uiTmp+1)<<1 );
RNOK( pcReadIf->getFlag( m_bMbAdaptiveFrameFieldFlag, "SPS: mb_adaptive_frame_field_flag"));
}
RNOK( pcReadIf->getFlag( m_bDirect8x8InferenceFlag, "SPS: direct_8x8_inference_flag" ) );
Bool bFrameCroppingFlag;
RNOK( pcReadIf->getFlag( bFrameCroppingFlag, "SPS: frame_cropping_flag" ) );
if( bFrameCroppingFlag )
{
RNOK( pcReadIf->getUvlc( m_uiFrameCropLeftOffset, "SPS: frame_crop_left_offset" ) );
RNOK( pcReadIf->getUvlc( m_uiFrameCropRightOffset, "SPS: frame_crop_right_offset" ) );
RNOK( pcReadIf->getUvlc( m_uiFrameCropTopOffset, "SPS: frame_crop_top_offset" ) );
RNOK( pcReadIf->getUvlc( m_uiFrameCropBottomOffset, "SPS: frame_crop_bottom_offset" ) );
}
else
{
m_uiFrameCropLeftOffset = 0;
m_uiFrameCropRightOffset = 0;
m_uiFrameCropTopOffset = 0;
m_uiFrameCropBottomOffset = 0;
}
RNOK( pcReadIf->getFlag( bTmp, "SPS: vui_parameters_present_flag" ) );
m_pcVUI = new VUI(this);
m_pcVUI->setVuiParametersPresentFlag( bTmp );
if( bTmp )
{
RNOK( m_pcVUI->read( pcReadIf ) );
}
ROFRS( m_eNalUnitType == NAL_UNIT_SUBSET_SPS, Err::m_nOK );
//===== start of subset parameter extension =====
if( m_eProfileIdc == SCALABLE_BASELINE_PROFILE || m_eProfileIdc == SCALABLE_HIGH_PROFILE )
{
RNOK( pcReadIf->getFlag( m_bInterlayerDeblockingPresent, "SPS: inter_layer_deblocking_filter_control_present_flag" ) ); //VB-JV 04/08
RNOK( pcReadIf->getCode( m_uiExtendedSpatialScalability, 2, "SPS: extended_spatial_scalability" ) );
if (getChromaFormatIdc() == 1 || getChromaFormatIdc() == 2 )
{
RNOK( pcReadIf->getCode( m_uiChromaPhaseXPlus1, 1, "SPS: chroma_phase_x_plus1_flag" ) ); //VB-JV 04/08
m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
}
if (getChromaFormatIdc() == 1 )
{
RNOK( pcReadIf->getCode( m_uiChromaPhaseYPlus1, 2, "SPS: chroma_phase_y_plus1" ) );
m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
}
if( m_uiExtendedSpatialScalability == ESS_SEQ )
{
if( getChromaFormatIdc() > 0 )
{
RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseXPlus1, 1, "SPS: seq_ref_layer_chroma_phase_x_plus1_flag" ) ); //VB-JV 04/08
RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseYPlus1, 2, "SPS: seq_ref_layer_chroma_phase_y_plus1" ) ); //VB-JV 04/08
}
RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset, "SPS: seq_scaled_ref_layer_left_offset" ) ); //VB-JV 04/08
RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset, "SPS: seq_scaled_ref_layer_top_offset" ) ); //VB-JV 04/08
RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset, "SPS: seq_scaled_ref_layer_right_offset" ) ); //VB-JV 04/08
RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset, "SPS: seq_scaled_ref_layer_bottom_offset" ) ); //VB-JV 04/08
}
else
{
m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
m_iScaledBaseLeftOffset = 0;
m_iScaledBaseTopOffset = 0;
m_iScaledBaseRightOffset = 0;
m_iScaledBaseBottomOffset = 0;
}
RNOK( pcReadIf->getFlag( m_bAVCRewriteFlag, "SPS: seq_tcoeff_level_prediction_flag" ) );
if( m_bAVCRewriteFlag )
{
RNOK( pcReadIf->getFlag( m_bAVCAdaptiveRewriteFlag, "SPS: adaptive_tcoeff_level_prediction_flag" ) );
}
RNOK( pcReadIf->getFlag( m_bAVCHeaderRewriteFlag, "SPS: slice_header_restriction_flag" ) );
//===== svc VUI extension =====
RNOK ( pcReadIf->getFlag( m_bSVCVUIParametersPresentFlag, "SPS: svc_vui_parameters_present_flag" ) );
if( m_bSVCVUIParametersPresentFlag )
{
RNOK( m_pcVUI->readSVCExtension( pcReadIf ) );
}
}
RNOK( pcReadIf->getFlag ( m_bAdditionalExtension2Flag, "SPS: additional_extension2_flag" ) );
ROT( m_bAdditionalExtension2Flag ); // not supported
return Err::m_nOK;
}
ErrVal
SequenceParameterSet::xWriteFrext( HeaderSymbolWriteIf* pcWriteIf ) const
{
ROTRS( m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != HIGH_10_PROFILE &&
m_eProfileIdc != HIGH_422_PROFILE &&
m_eProfileIdc != HIGH_444_PROFILE &&
m_eProfileIdc != CAVLC_444_PROFILE &&
m_eProfileIdc != SCALABLE_BASELINE_PROFILE &&
m_eProfileIdc != SCALABLE_HIGH_PROFILE, Err::m_nOK );
RNOK ( pcWriteIf->writeUvlc( m_uiChromaFormatIdc, "SPS: chroma_format_idc" ) );
RNOK ( pcWriteIf->writeUvlc( 0, "SPS: bit_depth_luma_minus8" ) );
RNOK ( pcWriteIf->writeUvlc( 0, "SPS: bit_depth_chroma_minus8" ) );
RNOK ( pcWriteIf->writeFlag( false, "SPS: qpprime_y_zero_transform_bypass_flag" ) );
RNOK ( pcWriteIf->writeFlag( m_bSeqScalingMatrixPresentFlag, "SPS: seq_scaling_matrix_present_flag" ) );
ROFRS ( m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
RNOK ( m_cSeqScalingMatrix.write( pcWriteIf, true ) );
return Err::m_nOK;
}
ErrVal
SequenceParameterSet::xReadFrext( HeaderSymbolReadIf* pcReadIf )
{
ROTRS( m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != HIGH_10_PROFILE &&
m_eProfileIdc != HIGH_422_PROFILE &&
m_eProfileIdc != HIGH_444_PROFILE &&
m_eProfileIdc != CAVLC_444_PROFILE &&
m_eProfileIdc != SCALABLE_BASELINE_PROFILE &&
m_eProfileIdc != SCALABLE_HIGH_PROFILE, Err::m_nOK );
UInt uiTmp;
Bool bTmp;
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: chroma_format_idc" ) );
ROF ( uiTmp == 1 );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: bit_depth_luma_minus8" ) );
ROF ( uiTmp == 0 );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: bit_depth_chroma_minus8" ) );
ROF ( uiTmp == 0 );
RNOK( pcReadIf->getFlag( bTmp, "SPS: qpprime_y_zero_transform_bypass_flag" ) );
ROT ( bTmp )
RNOK( pcReadIf->getFlag( m_bSeqScalingMatrixPresentFlag, "SPS: seq_scaling_matrix_present_flag") );
ROFRS ( m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
RNOK ( m_cSeqScalingMatrix.read( pcReadIf, true ) );
return Err::m_nOK;
}
Void SequenceParameterSet::setResizeParameters( const ResizeParameters& rcResizeParameters )
{
Int iVer = ( m_bFrameMbsOnlyFlag ? 2 : 4 ); // m_bFrameMbsOnlyFlag must be set !!!!!
m_uiExtendedSpatialScalability = (UInt)rcResizeParameters.m_iExtendedSpatialScalability;
m_uiChromaPhaseXPlus1 = (UInt)( rcResizeParameters.m_iChromaPhaseX + 1 );
m_uiChromaPhaseYPlus1 = (UInt)( rcResizeParameters.m_iChromaPhaseY + 1 );
if( m_uiExtendedSpatialScalability == ESS_SEQ )
{
m_uiBaseChromaPhaseXPlus1 = (UInt)(rcResizeParameters.m_iRefLayerChromaPhaseX+1);
m_uiBaseChromaPhaseYPlus1 = (UInt)(rcResizeParameters.m_iRefLayerChromaPhaseY+1);
m_iScaledBaseLeftOffset = rcResizeParameters.m_iLeftFrmOffset / 2;
m_iScaledBaseTopOffset = rcResizeParameters.m_iTopFrmOffset / iVer;
m_iScaledBaseRightOffset = ( rcResizeParameters.m_iFrameWidth - rcResizeParameters.m_iLeftFrmOffset - rcResizeParameters.m_iScaledRefFrmWidth ) / 2;
m_iScaledBaseBottomOffset = ( rcResizeParameters.m_iFrameHeight - rcResizeParameters.m_iTopFrmOffset - rcResizeParameters.m_iScaledRefFrmHeight ) / iVer;
}
else
{
m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
m_iScaledBaseBottomOffset = 0;
m_iScaledBaseLeftOffset = 0;
m_iScaledBaseRightOffset = 0;
m_iScaledBaseTopOffset = 0;
}
}
ErrVal SequenceParameterSet::xReadPicOrderCntInfo( HeaderSymbolReadIf* pcReadIf )
{
RNOK( pcReadIf->getUvlc( m_uiPicOrderCntType, "SPS: pic_order_cnt_type" ) );
ROT( m_uiPicOrderCntType>2 );
ROTRS( 2 == m_uiPicOrderCntType, Err::m_nOK );
if( 0 == m_uiPicOrderCntType )
{
UInt uiTmp;
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: log2_max_pic_order_cnt_lsb_minus4" ));
setLog2MaxPicOrderCntLsb( 4+uiTmp );
}
else if( 1 == m_uiPicOrderCntType )
{
RNOK( pcReadIf->getFlag( m_bDeltaPicOrderAlwaysZeroFlag, "SPS: delta_pic_order_always_zero_flag" ));
RNOK( pcReadIf->getSvlc( m_iOffsetForNonRefPic, "SPS: offset_for_non_ref_pic" ));
RNOK( pcReadIf->getSvlc( m_iOffsetForTopToBottomField, "SPS: offset_for_top_to_bottom_field" ));
RNOK( pcReadIf->getUvlc( m_uiNumRefFramesInPicOrderCntCycle, "SPS: num_ref_frames_in_pic_order_cnt_cycle" ));
RNOK( initOffsetForRefFrame( m_uiNumRefFramesInPicOrderCntCycle ) );
for( UInt i = 0; i < m_uiNumRefFramesInPicOrderCntCycle; i++)
{
Int iTmp;
RNOK( pcReadIf->getSvlc( iTmp, "SPS: offset_for_ref_frame" ) );
setOffsetForRefFrame( i, iTmp );
}
}
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -