sequenceparameterset.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 643 行 · 第 1/2 页
CPP
643 行
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 MULTIPLE_LOOP_DECODING
RNOK( pcWriteIf->writeFlag( m_bAlwaysDecodeBaseLayer, "SPS: always_decode_base_layer" ) );
#endif
#if INDEPENDENT_PARSING
RNOK( pcWriteIf->writeFlag( m_bIndepedentParsing, "SPS: independent_parsing" ) );
#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 lsj */
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
{
UInt uiNumPosVector = 0;
UInt uiIndex = 0;
while(uiNumPosVector != 15)
{
if(uiIndex == 0)
{
RNOK( pcReadIf->getUvlc(m_uiPosVect[uiIndex], "SPS: PosVect[0]") );
}
else
{
RNOK( pcReadIf->getUvlc(m_uiPosVect[uiIndex], "SPS: PosVect") );
m_uiPosVect[uiIndex] = m_uiPosVect[uiIndex] + m_uiPosVect[uiIndex-1] + 1;
}
uiNumPosVector = m_uiPosVect[uiIndex];
uiIndex++;
}
}
#if MULTIPLE_LOOP_DECODING
RNOK( pcReadIf->getFlag( m_bAlwaysDecodeBaseLayer, "SPS: always_decode_base_layer" ) );
#endif
#if INDEPENDENT_PARSING
RNOK( pcReadIf->getFlag( m_bIndepedentParsing, "SPS: independent_parsing" ) );
#endif
}
//--- fidelity range extension syntax ---
RNOK ( xReadFrext( pcReadIf ) );
RNOK ( pcReadIf->getUvlc( uiTmp, "SPS: log2_max_frame_num_minus_4" ) );
ROT ( uiTmp > 12 );
setLog2MaxFrameNum( uiTmp + 4 );
RNOK ( pcReadIf->getUvlc( m_uiPicOrderCntType, "SPS: pic_order_cnt_type" ) );
if( m_uiPicOrderCntType == 0 )
{
RNOK( pcReadIf->getUvlc( m_uiLog2MaxPicOrderCntLsb, "SPS: log2_max_pic_order_cnt_lsb_minus4" ) );
m_uiLog2MaxPicOrderCntLsb += 4;
}
else if( getPicOrderCntType() == 1 )
{
RNOK( pcReadIf->getFlag( m_bDeltaPicOrderAlwaysZeroFlag, "SPS: delta_pic_order_always_zero_flag" ) );
RNOK( pcReadIf->getSvlc( m_iOffsetForNonRefPic, "SPS: offset_for_non_ref_pic" ) );
RNOK( pcReadIf->getSvlc( m_iOffsetForTopToBottomField, "SPS: offset_for_top_to_bottom_field" ) );
RNOK( pcReadIf->getUvlc( m_uiNumRefFramesInPicOrderCntCycle, "SPS: num_ref_frames_in_pic_order_cnt_cycle" ) );
for( UInt uiIndex = 0; uiIndex < m_uiNumRefFramesInPicOrderCntCycle; uiIndex++ )
{
RNOK( pcReadIf->getSvlc( m_aiOffsetForRefFrame[uiIndex], "SPS: offset_for_ref_frame" ) );
}
}
RNOK( pcReadIf->getUvlc( m_uiNumRefFrames, "SPS: num_ref_frames" ) );
RNOK( pcReadIf->getFlag( m_bRequiredFrameNumUpdateBehaviourFlag, "SPS: required_frame_num_update_behaviour_flag" ) );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: pic_width_in_mbs_minus_1" ) );
setFrameWidthInMbs ( 1 + uiTmp );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: pic_height_in_map_units_minus_1" ) );
setFrameHeightInMbs( 1 + uiTmp );
RNOK( pcReadIf->getFlag( bTmp, "SPS: frame_mbs_only_flag" ) );
ROF ( bTmp );
RNOK( pcReadIf->getFlag( m_bDirect8x8InferenceFlag, "SPS: direct_8x8_inference_flag" ) );
RNOK( pcReadIf->getFlag( bTmp, "SPS: frame_cropping_flag" ) );
ROT ( bTmp );
RNOK( pcReadIf->getFlag( bTmp, "SPS: vui_parameters_present_flag" ) );
ROT ( bTmp );
return Err::m_nOK;
}
ErrVal
SequenceParameterSet::xWriteFrext( HeaderSymbolWriteIf* pcWriteIf ) const
{
ROTRS( m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != HIGH_10_PROFILE &&
m_eProfileIdc != HIGH_422_PROFILE &&
m_eProfileIdc != HIGH_444_PROFILE &&
m_eProfileIdc != MULTI_VIEW_PROFILE &&
m_eProfileIdc != SCALABLE_PROFILE, Err::m_nOK );
RNOK ( pcWriteIf->writeUvlc( 1, "SPS: chroma_format_idc" ) );
RNOK ( pcWriteIf->writeUvlc( 0, "SPS: bit_depth_luma_minus8" ) );
RNOK ( pcWriteIf->writeUvlc( 0, "SPS: bit_depth_chroma_minus8" ) );
RNOK ( pcWriteIf->writeFlag( false, "SPS: qpprime_y_zero_transform_bypass_flag" ) );
RNOK ( pcWriteIf->writeFlag( m_bSeqScalingMatrixPresentFlag, "SPS: seq_scaling_matrix_present_flag" ) );
ROTRS ( ! m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
RNOK ( m_cSeqScalingMatrix.write( pcWriteIf, true ) );
return Err::m_nOK;
}
ErrVal
SequenceParameterSet::xReadFrext( HeaderSymbolReadIf* pcReadIf )
{
ROTRS( m_eProfileIdc != HIGH_PROFILE &&
m_eProfileIdc != HIGH_10_PROFILE &&
m_eProfileIdc != HIGH_422_PROFILE &&
m_eProfileIdc != HIGH_444_PROFILE &&
m_eProfileIdc != MULTI_VIEW_PROFILE &&
m_eProfileIdc != SCALABLE_PROFILE, Err::m_nOK );
UInt uiTmp;
Bool bTmp;
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: chroma_format_idc" ) );
ROF ( uiTmp == 1 );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: bit_depth_luma_minus8" ) );
ROF ( uiTmp == 0 );
RNOK( pcReadIf->getUvlc( uiTmp, "SPS: bit_depth_chroma_minus8" ) );
ROF ( uiTmp == 0 );
RNOK( pcReadIf->getFlag( bTmp, "SPS: qpprime_y_zero_transform_bypass_flag" ) );
ROT ( bTmp )
RNOK( pcReadIf->getFlag( m_bSeqScalingMatrixPresentFlag, "SPS: seq_scaling_matrix_present_flag") );
ROTRS ( ! m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
RNOK ( m_cSeqScalingMatrix.read( pcReadIf, true ) );
return Err::m_nOK;
}
// TMM_ESS {
Void SequenceParameterSet::setResizeParameters ( const ResizeParameters * params )
{
m_uiExtendedSpatialScalability = (UInt)params->m_iExtendedSpatialScalability;
m_uiChromaPhaseXPlus1 = (UInt)(params->m_iChromaPhaseX+1);
m_uiChromaPhaseYPlus1 = (UInt)(params->m_iChromaPhaseY+1);
if (m_uiExtendedSpatialScalability == ESS_SEQ)
{
m_iScaledBaseLeftOffset = params->m_iPosX /2;
m_iScaledBaseTopOffset = params->m_iPosY /2;
m_iScaledBaseRightOffset = (params->m_iGlobWidth - params->m_iPosX - params->m_iOutWidth) /2;
m_iScaledBaseBottomOffset = (params->m_iGlobHeight - params->m_iPosY - params->m_iOutHeight) /2;
printf("offset: %d,%d %d,%d\n", m_iScaledBaseLeftOffset<<1, m_iScaledBaseTopOffset<<1, m_iScaledBaseRightOffset<<1, m_iScaledBaseBottomOffset<<1);
}
else
{
m_iScaledBaseBottomOffset = 0;
m_iScaledBaseLeftOffset = 0;
m_iScaledBaseRightOffset = 0;
m_iScaledBaseTopOffset = 0;
}
}
Void SequenceParameterSet::getResizeParameters ( ResizeParameters * params ) const
{
params->m_iExtendedSpatialScalability = m_uiExtendedSpatialScalability;
params->m_bCrop = (m_uiExtendedSpatialScalability != ESS_NONE);
int w = m_uiFrameWidthInMbs * 16;
int h = m_uiFrameHeightInMbs * 16;
params->m_iGlobWidth = w;
params->m_iGlobHeight = h;
params->m_iChromaPhaseX = (Int)m_uiChromaPhaseXPlus1 - 1;
params->m_iChromaPhaseY = (Int)m_uiChromaPhaseYPlus1 - 1;
if (m_uiExtendedSpatialScalability == ESS_SEQ)
{
params->m_iPosX = m_iScaledBaseLeftOffset *2;
params->m_iPosY = m_iScaledBaseTopOffset *2;
params->m_iOutWidth = w - params->m_iPosX - (m_iScaledBaseRightOffset *2);
params->m_iOutHeight = h - params->m_iPosY - (m_iScaledBaseBottomOffset *2);
}
else
{
params->m_iOutWidth = w;
params->m_iOutHeight = h;
params->m_iPosX = 0;
params->m_iPosY = 0;
}
}
// TMM_ESS }
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?