📄 h264avcencoder.cpp
字号:
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
//===== finish encoding =====
for( UInt uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
RNOK( m_apcMCTFEncoder[uiLayer]->finish ( ruiNumCodedFrames, rdHighestLayerOutputRate, dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate ) );
}
printf("\n");
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::xProcessGOP( PicBufferList* apcPicBufferOutputList,
PicBufferList* apcPicBufferUnusedList )
{
UInt uiAUIndex, uiLayer;
//===== init GOP =====
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
m_apcMCTFEncoder[uiLayer]->setLayerCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getLayerCGSSNR () );
m_apcMCTFEncoder[uiLayer]->setQualityLevelCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR () );
m_apcMCTFEncoder[uiLayer]->setBaseLayerCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseLayerCGSSNR () );
m_apcMCTFEncoder[uiLayer]->setBaseQualityLevelCGSSNR( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseQualityLevelCGSSNR() );
RNOK( m_apcMCTFEncoder[uiLayer]->initGOP( m_cAccessUnitList, m_acOrgPicBufferList[uiLayer] ) );
}
//===== loop over access units in GOP, and layers inside access units =====
for( uiAUIndex = 0; uiAUIndex <= 64; uiAUIndex++ )
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer ++ )
{
if( m_pcCodingParameter->getNonRequiredEnable() )
{
if( uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1 ) m_apcMCTFEncoder[ uiLayer ]->setNonRequiredWrite( 2 );
else m_apcMCTFEncoder[ uiLayer ]->setNonRequiredWrite( 1 );
}
RNOK( m_apcMCTFEncoder[uiLayer]->process( uiAUIndex,
m_cAccessUnitList,
m_acOrgPicBufferList [uiLayer],
m_acRecPicBufferList [uiLayer],
apcPicBufferUnusedList[uiLayer],
m_aaauidSeqBits ) );
}
//===== update pic buffer lists =====
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
//----- set output list -----
apcPicBufferOutputList[ uiLayer ] += m_acRecPicBufferList[ uiLayer ];
//----- update unused list -----
apcPicBufferUnusedList[ uiLayer ] += m_acOrgPicBufferList[ uiLayer ];
apcPicBufferUnusedList[ uiLayer ] += m_acRecPicBufferList[ uiLayer ];
//----- reset lists -----
m_acOrgPicBufferList [ uiLayer ].clear();
m_acRecPicBufferList [ uiLayer ].clear();
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::xInitParameterSets()
{
UInt uiSPSId = 0;
UInt uiPPSId = 0;
UInt uiIndex;
//===== determine values for Poc calculation =====
UInt uiMaxResolutionStages = m_pcCodingParameter->getDecompositionStages();
UInt uiRequiredPocBits = max( 4, 1 + (Int)ceil( log10( 1.0 + ( 1 << uiMaxResolutionStages ) ) / log10( 2.0 ) ) );
//===== loop over layers =====
for( uiIndex = 0; uiIndex < m_pcCodingParameter->getNumberOfLayers(); uiIndex++ )
{
//===== get configuration parameters =====
LayerParameters& rcLayerParameters = m_pcCodingParameter->getLayerParameters( uiIndex );
//bug-fix suffix{{
//Bool bH264AVCCompatible = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 0;
Bool bH264AVCCompatible = ( uiIndex == 0 );
//bug-fix suffix}}
UInt uiMbY = rcLayerParameters.getFrameHeight() / 16;
UInt uiMbX = rcLayerParameters.getFrameWidth () / 16;
UInt uiOutFreq = (UInt)ceil( rcLayerParameters.getOutputFrameRate() );
UInt uiMvRange = m_pcCodingParameter->getMotionVectorSearchParams().getSearchRange() / 4;
UInt uiDPBSize = ( 1 << max( 1, rcLayerParameters.getDecompositionStages() ) );
UInt uiNumRefPic = uiDPBSize;
UInt uiLevelIdc = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
//bug-fix suffix{{
// if(m_pcCodingParameter->getBaseLayerMode() > 0)
//bug-fix suffix}}
// {
// ROT( bH264AVCCompatible && uiDPBSize > 16 );
// }
ROT( uiLevelIdc == MSYS_UINT_MAX );
//===== create parameter sets, set Id's, and store =====
SequenceParameterSet* pcSPS;
PictureParameterSet* pcPPSLP;
PictureParameterSet* pcPPSHP;
RNOK( SequenceParameterSet::create( pcSPS ) );
RNOK( PictureParameterSet ::create( pcPPSHP ) );
pcPPSHP->setPicParameterSetId( uiPPSId++ );
pcPPSHP->setSeqParameterSetId( uiSPSId );
RNOK( m_pcParameterSetMng->store( pcPPSHP ) );
if( rcLayerParameters.getContrainedIntraForLP() )
{
pcPPSLP = pcPPSHP;
}
else
{
RNOK( PictureParameterSet ::create( pcPPSLP ) );
pcPPSLP->setPicParameterSetId( uiPPSId++ );
pcPPSLP->setSeqParameterSetId( uiSPSId );
RNOK( m_pcParameterSetMng->store( pcPPSLP ) );
}
pcSPS->setSeqParameterSetId( uiSPSId++ );
RNOK( m_pcParameterSetMng->store( pcSPS ) );
//===== set sequence parameter set parameters =====
pcSPS->setNalUnitType ( NAL_UNIT_SPS );
pcSPS->setLayerId ( rcLayerParameters.getLayerId() );
pcSPS->setProfileIdc ( bH264AVCCompatible ? ( rcLayerParameters.getAdaptiveTransform() > 0 ? HIGH_PROFILE : MAIN_PROFILE ) : SCALABLE_PROFILE );
pcSPS->setConstrainedSet0Flag ( false );
pcSPS->setConstrainedSet1Flag ( bH264AVCCompatible ? 1 : 0 );
pcSPS->setConstrainedSet2Flag ( false );
pcSPS->setConstrainedSet3Flag ( false );
pcSPS->setLevelIdc ( uiLevelIdc );
pcSPS->setSeqScalingMatrixPresentFlag ( rcLayerParameters.getAdaptiveTransform() > 1 );
pcSPS->setLog2MaxFrameNum ( MAX_FRAME_NUM_LOG2 );
pcSPS->setLog2MaxPicOrderCntLsb ( min( 15, uiRequiredPocBits + 2 ) ); // HS: decoder robustness -> value increased by 2
pcSPS->setNumRefFrames ( uiNumRefPic );
pcSPS->setGapsInFrameNumValueAllowedFlag ( true );
pcSPS->setFrameWidthInMbs ( uiMbX );
pcSPS->setFrameHeightInMbs ( uiMbY );
pcSPS->setDirect8x8InferenceFlag ( true );
// TMM_ESS
pcSPS->setResizeParameters (rcLayerParameters.getResizeParameters());
if (uiIndex == 0)
{ // base layer AVC rewrite flag should always be false
pcSPS->setAVCRewriteFlag(false);
pcSPS->setAVCAdaptiveRewriteFlag(false);
}
else
{
pcSPS->setAVCRewriteFlag(rcLayerParameters.getAVCRewriteFlag());
pcSPS->setAVCAdaptiveRewriteFlag(rcLayerParameters.getAVCAdaptiveRewriteFlag());
}
const Bool bInterlaced = ( rcLayerParameters.getPaff() || rcLayerParameters.getMbAff() );
pcSPS->setPaff ( bH264AVCCompatible || ! rcLayerParameters.getPaff() );
pcSPS->setFrameMbsOnlyFlag ( ! bInterlaced );
pcSPS->setMbAdaptiveFrameFieldFlag ( (rcLayerParameters.getMbAff() ? true : false ) );
if( pcSPS->getMbAdaptiveFrameFieldFlag() && uiMbY % 2)
{
printf(" MBAFF ignored ");
pcSPS->setMbAdaptiveFrameFieldFlag( false ); //not allowed
}
// always send FGS info in SPS, and always send only 1 set of VectMode parameters
pcSPS->setFGSInfoPresentFlag ( true );
pcSPS->setFGSCycleAlignedFragment ( m_pcCodingParameter->getFGSParallelDecodingFlag() );
pcSPS->setNumFGSVectModes ( 1 );
pcSPS->setFGSCodingMode ( 0, (rcLayerParameters.getFGSCodingMode() != 0) );
pcSPS->setGroupingSize ( 0, rcLayerParameters.getGroupingSize() );
for( UInt ui = 0; ui < 16; ui++ )
{
pcSPS->setPosVect ( 0, ui, rcLayerParameters.getPosVect(ui) );
}
RNOK( pcSPS->checkPosVectors( 0 ) );
pcSPS->setRCDOBlockSizes ( false );
pcSPS->setRCDOMotionCompensationY( false );
pcSPS->setRCDOMotionCompensationC( false );
pcSPS->setRCDODeblocking ( false );
UInt uiRCDOBS = m_pcCodingParameter->getRCDOBlockSizes ();
UInt uiRCDOMCY = m_pcCodingParameter->getRCDOMotionCompensationY();
UInt uiRCDOMCC = m_pcCodingParameter->getRCDOMotionCompensationC();
UInt uiRCDODB = m_pcCodingParameter->getRCDODeblocking ();
pcSPS->setRCDOBlockSizes ( ( uiIndex && uiRCDOBS ) || ( uiRCDOBS > 1 ) );
pcSPS->setRCDOMotionCompensationY( ( uiIndex && uiRCDOMCY ) || ( uiRCDOMCY > 1 ) );
pcSPS->setRCDOMotionCompensationC( ( uiIndex && uiRCDOMCC ) || ( uiRCDOMCC > 1 ) );
pcSPS->setRCDODeblocking ( ( uiIndex && uiRCDODB ) || ( uiRCDODB > 1 ) );
// V090
pcSPS->set4TapMotionCompensationY( false );
UInt ui4TapMCY = m_pcCodingParameter->get4TapMotionCompensationY(); // V090
pcSPS->set4TapMotionCompensationY( ( uiIndex && ui4TapMCY ) || ( ui4TapMCY > 1 ) ); // V090
// V090
//===== set picture parameter set parameters =====
pcPPSHP->setNalUnitType ( NAL_UNIT_PPS );
pcPPSHP->setLayerId ( rcLayerParameters.getLayerId() );
pcPPSHP->setEntropyCodingModeFlag ( rcLayerParameters.getEntropyCodingModeFlag() );
pcPPSHP->setPicOrderPresentFlag ( true );
pcPPSHP->setNumRefIdxActive( LIST_0 , m_pcCodingParameter->getNumRefFrames() );
pcPPSHP->setNumRefIdxActive( LIST_1 , m_pcCodingParameter->getNumRefFrames() );
// heiko.schwarz@hhi.fhg.de: ensures that the PPS QP will be in the valid range (specified QP can be outside that range to force smaller/higher lambdas)
//pcPPSHP->setPicInitQp ( (Int)rcLayerParameters.getBaseQpResidual() );
pcPPSHP->setPicInitQp ( min( 51, max( 0, (Int)rcLayerParameters.getBaseQpResidual() ) ) );
pcPPSHP->setChomaQpIndexOffset ( 0 );
pcPPSHP->setDeblockingFilterParametersPresentFlag ( ! m_pcCodingParameter->getLoopFilterParams().isDefault() );
pcPPSHP->setConstrainedIntraPredFlag ( true );
pcPPSHP->setRedundantPicCntPresentFlag ( rcLayerParameters.getUseRedundantSliceFlag() ); // JVT-Q054 Red. Picture
pcPPSHP->setTransform8x8ModeFlag ( rcLayerParameters.getAdaptiveTransform() > 0 );
pcPPSHP->setPicScalingMatrixPresentFlag ( false );
pcPPSHP->set2ndChromaQpIndexOffset ( 0 );
pcPPSHP->setWeightedPredFlag ( WEIGHTED_PRED_FLAG );
pcPPSHP->setWeightedBiPredIdc ( WEIGHTED_BIPRED_IDC );
//TMM_WP
pcPPSHP->setWeightedPredFlag (m_pcCodingParameter->getIPMode()!=0);
pcPPSHP->setWeightedBiPredIdc (m_pcCodingParameter->getBMode());
//TMM_WP
//--ICU/ETRI FMO Implementation : FMO stuff start
pcPPSHP->setNumSliceGroupsMinus1 (rcLayerParameters.getNumSliceGroupsMinus1());
pcPPSHP->setSliceGroupMapType (rcLayerParameters.getSliceGroupMapType());
pcPPSHP->setArrayRunLengthMinus1 (rcLayerParameters.getArrayRunLengthMinus1());
pcPPSHP->setArrayTopLeft (rcLayerParameters.getArrayTopLeft());
pcPPSHP->setArrayBottomRight (rcLayerParameters.getArrayBottomRight());
pcPPSHP->setSliceGroupChangeDirection_flag (rcLayerParameters.getSliceGroupChangeDirection_flag());
pcPPSHP->setSliceGroupChangeRateMinus1 (rcLayerParameters.getSliceGroupChangeRateMinus1());
pcPPSHP->setNumSliceGroupMapUnitsMinus1 (rcLayerParameters.getNumSliceGroupMapUnitsMinus1());
pcPPSHP->setArraySliceGroupId (rcLayerParameters.getArraySliceGroupId());
//--ICU/ETRI FMO Implementation : FMO stuff end
if( ! rcLayerParameters.getContrainedIntraForLP() )
{
pcPPSLP->setNalUnitType ( pcPPSHP->getNalUnitType () );
pcPPSLP->setLayerId ( pcPPSHP->getLayerId () );
pcPPSLP->setEntropyCodingModeFlag ( pcPPSHP->getEntropyCodingModeFlag () );
pcPPSLP->setPicOrderPresentFlag ( pcPPSHP->getPicOrderPresentFlag () );
pcPPSLP->setNumRefIdxActive( LIST_0 , pcPPSHP->getNumRefIdxActive ( LIST_0 ) );
pcPPSLP->setNumRefIdxActive( LIST_1 , pcPPSHP->getNumRefIdxActive ( LIST_1 ) );
pcPPSLP->setPicInitQp ( pcPPSHP->getPicInitQp () );
pcPPSLP->setChomaQpIndexOffset ( pcPPSHP->getChomaQpIndexOffset () );
pcPPSLP->setDeblockingFilterParametersPresentFlag ( pcPPSHP->getDeblockingFilterParametersPresentFlag () );
pcPPSLP->setConstrainedIntraPredFlag ( false );
pcPPSLP->setRedundantPicCntPresentFlag ( pcPPSHP->getRedundantPicCntPresentFlag () ); //JVT-Q054 Red. Picture
pcPPSLP->setTransform8x8ModeFlag ( pcPPSHP->getTransform8x8ModeFlag () );
pcPPSLP->setPicScalingMatrixPresentFlag ( pcPPSHP->getPicScalingMatrixPresentFlag () );
pcPPSLP->set2ndChromaQpIndexOffset ( pcPPSHP->get2ndChromaQpIndexOffset () );
pcPPSLP->setWeightedPredFlag ( pcPPSHP->getWeightedPredFlag () );
pcPPSLP->setWeightedBiPredIdc ( pcPPSHP->getWeightedBiPredIdc () );
}
//--ICU/ETRI FMO Implementation : FMO stuff start
pcPPSLP->setNumSliceGroupsMinus1 (rcLayerParameters.getNumSliceGroupsMinus1());
pcPPSLP->setSliceGroupMapType (rcLayerParameters.getSliceGroupMapType());
pcPPSLP->setArrayRunLengthMinus1 (rcLayerParameters.getArrayRunLengthMinus1());
pcPPSLP->setArrayTopLeft (rcLayerParameters.getArrayTopLeft());
pcPPSLP->setArrayBottomRight (rcLayerParameters.getArrayBottomRight());
pcPPSLP->setSliceGroupChangeDirection_flag (rcLayerParameters.getSliceGroupChangeDirection_flag());
pcPPSLP->setSliceGroupChangeRateMinus1 (rcLayerParameters.getSliceGroupChangeRateMinus1());
pcPPSLP->setNumSliceGroupMapUnitsMinus1 (rcLayerParameters.getNumSliceGroupMapUnitsMinus1());
pcPPSLP->setArraySliceGroupId (rcLayerParameters.getArraySliceGroupId());
//--ICU/ETRI FMO Implementation : FMO stuff end
//===== initialization using parameter sets =====
RNOK( m_pcControlMng->initParameterSets( *pcSPS, *pcPPSLP, *pcPPSHP ) );
}
uiIndex = 0;
LayerParameters& rcLayerParameters = m_pcCodingParameter->getLayerParameters( uiIndex );
//bug-fix suffix{{
//Bool bH264AVCCompatible = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 0;
Bool bH264AVCCompatible = ( uiIndex == 0 );
//bug-fix suffix}}
if(bH264AVCCompatible && m_pcCodingParameter->getNumberOfLayers() == 1 && rcLayerParameters.getNumFGSLayers() > 0)
{
UInt uiMbY = rcLayerParameters.getFrameHeight() / 16;
UInt uiMbX = rcLayerParameters.getFrameWidth () / 16;
UInt uiOutFreq = (UInt)ceil( rcLayerParameters.getOutputFrameRate() );
UInt uiMvRange = m_pcCodingParameter->getMotionVectorSearchParams().getSearchRange() / 4;
UInt uiDPBSize = ( 1 << max( 1, rcLayerParameters.getDecompositionStages() ) );
UInt uiNumRefPic = uiDPBSize;
UInt uiLevelIdc = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
//bug-fix suffix{{
if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -