sliceheaderbase.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,669 行 · 第 1/5 页
CPP
1,669 行
delete m_pcFMO; m_pcFMO = NULL;
}
//--
ANOK( m_acPredWeightTable[LIST_0].uninit() );
ANOK( m_acPredWeightTable[LIST_1].uninit() );
}
ErrVal
SliceHeaderBase::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ||
m_eNalUnitType == NAL_UNIT_CODED_SLICE_PREFIX )
{
return xWriteScalable ( pcWriteIf );
}
else
{
return xWriteH264AVCCompatible( pcWriteIf );
}
}
ErrVal
SliceHeaderBase::xWriteScalable( 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" ) );
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ||
m_eNalUnitType == NAL_UNIT_CODED_SLICE_PREFIX )
{
RNOK ( pcWriteIf->writeCode( this->getSvcMvcFlag(), 1, "NALU HEADER: svc_mvc_flag" ) );
if (this->getSvcMvcFlag()==0) {
//{{Variable Lengh NAL unit header data with priority and dead substream flag
//France Telecom R&D- (nathalie.cammas@francetelecom.com)
RNOK (pcWriteIf->writeCode( m_uiSimplePriorityId, 6, "NALU HEADER: simple_priority_id"));
RNOK (pcWriteIf->writeFlag( m_bDiscardableFlag, "NALU HEADER: discardable_flag"));
RNOK (pcWriteIf->writeFlag( m_bReservedZeroBit, "NALU HEADER: reserved_zero_bit"));
RNOK (pcWriteIf->writeCode( m_uiTemporalLevel, 3, "NALU HEADER: temporal_level"));
if( m_eSliceType != F_SLICE )
{
RNOK( pcWriteIf->writeCode( m_uiLayerCGSSNR, 3, "NALU HEADER: dependency_id" ) );
RNOK( pcWriteIf->writeCode( m_uiQualityLevelCGSSNR, 2, "NALU HEADER: quality_level" ) );
}
else
{
RNOK( pcWriteIf->writeCode( m_uiLayerId, 3, "NALU HEADER: dependency_id" ) );
RNOK( pcWriteIf->writeCode( m_uiQualityLevel, 2, "NALU HEADER: quality_level" ) );
}
} else {
RNOK ( pcWriteIf->writeCode( m_uiSimplePriorityId, 6, "NALU HEADER: simple_priority_id"));
RNOK ( pcWriteIf->writeCode( m_uiTemporalLevel, 3, "NALU HEADER: temporal_level"));
// JVT-W035
RNOK ( pcWriteIf->writeCode( this->getAnchorPicFlag(), 1, "NALU HEADER: anchor_pic_flag" ) );
RNOK ( pcWriteIf->writeCode( this->getViewId(), 10, "NALU HEADER: view_id" ) );
RNOK ( pcWriteIf->writeCode( this->getIDRFlag(), 1, "NALU HEADER: IDR_flag" ) );
RNOK ( pcWriteIf->writeCode( this->getInterViewFlag(), 1, "NALU HEADER: inter_view_flag") ); // JVT-W056 Samsung
RNOK ( pcWriteIf->writeCode( this->getReservedZeroBits(), 1, "NALU HEADER: reserved_zero_two_bits" ) );
return Err::m_nOK;
}
}
//JVT-S036 start
if(m_uiLayerId == 0 && m_uiQualityLevel == 0 && m_eAVCCompatible )
{
if( m_eNalRefIdc != 0)
{
RNOK (pcWriteIf->writeFlag( m_bKeyPictureFlag, "SH: key_pic_flag"));
if( m_bKeyPictureFlag && m_eNalUnitType != 21)
{
RNOK(pcWriteIf->writeFlag( m_bAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if(m_bAdaptiveRefPicMarkingModeFlag)
{
RNOK( getMmcoBaseBuffer().write( pcWriteIf ) );
}
}
}
}
else
{
//JVT-S036 end
//===== slice header =====
RNOK( pcWriteIf->writeUvlc( m_uiFirstMbInSlice, "SH: first_mb_in_slice" ) );
UInt uiSliceType = ( m_eSliceType == B_SLICE ? 0 : m_eSliceType == P_SLICE ? 1 : UInt(m_eSliceType) );
RNOK( pcWriteIf->writeUvlc( uiSliceType, "SH: slice_type" ) );
//JVT-P031
if(uiSliceType == F_SLICE)
{
RNOK( pcWriteIf ->writeFlag( m_bFragmentedFlag, "SH: fgs_frag_flag" ) );
if(m_bFragmentedFlag)
{
RNOK( pcWriteIf ->writeUvlc( m_uiFragmentOrder, "SH: fgs_frag_order" ) );
if(m_uiFragmentOrder!=0)
{
RNOK( pcWriteIf ->writeFlag( m_bLastFragmentFlag, "SH: fgs_last_frag_flag" ) );
}
}
}
if(m_uiFragmentOrder == 0)
{
//~JVT-P031
if( m_eSliceType == F_SLICE )
{
RNOK( pcWriteIf->writeUvlc( m_uiNumMbsInSlice, "SH: num_mbs_in_slice" ) );
RNOK( pcWriteIf->writeFlag( m_bFgsComponentSep, "SH: fgs_comp_sep" ) );
}
RNOK( pcWriteIf->writeUvlc( m_uiPicParameterSetId, "SH: pic_parameter_set_id" ) );
RNOK( pcWriteIf->writeCode( m_uiFrameNum,
getSPS().getLog2MaxFrameNum(), "SH: frame_num" ) );
if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE )
{
RNOK( pcWriteIf->writeUvlc( m_uiIdrPicId, "SH: idr_pic_id" ) );
}
if( getSPS().getPicOrderCntType() == 0 )
{
RNOK( pcWriteIf->writeCode( m_uiPicOrderCntLsb,
getSPS().getLog2MaxPicOrderCntLsb(), "SH: pic_order_cnt_lsb" ) );
if( getPPS().getPicOrderPresentFlag() /*&& true ! field_pic_flag */ )
{
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() /*&& true ! field_pic_flag */ )
{
RNOK( pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[1], "SH: delta_pic_order_cnt[1]" ) );
}
}
//JVT-S036 start
}
if ( m_eNalRefIdc != 0 )
{
RNOK( pcWriteIf->writeFlag( m_bKeyPictureFlag, "SH: key_pic_flag"));
}
if( m_uiFragmentOrder == 0 )
{
//JVT-S036 end
//JVT-Q054 Red. Picture {
if ( m_eSliceType != F_SLICE )
{
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 != F_SLICE )
{
UInt uiBaseLayerIdPlus1;
if( m_uiBaseLayerId == MSYS_UINT_MAX )
uiBaseLayerIdPlus1 = 0;
else
//JVT-T054{
{
if(m_uiQualityLevelCGSSNR != m_uiQualityLevel || m_uiLayerCGSSNR != m_uiLayerId)
{
uiBaseLayerIdPlus1 = ( (m_uiBaseLayerCGSSNR << 4) + ((m_uiBaseQualityLevelCGSSNR) << 2) + m_uiBaseFragmentOrder ) + 1;
}
else
{
// one example (m_uiBaseLayerId, m_uiBaseQualityLevel) -> uiBaseLayerIdPlus1 mapping
uiBaseLayerIdPlus1 = ( (m_uiBaseLayerId << 4) + (m_uiBaseQualityLevel << 2) + m_uiBaseFragmentOrder ) + 1;
}
}
//JVT-T054}
RNOK( pcWriteIf->writeUvlc( uiBaseLayerIdPlus1, "SH: base_id_plus1" ) );
if( uiBaseLayerIdPlus1 )
{
RNOK( pcWriteIf->writeFlag( m_bAdaptivePredictionFlag, "SH: adaptive_prediction_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 JMVM_ONLY // JVT-W081
UInt i;
UInt uiNumNonAnchorRefL0 = getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(this->getViewId(), LIST_0);
UInt uiNumNonAnchorRefL1 = getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(this->getViewId(), LIST_1);
if( this->getAnchorPicFlag())
{
if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
{
for(i=0; i<uiNumNonAnchorRefL0; i++)
{
RNOK ( pcWriteIf->writeSvlc ( m_iGlobalDisparityL0[i][0], "SH: global_disparity_L0[i][0]" ) );
RNOK ( pcWriteIf->writeSvlc ( m_iGlobalDisparityL0[i][1], "SH: global_disparity_L0[i][1]" ) );
}
}
if( m_eSliceType == B_SLICE )
{
for(i=0; i<uiNumNonAnchorRefL1; i++)
{
RNOK ( pcWriteIf->writeSvlc ( m_iGlobalDisparityL1[i][0], "SH: global_disparity_L1[i][0]" ) );
RNOK ( pcWriteIf->writeSvlc ( m_iGlobalDisparityL1[i][1], "SH: global_disparity_L1[i][1]" ) );
}
}
}
#endif // JVT-W081
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 ) ) )
{
if( m_bAdaptivePredictionFlag )
{
RNOK( pcWriteIf->writeFlag( m_bBasePredWeightTableFlag, "PWT: base_pred_weight_table_flag" ) );
}
if( ! m_bBasePredWeightTableFlag )
{
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 ) );
}
}
//JVT-S036 start
if(getKeyPictureFlag() && getNalUnitType() !=21)
{
RNOK(pcWriteIf->writeFlag( m_bAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if(m_bAdaptiveRefPicMarkingModeFlag)
{
RNOK( getMmcoBaseBuffer().write( pcWriteIf ) );
}
}
//JVT-S036 end
}
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( getDeblockingFilterParameter().write( pcWriteIf ) );
}
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)
{
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseLeftOffset, "SH: ScaledBaseLeftOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseTopOffset, "SH: ScaledBaseTopOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseRightOffset, "SH: ScaledBaseRightOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseBottomOffset, "SH: ScaledBaseBottomOffset" ) );
}
}
// TMM_ESS }
if( m_eSliceType == F_SLICE )
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?