sliceheaderbase.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,669 行 · 第 1/5 页
CPP
1,669 行
if( m_eSliceType == B_SLICE )
{
RNOK( pcReadIf->getUvlc( m_auiNumRefIdxActive[LIST_1], "SH: num_ref_idx_l1_active_minus1" ) );
m_auiNumRefIdxActive[LIST_1]++;
}
}
}
if( m_eSliceType != B_SLICE )
{
m_auiNumRefIdxActive[LIST_1] = 0;
}
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_0 ).read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
}
if( m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_1 ).read( pcReadIf, getNumRefIdxActive( LIST_1 ) ) );
}
RNOK( m_acPredWeightTable[LIST_0].init( 64 ) );
RNOK( m_acPredWeightTable[LIST_1].init( 64 ) );
if( ( getPPS().getWeightedPredFlag () && ( m_eSliceType == P_SLICE ) ) ||
( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
{
if( m_bAdaptivePredictionFlag)//m_uiBaseLayerId != MSYS_UINT_MAX )
{
RNOK( pcReadIf->getFlag( m_bBasePredWeightTableFlag, "PWT: base_pred_weight_table_flag" ) );
}
else
{
if(m_uiBaseLayerId != MSYS_UINT_MAX)
m_bBasePredWeightTableFlag = true;
else
m_bBasePredWeightTableFlag = false;
}
if( ! m_bBasePredWeightTableFlag )
{
RNOK( pcReadIf->getUvlc( m_uiLumaLog2WeightDenom, "PWT: luma_log_weight_denom" ) );
RNOK( pcReadIf->getUvlc( m_uiChromaLog2WeightDenom, "PWT: chroma_log_weight_denom" ) );
ROTR( m_uiLumaLog2WeightDenom > 7, Err::m_nInvalidParameter );
ROTR( m_uiChromaLog2WeightDenom > 7, Err::m_nInvalidParameter );
RNOK( m_acPredWeightTable[LIST_0].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
RNOK( m_acPredWeightTable[LIST_0].read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
if( m_eSliceType == B_SLICE )
{
RNOK( m_acPredWeightTable[LIST_1].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
RNOK( m_acPredWeightTable[LIST_1].read( pcReadIf, getNumRefIdxActive( LIST_1) ) );
}
}
}
if( getNalRefIdc() )
{
if( isIdrNalUnit() )
{
RNOK( pcReadIf->getFlag( m_bNoOutputOfPriorPicsFlag, "DRPM: no_output_of_prior_pics_flag" ) );
RNOK( pcReadIf->getFlag( bTmp, "DRPM: long_term_reference_flag" ) );
ROT ( bTmp );
}
else
{
RNOK( pcReadIf->getFlag( m_bAdaptiveRefPicBufferingModeFlag, "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
if( m_bAdaptiveRefPicBufferingModeFlag )
{
RNOK( getMmcoBuffer().read( pcReadIf ) );
}
}
//JVT-S036 start
if( getKeyPicFlagScalable() && getNalUnitType() != 21)
{
RNOK(pcReadIf->getFlag( m_bAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if(m_bAdaptiveRefPicMarkingModeFlag)
{
RNOK( getMmcoBaseBuffer().read( pcReadIf ) );
}
}
//JVT-S036 end
}
if( getPPS().getEntropyCodingModeFlag() && m_eSliceType != I_SLICE )
{
RNOK( pcReadIf->getUvlc( m_uiCabacInitIdc, "SH: cabac_init_idc" ) );
}
}
RNOK( pcReadIf->getSvlc( m_iSliceQpDelta, "SH: slice_qp_delta" ) );
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( getDeblockingFilterParameter().read( pcReadIf ) );
}
UInt uiSliceGroupChangeCycle;
if( getPPS().getNumSliceGroupsMinus1()> 0 && getPPS().getSliceGroupMapType() >= 3 && getPPS().getSliceGroupMapType() <= 5)
{
UInt pictureSizeInMB = getSPS().getFrameHeightInMbs()*getSPS().getFrameWidthInMbs();
RNOK( pcReadIf->getCode( uiSliceGroupChangeCycle, getLog2MaxSliceGroupChangeCycle(pictureSizeInMB), "SH: slice_group_change_cycle" ) );
setSliceGroupChangeCycle(uiSliceGroupChangeCycle);
}
// TMM_ESS {
if ((m_eSliceType != F_SLICE) && (getSPS().getExtendedSpatialScalability() > ESS_NONE))
{
//if ( 1 /* chroma_format_idc */ > 0 )
{
RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseXPlus1, 2, "SH: BaseChromaPhaseXPlus1" ) );
RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseYPlus1, 2, "SH: BaseChromaPhaseYPlus1" ) );
}
if (getSPS().getExtendedSpatialScalability() == ESS_PICT)
{
RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset, "SH: ScaledBaseLeftOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset, "SH: ScaledBaseTopOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset, "SH: ScaledBaseRightOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset, "SH: ScaledBaseBottomOffset" ) );
}
}
// TMM_ESS }
if( m_eSliceType == F_SLICE )
{
RNOK( pcReadIf->getFlag( m_bArFgsUsageFlag, "SH: base_layer_key_pic_flag" ) );
if( m_bArFgsUsageFlag )
{
// send other information conditionally
RNOK( pcReadIf->getCode( m_uiBaseWeightZeroBaseBlock, 5, "SH: base_ref_weight_for_zero_base_block" ) );
if( m_uiBaseWeightZeroBaseBlock != 0 )
m_uiBaseWeightZeroBaseBlock += 1;
RNOK( pcReadIf->getCode( m_uiBaseWeightZeroBaseCoeff, 5, "SH: base_ref_weight_for_zero_base_coeff" ) );
if( m_uiBaseWeightZeroBaseCoeff != 0 )
m_uiBaseWeightZeroBaseCoeff += 1;
RNOK( pcReadIf->getFlag( m_bFgsEntropyOrderFlag, "SH: fgs_order_flag" ) );
}
else
{
m_uiBaseWeightZeroBaseBlock = AR_FGS_DEFAULT_BASE_WEIGHT_ZERO_BLOCK;
m_uiBaseWeightZeroBaseCoeff = AR_FGS_DEFAULT_BASE_WEIGHT_ZERO_COEFF;
m_bFgsEntropyOrderFlag = 0;
}
RNOK( pcReadIf->getFlag( m_bAdaptivePredictionFlag, "SH: motion_refinement_flag" ) );
}
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::xReadH264AVCCompatible( HeaderSymbolReadIf* pcReadIf )
{
Bool bTmp;
RNOK( pcReadIf->getCode( m_uiFrameNum,
getSPS().getLog2MaxFrameNum(), "SH: frame_num" ) );
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
{
RNOK( pcReadIf->getUvlc( m_uiIdrPicId, "SH: idr_pic_id" ) );
}
if( getSPS().getPicOrderCntType() == 0 )
{
RNOK( pcReadIf->getCode( m_uiPicOrderCntLsb,
getSPS().getLog2MaxPicOrderCntLsb(), "SH: pic_order_cnt_lsb" ) );
if( getPPS().getPicOrderPresentFlag() /*&& true ! field_pic_flag */ )
{
RNOK( pcReadIf->getSvlc( m_iDeltaPicOrderCntBottom, "SH: delta_pic_order_cnt_bottom" ) );
}
}
if( getSPS().getPicOrderCntType() == 1 && ! getSPS().getDeltaPicOrderAlwaysZeroFlag() )
{
RNOK( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[0], "SH: delta_pic_order_cnt[0]" ) );
if( getPPS().getPicOrderPresentFlag() /*&& true ! field_pic_flag */ )
{
RNOK( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[1], "SH: delta_pic_order_cnt[1]" ) );
}
}
//JVT-Q054 Red. Picture {
if ( getPPS().getRedundantPicCntPresentFlag())
{
RNOK( pcReadIf->getUvlc( m_uiRedundantPicCnt, "SH: redundant_pic_cnt") );
}
//JVT-Q054 Red. Picture }
if( m_eSliceType == B_SLICE )
{
RNOK( pcReadIf->getFlag( m_bDirectSpatialMvPredFlag, "SH: direct_spatial_mv_pred_flag" ) );
}
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
RNOK( pcReadIf->getFlag( m_bNumRefIdxActiveOverrideFlag, "SH: num_ref_idx_active_override_flag" ) );
if( m_bNumRefIdxActiveOverrideFlag )
{
RNOK( pcReadIf->getUvlc( m_auiNumRefIdxActive[LIST_0], "SH: num_ref_idx_l0_active_minus1" ) );
m_auiNumRefIdxActive[LIST_0]++;
if( m_eSliceType == B_SLICE )
{
RNOK( pcReadIf->getUvlc( m_auiNumRefIdxActive[LIST_1], "SH: num_ref_idx_l1_active_minus1" ) );
m_auiNumRefIdxActive[LIST_1]++;
}
}
}
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_0 ).read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
}
if( m_eSliceType == B_SLICE )
{
RNOK( getRplrBuffer( LIST_1 ).read( pcReadIf, getNumRefIdxActive( LIST_1 ) ) );
}
RNOK( m_acPredWeightTable[LIST_0].init( 64 ) );
RNOK( m_acPredWeightTable[LIST_1].init( 64 ) );
if( ( getPPS().getWeightedPredFlag () && ( m_eSliceType == P_SLICE ) ) ||
( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
{
RNOK( pcReadIf->getUvlc( m_uiLumaLog2WeightDenom, "PWT: luma_log_weight_denom" ) );
RNOK( pcReadIf->getUvlc( m_uiChromaLog2WeightDenom, "PWT: chroma_log_weight_denom" ) );
ROTR( m_uiLumaLog2WeightDenom > 7, Err::m_nInvalidParameter );
ROTR( m_uiChromaLog2WeightDenom > 7, Err::m_nInvalidParameter );
RNOK( m_acPredWeightTable[LIST_0].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
RNOK( m_acPredWeightTable[LIST_0].read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
if( m_eSliceType == B_SLICE )
{
RNOK( m_acPredWeightTable[LIST_1].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
RNOK( m_acPredWeightTable[LIST_1].read( pcReadIf, getNumRefIdxActive( LIST_1) ) );
}
}
if( getNalRefIdc() )
{
if( isIdrNalUnit() )
{
RNOK( pcReadIf->getFlag( m_bNoOutputOfPriorPicsFlag, "DRPM: no_output_of_prior_pics_flag" ) );
RNOK( pcReadIf->getFlag( bTmp, "DRPM: long_term_reference_flag" ) );
ROT ( bTmp );
}
else
{
RNOK( pcReadIf->getFlag( m_bAdaptiveRefPicBufferingModeFlag, "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
if( m_bAdaptiveRefPicBufferingModeFlag )
{
RNOK( getMmcoBuffer().read( pcReadIf ) );
}
}
}
if( getPPS().getEntropyCodingModeFlag() && m_eSliceType != I_SLICE )
{
RNOK( pcReadIf->getUvlc( m_uiCabacInitIdc, "SH: cabac_init_idc" ) );
}
RNOK( pcReadIf->getSvlc( m_iSliceQpDelta, "SH: slice_qp_delta" ) );
if( getPPS().getDeblockingFilterParametersPresentFlag() )
{
RNOK( getDeblockingFilterParameter().read( pcReadIf ) );
}
//--ICU/ETRI FMO Implementation
UInt uiSliceGroupChangeCycle;
if( getPPS().getNumSliceGroupsMinus1()> 0 && getPPS().getSliceGroupMapType() >= 3 && getPPS().getSliceGroupMapType() <= 5)
{
UInt pictureSizeInMB = getSPS().getFrameHeightInMbs()*getSPS().getFrameWidthInMbs();
RNOK( pcReadIf->getCode( uiSliceGroupChangeCycle, getLog2MaxSliceGroupChangeCycle(pictureSizeInMB), "SH: slice_group_change_cycle" ) );
setSliceGroupChangeCycle(uiSliceGroupChangeCycle);
}
#if 0//JMVM_ONLY // JVT-U052
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
RNOK( pcReadIf->getCode( m_uiIcEnable, 1, "SH: ic_enable" ) );
#endif
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::DeblockingFilterParameter::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
RNOK( pcWriteIf->writeUvlc( getDisableDeblockingFilterIdc(), "SH: disable_deblocking_filter_idc" ) );
ROTRS( 1 == getDisableDeblockingFilterIdc(), Err::m_nOK );
RNOK( pcWriteIf->writeSvlc( getSliceAlphaC0Offset() >> 1, "SH: slice_alpha_c0_offset_div2" ) );
RNOK( pcWriteIf->writeSvlc( getSliceBetaOffset() >> 1, "SH: slice_beta_offset_div2" ) );
return Err::m_nOK;
}
ErrVal
SliceHeaderBase::DeblockingFilterParameter::read( HeaderSymbolReadIf* pcReadIf )
{
RNOK( pcReadIf->getUvlc( m_uiDisableDeblockingFilterIdc, "SH: disable_deblocking_filter_idc" ) );
ROT ( m_uiDisableDeblockingFilterIdc > 2 );
ROTRS( 1 == getDisableDeblockingFilterIdc(), Err::m_nOK );
Int iTmp;
RNOK( pcReadIf->getSvlc( iTmp, "SH: slice_alpha_c0_offset_div2" ) );
ROT( (iTmp < -6) || (iTmp > 6) );
setSliceAlphaC0Offset( iTmp << 1);
RNOK( pcReadIf->getSvlc( iTmp, "SH: slice_beta_offset_div2" ) );
ROT( (iTmp < -6) || (iTmp > 6) );
setSliceBetaOffset( iTmp << 1 );
return Err::m_nOK;
}
//--ICU/ETRI FMO Implementation
ErrVal
SliceHeaderBase::FMOInit()
{
if(m_pcFMO == NULL)
m_pcFMO = new FMO();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?