📄 sliceheaderbase.cpp
字号:
RNOK( rcWriteIf.writeSvlc ( m_iSliceQsDelta, "SH: slice_qs_delta" ) );
}
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( m_cDeblockingFilterParameter.write( rcWriteIf ) );
}
if( getQualityId() == 0 &&
getPPS().getNumSliceGroupsMinus1() > 0 &&
getPPS().getSliceGroupMapType() >= 3 && getPPS().getSliceGroupMapType() <= 5 )
{
RNOK( rcWriteIf.writeCode ( m_uiSliceGroupChangeCycle,
getPPS().getLog2MaxSliceGroupChangeCycle( getSPS().getMbInFrame() ),
"SH: slice_group_change_cycle" ) );
}
if( !getNoInterLayerPredFlag() && getQualityId() == 0 )
{
RNOK( rcWriteIf.writeUvlc ( m_uiRefLayerDQId, "SH: ref_layer_dq_id" ) );
if( getSPS().getInterlayerDeblockingPresent() )
{
RNOK( m_cInterLayerDeblockingFilterParameter.write( rcWriteIf ) );
}
RNOK( rcWriteIf.writeFlag ( m_bConstrainedIntraResamplingFlag, "SH: constrained_intra_resampling_flag"));
if( getSPS().getExtendedSpatialScalability() == ESS_PICT )
{
RNOK( rcWriteIf.writeFlag ( m_bRefLayerChromaPhaseXPlus1Flag, "SH: ref_layer_chroma_phase_x_plus1_flag" ) );
RNOK( rcWriteIf.writeCode ( m_uiRefLayerChromaPhaseYPlus1, 2, "SH: ref_layer_chroma_phase_y_plus1" ) );
RNOK( rcWriteIf.writeSvlc ( m_iScaledRefLayerLeftOffset, "SH: scaled_ref_layer_left_offset" ) );
RNOK( rcWriteIf.writeSvlc ( m_iScaledRefLayerTopOffset, "SH: scaled_ref_layer_top_offset" ) );
RNOK( rcWriteIf.writeSvlc ( m_iScaledRefLayerRightOffset, "SH: scaled_ref_layer_right_offset" ) );
RNOK( rcWriteIf.writeSvlc ( m_iScaledRefLayerBottomOffset, "SH: scaled_ref_layer_bottom_offset" ) );
}
}
if( !getNoInterLayerPredFlag() )
{
RNOK( rcWriteIf.writeFlag ( m_bSliceSkipFlag, "SH: slice_skip_flag" ) );
if( m_bSliceSkipFlag )
{
RNOK( rcWriteIf.writeUvlc ( m_uiNumMbsInSliceMinus1, "SH: num_mbs_in_slice_minus1" ) );
}
else
{
RNOK( rcWriteIf.writeFlag ( m_bAdaptiveBaseModeFlag, "SH: adaptive_base_mode_flag" ) );
if( !m_bAdaptiveBaseModeFlag )
{
RNOK( rcWriteIf.writeFlag ( m_bDefaultBaseModeFlag, "SH: default_base_mode_flag" ) );
}
if( !m_bDefaultBaseModeFlag )
{
RNOK( rcWriteIf.writeFlag ( m_bAdaptiveMotionPredictionFlag, "SH: adaptive_motion_prediction_flag" ) );
if( !m_bAdaptiveMotionPredictionFlag )
{
RNOK( rcWriteIf.writeFlag ( m_bDefaultMotionPredictionFlag, "SH: default_motion_prediction_flag" ) );
}
}
RNOK( rcWriteIf.writeFlag ( m_bAdaptiveResidualPredictionFlag, "SH: adaptive_residual_prediction_flag" ) );
if( !m_bAdaptiveResidualPredictionFlag )
{
RNOK( rcWriteIf.writeFlag ( m_bDefaultResidualPredictionFlag, "SH: default_residual_prediction_flag" ) );
}
}
if( getSPS().getAVCAdaptiveRewriteFlag() )
{
RNOK( rcWriteIf.writeFlag ( m_bTCoeffLevelPredictionFlag, "SH: tcoeff_level_prediction_flag" ) );
}
}
if( !getSPS().getAVCHeaderRewriteFlag() && ! isH264AVCCompatible() && ! m_bSliceSkipFlag )
{
UInt uiScanIdxStart = ( m_uiScanIdxStart == m_uiScanIdxStop ? 1 : m_uiScanIdxStart );
UInt uiScanIdxEnd = ( m_uiScanIdxStart == m_uiScanIdxStop ? 0 : m_uiScanIdxStop - 1 );
RNOK( rcWriteIf.writeCode ( uiScanIdxStart, 4, "SH: scan_idx_start" ) );
RNOK( rcWriteIf.writeCode ( uiScanIdxEnd, 4, "SH: scan_idx_end" ) );
}
return Err::m_nOK;
}
ErrVal
SliceHeaderSyntax::read( ParameterSetMng& rcParameterSetMng, HeaderSymbolReadIf& rcReadIf, Bool bInclusiveNalUnitHeader )
{
if( bInclusiveNalUnitHeader )
{
NalUnitHeader::read( rcReadIf );
}
RNOK( rcReadIf.getUvlc ( m_uiFirstMbInSlice, "SH: first_mb_in_slice" ) );
UInt uiSliceType;
RNOK( rcReadIf.getUvlc ( uiSliceType, "SH: slice_type" ) );
m_eSliceType = SliceType( uiSliceType );
RNOK( rcReadIf.getUvlc ( m_uiPicParameterSetId, "SH: pic_parameter_set_id" ) );
RNOK( xInitParameterSets( rcParameterSetMng, m_uiPicParameterSetId, getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE ) );
RNOK( rcReadIf.getCode ( m_uiFrameNum,
getSPS().getLog2MaxFrameNum(), "SH: frame_num" ) );
if( ! getSPS().getFrameMbsOnlyFlag() )
{
RNOK( rcReadIf.getFlag ( m_bFieldPicFlag, "SH: field_pic_flag" ) );
if( m_bFieldPicFlag )
{
RNOK( rcReadIf.getFlag ( m_bBottomFieldFlag, "SH: bottom_field_flag" ) );
}
}
if( getIdrFlag() )
{
RNOK( rcReadIf.getUvlc ( m_uiIdrPicId, "SH: idr_pic_id" ) );
}
if( getSPS().getPicOrderCntType() == 0 )
{
RNOK( rcReadIf.getCode ( m_uiPicOrderCntLsb,
getSPS().getLog2MaxPicOrderCntLsb(), "SH: pic_order_cnt_lsb" ) );
if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
{
RNOK( rcReadIf.getSvlc ( m_iDeltaPicOrderCntBottom, "SH: delta_pic_order_cnt_bottom" ) );
}
}
if( getSPS().getPicOrderCntType() == 1 && !getSPS().getDeltaPicOrderAlwaysZeroFlag() )
{
RNOK( rcReadIf.getSvlc ( m_iDeltaPicOrderCnt0, "SH: delta_pic_order_cnt[0]" ) );
if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
{
RNOK( rcReadIf.getSvlc ( m_iDeltaPicOrderCnt1, "SH: delta_pic_order_cnt[1]" ) );
}
}
if( getPPS().getRedundantPicCntPresentFlag() )
{
RNOK( rcReadIf.getUvlc ( m_uiRedundantPicCnt, "SH: redundant_pic_cnt" ) );
}
if( ! getQualityId() )
{
if( isBSlice() )
{
RNOK( rcReadIf.getFlag ( m_bDirectSpatialMvPredFlag, "SH: direct_spatial_mv_pred_flag" ) );
}
if( isInterSlice() )
{
RNOK( rcReadIf.getFlag ( m_bNumRefIdxActiveOverrideFlag, "SH: num_ref_idx_active_override_flag" ) );
if( m_bNumRefIdxActiveOverrideFlag )
{
RNOK( rcReadIf.getUvlc ( m_uiNumRefIdxL0ActiveMinus1, "SH: num_ref_idx_l0_active_minus1" ) );
if( isBSlice() )
{
RNOK( rcReadIf.getUvlc ( m_uiNumRefIdxL1ActiveMinus1, "SH: num_ref_idx_l1_active_minus1" ) );
}
}
}
if( isInterSlice() )
{
RNOK( m_cRefPicListReorderingL0.read( rcReadIf ) );
}
if( isBSlice() )
{
RNOK( m_cRefPicListReorderingL1.read( rcReadIf ) );
}
if( ( getPPS().getWeightedPredFlag() && isPorSPSlice() ) || ( getPPS().getWeightedBiPredIdc() == 1 && isBSlice() ) )
{
if( ! getNoInterLayerPredFlag() )
{
RNOK( rcReadIf.getFlag ( m_bBasePredWeightTableFlag, "SH: base_pred_weight_table_flag" ) );
}
if( getNoInterLayerPredFlag() || ! m_bBasePredWeightTableFlag )
{
RNOK( rcReadIf.getUvlc ( m_uiLumaLog2WeightDenom, "PWT: luma_log_weight_denom" ) );
RNOK( rcReadIf.getUvlc ( m_uiChromaLog2WeightDenom, "PWT: chroma_log_weight_denom" ) );
RNOK( m_cPredWeightTableL0.read( rcReadIf, m_uiNumRefIdxL0ActiveMinus1, m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
if( isBSlice() )
{
RNOK( m_cPredWeightTableL1.read( rcReadIf, m_uiNumRefIdxL1ActiveMinus1, m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
}
}
}
if( getNalRefIdc() )
{
if( getIdrFlag() )
{
RNOK( rcReadIf.getFlag ( m_bNoOutputOfPriorPicsFlag, "DRPM: no_output_of_prior_pics_flag" ) );
RNOK( rcReadIf.getFlag ( m_bLongTermReferenceFlag, "DRPM: long_term_reference_flag" ) );
}
else
{
RNOK( m_cDecRefPicMarking.read( rcReadIf ) );
}
if( ! getSPS().getAVCHeaderRewriteFlag() && ! isH264AVCCompatible() )
{
Bool bStoreRefBasePicFlag;
RNOK( rcReadIf.getFlag ( bStoreRefBasePicFlag, "SH: store_ref_base_pic_flag" ) );
setStoreRefBasePicFlag( bStoreRefBasePicFlag );
if( ( getUseRefBasePicFlag() || getStoreRefBasePicFlag() ) && !getIdrFlag() )
{
RNOK( getDecRefBasePicMarking().read( rcReadIf ) );
}
}
}
}
if( getPPS().getEntropyCodingModeFlag() && !isIntraSlice() )
{
RNOK( rcReadIf.getUvlc ( m_uiCabacInitIdc, "SH: cabac_init_idc" ) );
}
RNOK( rcReadIf.getSvlc ( m_iSliceQpDelta, "SH: slice_qp_delta" ) );
if( isSPSlice() || isSISlice() )
{
if( isSPSlice() )
{
RNOK( rcReadIf.getFlag ( m_bSPForSwitchFlag, "SH: sp_for_switch_flag" ) );
}
RNOK( rcReadIf.getSvlc ( m_iSliceQsDelta, "SH: slice_qs_delta" ) );
}
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( m_cDeblockingFilterParameter.read( rcReadIf, getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE ) );
}
if( getQualityId() == 0 &&
getPPS().getNumSliceGroupsMinus1() > 0 &&
getPPS().getSliceGroupMapType() >= 3 && getPPS().getSliceGroupMapType() <= 5 )
{
RNOK( rcReadIf.getCode ( m_uiSliceGroupChangeCycle,
getPPS().getLog2MaxSliceGroupChangeCycle( getSPS().getMbInFrame() ),
"SH: slice_group_change_cycle" ) );
}
if( !getNoInterLayerPredFlag() && getQualityId() == 0 )
{
RNOK( rcReadIf.getUvlc ( m_uiRefLayerDQId, "SH: ref_layer_dq_id" ) );
if( getSPS().getInterlayerDeblockingPresent() )
{
RNOK( m_cInterLayerDeblockingFilterParameter.read( rcReadIf, getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE ) );
}
RNOK( rcReadIf.getFlag ( m_bConstrainedIntraResamplingFlag, "SH: constrained_intra_resampling_flag"));
if( getSPS().getExtendedSpatialScalability() == ESS_PICT )
{
RNOK( rcReadIf.getFlag ( m_bRefLayerChromaPhaseXPlus1Flag, "SH: ref_layer_chroma_phase_x_plus1_flag" ) );
RNOK( rcReadIf.getCode ( m_uiRefLayerChromaPhaseYPlus1, 2, "SH: ref_layer_chroma_phase_y_plus1" ) );
RNOK( rcReadIf.getSvlc ( m_iScaledRefLayerLeftOffset, "SH: scaled_ref_layer_left_offset" ) );
RNOK( rcReadIf.getSvlc ( m_iScaledRefLayerTopOffset, "SH: scaled_ref_layer_top_offset" ) );
RNOK( rcReadIf.getSvlc ( m_iScaledRefLayerRightOffset, "SH: scaled_ref_layer_right_offset" ) );
RNOK( rcReadIf.getSvlc ( m_iScaledRefLayerBottomOffset, "SH: scaled_ref_layer_bottom_offset" ) );
}
}
else
{
if( getNoInterLayerPredFlag() )
{
m_uiRefLayerDQId = MSYS_UINT_MAX;
}
else
{
m_uiRefLayerDQId = ( getDependencyId() << 4 ) + getQualityId() - 1;
}
}
if( !getNoInterLayerPredFlag() )
{
RNOK( rcReadIf.getFlag ( m_bSliceSkipFlag, "SH: slice_skip_flag" ) );
if( m_bSliceSkipFlag )
{
RNOK( rcReadIf.getUvlc ( m_uiNumMbsInSliceMinus1, "SH: num_mbs_in_slice_minus1" ) );
}
else
{
RNOK( rcReadIf.getFlag ( m_bAdaptiveBaseModeFlag, "SH: adaptive_base_mode_flag" ) );
if( !m_bAdaptiveBaseModeFlag )
{
RNOK( rcReadIf.getFlag ( m_bDefaultBaseModeFlag, "SH: default_base_mode_flag" ) );
}
if( !m_bDefaultBaseModeFlag )
{
RNOK( rcReadIf.getFlag ( m_bAdaptiveMotionPredictionFlag, "SH: adaptive_motion_prediction_flag" ) );
if( !m_bAdaptiveMotionPredictionFlag )
{
RNOK( rcReadIf.getFlag ( m_bDefaultMotionPredictionFlag, "SH: default_motion_prediction_flag" ) );
}
}
RNOK( rcReadIf.getFlag ( m_bAdaptiveResidualPredictionFlag, "SH: adaptive_residual_prediction_flag" ) );
if( !m_bAdaptiveResidualPredictionFlag )
{
RNOK( rcReadIf.getFlag ( m_bDefaultResidualPredictionFlag, "SH: default_residual_prediction_flag" ) );
}
}
if( getSPS().getAVCAdaptiveRewriteFlag() )
{
RNOK( rcReadIf.getFlag ( m_bTCoeffLevelPredictionFlag, "SH: tcoeff_level_prediction_flag" ) );
}
}
if( !getSPS().getAVCHeaderRewriteFlag() && ! isH264AVCCompatible() && ! m_bSliceSkipFlag )
{
RNOK( rcReadIf.getCode ( m_uiScanIdxStart, 4, "SH: scan_idx_start" ) );
RNOK( rcReadIf.getCode ( m_uiScanIdxStop, 4, "SH: scan_idx_end" ) );
if( m_uiScanIdxStart > m_uiScanIdxStop )
{
m_uiScanIdxStart = 0;
m_uiScanIdxStop = 0;
}
else
{
m_uiScanIdxStop++;
}
}
return Err::m_nOK;
}
Void
SliceHeaderSyntax::xInit()
{
m_uiFirstMbInSlice = 0;
m_eSliceType = I_SLICE;
m_uiPicParameterSetId = 0;
m_uiColourPlaneId = 0;
m_uiFrameNum = 0;
m_bFieldPicFlag = false;
m_bBottomFieldFlag = false;
m_uiIdrPicId = 0;
m_uiPicOrderCntLsb = 0;
m_iDeltaPicOrderCntBottom = 0;
m_iDeltaPicOrderCnt0 = 0;
m_iDeltaPicOrderCnt1 = 0;
m_uiRedundantPicCnt = 0;
m_bDirectSpatialMvPredFlag = true;
m_bNumRefIdxActiveOverrideFlag = false;
m_uiNumRefIdxL0ActiveMinus1 = 0;
m_uiNumRefIdxL1ActiveMinus1 = 0;
m_cRefPicListReorderingL0 .clear( false );
m_cRefPicListReorderingL1 .clear( false );
m_bBasePredWeightTableFlag = false;
m_uiLumaLog2WeightDenom = 0;
m_uiChromaLog2WeightDenom = 0;
m_cPredWeightTableL0 .clear();
m_cPredWeightTableL1 .clear();
m_bNoOutputOfPriorPicsFlag = true;
m_bLongTermReferenceFlag = false;
m_cDecRefPicMarking .clear( false, false );
m_uiCabacInitIdc = 0;
m_iSliceQpDelta = 0;
m_bSPForSwitchFlag = false;
m_iSliceQsDelta = 0;
m_cDeblockingFilterParameter .clear( false );
m_uiSliceGroupChangeCycle = 0;
m_uiRefLayerDQId = MSYS_UINT_MAX;
m_cInterLayerDeblockingFilterParameter .clear( true );
m_bConstrainedIntraResamplingFlag = false;
m_bRefLayerChromaPhaseXPlus1Flag = false;
m_uiRefLayerChromaPhaseYPlus1 = 0;
m_iScaledRefLayerLeftOffset = 0;
m_iScaledRefLayerTopOffset = 0;
m_iScaledRefLayerRightOffset = 0;
m_iScaledRefLayerBottomOffset = 0;
m_bSliceSkipFlag = false;
m_uiNumMbsInSliceMinus1 = 0;
m_bAdaptiveBaseModeFlag = false;
m_bDefaultBaseModeFlag = false;
m_bAdaptiveMotionPredictionFlag = false;
m_bDefaultMotionPredictionFlag = false;
m_bAdaptiveResidualPredictionFlag = false;
m_bDefaultResidualPredictionFlag = false;
m_bTCoeffLevelPredictionFlag = false;
m_uiScanIdxStart = 0;
m_uiScanIdxStop = 16;
m_pcSPS = 0;
m_pcPPS = 0;
m_acScalingMatrix .setAll( 0 );
}
Void
SliceHeaderSyntax::xCopy( const SliceHeaderSyntax& rcSliceHeaderSyntax )
{
m_uiFirstMbInSlice = rcSliceHeaderSyntax.m_uiFirstMbInSlice;
m_eSliceType = rcSliceHeaderSyntax.m_eSliceType;
m_uiPicParameterSetId
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -