sequenceparameterset.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 800 行 · 第 1/3 页
CPP
800 行
{
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++;
}
}
}
SpsMVC = NULL; // Nov. 30
if( m_eProfileIdc == MULTI_VIEW_PROFILE )
{
SpsMVC = new SpsMvcExtension; // Nov. 30
int i,j, vcOrder;
// seq_parameter_set_mvc_extension()
RNOK ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_views_minus_1, "SPS: num_views_minus_1" ) ); // ue(v)
SpsMVC->initViewSPSMemory_num_refs_for_lists(SpsMVC->getNumViewMinus1());
#if JMVM_ONLY // JVT-Y042
RNOK ( pcReadIf->getFlag( SpsMVC->non_anchor_single_loop_decoding_flag, "SPS: non_anchor_single_loop_decoding_flag" ) ); // u(1)
#endif
//JVT-V054
SpsMVC->setInitDone(false);
printf("ViewCodingOrder: ");
for (i=0;i<= SpsMVC->m_num_views_minus_1; i++)
{
RNOK ( pcReadIf->getUvlc( SpsMVC->m_uiViewCodingOrder[i], "SPS: view_id[i]")); //ue(v)
printf("%d ", SpsMVC->m_uiViewCodingOrder[i]);
}
printf ("\n");
for (i=1;i<= SpsMVC->m_num_views_minus_1; i++) //JVT-Y061
{
vcOrder = SpsMVC->m_uiViewCodingOrder[i];
RNOK ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_anchor_refs_list0[vcOrder], "SPS: num_anchor_refs_l0[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,0);
for (j=0; j<SpsMVC->m_num_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_anchor_ref_list0[vcOrder][j], "SPS: anchor_ref_l0[i][j]" ) ); // ue(v)
RNOK ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_anchor_refs_list1[vcOrder], "SPS: num_anchor_refs_l1[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,0);
for (j=0; j<SpsMVC->m_num_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_anchor_ref_list1[vcOrder][j], "SPS: anchor_ref_l1[vcOrder][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 ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
SpsMVC->setNumNonAnchorRefsForListX(vcOrder,0,0);
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j], "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
}
else
{
RNOK ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j], "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
}
#else
RNOK ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_non_anchor_refs_list0[vcOrder], "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( 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 ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
SpsMVC->setNumNonAnchorRefsForListX(vcOrder,1,0);
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
}
else
{
RNOK ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
}
#else
RNOK ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_non_anchor_refs_list1[vcOrder], "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
RNOK ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j], "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
#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 + -
显示快捷键?