📄 h264avcencodertest.cpp
字号:
if( NULL != pcBuffer )
{
PicBufferList::iterator begin = m_acActivePicBufferList[uiLayer].begin();
PicBufferList::iterator end = m_acActivePicBufferList[uiLayer].end ();
PicBufferList::iterator iter = std::find( begin, end, pcBuffer );
ROT( iter == end ); // there is something wrong if the address is not in the active list
AOT_DBG( (*iter)->isUsed() );
m_acUnusedPicBufferList[uiLayer].push_back( *iter );
m_acActivePicBufferList[uiLayer].erase ( iter );
}
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xWrite( PicBufferList& rcPicBufferList,
UInt uiLayer )
{
while( ! rcPicBufferList.empty() )
{
PicBuffer* pcBuffer = rcPicBufferList.popFront();
Pel* pcBuf = pcBuffer->getBuffer();
RNOK( m_apcWriteYuv[uiLayer]->writeFrame( pcBuf + m_auiLumOffset[uiLayer],
pcBuf + m_auiCbOffset [uiLayer],
pcBuf + m_auiCrOffset [uiLayer],
m_auiHeight [uiLayer],
m_auiWidth [uiLayer],
m_auiStride [uiLayer] ) );
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xRelease( PicBufferList& rcPicBufferList,
UInt uiLayer )
{
RNOK( xRemovePicBuffer( rcPicBufferList, uiLayer ) );
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xWrite( ExtBinDataAccessorList& rcList,
UInt& ruiBytesInFrame )
{
while( rcList.size() )
{
ruiBytesInFrame += rcList.front()->size() + 4;
RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( rcList.front() ) );
delete[] rcList.front()->data();
delete rcList.front();
rcList.pop_front();
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xRelease( ExtBinDataAccessorList& rcList )
{
while( rcList.size() )
{
delete[] rcList.front()->data();
delete rcList.front();
rcList.pop_front();
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::go()
{
UInt uiWrittenBytes = 0;
const UInt uiMaxFrame = m_pcEncoderCodingParameter->getTotalFrames();
UInt uiNumLayers = ( m_pcEncoderCodingParameter->getAVCmode() ? 1 : m_pcEncoderCodingParameter->getNumberOfLayers() );
UInt uiFrame;
UInt uiLayer;
UInt auiMbX [MAX_LAYERS];
UInt auiMbY [MAX_LAYERS];
UInt auiPicSize [MAX_LAYERS];
PicBuffer* apcOriginalPicBuffer [MAX_LAYERS];
PicBuffer* apcReconstructPicBuffer [MAX_LAYERS];
PicBufferList acPicBufferOutputList [MAX_LAYERS];
PicBufferList acPicBufferUnusedList [MAX_LAYERS];
ExtBinDataAccessorList cOutExtBinDataAccessorList;
Bool bMoreSets;
//===== initialization =====
RNOK( m_pcH264AVCEncoder->init( m_pcEncoderCodingParameter ) );
//===== write parameter sets =====
for( bMoreSets = true; bMoreSets; )
{
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
if( m_pcH264AVCEncoder->getScalableSeiMessage() )
{
RNOK( m_pcWriteBitstreamToFile->writePacket ( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
}
cBinData.reset();
}
// JVT-T073 {
if( m_pcEncoderCodingParameter->getNestingSEIEnable() && m_pcEncoderCodingParameter->getSceneInfoEnable() )
{
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder ->writeNestingSEIMessage( &cExtBinDataAccessor ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
// JVT-T073 }
//===== determine parameters for required frame buffers =====
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
auiMbX [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameWidth () >> 4;
auiMbY [uiLayer] = m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getFrameHeight() >> 4;
UInt uiSize = ((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN);
auiPicSize [uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)*((auiMbY[uiLayer]<<4)+2*YUV_Y_MARGIN)*3/2;
m_auiLumOffset[uiLayer] = ((auiMbX[uiLayer]<<4)+2*YUV_X_MARGIN)* YUV_Y_MARGIN + YUV_X_MARGIN;
m_auiCbOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+ YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + uiSize;
m_auiCrOffset [uiLayer] = ((auiMbX[uiLayer]<<3)+ YUV_X_MARGIN)* YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + 5*uiSize/4;
m_auiHeight [uiLayer] = auiMbY[uiLayer]<<4;
m_auiWidth [uiLayer] = auiMbX[uiLayer]<<4;
m_auiStride [uiLayer] = (auiMbX[uiLayer]<<4)+ 2*YUV_X_MARGIN;
}
//===== loop over frames =====
for( uiFrame = 0; uiFrame < uiMaxFrame; uiFrame++ )
{
//===== get picture buffers and read original pictures =====
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
UInt uiSkip = ( 1 << m_pcEncoderCodingParameter->getLayerParameters( uiLayer ).getTemporalResolution() );
if( uiFrame % uiSkip == 0 )
{
RNOK( xGetNewPicBuffer( apcReconstructPicBuffer [uiLayer], uiLayer, auiPicSize[uiLayer] ) );
RNOK( xGetNewPicBuffer( apcOriginalPicBuffer [uiLayer], uiLayer, auiPicSize[uiLayer] ) );
RNOK( m_apcReadYuv[uiLayer]->readFrame( *apcOriginalPicBuffer[uiLayer] + m_auiLumOffset[uiLayer],
*apcOriginalPicBuffer[uiLayer] + m_auiCbOffset [uiLayer],
*apcOriginalPicBuffer[uiLayer] + m_auiCrOffset [uiLayer],
m_auiHeight [uiLayer],
m_auiWidth [uiLayer],
m_auiStride [uiLayer] ) );
}
else
{
apcReconstructPicBuffer [uiLayer] = 0;
apcOriginalPicBuffer [uiLayer] = 0;
}
}
//===== call encoder =====
RNOK( m_pcH264AVCEncoder->process( cOutExtBinDataAccessorList,
apcOriginalPicBuffer,
apcReconstructPicBuffer,
acPicBufferOutputList,
acPicBufferUnusedList ) );
//===== write and release NAL unit buffers =====
UInt uiBytesUsed = 0;
RNOK( xWrite ( cOutExtBinDataAccessorList, uiBytesUsed ) );
uiWrittenBytes += uiBytesUsed;
//===== write and release reconstructed pictures =====
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
RNOK( xWrite ( acPicBufferOutputList[uiLayer], uiLayer ) );
RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
}
}
//===== finish encoding =====
UInt uiNumCodedFrames = 0;
Double dHighestLayerOutputRate = 0.0;
RNOK( m_pcH264AVCEncoder->finish( cOutExtBinDataAccessorList,
acPicBufferOutputList,
acPicBufferUnusedList,
uiNumCodedFrames,
dHighestLayerOutputRate ) );
//===== write and release NAL unit buffers =====
RNOK( xWrite ( cOutExtBinDataAccessorList, uiWrittenBytes ) );
//===== write and release reconstructed pictures =====
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
RNOK( xWrite ( acPicBufferOutputList[uiLayer], uiLayer ) );
RNOK( xRelease( acPicBufferUnusedList[uiLayer], uiLayer ) );
}
//===== set parameters and output summary =====
m_cEncoderIoParameter.nFrames = uiFrame;
m_cEncoderIoParameter.nResult = 0;
if( ! m_pcEncoderCodingParameter->getAVCmode() )
{
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
m_pcH264AVCEncoder->SetVeryFirstCall();
RNOK( m_pcH264AVCEncoder ->writeParameterSets( &cExtBinDataAccessor, bMoreSets) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
if( m_pcWriteBitstreamToFile )
{
RNOK( m_pcWriteBitstreamToFile->uninit() );
RNOK( m_pcWriteBitstreamToFile->destroy() );
}
if( ! m_pcEncoderCodingParameter->getAVCmode() )
{
RNOK ( ScalableDealing() );
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::ScalableDealing()
{
FILE *ftemp = fopen( m_cWriteToBitFileTempName.c_str(), "rb" );
FILE *f = fopen( m_cWriteToBitFileName.c_str (), "wb" );
UChar pvBuffer[4];
fseek( ftemp, SEEK_SET, SEEK_END );
long lFileLength = ftell( ftemp );
long lpos = 0;
long loffset = -5; //start offset from end of file
Bool bMoreSets = true;
do {
fseek( ftemp, loffset, SEEK_END);
fread( pvBuffer, 1, 4, ftemp );
if( pvBuffer[0] == 0 && pvBuffer[1] == 0 && pvBuffer[2] == 0 && pvBuffer[3] == 1)
{
bMoreSets = false;
lpos = abs( loffset );
}
else
{
loffset --;
}
} while( bMoreSets );
fseek( ftemp, loffset, SEEK_END );
UChar *pvChar = new UChar[lFileLength];
fread( pvChar, 1, lpos, ftemp );
fseek( ftemp, 0, SEEK_SET );
fread( pvChar+lpos, 1, lFileLength-lpos, ftemp);
fclose(ftemp);
fflush(ftemp);
fwrite( pvChar, 1, lFileLength, f);
delete pvChar;
fclose(f);
fflush(f);
RNOK( remove( m_cWriteToBitFileTempName.c_str() ) );
return Err::m_nOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -