📄 h264avcencoder.cpp
字号:
m_cUnWrittenSPS.pop_front();
}
else
{
if( ! m_cUnWrittenPPS.empty() )
{
RNOK( m_pcNalUnitEncoder->initNalUnit( pcExtBinDataAccessor ) );
PictureParameterSet& rcPPS = *m_cUnWrittenPPS.front();
RNOK( m_pcNalUnitEncoder->write( rcPPS ) )
RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );
if( m_pcCodingParameter->getNumberOfLayers() )
{
UInt uiSPSId = rcPPS.getSeqParameterSetId();
SequenceParameterSet* pcSPS;
RNOK( m_pcParameterSetMng->get( pcSPS, uiSPSId, rcPPS.referencesSubsetSPS() ) );
UInt uiLayer = pcSPS->getDependencyId();
UInt uiSize = pcExtBinDataAccessor->size();
RNOK( m_apcLayerEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
}
m_cUnWrittenPPS.pop_front();
}
else
{
AF();
rbMoreSets = false;
return Err::m_nERR;
}
}
rbMoreSets = !(m_cUnWrittenSPS.empty() && m_cUnWrittenPPS.empty());
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::process( ExtBinDataAccessorList& rcExtBinDataAccessorList,
PicBuffer* apcOriginalPicBuffer [MAX_LAYERS],
PicBuffer* apcReconstructPicBuffer [MAX_LAYERS],
PicBufferList* apcPicBufferOutputList,
PicBufferList* apcPicBufferUnusedList )
{
UInt uiHighestLayer = m_pcCodingParameter->getNumberOfLayers() - 1;
UInt uiTargetSize = ( 1 << m_pcCodingParameter->getLayerParameters(uiHighestLayer).getDecompositionStages() ) + ( m_apcLayerEncoder[uiHighestLayer]->firstGOPCoded() ? 0 : 1 );
//===== fill lists =====
for( UInt uiLayer = 0; uiLayer <= uiHighestLayer; uiLayer++ )
{
if( apcOriginalPicBuffer[ uiLayer ] )
{
ROF( apcReconstructPicBuffer[ uiLayer ] );
m_acOrgPicBufferList [ uiLayer ].push_back( apcOriginalPicBuffer [ uiLayer ] );
m_acRecPicBufferList [ uiLayer ].push_back( apcReconstructPicBuffer[ uiLayer ] );
}
else if( apcReconstructPicBuffer[ uiLayer ] )
{
apcPicBufferUnusedList[ uiLayer ].push_back( apcReconstructPicBuffer[ uiLayer ] );
}
}
//===== encoding of GOP =====
ROT( m_acOrgPicBufferList[uiHighestLayer].size() > uiTargetSize );
if ( m_acOrgPicBufferList[uiHighestLayer].size() == uiTargetSize )
{
RNOK( xProcessGOP( apcPicBufferOutputList, apcPicBufferUnusedList ) );
}
//===== update data accessor list =====
m_cAccessUnitDataList.emptyNALULists( rcExtBinDataAccessorList );
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::finish( ExtBinDataAccessorList& rcExtBinDataAccessorList,
PicBufferList* apcPicBufferOutputList,
PicBufferList* apcPicBufferUnusedList,
UInt& ruiNumCodedFrames,
Double& rdHighestLayerOutputRate )
{
//===== encode GOP =====
RNOK( xProcessGOP( apcPicBufferOutputList, apcPicBufferUnusedList ) );
//===== update data accessor list =====
m_cAccessUnitDataList.emptyNALULists( rcExtBinDataAccessorList );
//===== finish encoding =====
if( m_pcCodingParameter->getCGSSNRRefinement() == 1 )
{
for( UInt uiLayer = 1; uiLayer <= m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
if( uiLayer == m_pcCodingParameter->getNumberOfLayers() || m_apcLayerEncoder[uiLayer]->getQualityLevelCGSSNR() == 0 ) //last layer is highest quality layer
{
RNOK( m_apcLayerEncoder[uiLayer-1]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate, m_aaadFinalFramerate, m_aaadSeqBits ) );
UInt uiLayerCGSSNR = m_apcLayerEncoder[uiLayer-1]->getLayerCGSSNR();
m_adAvgBitrate[uiLayerCGSSNR] = m_apcLayerEncoder[uiLayer-1]->m_dAvgBitrate;
}
}
}
else
{
for( UInt uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
RNOK( m_apcLayerEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate, m_aaadFinalFramerate, m_aaadSeqBits ) );
//JVT-W051 {
m_adAvgBitrate[uiLayer] = m_apcLayerEncoder[uiLayer]->m_dAvgBitrate;
//JVT-W051 }
}
}
printf("\n");
return Err::m_nOK;
}
//JVT-W051 {
ErrVal
H264AVCEncoder::xCalMaxBitrate(UInt uiLayer)
{
//UInt uiDecompositionStages = m_pcCodingParameter->getLayerParameters(uiLayer).getDecompositionStages();
UInt uiCurrIdx = 0;
UInt uiTimeWindowSize = (UInt)(m_pcCodingParameter->getLayerParameters(uiLayer).m_dOutputFrameRate+0.5);
UInt uiFrameNumInGOP = m_uiFrameNumInGOP[uiLayer];
UInt uiBaseLayerId = m_pcCodingParameter->getLayerParameters(uiLayer).getBaseLayerId();
UInt uiBaseQualityLevel = m_pcCodingParameter->getLayerParameters(uiLayer).getBaseQualityLevel();
if ( uiBaseQualityLevel > 3 )
{
uiBaseQualityLevel = 3;
}
for ( uiCurrIdx = 0; uiCurrIdx < uiFrameNumInGOP; uiCurrIdx++ )
{
if ( uiLayer )
{
m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][0] += m_aaadFrameInGOPBits[uiCurrIdx][uiBaseLayerId][uiBaseQualityLevel];
}
for ( UInt uiFGSLayer = 1; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer] += m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer-1];
}
}
if ( ( m_uiCodeFrameNum[uiLayer] - uiFrameNumInGOP ) < uiTimeWindowSize )
{
for ( uiCurrIdx = 0; (uiCurrIdx < uiFrameNumInGOP) && (m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx < uiTimeWindowSize); uiCurrIdx ++ )
{
for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
m_aaadFrameInTimeWindowBits[m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx][uiLayer][uiFGSLayer] =
m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer];
}
}
//add
for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] = 0;
for ( UInt i = 0; i < uiTimeWindowSize; i++ )
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
}
m_aadMaxBitrate[uiLayer][uiFGSLayer] = m_aadMaxBitrate[uiLayer][uiFGSLayer]*uiTimeWindowSize/(m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx);
}
//add
if ((uiCurrIdx < uiFrameNumInGOP) || (m_uiCodeFrameNum[uiLayer]-uiFrameNumInGOP+uiCurrIdx == uiTimeWindowSize))
{
for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] = 0;
for ( UInt i = 0; i < uiTimeWindowSize; i++ )
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
}
//m_aadMaxBitrate[uiLayer][uiFGSLayer] = m_aadMaxBitrate[uiLayer][uiFGSLayer];
}
for ( UInt uiCurrAUIdx = uiCurrIdx; uiCurrAUIdx < uiFrameNumInGOP; uiCurrAUIdx++ )
{
for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
UInt i = 0;
for (i = 0; i < uiTimeWindowSize-1; i++)
{
m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer] = m_aaadFrameInTimeWindowBits[i+1][uiLayer][uiFGSLayer];
}
m_aaadFrameInTimeWindowBits[uiTimeWindowSize-1][uiLayer][uiFGSLayer] = m_aaadFrameInGOPBits[uiCurrAUIdx][uiLayer][uiFGSLayer];
Double dTmpMaxBitrate = 0;
for (i = 0; i < uiTimeWindowSize; i++)
{
dTmpMaxBitrate += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
}
dTmpMaxBitrate = dTmpMaxBitrate;
if (dTmpMaxBitrate > m_aadMaxBitrate[uiLayer][uiFGSLayer])
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] = dTmpMaxBitrate;
}
}
}
}
}
else
{
for ( uiCurrIdx = 0; uiCurrIdx < uiFrameNumInGOP; uiCurrIdx ++ )
{
for ( UInt uiFGSLayer = 0; uiFGSLayer < MAX_QUALITY_LEVELS; uiFGSLayer++ )
{
UInt i = 0;
for (i = 0; i < uiTimeWindowSize-1; i++)
{
m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer] = m_aaadFrameInTimeWindowBits[i+1][uiLayer][uiFGSLayer];
}
m_aaadFrameInTimeWindowBits[uiTimeWindowSize-1][uiLayer][uiFGSLayer] = m_aaadFrameInGOPBits[uiCurrIdx][uiLayer][uiFGSLayer];
Double dTmpMaxBitrate = 0;
for (i = 0; i < uiTimeWindowSize; i++)
{
dTmpMaxBitrate += m_aaadFrameInTimeWindowBits[i][uiLayer][uiFGSLayer];
}
dTmpMaxBitrate = dTmpMaxBitrate;
if (dTmpMaxBitrate > m_aadMaxBitrate[uiLayer][uiFGSLayer])
{
m_aadMaxBitrate[uiLayer][uiFGSLayer] = dTmpMaxBitrate;
}
}
}
}
return Err::m_nOK;
}
//JVT-W051 }
ErrVal
H264AVCEncoder::xProcessGOP( PicBufferList* apcPicBufferOutputList,
PicBufferList* apcPicBufferUnusedList )
{
UInt uiAUIndex, uiLayer;
//===== init GOP =====
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
m_apcLayerEncoder[uiLayer]->setLayerCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getLayerCGSSNR () );
m_apcLayerEncoder[uiLayer]->setQualityLevelCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR () );
m_apcLayerEncoder[uiLayer]->setBaseLayerCGSSNR ( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseLayerCGSSNR () );
m_apcLayerEncoder[uiLayer]->setBaseQualityLevelCGSSNR( m_pcCodingParameter->getLayerParameters( uiLayer ).getBaseQualityLevelCGSSNR() );
RNOK( m_apcLayerEncoder[uiLayer]->initGOP( m_cAccessUnitDataList.getAccessUnitData( MSYS_UINT_MAX ), m_acOrgPicBufferList[uiLayer] ) );
}
//JVT-W052
if(m_pcCodingParameter->getIntegrityCheckSEIEnable() && m_pcCodingParameter->getCGSSNRRefinement())
{
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
m_uiNumofCGS[m_apcLayerEncoder[uiLayer]->getLayerCGSSNR()] = m_pcCodingParameter->getLayerParameters( uiLayer ).getQualityLevelCGSSNR() + m_pcCodingParameter->getLayerParameters( uiLayer ).getNumberOfQualityLevelsCGSSNR() - 1;
m_uicrcVal [m_apcLayerEncoder[uiLayer]->getLayerCGSSNR()] = 0xffff;
}
}
//JVT-W052
//===== loop over access units in GOP, and layers inside access units =====
for( uiAUIndex = 0; uiAUIndex <= 64; uiAUIndex++ )
{ //JVT-W052
if(m_pcCodingParameter->getIntegrityCheckSEIEnable() && m_pcCodingParameter->getCGSSNRRefinement())//JVT-W052
RNOK( SEI::IntegrityCheckSEI::create( m_pcIntegrityCheckSEI ) ); //JVT-W052
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer ++ )
{
if( m_pcCodingParameter->getNonRequiredEnable() )
{
if( uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1 ) m_apcLayerEncoder[ uiLayer ]->setNonRequiredWrite( 2 );
else m_apcLayerEncoder[ uiLayer ]->setNonRequiredWrite( 1 );
}
//JVT-W051 {
m_bIsFirstGOP = false;
if ( m_apcLayerEncoder[uiLayer]->firstGOPCoded() == false )
{
m_bIsFirstGOP = true;
}
//JVT-W051 }
RNOK( m_apcLayerEncoder[uiLayer]->process( uiAUIndex,
m_cAccessUnitDataList.getAccessUnitData( uiAUIndex ),
m_acOrgPicBufferList [uiLayer],
m_acRecPicBufferList [uiLayer],
apcPicBufferUnusedList[uiLayer],
m_pcParameterSetMng ) );
//JVT-W051 {
m_aaadFrameInGOPBits[uiAUIndex][uiLayer][0] = m_apcLayerEncoder[uiLayer]->m_dFrameBits;
if ( uiLayer == 0 && uiAUIndex == 0 )
{
m_aaadFrameInGOPBits[uiAUIndex][uiLayer][0] += (Double)m_apcLayerEncoder[uiLayer]->xGetParameterSetBits();
}
if ( m_bIsFirstGOP )
{
m_uiProfileIdc[uiLayer] = m_apcLayerEncoder[uiLayer]->m_uiProfileIdc;
m_uiLevelIdc[uiLayer] = m_apcLayerEncoder[uiLayer]->m_uiLevelIdc;
m_bConstraint0Flag[uiLayer] = m_apcLayerEn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -