?? slicereader.cpp
字號:
//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,
Bool m_svc_mvc_flag, // this m_xxx is not good
Bool bIDRFlag, // JVT-W035
Bool bAnchorPicFlag,
UInt uiViewId,
Bool uiInterViewFlag, // JVT-W056 Samsung
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 =====
UInt uiNumMbsInSlice = 0;
UInt uiFragOrder = 0;
Bool bFragFlag = false;
Bool bLastFragFlag = false;
Bool bFGSCompSep = false;
MmcoBuffer eMmcoBaseBuffer;
// if(bScalable && m_view_level == 0)
if( eNalUnitType == NAL_UNIT_CODED_SLICE_PREFIX) //JVT-W035
return Err::m_nOK;
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->setAnchorPicFlag ( bAnchorPicFlag );
rpcSH->setViewId ( uiViewId );
rpcSH->setIDRFlag ( bIDRFlag ); //JVT-W035
rpcSH->setInterViewFalg (uiInterViewFlag); //JVT-W056 Samsung
rpcSH->setSvcMvcFlag ( m_svc_mvc_flag);
rpcSH->setFirstMbInSlice( uiFirstMbInSlice);
rpcSH->setSliceType ( SliceType( uiSliceType ) );
rpcSH->setNumMbsInSlice ( uiNumMbsInSlice);
//JVT-W035
rpcSH->setAVCFlag ( !bScalable );
rpcSH->setLayerId ( 0 );
rpcSH->setTemporalLevel ( 0 );
rpcSH->setQualityLevel ( 0 );
rpcSH->setFragmentedFlag( bFragFlag );
rpcSH->setFragmentOrder ( uiFragOrder );
rpcSH->setLastFragmentFlag( bLastFragFlag );
rpcSH->setFgsComponentSep(bFGSCompSep);
//===== read remaining parameters =====
RNOK( rpcSH->read( m_pcHeaderReadIf ) );
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();
}
//--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;
}
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
)
{
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 start
Bool KeyPicFlag = false;
Bool eAdaptiveRefPicMarkingModeFlag = false;
MmcoBuffer eMmcoBaseBuffer;
//JVT-S036 end
if( eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE )
{
//JVT-S036 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 end
// slice_header_in_scalable_extenson() begins
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
}
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
rpcSH->setAVCFlag ( ! bScalable); //JVT-W035
//===== read remaining parameters =====
if(uiFragOrder == 0) //JVT-P031
{
RNOK( rpcSH->read( m_pcHeaderReadIf ) );
}
//JVT-S036 start
else
{
RNOK( m_pcHeaderReadIf->getFlag( KeyPicFlag, "SH: key_pic_flag"));
rpcSH->setKeyPicFlagScalable( KeyPicFlag ); //JVT-S036
}
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 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 start
ErrVal
SliceReader::readSliceHeaderPrefix( NalUnitType eNalUnitType,
Bool m_svc_mvc_flag, //JVT-W035
NalRefIdc eNalRefIdc,
UInt uiLayerId,
UInt uiQualityLevel,
SliceHeader* pcSliceHeader
)
{
//===== read first parameters =====
Bool eAdaptiveRefPicMarkingModeFlag = false;
Bool KeyPicFlag = false;
//JVT-W035 {{ prefix
if (m_svc_mvc_flag==1 && eNalUnitType == NAL_UNIT_CODED_SLICE_PREFIX)
return Err::m_nOK;
//JVT-W035 }} mvc prefix end
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
pcSliceHeader->setAdaptiveRefPicMarkingFlag( eAdaptiveRefPicMarkingModeFlag );
return Err::m_nOK;
}
else
return Err::m_nERR;
}
else
return Err::m_nERR;
}
//JVT-S036 end
H264AVC_NAMESPACE_END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -