📄 sliceheaderbase.cpp
字号:
, m_bInIDRAccess ( false ) //EIDR bug-fix
, m_bUseSmoothedRef ( true )//JVT-V058
, m_bAVCRewriteFlag ( rcSPS.getAVCRewriteFlag() ) // V-035
{
::memset( m_auiNumRefIdxActive , 0x00, 2*sizeof(UInt));
::memset( m_aiDeltaPicOrderCnt, 0x00, 2*sizeof(Int) );
//TMM_INTERLACE
for(UInt ui=0;ui<MAX_TEMP_LEVELS;ui++)
::memset( m_aauiNumRefIdxActiveUpdate[ui] , 0x00, 2*sizeof(UInt));
}
SliceHeaderBase::~SliceHeaderBase()
{
FMOUninit(); //TMM_INTERLACE
//--
ANOK( m_acPredWeightTable[LIST_0].uninit() );
ANOK( m_acPredWeightTable[LIST_1].uninit() );
}
SliceHeaderBase& SliceHeaderBase::operator = ( const SliceHeaderBase& rcSHB )
{
m_eNalRefIdc = rcSHB.m_eNalRefIdc;
m_eNalUnitType = rcSHB.m_eNalUnitType;
m_uiLayerId = rcSHB.m_uiLayerId;
m_uiTemporalLevel = rcSHB.m_uiTemporalLevel;
m_uiQualityLevel = rcSHB.m_uiQualityLevel;
m_uiFirstMbInSlice = rcSHB.m_uiFirstMbInSlice;
m_eSliceType = rcSHB.m_eSliceType;
m_uiPicParameterSetId = rcSHB.m_uiPicParameterSetId;
m_uiFrameNum = rcSHB.m_uiFrameNum;
m_uiNumMbsInSlice = rcSHB.m_uiNumMbsInSlice;
m_bFgsComponentSep = rcSHB.m_bFgsComponentSep;
m_uiIdrPicId = rcSHB.m_uiIdrPicId;
m_uiPicOrderCntLsb = rcSHB.m_uiPicOrderCntLsb;
m_bDirectSpatialMvPredFlag = rcSHB.m_bDirectSpatialMvPredFlag;
m_uiBaseLayerId = rcSHB.m_uiBaseLayerId;
m_uiBaseQualityLevel = rcSHB.m_uiBaseQualityLevel;
m_bAdaptivePredictionFlag = rcSHB.m_bAdaptivePredictionFlag;
m_bNumRefIdxActiveOverrideFlag = false; //rcSHB.m_bNumRefIdxActiveOverrideFlag;
m_auiNumRefIdxActive[ LIST_0 ] = rcSHB.m_auiNumRefIdxActive[ LIST_0 ];
m_auiNumRefIdxActive[ LIST_1 ] = rcSHB.m_auiNumRefIdxActive[ LIST_1 ];
m_acRplrBuffer [ LIST_0 ] = rcSHB.m_acRplrBuffer [ LIST_0 ];
m_acRplrBuffer [ LIST_1 ] = rcSHB.m_acRplrBuffer [ LIST_1 ];
//m_aauiNumRefIdxActiveUpdate[MAX_TEMP_LEVELS][2];
m_bNoOutputOfPriorPicsFlag = rcSHB.m_bNoOutputOfPriorPicsFlag;
m_bAdaptiveRefPicBufferingModeFlag = rcSHB.m_bAdaptiveRefPicBufferingModeFlag;
m_cMmmcoBuffer = rcSHB.m_cMmmcoBuffer;
m_uiCabacInitIdc = rcSHB.m_uiCabacInitIdc;
m_iSliceQpDelta = rcSHB.m_iSliceQpDelta;
m_cDeblockingFilterParameterScalable = rcSHB.m_cDeblockingFilterParameterScalable;
m_bBaseLayerUsesConstrainedIntraPred = rcSHB.m_bBaseLayerUsesConstrainedIntraPred;
m_uiPriorityId = rcSHB.m_uiPriorityId;
m_bDiscardableFlag = rcSHB.m_bDiscardableFlag;
m_bFieldPicFlag = rcSHB.m_bFieldPicFlag;
m_bBottomFieldFlag = rcSHB.m_bBottomFieldFlag;
m_iDeltaPicOrderCntBottom = rcSHB.m_iDeltaPicOrderCntBottom;
m_aiDeltaPicOrderCnt[0] = rcSHB.m_aiDeltaPicOrderCnt[0];
m_aiDeltaPicOrderCnt[1] = rcSHB.m_aiDeltaPicOrderCnt[1];
m_uiBaseChromaPhaseXPlus1 = rcSHB.m_uiBaseChromaPhaseXPlus1;
m_uiBaseChromaPhaseYPlus1 = rcSHB.m_uiBaseChromaPhaseYPlus1;
m_iScaledBaseLeftOffset = rcSHB.m_iScaledBaseLeftOffset;
m_iScaledBaseTopOffset = rcSHB.m_iScaledBaseTopOffset;
m_iScaledBaseRightOffset = rcSHB.m_iScaledBaseRightOffset;
m_iScaledBaseBottomOffset = rcSHB.m_iScaledBaseBottomOffset;
m_bArFgsUsageFlag = rcSHB.m_bArFgsUsageFlag;
m_uiLowPassFgsMcFilter = rcSHB.m_uiLowPassFgsMcFilter;
m_uiBaseWeightZeroBaseBlock = rcSHB.m_uiBaseWeightZeroBaseBlock;
m_uiBaseWeightZeroBaseCoeff = rcSHB.m_uiBaseWeightZeroBaseCoeff;
m_bBasePredWeightTableFlag = rcSHB.m_bBasePredWeightTableFlag;
m_uiLumaLog2WeightDenom = rcSHB.m_uiLumaLog2WeightDenom;
m_uiChromaLog2WeightDenom = rcSHB.m_uiChromaLog2WeightDenom;
m_uiBaseFragmentOrder = rcSHB.m_uiBaseFragmentOrder;
m_bCIUFlag = rcSHB.m_bCIUFlag;
if(m_pcFMO == NULL)
m_pcFMO = new FMO();
else
{
FMOUninit(); //TMM_INTERLACE
m_pcFMO = new FMO();
}
*m_pcFMO = *(rcSHB.m_pcFMO);
return *this;
}
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_PREFIX ) //prefix unit
{
return xWriteScalable ( pcWriteIf );
}
else
{
return xWriteH264AVCCompatible( pcWriteIf );
}
}
ErrVal
SliceHeaderBase::xWriteScalable( HeaderSymbolWriteIf* pcWriteIf ) const
{
UInt uiFragmentOrder = m_uiFragmentOrder;
UInt uiDependencyId = (m_eSliceType != F_SLICE)?m_uiLayerCGSSNR:m_uiLayerId;
UInt uiQualityLevel = (m_eSliceType != F_SLICE)?m_uiQualityLevelCGSSNR:m_uiQualityLevel;
Bool bLayerBaseFlag = ( (m_uiBaseLayerId == MSYS_UINT_MAX) && (uiQualityLevel==0) );
// JVT-V088 LMI {
// JVT-U116 LMI
//Bool bExtensionFlag = (uiDependencyId == 0 && uiQualityLevel == 0) ? m_bExtensionFlag : false;
// JVT-V088 LMI }
//===== 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_PREFIX )//prefix unit
{
//{{JVT-T083
RNOK (pcWriteIf->writeCode( 0 , 2, "NALU HEADER: reserved_zero_two_bits"));
RNOK (pcWriteIf->writeCode( m_uiPriorityId, 6, "NALU HEADER: priority_id"));
RNOK (pcWriteIf->writeCode( m_uiTemporalLevel, 3, "NALU HEADER: temporal_level"));
RNOK( pcWriteIf->writeCode( uiDependencyId, 3, "NALU HEADER: dependency_id" ) );
RNOK( pcWriteIf->writeCode( uiQualityLevel, 2, "NALU HEADER: quality_level" ) );
// JVT-U116 LMI
//RNOK (pcWriteIf->writeFlag( 0, "NALU HEADER: reserved_zero_one_bit"));
RNOK (pcWriteIf->writeFlag( bLayerBaseFlag, "NALU HEADER: layer_base_flag"));
RNOK (pcWriteIf->writeFlag( m_bUseBasePredictionFlag, "NALU HEADER: use_base_prediction_flag"));
RNOK (pcWriteIf->writeFlag( m_bDiscardableFlag, "NALU HEADER: discardable_flag"));
if ( m_eSliceType == F_SLICE && !m_bFragmentedFlag )
{ // PR_SLICES are allways fragmented (with a single framgment by default)
uiFragmentOrder = 0;
RNOK( pcWriteIf->writeFlag( 1, "NALU HEADER: fgs_frag_flag" ) );
RNOK( pcWriteIf->writeFlag( 1, "NALU HEADER: fgs_last_frag_flag" ) );
}
else
{
RNOK( pcWriteIf->writeFlag( m_bFragmentedFlag, "NALU HEADER: fgs_frag_flag" ) );
RNOK( pcWriteIf->writeFlag( m_bLastFragmentFlag, "NALU HEADER: fgs_last_frag_flag" ) );
}
RNOK( pcWriteIf->writeCode( uiFragmentOrder, 2, "NALU HEADER: fgs_frag_order" ) );
//}}JVT-T083
// JVT-V088 LMI {
// JVT-U116 LMI {
RNOK (pcWriteIf->writeFlag( m_bTl0PicIdxPresentFlag, "NALU HEADER: tl0_pic_idx_present_flag"));
if ( m_bTl0PicIdxPresentFlag )
RNOK( pcWriteIf->writeCode( m_uiTl0PicIdx, 8, "SH: tl0_pic_idx" ) );
// JVT-U116 LMI }
// JVT-V088 LMI }
}
//JVT-S036 lsj start
if(m_uiLayerId == 0 && m_uiQualityLevel == 0)
{
if( getNalRefIdc() )
{
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 ) );
}
}
}
}
else
{
//JVT-S036 lsj end
//===== slice header =====
UInt uiFirstMbInSlice = getFirstMbInSlice();
if ( !getSPS().getFrameMbsOnlyFlag() && getSPS().getMbAdaptiveFrameFieldFlag() && !getFieldPicFlag())
{
uiFirstMbInSlice >>=1;
}
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_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() && ! 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]" ) );
}
}
if ( getPPS().getRedundantPicCntPresentFlag() )
{
RNOK( pcWriteIf->writeUvlc( m_uiRedundantPicCnt, "SH: redundant_pic_cnt") );
}
if( m_eSliceType == B_SLICE )
{
RNOK( pcWriteIf->writeFlag( m_bDirectSpatialMvPredFlag, "SH: direct_spatial_mv_pred_flag" ) );
}
if( m_eSliceType != F_SLICE )
{
if( getSPS().getAVCAdaptiveRewriteFlag() == true )
RNOK( pcWriteIf->writeFlag( m_bAVCRewriteFlag, "SH: AVC_rewrite_flag" ) );
//{{JVT-T083
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 ( !bLayerBaseFlag )
{
UInt uiBaseLayerId;
if(m_uiQualityLevelCGSSNR != m_uiQualityLevel || m_uiLayerCGSSNR != m_uiLayerId)
{
uiBaseLayerId = ( (m_uiBaseLayerCGSSNR << 4) + ((m_uiBaseQualityLevelCGSSNR) << 2) + m_uiBaseFragmentOrder );
}
else
{
// one example (m_uiBaseLayerId, m_uiBaseQualityLevel) -> uiBaseLayerIdPlus1 mapping
uiBaseLayerId = ( (m_uiBaseLayerId << 4) + (m_uiBaseQualityLevel << 2) + m_uiBaseFragmentOrder );
}
RNOK( pcWriteIf->writeUvlc( uiBaseLayerId, "SH: base_id" ) );
RNOK( pcWriteIf->writeFlag( m_bAdaptivePredictionFlag, "SH: adaptive_prediction_flag" ) );
// JVT-U160 LMI {
if ( !m_bAdaptivePredictionFlag )
{
RNOK( pcWriteIf->writeFlag( m_bDefaultBaseModeFlag, "SH: default_base_mode_flag" ) );
if( !m_bDefaultBaseModeFlag)
{
RNOK( pcWriteIf->writeFlag( m_bAdaptiveMotPredictionFlag, "SH: adaptive_motion_prediction_flag" ) );
if ( !m_bAdaptiveMotPredictionFlag )
RNOK( pcWriteIf->writeFlag( m_bDefaultMotPredictionFlag, "SH: default_motion_prediction_flag" ) );
}
}
RNOK( pcWriteIf->writeFlag( m_bAdaptiveResPredictionFlag, "SH: adaptive_residual_prediction_flag" ) );
// JVT-U160 LMI }
RNOK( pcWriteIf->writeFlag( m_bUseSmoothedRef, "SH: use_smoothed_ref") );
}
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) ) );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -