📄 sliceheaderbase.cpp
字号:
if( getNalRefIdc() )
{
if( isIdrNalUnit() )
{
RNOK( pcWriteIf->writeFlag( m_bNoOutputOfPriorPicsFlag, "DRPM: no_output_of_prior_pics_flag" ) );
RNOK( pcWriteIf->writeFlag( false, "DRPM: long_term_reference_flag" ) );
}
else
{
RNOK( pcWriteIf->writeFlag( m_bAdaptiveRefPicBufferingModeFlag, "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
if( m_bAdaptiveRefPicBufferingModeFlag )
{
RNOK( getMmcoBuffer().write( pcWriteIf ) );
}
}
//JVT-S036 lsj start
if( m_bUseBasePredictionFlag && m_eNalUnitType != NAL_UNIT_CODED_SLICE_IDR_SCALABLE)
{
RNOK(pcWriteIf->writeFlag( m_bAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if(m_bAdaptiveRefPicMarkingModeFlag)
{
RNOK( getMmcoBaseBuffer().write( pcWriteIf ) );
}
}
//JVT-S036 lsj end
}
if( getPPS().getEntropyCodingModeFlag() && m_eSliceType != I_SLICE )
{
RNOK( pcWriteIf->writeUvlc( m_uiCabacInitIdc, "SH: cabac_init_idc" ) );
}
}
if( uiFragmentOrder == 0 || m_eSliceType != F_SLICE )
{
RNOK( pcWriteIf->writeSvlc( m_iSliceQpDelta, "SH: slice_qp_delta" ) );
}
if ( m_eSliceType != F_SLICE ) {
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( getDeblockingFilterParameterScalable().getDeblockingFilterParameter().write( pcWriteIf, true ) ); //V032, added enhanced layer indicator "true"
}
if ( getSPS().getInterlayerDeblockingPresent() )
{
RNOK( getDeblockingFilterParameterScalable().getInterlayerDeblockingFilterParameter().write( pcWriteIf, true ) ); //V032, added enhanced layer indicator "true"
}
//JVT-U106 Behaviour at slice boundaries{
RNOK (pcWriteIf->writeFlag( m_bCIUFlag, "SH: constrained_intra_upsampling_flag"));
//JVT-U106 Behaviour at slice boundaries}
}
if(getPPS().getNumSliceGroupsMinus1()>0 && getPPS().getSliceGroupMapType() >=3 && getPPS().getSliceGroupMapType() <= 5)
{
RNOK( pcWriteIf->writeCode( m_uiSliceGroupChangeCycle, getPPS().getLog2MaxSliceGroupChangeCycle(getSPS().getMbInFrame()) , "SH: slice_group_change_cycle" ) );
}
// TMM_ESS {
if ((m_eSliceType != F_SLICE) && (getSPS().getExtendedSpatialScalability() > ESS_NONE))
{
//if ( 1 /* chroma_format_idc */ > 0 )
{
RNOK( pcWriteIf->writeCode( m_uiBaseChromaPhaseXPlus1, 2, "SH: BaseChromaPhaseXPlus1" ) );
RNOK( pcWriteIf->writeCode( m_uiBaseChromaPhaseYPlus1, 2, "SH: BaseChromaPhaseXPlus1" ) );
}
if (getSPS().getExtendedSpatialScalability() == ESS_PICT)
{
Int iYScale = 2 - getSPS().getFrameMbsOnlyFlag();
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseLeftOffset, "SH: ScaledBaseLeftOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseTopOffset/iYScale, "SH: ScaledBaseTopOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseRightOffset, "SH: ScaledBaseRightOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseBottomOffset/iYScale, "SH: ScaledBaseBottomOffset" ) );
}
}
#ifdef _JVTV074_
if ((m_eSliceType != F_SLICE))
{
if (getSPS().getNumResampleFiltersMinus1())
{
RNOK( pcWriteIf->writeUvlc( m_uiResampleFilterIdx, "SH: ResampleFilterIdx" ) );
}
}
#endif // _JVTV074_
// TMM_ESS }
if( m_eSliceType == F_SLICE && uiFragmentOrder == 0)
{
RNOK( pcWriteIf->writeUvlc( m_uiNumMbsInSlice - 1, "SH: num_mbs_in_slice_minus1" ) );
RNOK( pcWriteIf->writeFlag( m_bFgsComponentSep, "SH: luma_chroma_sep_flag" ) );
if ( m_bUseBasePredictionFlag )
{
RNOK( pcWriteIf->writeFlag( m_bStoreBaseRepresentationFlag, "SH: store_base_rep_flag" ) );
RNOK( pcWriteIf->writeFlag( m_bArFgsUsageFlag, "SH: adaptive_ref_fgs_flag" ) );
if( m_bArFgsUsageFlag )
{
// send other information conditionally
UInt uiWeight;
// AR_FGS_MAX_BASE_WEIGHT - 1 is not allowed
uiWeight = ( m_uiBaseWeightZeroBaseBlock <= 1 ) ? 0 : ( m_uiBaseWeightZeroBaseBlock - 1 );
RNOK( pcWriteIf->writeCode( uiWeight, 5, "SH: max_diff_ref_scale_for_zero_base_block" ) );
// AR_FGS_MAX_BASE_WEIGHT - 1 is not allowed
uiWeight = ( m_uiBaseWeightZeroBaseCoeff <= 1 ) ? 0 : ( m_uiBaseWeightZeroBaseCoeff - 1 );
RNOK( pcWriteIf->writeCode( uiWeight, 5, "SH: max_diff_ref_scale_for_zero_base_coeff" ) );
RNOK( pcWriteIf->writeFlag( m_bFgsEntropyOrderFlag, "SH: fgs_order_flag" ) );
}
}
RNOK( pcWriteIf->writeFlag( m_bAdaptivePredictionFlag, "SH: motion_refinement_flag" ) );
}
if (m_eSliceType != F_SLICE )
{
//TMM_INTERLACE {
if( !getSPS().getFrameMbsOnlyFlag() && !getFieldPicFlag() )
RNOK( pcWriteIf->writeFlag( m_bBaseFrameFromBotFieldFlag, "SH: base_frame_from_bot_field_coincided_flag" ) ); // set to 0 (default)
if( getSPS().getFrameMbsOnlyFlag() )
RNOK( pcWriteIf->writeFlag( m_bBaseBotFieldSyncFlag, "SH: base_bot_field_coincided_flag" ) ); // set to 0 (default)
//TMM_INTERLACE }
}
}//JVT-S036 lsj
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::xWriteH264AVCCompatible( HeaderSymbolWriteIf* pcWriteIf ) const
{
//===== NAL unit header =====
RNOK ( pcWriteIf->writeFlag( 0, "NALU HEADER: forbidden_zero_bit" ) );
RNOK ( pcWriteIf->writeCode( m_eNalRefIdc, 2, "NALU HEADER: nal_ref_idc" ) );
RNOK ( pcWriteIf->writeCode( m_eNalUnitType, 5, "NALU HEADER: nal_unit_type" ) );
//===== slice header =====
UInt uiFirstMbInSlice = getFirstMbInSlice();
if ( !getSPS().getFrameMbsOnlyFlag() && getSPS().getMbAdaptiveFrameFieldFlag() && !getFieldPicFlag())
{
uiFirstMbInSlice >>=1;
}
//===== slice header =====
RNOK( pcWriteIf->writeUvlc( uiFirstMbInSlice, "SH: first_mb_in_slice" ) );
RNOK( pcWriteIf->writeUvlc( m_eSliceType, "SH: slice_type" ) );
RNOK( pcWriteIf->writeUvlc( m_uiPicParameterSetId, "SH: pic_parameter_set_id" ) );
RNOK( pcWriteIf->writeCode( m_uiFrameNum, getSPS().getLog2MaxFrameNum(), "SH: frame_num" ) );
if( ! getSPS().getFrameMbsOnlyFlag())
{
RNOK( pcWriteIf->writeFlag( getFieldPicFlag(), "SH: field_pic_flag" ) );
if( getFieldPicFlag() )
{
RNOK( pcWriteIf->writeFlag( getBottomFieldFlag(), "SH: bottom_field_flag" ) );
}
}
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
{
RNOK( pcWriteIf->writeUvlc( m_uiIdrPicId, "SH: idr_pic_id" ) );
}
if( 0 == getSPS().getPicOrderCntType() )
{
RNOK( pcWriteIf->writeCode( m_uiPicOrderCntLsb,
getSPS().getLog2MaxPicOrderCntLsb(), "SH: pic_order_cnt_lsb" ) );
if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
{
RNOK( pcWriteIf->writeSvlc( m_iDeltaPicOrderCntBottom, "SH: delta_pic_order_cnt_bottom" ) );
}
}
if( getSPS().getPicOrderCntType() == 1 && ! getSPS().getDeltaPicOrderAlwaysZeroFlag() )
{
RNOK( pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[0], "SH: delta_pic_order_cnt[0]" ) );
if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
{
RNOK( pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[1], "SH: delta_pic_order_cnt[1]" ) );
}
}
//JVT-Q054 Red. Picture {
if ( getPPS().getRedundantPicCntPresentFlag() )
{
RNOK( pcWriteIf->writeUvlc( m_uiRedundantPicCnt, "SH: redundant_pic_cnt") );
}
//JVT-Q054 Red. Picture }
if( m_eSliceType == B_SLICE )
{
RNOK( pcWriteIf->writeFlag( m_bDirectSpatialMvPredFlag, "SH: direct_spatial_mv_pred_flag" ) );
}
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
RNOK( pcWriteIf->writeFlag( m_bNumRefIdxActiveOverrideFlag, "SH: num_ref_idx_active_override_flag" ) );
if( m_bNumRefIdxActiveOverrideFlag )
{
RNOK( pcWriteIf->writeUvlc( m_auiNumRefIdxActive[LIST_0]-1, "SH: num_ref_idx_l0_active_minus1" ) );
if( m_eSliceType == B_SLICE )
{
RNOK( pcWriteIf->writeUvlc( m_auiNumRefIdxActive[LIST_1]-1, "SH: num_ref_idx_l1_active_minus1" ) );
}
}
}
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_0 ).write( pcWriteIf ) );
}
if( m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_1 ).write( pcWriteIf ) );
}
if( ( getPPS().getWeightedPredFlag () && ( m_eSliceType == P_SLICE ) ) ||
( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
{
RNOK( pcWriteIf->writeUvlc( m_uiLumaLog2WeightDenom, "PWT: luma_log_weight_denom" ) );
RNOK( pcWriteIf->writeUvlc( m_uiChromaLog2WeightDenom, "PWT: chroma_log_weight_denom" ) );
RNOK( m_acPredWeightTable[LIST_0].write( pcWriteIf, getNumRefIdxActive( LIST_0 ) ) );
if( m_eSliceType == B_SLICE )
{
RNOK( m_acPredWeightTable[LIST_1].write( pcWriteIf, getNumRefIdxActive( LIST_1) ) );
}
}
if( getNalRefIdc() )
{
if( isIdrNalUnit() )
{
RNOK( pcWriteIf->writeFlag( m_bNoOutputOfPriorPicsFlag, "DRPM: no_output_of_prior_pics_flag" ) );
RNOK( pcWriteIf->writeFlag( false, "DRPM: long_term_reference_flag" ) );
}
else
{
RNOK( pcWriteIf->writeFlag( m_bAdaptiveRefPicBufferingModeFlag, "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
if( m_bAdaptiveRefPicBufferingModeFlag )
{
RNOK( getMmcoBuffer().write( pcWriteIf ) );
}
}
}
if( getPPS().getEntropyCodingModeFlag() && m_eSliceType != I_SLICE )
{
RNOK( pcWriteIf->writeUvlc( m_uiCabacInitIdc, "SH: cabac_init_idc" ) );
}
RNOK( pcWriteIf->writeSvlc( m_iSliceQpDelta, "SH: slice_qp_delta" ) );
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( getDeblockingFilterParameterScalable().getDeblockingFilterParameter().write( pcWriteIf, false ) ); //XXXV032, added enhanced layer indicator "true"
}
if(getPPS().getNumSliceGroupsMinus1()>0 && getPPS().getSliceGroupMapType() >=3 && getPPS().getSliceGroupMapType() <= 5)
{
RNOK( pcWriteIf->writeCode( m_uiSliceGroupChangeCycle, getPPS().getLog2MaxSliceGroupChangeCycle(getSPS().getMbInFrame()) , "SH: slice_group_change_cycle" ) );
}
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::read( HeaderSymbolReadIf* pcReadIf )
{
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE )
{
m_pcReadIf = pcReadIf; // TMM_INTERLACE
return xReadScalable ( pcReadIf );
}
else
{
return xReadH264AVCCompatible ( pcReadIf );
}
}
ErrVal
SliceHeaderBase::ReadLastBit( )
{
if (m_eSliceType != F_SLICE )
{
m_bBaseFrameFromBotFieldFlag = m_bBaseBotFieldSyncFlag = false;
//TMM_INTERLACE {
if( !getSPS().getFrameMbsOnlyFlag() && !getFieldPicFlag() )
RNOK( m_pcReadIf->getFlag( m_bBaseFrameFromBotFieldFlag, "SH: base_frame_from_bot_field_coincided_flag" ) );
if( getSPS().getFrameMbsOnlyFlag() )
RNOK( m_pcReadIf->getFlag( m_bBaseBotFieldSyncFlag, "SH: base_bot_field_coincided_flag" ) );
//TMM_INTERLACE }
}
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::xReadScalable( HeaderSymbolReadIf* pcReadIf )
{
Bool bTmp;
RNOK( pcReadIf->getCode( m_uiFrameNum,
getSPS().getLog2MaxFrameNum(), "SH: frame_num" ) );
if( ! getSPS().getFrameMbsOnlyFlag() )
{
RNOKS( pcReadIf->getFlag( m_bFieldPicFlag, "SH: field_pic_flag" ) );
if( m_bFieldPicFlag )
{
RNOKS(pcReadIf->getFlag( m_bBottomFieldFlag, "SH: bottom_field_flag" ) );
}
}
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE )
{
RNOK( pcReadIf->getUvlc( m_uiIdrPicId, "SH: idr_pic_id" ) );
}
if( 0 == getSPS().getPicOrderCntType() )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -