slicereader.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 680 行 · 第 1/2 页
CPP
680 行
UInt uiFrameNum,
UInt uiPoc,
UInt uiTemporalLevel,
SliceHeader*& rpcSH)
{
SequenceParameterSet* pcSPS;
PictureParameterSet* pcPPS;
UInt uiPPSId = rpcVeryFirstSliceHeader->getPPS().getPicParameterSetId();
#if MULTIPLE_LOOP_DECODING
// if ( uiPoc % uiMaxGopSize != 0)
// uiPPSId--;
#endif
RNOK( m_pcParameterSetMng ->get ( pcPPS, uiPPSId) );
RNOK( m_pcParameterSetMng ->get ( pcSPS, pcPPS->getSeqParameterSetId() ) );
rpcSH = new SliceHeader ( *pcSPS, *pcPPS );
ROF( rpcSH );
rpcSH->setNalUnitType ( eNalUnitType );
if(eNalUnitType==NAL_UNIT_CODED_SLICE_SCALABLE)
{
rpcSH->setLayerId ( 1 );
rpcSH->setBaseLayerId(MSYS_UINT_MAX); // will be modified later
}
else
{
rpcSH->setLayerId(0);
rpcSH->setBaseLayerId ( MSYS_UINT_MAX );
}
rpcSH->setTemporalLevel ( uiTemporalLevel );
rpcSH->setQualityLevel ( 0 );
rpcSH->setFirstMbInSlice( 0 );
rpcSH->setFragmentedFlag( false);
UInt uiMaxPocLsb = 1 << rpcSH->getSPS().getLog2MaxPicOrderCntLsb();
rpcSH->setFrameNum( uiFrameNum);
rpcSH->setPicOrderCntLsb( uiPoc % uiMaxPocLsb);
rpcSH->setPoc( uiPoc);
rpcSH->setAdaptivePredictionFlag(1);
rpcSH->setDirectSpatialMvPredFlag(false);
rpcSH->setNumRefIdxActiveOverrideFlag( true);
rpcSH->setNumRefIdxActive( LIST_0, 1);
if ( rpcSH->getPicOrderCntLsb() % uiMaxGopSize == 0 || (uiGopSize - ((rpcSH->getPicOrderCntLsb() % uiMaxGopSize) >> (uiMaxDecompositionStages-uiDecompositionStages)) < (unsigned)( 1<<(uiDecompositionStages-uiTemporalLevel) ) ) )
{
rpcSH->setSliceType ( P_SLICE );
if( rpcSH->getPicOrderCntLsb() % (1<<(uiMaxDecompositionStages-uiDecompositionStages+1)) == 0)
rpcSH->setNalRefIdc ( NAL_REF_IDC_PRIORITY_HIGHEST);
else
rpcSH->setNalRefIdc ( NAL_REF_IDC_PRIORITY_HIGH);
rpcSH->setKeyPictureFlag( 1);
}
else
{
rpcSH->setSliceType ( B_SLICE );
if( rpcSH->getPicOrderCntLsb() % (1<<(uiMaxDecompositionStages-uiDecompositionStages+1)) == 0)
rpcSH->setNalRefIdc ( NAL_REF_IDC_PRIORITY_LOW);
else
rpcSH->setNalRefIdc ( NAL_REF_IDC_PRIORITY_LOWEST);
rpcSH->setNumRefIdxActive( LIST_1, 1);
rpcSH->setKeyPictureFlag( 0);
}
//if(eNalUnitType==NAL_UNIT_CODED_SLICE||)
//key picture MMCO for base and enhancement layer
{
if(rpcSH->getPoc() % uiMaxGopSize == 0 || (uiGopSize - ((rpcSH->getPicOrderCntLsb() % uiMaxGopSize) >> (uiMaxDecompositionStages-uiDecompositionStages)) < (unsigned)( 1<<(uiDecompositionStages-uiTemporalLevel) ) ) )
{
UInt index=rpcSH->getPoc() / uiMaxGopSize;
if( index>0 )rpcSH->setAdaptiveRefPicBufferingFlag(true);
else rpcSH->setAdaptiveRefPicBufferingFlag(false);
if(index>1)
{
Bool bNumber2Gop= index >2 ? true : false;
rpcSH->setDefualtMmcoBuffer(uiDecompositionStages,bNumber2Gop);
}
rpcSH->setSliceType(P_SLICE);
rpcSH->setNalRefIdc(NAL_REF_IDC_PRIORITY_HIGHEST);
}
if(rpcSH->getPoc() % uiMaxGopSize == 0 || (uiGopSize - ((rpcSH->getPicOrderCntLsb() % uiMaxGopSize) >> (uiMaxDecompositionStages-uiDecompositionStages)) < (unsigned)( 1<<(uiDecompositionStages-uiTemporalLevel) ) ) )
{
UInt index=rpcSH->getPoc() / uiMaxGopSize;
if( index>1 )
{
rpcSH->getRplrBuffer(LIST_0).setRefPicListReorderingFlag(true);
rpcSH->getRplrBuffer(LIST_0).clear();
rpcSH->getRplrBuffer(LIST_0).set(0,Rplr(RPLR_NEG,uiGopSize/2-1));
}
else
{
rpcSH->getRplrBuffer(LIST_0).setRefPicListReorderingFlag(false);
}
}
}
//weighted prediction
RNOK( rpcSH->getPredWeightTable(LIST_0).init( 64 ) );
RNOK( rpcSH->getPredWeightTable(LIST_1).init( 64 ) );
return Err::m_nOK;
}
//TMM_EC }}
ErrVal
SliceReader::readSliceHeader( NalUnitType eNalUnitType,
NalRefIdc eNalRefIdc,
UInt uiLayerId,
UInt uiTemporalLevel,
UInt uiQualityLevel,
SliceHeader*& rpcSH
//JVT-P031
,UInt uiFirstFragSHPPSId
,UInt uiFirstFragNumMbsInSlice
,Bool bFirstFragFGSCompSep
//~JVT-P031
,Bool UnitAVCFlag //JVT-S036 lsj
)
{
Bool bScalable = ( eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE );
UInt uiFirstMbInSlice;
UInt uiSliceType;
UInt uiPPSId;
SequenceParameterSet* pcSPS;
PictureParameterSet* pcPPS;
//===== read first parameters =====
//JVT-P031
UInt uiFragOrder = 0;
Bool bFragFlag = false;
Bool bLastFragFlag = false;
UInt uiNumMbsInSlice = 0;
Bool bFGSCompSep = false;
//JVT-S036 lsj start
Bool KeyPicFlag = false;
Bool eAdaptiveRefPicMarkingModeFlag = false;
MmcoBuffer eMmcoBaseBuffer;
//JVT-S036 lsj end
if( eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE )
{
//JVT-S036 lsj start
if( uiLayerId == 0 && uiQualityLevel == 0 && UnitAVCFlag )
{
RNOK( m_pcParameterSetMng ->get ( pcPPS, PPSId_AVC ) );
RNOK( m_pcParameterSetMng ->get ( pcSPS, SPSId_AVC ) );
rpcSH = new SliceHeader ( *pcSPS, *pcPPS );
ROF( rpcSH );
if( eNalRefIdc != 0)
{
RNOK( m_pcHeaderReadIf->getFlag( KeyPicFlag, "SH: key_pic_flag"));
if( KeyPicFlag && eNalUnitType != 21)
{
RNOK(m_pcHeaderReadIf->getFlag( eAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if( eAdaptiveRefPicMarkingModeFlag )
{
RNOK( rpcSH->getMmcoBaseBuffer().read( m_pcHeaderReadIf ) );
}
}
}
rpcSH->setNalUnitType ( eNalUnitType );
rpcSH->setNalRefIdc ( eNalRefIdc );
rpcSH->setLayerId ( uiLayerId );
rpcSH->setTemporalLevel ( uiTemporalLevel );
rpcSH->setQualityLevel ( uiQualityLevel );
rpcSH->setKeyPicFlagScalable( KeyPicFlag );
rpcSH->setAdaptiveRefPicMarkingFlag( eAdaptiveRefPicMarkingModeFlag );
rpcSH->setPicOrderCntLsb( POC_AVC );
// UnitAVCFlag = false;
return Err::m_nOK;
}
else
{
//JVT-S036 lsj end
RNOK( m_pcHeaderReadIf ->getUvlc( uiFirstMbInSlice, "SH: first_mb_in_slice" ) );
RNOK( m_pcHeaderReadIf ->getUvlc( uiSliceType, "SH: slice_type" ) );
if( uiSliceType > 4 && ! bScalable )
{
uiSliceType -= 5;
}
if(uiSliceType == F_SLICE)
{
RNOK( m_pcHeaderReadIf ->getFlag( bFragFlag, "SH: fgs_frag_flag" ) );
if(bFragFlag)
{
RNOK( m_pcHeaderReadIf ->getUvlc( uiFragOrder, "SH: fgs_frag_order" ) );
if(uiFragOrder!=0)
{
RNOK( m_pcHeaderReadIf ->getFlag( bLastFragFlag, "SH: fgs_last_frag_flag" ) );
}
}
if(uiFragOrder == 0 )
{
RNOK( m_pcHeaderReadIf ->getUvlc( uiNumMbsInSlice, "SH: num_mbs_in_slice" ) );
RNOK( m_pcHeaderReadIf ->getFlag( bFGSCompSep, "SH: fgs_comp_sep" ) );
}
}
if(uiFragOrder == 0)
{
RNOK( m_pcHeaderReadIf ->getUvlc( uiPPSId, "SH: pic_parameter_set_id" ) );
}
else
{
// Get PPS Id from first fragment
uiPPSId = uiFirstFragSHPPSId;
uiNumMbsInSlice = uiFirstFragNumMbsInSlice;
bFGSCompSep = bFirstFragFGSCompSep;
}
RNOK( m_pcParameterSetMng ->get ( pcPPS, uiPPSId) );
RNOK( m_pcParameterSetMng ->get ( pcSPS, pcPPS->getSeqParameterSetId() ) );
}//JVT-S036 lsj
}
else
{
RNOK( m_pcHeaderReadIf ->getUvlc( uiFirstMbInSlice, "SH: first_mb_in_slice" ) );
RNOK( m_pcHeaderReadIf ->getUvlc( uiSliceType, "SH: slice_type" ) );
if( uiSliceType > 4 && ! bScalable )
{
uiSliceType -= 5;
}
RNOK( m_pcHeaderReadIf ->getUvlc( uiPPSId, "SH: pic_parameter_set_id" ) );
RNOK( m_pcParameterSetMng ->get ( pcPPS, uiPPSId) );
RNOK( m_pcParameterSetMng ->get ( pcSPS, pcPPS->getSeqParameterSetId() ) );
}
//===== create and initialize slice header =====
rpcSH = new SliceHeader ( *pcSPS, *pcPPS );
ROF( rpcSH );
rpcSH->setNalUnitType ( eNalUnitType );
rpcSH->setNalRefIdc ( eNalRefIdc );
rpcSH->setLayerId ( uiLayerId );
rpcSH->setTemporalLevel ( uiTemporalLevel );
rpcSH->setQualityLevel ( uiQualityLevel );
rpcSH->setFirstMbInSlice( uiFirstMbInSlice);
rpcSH->setSliceType ( SliceType( uiSliceType ) );
rpcSH->setFragmentedFlag( bFragFlag );
rpcSH->setFragmentOrder ( uiFragOrder );
rpcSH->setLastFragmentFlag( bLastFragFlag );
rpcSH->setFgsComponentSep(bFGSCompSep);
rpcSH->setNumMbsInSlice(uiNumMbsInSlice);
//~JVT-P031
//===== read remaining parameters =====
if(uiFragOrder == 0) //JVT-P031
{
RNOK( rpcSH->read( m_pcHeaderReadIf ) );
}
//JVT-S036 lsj start
else
{
RNOK( m_pcHeaderReadIf->getFlag( KeyPicFlag, "SH: key_pic_flag"));
rpcSH->setKeyPicFlagScalable( KeyPicFlag ); //JVT-S036 lsj
}
if ( eNalUnitType == NAL_UNIT_CODED_SLICE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
{
UnitAVCFlag = true;
PPSId_AVC = uiPPSId;
SPSId_AVC = pcPPS->getSeqParameterSetId();
POC_AVC = rpcSH->getPicOrderCntLsb();
}
//JVT-S036 lsj end
//--ICU/ETRI FMO Implementation
rpcSH->FMOInit();
// JVT-S054 (2) (ADD) ->
if (uiNumMbsInSlice != 0)
rpcSH->setLastMbInSlice(rpcSH->getFMO()->getLastMbInSlice(uiFirstMbInSlice, uiNumMbsInSlice));
else
// JVT-S054 (2) (ADD) <-
rpcSH->setLastMbInSlice(rpcSH->getFMO()->getLastMBInSliceGroup(rpcSH->getFMO()->getSliceGroupId(uiFirstMbInSlice)));
return Err::m_nOK;
}
//JVT-S036 lsj start
ErrVal
SliceReader::readSliceHeaderSuffix( NalUnitType eNalUnitType,
NalRefIdc eNalRefIdc,
UInt uiLayerId,
UInt uiQualityLevel,
SliceHeader* pcSliceHeader
)
{
//===== read first parameters =====
Bool eAdaptiveRefPicMarkingModeFlag = false;
Bool KeyPicFlag = false;
if( eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE )
{
if( uiLayerId == 0 && uiQualityLevel == 0 )
{
if( eNalRefIdc != 0)
{
RNOK( m_pcHeaderReadIf->getFlag( KeyPicFlag, "SH: key_pic_flag"));
if( KeyPicFlag && eNalUnitType != 21)
{
RNOK(m_pcHeaderReadIf->getFlag( eAdaptiveRefPicMarkingModeFlag, "DRPM: adaptive_ref_pic_marking_mode_flag"));
if( eAdaptiveRefPicMarkingModeFlag )
{
RNOK( pcSliceHeader->getMmcoBaseBuffer().read( m_pcHeaderReadIf ) );
}
}
}
pcSliceHeader->setKeyPicFlagScalable( KeyPicFlag ); //JVT-S036 lsj
pcSliceHeader->setAdaptiveRefPicMarkingFlag( eAdaptiveRefPicMarkingModeFlag );
return Err::m_nOK;
}
else
return Err::m_nERR;
}
else
return Err::m_nERR;
}
//JVT-S036 lsj end
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?