sequenceparameterset.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 800 行 · 第 1/3 页
CPP
800 行
return n;
}
}
}
return MSYS_UINT_MAX;
}
ErrVal
SequenceParameterSet::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
//===== NAL unit header =====
ETRACE_DECLARE( Bool m_bTraceEnable = true );
g_nLayer = m_uiLayerId;
ETRACE_LAYER(m_uiLayerId);
ETRACE_VIEWID(m_uiCurrentViewId);
ETRACE_HEADER( "SEQUENCE PARAMETER SET" );
RNOK ( pcWriteIf->writeFlag( 0, "NALU HEADER: forbidden_zero_bit" ) );
RNOK ( pcWriteIf->writeCode( 3, 2, "NALU HEADER: nal_ref_idc" ) );
RNOK ( pcWriteIf->writeCode( m_eNalUnitType, 5, "NALU HEADER: nal_unit_type" ) );
//===== Sequence parameter set =====
RNOK ( pcWriteIf->writeCode( getProfileIdc(), 8, "SPS: profile_idc" ) );
RNOK ( pcWriteIf->writeFlag( m_bConstrainedSet0Flag, "SPS: constrained_set0_flag" ) );
RNOK ( pcWriteIf->writeFlag( m_bConstrainedSet1Flag, "SPS: constrained_set1_flag" ) );
RNOK ( pcWriteIf->writeFlag( m_bConstrainedSet2Flag, "SPS: constrained_set2_flag" ) );
RNOK ( pcWriteIf->writeFlag( m_bConstrainedSet3Flag, "SPS: constrained_set3_flag" ) );
RNOK ( pcWriteIf->writeCode( 0, 4, "SPS: reserved_zero_4bits" ) );
RNOK ( pcWriteIf->writeCode( getLevelIdc(), 8, "SPS: level_idc" ) );
RNOK ( pcWriteIf->writeUvlc( getSeqParameterSetId(), "SPS: seq_parameter_set_id" ) );
if( m_eProfileIdc == SCALABLE_PROFILE ) // bug-fix (HS)
{
/*RNOK( pcWriteIf->writeFlag( m_bNalUnitExtFlag, "SPS: nal_unit_extension_flag" ) );
if ( m_bNalUnitExtFlag == 0 )
{
RNOK ( pcWriteIf->writeUvlc( m_uiNumSimplePriIdVals - 1, "SPS: number_of_simple_priority_id_values_minus1" ) );
for ( UInt uiPriCount = 0; uiPriCount < m_uiNumSimplePriIdVals; uiPriCount++ )
{
RNOK ( pcWriteIf->writeCode( uiPriCount, PRI_ID_BITS, "SPS: priority_id" ) );
RNOK ( pcWriteIf->writeCode( m_uiTemporalLevelList[uiPriCount], 3, "SPS: temporal_level_list[priority_id]" ) );
RNOK ( pcWriteIf->writeCode( m_uiDependencyIdList [uiPriCount], 3, "SPS: dependency_id_list[priority_id]" ) );
RNOK ( pcWriteIf->writeCode( m_uiQualityLevelList [uiPriCount], 2, "SPS: quality_level_list[priority_id]" ) );
}
}
JVT-S036 */
RNOK( pcWriteIf->writeCode( getExtendedSpatialScalability(), 2, "SPS: ExtendedSpatialScalability" ) );
// if ( 1 /* chroma_format_idc */ > 0 )
{
RNOK( pcWriteIf->writeCode( m_uiChromaPhaseXPlus1, 2, "SPS: ChromaPhaseXPlus1" ) );
RNOK( pcWriteIf->writeCode( m_uiChromaPhaseYPlus1, 2, "SPS: ChromaPhaseYPlus1" ) );
}
if (getExtendedSpatialScalability() == ESS_SEQ)
{
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseLeftOffset, "SPS: ScaledBaseLeftOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseTopOffset, "SPS: ScaledBaseTopOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseRightOffset, "SPS: ScaledBaseRightOffset" ) );
RNOK( pcWriteIf->writeSvlc( m_iScaledBaseBottomOffset, "SPS: ScaledBaseBottomOffset" ) );
}
RNOK ( pcWriteIf->writeFlag( m_bFGSCodingMode, "SPS: FGSCodingMode") );
if(m_bFGSCodingMode == false)
{
RNOK ( pcWriteIf->writeUvlc(m_uiGroupingSize-1, "SPS: GroupingSizeMinus1") );
}
else
{
UInt uiNumPosVector = 0;
UInt uiIndex = 0;
while(uiNumPosVector != 15)
{
if(uiIndex == 0)
{
RNOK( pcWriteIf->writeUvlc(m_uiPosVect[uiIndex], "SPS: PosVect[0]") );
}
else
{
RNOK( pcWriteIf->writeUvlc(m_uiPosVect[uiIndex]-m_uiPosVect[uiIndex-1]-1, "SPS: PosVect") );
}
uiNumPosVector = m_uiPosVect[uiIndex];
uiIndex++;
}
}
}
if( m_eProfileIdc == MULTI_VIEW_PROFILE )
{
// seq_parameter_set_mvc_extension()
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_num_views_minus_1, "SPS: num_views_minus_1" ) ); // ue(v)
#if JMVM_ONLY // JVT-Y042
RNOK ( pcWriteIf->writeFlag(SpsMVC->non_anchor_single_loop_decoding_flag, "SPS: non_anchor_single_loop_decoding_flag" ) ); // u(1)
#endif
int i,j, vcOrder;
//JVT-V054
printf("ViewCodingOrder: ");
for (i=0;i<= SpsMVC->m_num_views_minus_1; i++)
{
printf("%d ", SpsMVC->m_uiViewCodingOrder[i]);
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_uiViewCodingOrder[i], "SPS: view_id[i]")); //ue(v)
}
printf ("\n");
for (i=1;i<= SpsMVC->m_num_views_minus_1; i++) //JVT-Y061
{
vcOrder = SpsMVC->m_uiViewCodingOrder[i];
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_anchor_refs_list0[vcOrder], "SPS: num_anchor_refs_l0[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_anchor_ref_list0[vcOrder][j], "SPS: anchor_ref_l0[i][j]" ) ); // ue(v)
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_anchor_refs_list1[vcOrder], "SPS: num_anchor_refs_l1[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_anchor_ref_list1[vcOrder][j], "SPS: anchor_ref_l1[i][j]" ) ); // ue(v)
}
for (i=1;i<= SpsMVC->m_num_views_minus_1; i++) //JVT-Y061
{
vcOrder = SpsMVC->m_uiViewCodingOrder[i];
#if JMVM_ONLY // JVT-Y042
if ( SpsMVC->getSingleLoopDecoding() )
{
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j], "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
}
else
{
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j], "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
}
#else
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j], "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
#endif
#if JMVM_ONLY // JVT-Y042
if ( SpsMVC->getSingleLoopDecoding() )
{
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
}
else
{
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
}
#else
RNOK ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
#endif
}
}
//--- fidelity range extension syntax ---
RNOK ( xWriteFrext( pcWriteIf ) );
UInt uiTmp = getLog2MaxFrameNum();
ROF ( uiTmp >= 4 );
RNOK ( pcWriteIf->writeUvlc( uiTmp - 4, "SPS: log2_max_frame_num_minus_4" ) );
RNOK ( pcWriteIf->writeUvlc( getPicOrderCntType(), "SPS: pic_order_cnt_type" ) );
if( getPicOrderCntType() == 0 )
{
RNOK ( pcWriteIf->writeUvlc( getLog2MaxPicOrderCntLsb() - 4, "SPS: log2_max_pic_order_cnt_lsb_minus4" ) );
}
else if( getPicOrderCntType() == 1 )
{
RNOK( pcWriteIf->writeFlag( getDeltaPicOrderAlwaysZeroFlag(), "SPS: delta_pic_order_always_zero_flag" ) );
RNOK( pcWriteIf->writeSvlc( getOffsetForNonRefPic(), "SPS: offset_for_non_ref_pic" ) );
RNOK( pcWriteIf->writeSvlc( getOffsetForTopToBottomField(), "SPS: offset_for_top_to_bottom_field" ) );
RNOK( pcWriteIf->writeUvlc( getNumRefFramesInPicOrderCntCycle(), "SPS: num_ref_frames_in_pic_order_cnt_cycle" ) );
for( UInt uiIndex = 0; uiIndex < getNumRefFramesInPicOrderCntCycle(); uiIndex++ )
{
RNOK( pcWriteIf->writeSvlc( getOffsetForRefFrame( uiIndex ), "SPS: offset_for_ref_frame" ) );
}
}
RNOK ( pcWriteIf->writeUvlc( getNumRefFrames(), "SPS: num_ref_frames" ) );
RNOK ( pcWriteIf->writeFlag( getRequiredFrameNumUpdateBehaviourFlag(), "SPS: required_frame_num_update_behaviour_flag" ) );
RNOK ( pcWriteIf->writeUvlc( getFrameWidthInMbs () - 1, "SPS: pic_width_in_mbs_minus_1" ) );
RNOK ( pcWriteIf->writeUvlc( getFrameHeightInMbs () - 1, "SPS: pic_height_in_map_units_minus_1" ) );
RNOK ( pcWriteIf->writeFlag( true, "SPS: frame_mbs_only_flag" ) );
RNOK ( pcWriteIf->writeFlag( getDirect8x8InferenceFlag(), "SPS: direct_8x8_inference_flag" ) );
RNOK ( pcWriteIf->writeFlag( false, "SPS: frame_cropping_flag" ) );
RNOK ( pcWriteIf->writeFlag( false, "SPS: vui_parameters_present_flag" ) );
return Err::m_nOK;
}
ErrVal
SequenceParameterSet::read( HeaderSymbolReadIf* pcReadIf,
NalUnitType eNalUnitType )
{
m_uiExtendedSpatialScalability = ESS_NONE;
//===== NAL unit header =====
setNalUnitType ( eNalUnitType );
Bool bTmp;
UInt uiTmp;
//===== Sequence parameter set =====
RNOK ( pcReadIf->getCode( uiTmp, 8, "SPS: profile_idc" ) );
m_eProfileIdc = Profile ( uiTmp );
ROT ( m_eProfileIdc != BASELINE_PROFILE &&
m_eProfileIdc != MAIN_PROFILE &&
m_eProfileIdc != EXTENDED_PROFILE &&
m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != MULTI_VIEW_PROFILE &&
m_eProfileIdc != SCALABLE_PROFILE );
RNOK ( pcReadIf->getFlag( m_bConstrainedSet0Flag, "SPS: constrained_set0_flag" ) );
RNOK ( pcReadIf->getFlag( m_bConstrainedSet1Flag, "SPS: constrained_set1_flag" ) );
RNOK ( pcReadIf->getFlag( m_bConstrainedSet2Flag, "SPS: constrained_set2_flag" ) );
RNOK ( pcReadIf->getFlag( m_bConstrainedSet3Flag, "SPS: constrained_set3_flag" ) );
RNOK ( pcReadIf->getCode( uiTmp, 4, "SPS: reserved_zero_4bits" ) );
ROT ( uiTmp );
RNOK ( pcReadIf->getCode( m_uiLevelIdc, 8, "SPS: level_idc" ) );
RNOK ( pcReadIf->getUvlc( m_uiSeqParameterSetId, "SPS: seq_parameter_set_id" ) );
if( m_eProfileIdc == SCALABLE_PROFILE ) // bug-fix (HS)
{
/* RNOK( pcReadIf->getFlag( m_bNalUnitExtFlag, "SPS: nal_unit_extension_flag" ) );
if ( m_bNalUnitExtFlag == 0 )
{
RNOK ( pcReadIf->getUvlc( m_uiNumSimplePriIdVals, "SPS: number_of_simple_priority_id_values_minus1" ) );
m_uiNumSimplePriIdVals++;
for ( UInt uiPriCount = 0; uiPriCount < m_uiNumSimplePriIdVals; uiPriCount++ )
{
RNOK ( pcReadIf->getCode( uiTmp, PRI_ID_BITS, "SPS: priority_id" ) );
RNOK ( pcReadIf->getCode( m_uiTemporalLevelList[uiTmp], 3, "SPS: temporal_level_list[priority_id]" ) );
RNOK ( pcReadIf->getCode( m_uiDependencyIdList [uiTmp], 3, "SPS: dependency_id_list[priority_id]" ) );
RNOK ( pcReadIf->getCode( m_uiQualityLevelList [uiTmp], 2, "SPS: quality_level_list[priority_id]" ) );
}
}
JVT-S036 */
RNOK( pcReadIf->getCode( m_uiExtendedSpatialScalability, 2, "SPS: ExtendedSpatialScalability" ) );
// if ( 1 /* chroma_format_idc */ > 0 )
{
RNOK( pcReadIf->getCode( m_uiChromaPhaseXPlus1, 2, "SPS: ChromaPhaseXPlus1" ) );
RNOK( pcReadIf->getCode( m_uiChromaPhaseYPlus1, 2, "SPS: ChromaPhaseYPlus1" ) );
}
if (m_uiExtendedSpatialScalability == ESS_SEQ)
{
RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset, "SPS: ScaledBaseLeftOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset, "SPS: ScaledBaseTopOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset, "SPS: ScaledBaseRightOffset" ) );
RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset, "SPS: ScaledBaseBottomOffset" ) );
}
RNOK ( pcReadIf->getFlag( m_bFGSCodingMode, "SPS: FGSCodingMode") );
if(m_bFGSCodingMode == false)
{
RNOK ( pcReadIf->getUvlc(m_uiGroupingSize, "SPS: GroupingSizeMinus1") );
m_uiGroupingSize++;
}
else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?