h264avcencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,655 行 · 第 1/5 页
CPP
1,655 行
SequenceParameterSet* pcSPS;
RNOK( m_pcParameterSetMng->get( pcSPS, uiSPSId ) );
UInt uiLayer = pcSPS->getLayerId();
UInt uiSize = pcExtBinDataAccessor->size();
RNOK( m_apcMCTFEncoder[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 uiLayer;
UInt uiScalableLayer = 0;
UInt uiNumLayers = m_pcCodingParameter->getNumberOfLayers();
//{{Adaptive GOP structure
// --ETRI & KHU
if ( !m_pcCodingParameter->getUseAGS() ) {
//}}Adaptive GOP structure
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
if( apcOriginalPicBuffer[uiLayer] )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
apcOriginalPicBuffer [uiLayer],
apcReconstructPicBuffer[uiLayer],
apcPicBufferOutputList [uiLayer],
apcPicBufferUnusedList [uiLayer] ) );
}
else
{
if( apcReconstructPicBuffer[uiLayer] )
{
apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
}
}
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
//{{Adaptive GOP structure
// --ETRI & KHU
}
else
{
if ( m_pcCodingParameter->getWriteGOPMode() )
{
m_uiGOPOrder = 0xffffffff;
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
if( apcOriginalPicBuffer[uiLayer] )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
apcOriginalPicBuffer [uiLayer],
apcReconstructPicBuffer[uiLayer],
apcPicBufferOutputList [uiLayer],
apcPicBufferUnusedList [uiLayer] ) );
}
else
{
if( apcReconstructPicBuffer[uiLayer] )
{
apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
}
}
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
}
else
{
if ((1 == (m_uiTarget - m_acOrgPicBufferList[uiNumLayers-1].size())
&& apcOriginalPicBuffer[uiNumLayers-1])|| (m_uiTarget == m_acOrgPicBufferList[uiNumLayers-1].size()))
{
int order = 0;
int i;
for (i = 0; i < 8 && (m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i ) ); i++) {
if ( m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i) )
order++;
}
m_bGOPDone = false;
for (i = 0; i < order; i++)
{
if (i == order-1 ) {
m_bGOPDone = true;
}
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
m_apcMCTFEncoder[uiLayer]->setSelectPos(i);
if( apcOriginalPicBuffer[uiLayer] )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
apcOriginalPicBuffer [uiLayer],
apcReconstructPicBuffer[uiLayer],
apcPicBufferOutputList [uiLayer],
apcPicBufferUnusedList [uiLayer] ) );
}
else
{
if( apcReconstructPicBuffer[uiLayer] )
{
apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
}
}
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList ); //!! ??
}
m_uiTarget = 0xffffffff;
m_uiGOPOrder++;
}
else {
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
if( apcOriginalPicBuffer[uiLayer] )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
apcOriginalPicBuffer [uiLayer],
apcReconstructPicBuffer[uiLayer],
apcPicBufferOutputList [uiLayer],
apcPicBufferUnusedList [uiLayer] ) );
}
else
{
if( apcReconstructPicBuffer[uiLayer] )
{
apcPicBufferUnusedList[uiLayer].push_back( apcReconstructPicBuffer[uiLayer] );
}
}
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList ); //!! ??
}
}
}
//}}Adaptive GOP structure
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::finish( ExtBinDataAccessorList& rcExtBinDataAccessorList,
PicBufferList* apcPicBufferOutputList,
PicBufferList* apcPicBufferUnusedList,
UInt& ruiNumCodedFrames,
Double& rdHighestLayerOutputRate )
{
UInt uiLayer;
UInt uiScalableLayer = 0;
UInt uiNumLayers = m_pcCodingParameter->getNumberOfLayers();
//{{Adaptive GOP structure
// --ETRI & KHU
if ( !m_pcCodingParameter->getUseAGS() ) {
//}}Adaptive GOP structure
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
NULL,
NULL,
apcPicBufferOutputList[uiLayer],
apcPicBufferUnusedList[uiLayer] ) );
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
RNOK( m_apcMCTFEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate ,
dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
// BUG_FIX liuhui{
RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate) );
// BUG_FIX liuhui}
}
printf("\n");
//{{Adaptive GOP structure
// --ETRI & KHU
}
else
{
if (m_pcCodingParameter->getWriteGOPMode())
{
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
NULL,
NULL,
apcPicBufferOutputList[uiLayer],
apcPicBufferUnusedList[uiLayer] ) );
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
RNOK( m_apcMCTFEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate,
dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
// BUG_FIX liuhui{
RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate) );
// BUG_FIX liuhui}
}
printf("\n");
}
else
{
int order = 0;
int i;
for (i = 0; i < 8 && (m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i ) ); i++) {
if ( m_apcMCTFEncoder[0]->getSelect(m_uiGOPOrder,i) )
order++;
}
m_bGOPDone = false;
for (i = 0; i < order; i++) {
if (i == order-1 ) {
m_bGOPDone = true;
}
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
m_apcMCTFEncoder[uiLayer]->setSelectPos(i);
RNOK( xProcessGOP( uiLayer,
uiScalableLayer,
NULL,
NULL,
apcPicBufferOutputList[uiLayer],
apcPicBufferUnusedList[uiLayer] ) );
}
m_cAccessUnitList.emptyNALULists( rcExtBinDataAccessorList );
}
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
RNOK( m_apcMCTFEncoder[uiLayer]->finish( ruiNumCodedFrames, rdHighestLayerOutputRate,
dGetFramerate(), dGetBitrate(), m_aaauidSeqBits ) );
// BUG_FIX liuhui{
RNOK( m_apcMCTFEncoder[uiLayer]->SingleLayerFinish( m_aaauidSeqBits, m_aaadSingleLayerBitrate) );
// BUG_FIX liuhui}
}
printf("\n");
}
}
//}}Adaptive GOP structure
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::xProcessGOP( UInt uiLayer,
UInt& uiScalableLayer,
PicBuffer* pcOriginalPicBuffer,
PicBuffer* pcReconstructPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList )
{
//NonRequired JVT-Q066 (06-04-08){{
if(m_pcCodingParameter->getNonRequiredEnable())
{
if(uiLayer == m_pcCodingParameter->getNumberOfLayers() - 1)
m_apcMCTFEncoder[uiLayer]->setNonRequiredWrite(2);
else
m_apcMCTFEncoder[uiLayer]->setNonRequiredWrite(1);
}
//NonRequired JVT-Q066 (06-04-08)}}
//{{Adaptive GOP structure
// --ETRI & KHU
if ( !m_pcCodingParameter->getUseAGS() ) {
//}}Adaptive GOP structure
if( pcOriginalPicBuffer == NULL )
{
//===== FINISH ENCODING =====
if( pcReconstructPicBuffer )
{
rcPicBufferUnusedList.push_back( pcReconstructPicBuffer );
}
if( m_acOrgPicBufferList[uiLayer].size() )
{
// BUG_FIX liuhui{
if( uiLayer && uiScalableLayer == 0 )
m_apcMCTFEncoder[uiLayer]->setScalableLayer( m_apcMCTFEncoder[uiLayer-1]->getScalableLayer() );
else
// BUG_FIX liuhui}
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();
rcPicBufferOutputList += m_acRecPicBufferList[uiLayer];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?