h264avcencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,655 行 · 第 1/5 页
CPP
1,655 行
}
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
return Err::m_nOK;
}
//===== INSERT BUFFERS =====
m_acOrgPicBufferList[uiLayer].push_back( pcOriginalPicBuffer );
m_acRecPicBufferList[uiLayer].push_back( pcReconstructPicBuffer );
UInt uiTargetBufferSize = ( 1 << m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages() );
if( ! m_apcMCTFEncoder[uiLayer]->firstGOPCoded() )
{
uiTargetBufferSize++;
}
ROT( m_acOrgPicBufferList[uiLayer].size() > uiTargetBufferSize );
if( m_acOrgPicBufferList[uiLayer].size() == uiTargetBufferSize )
{
//===== ENCODE GROUP OF PICTURES =====
m_apcMCTFEncoder[uiLayer]->setScalableLayer( uiScalableLayer );
RNOK( m_apcMCTFEncoder[uiLayer]->process( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
uiScalableLayer = m_apcMCTFEncoder[uiLayer]->getScalableLayer();
//----- set output list -----
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
//----- update unused list -----
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
//----- reset orig and reconstructed list -----
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
}
//{{Adaptive GOP structure
// --ETRI & KHU
}
else
{
if( pcOriginalPicBuffer == NULL )
{
//===== FINISH ENCODING =====
if( pcReconstructPicBuffer )
{
rcPicBufferUnusedList.push_back( pcReconstructPicBuffer );
}
if ( m_pcCodingParameter->getWriteGOPMode() ) { // mode decision
if( m_acOrgPicBufferList[uiLayer].size() )
{
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
}
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
}
else {
if ( !m_bGOPDone )
{
PicBufferList templist;
templist += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
if( m_acOrgPicBufferList[uiLayer].size() ) { // !!!!!
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
}
m_acRecPicBufferList[uiLayer] += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
rcPicBufferUnusedList += templist;
}
else
{
PicBufferList templist;
PicBufferList templist2;
templist += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
if( m_acOrgPicBufferList[uiLayer].size() ) { // !!!!!
//===== ENCODE GROUP OF PICTURES =====
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
//----- set output list -----
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
templist2 += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
rcPicBufferUnusedList += templist;
}
//----- update unused list -----
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += templist2;
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
//----- reset orig and reconstructed list -----
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
}
}
return Err::m_nOK;
}
UInt uiTargetBufferSize = ( 1 << m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages() );
if( ! m_apcMCTFEncoder[uiLayer]->firstGOPCoded() )
{
uiTargetBufferSize++;
}
UInt add_size = 0;
if (!m_uiGOPOrder && !(uiTargetBufferSize%2))
add_size = 1;
if (uiTargetBufferSize + add_size != m_acOrgPicBufferList[uiLayer].size()) {
//===== INSERT BUFFERS =====
m_acOrgPicBufferList[uiLayer].push_back( pcOriginalPicBuffer );
m_acRecPicBufferList[uiLayer].push_back( pcReconstructPicBuffer );
ROT( m_acOrgPicBufferList[uiLayer].size() > uiTargetBufferSize );
if (uiLayer == (m_pcCodingParameter->getNumberOfLayers()-1))
m_uiTarget = uiTargetBufferSize;
}
if( m_acOrgPicBufferList[uiLayer].size() == uiTargetBufferSize + add_size)
{
if (m_pcCodingParameter->getWriteGOPMode()) {
//===== ENCODE GROUP OF PICTURES =====
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
//----- set output list -----
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
//----- update unused list -----
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
//----- reset orig and reconstructed list -----
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
}
else {
if ( !m_bGOPDone ) {
PicBufferList templist;
templist += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
m_acRecPicBufferList[uiLayer] += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
rcPicBufferUnusedList += templist;
}
else {
PicBufferList templist;
PicBufferList templist2;
templist += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
//===== ENCODE GROUP OF PICTURES =====
RNOK( m_apcMCTFEncoder[uiLayer]->process_ags ( m_cAccessUnitList,
m_acOrgPicBufferList[uiLayer],
m_acRecPicBufferList[uiLayer],
rcPicBufferUnusedList,
m_aaauidSeqBits ) );
//----- set output list -----
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
templist2 += rcPicBufferUnusedList;
rcPicBufferUnusedList.clear();
rcPicBufferUnusedList += templist;
//----- update unused list -----
rcPicBufferUnusedList += m_acOrgPicBufferList[uiLayer];
rcPicBufferUnusedList += templist2;
rcPicBufferUnusedList += m_acRecPicBufferList[uiLayer];
//----- reset orig and reconstructed list -----
m_acOrgPicBufferList[uiLayer].clear();
m_acRecPicBufferList[uiLayer].clear();
}
}
}
}
//}}Adaptive GOP structure
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 );
Bool bH264AVCCompatible = m_pcCodingParameter->getBaseLayerMode() > 0 && uiIndex == 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() ) )
//{{Adaptive GOP structure -- 10.18.2005
// --ETRI & KHU
+ (m_pcCodingParameter->getUseAGS() && !bH264AVCCompatible? 20: 0);
//}}Adaptive GOP structure -- 10.18.2005
UInt uiNumRefPic = uiDPBSize;
UInt uiLevelIdc = SequenceParameterSet::getLevelIdc( uiMbY, uiMbX, uiOutFreq, uiMvRange, uiDPBSize );
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->setRequiredFrameNumUpdateBehaviourFlag ( true );
pcSPS->setFrameWidthInMbs ( uiMbX );
pcSPS->setFrameHeightInMbs ( uiMbY );
pcSPS->setDirect8x8InferenceFlag ( true );
// TMM_ESS
pcSPS->setResizeParameters (rcLayerParameters.getResizeParameters());
#if MULTIPLE_LOOP_DECODING
pcSPS->setAlwaysDecodeBaseLayer ( rcLayerParameters.getInterLayerPredictionMode() > 0 &&
rcLayerParameters.getDecodingLoops() > 1 );
#endif
if(rcLayerParameters.getFGSCodingMode() == 0)
{
pcSPS->setFGSCodingMode ( false );
}
else
{
pcSPS->setFGSCodingMode ( true );
}
pcSPS->setGroupingSize ( rcLayerParameters.getGroupingSize() );
for( UInt ui = 0; ui < 16; ui++ )
{
pcSPS->setPo
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?