📄 h264avcencodertest.cpp
字号:
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder ->writeActiveViewInfoSEIMessage( &cExtBinDataAccessor ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
if( m_pcEncoderCodingParameter->getMultiviewSceneInfoSEIEnable() ) // SEI JVT-W060
{
// Multiview scene information sei message
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder ->writeMultiviewSceneInfoSEIMessage( &cExtBinDataAccessor ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
if( m_pcEncoderCodingParameter->getMultiviewAcquisitionInfoSEIEnable() ) // SEI JVT-W060
{
// Multiview acquisition information sei message
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder ->writeMultiviewAcquisitionInfoSEIMessage( &cExtBinDataAccessor ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
if( m_pcEncoderCodingParameter->getNestingSEIEnable() && m_pcEncoderCodingParameter->getSnapshotEnable()
&& m_pcEncoderCodingParameter->getCurentViewId() == 0 )
{
// add nesting sei message for view0
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();
}
//SEI }
//===== 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;
}
#if JMVM_ONLY
if( m_pcEncoderCodingParameter->getMVCmode() && m_pcEncoderCodingParameter->getMotionSkipMode() )
{
Int iVId = m_pcEncoderCodingParameter->getCurentViewId();
UInt uiNumNonAnchorViewsL0 = m_pcEncoderCodingParameter->getSpsMVC()->getNumNonAnchorRefsForListX(iVId,0);
UInt uiNumNonAnchorViewsL1 = m_pcEncoderCodingParameter->getSpsMVC()->getNumNonAnchorRefsForListX(iVId,1);
g_pcGlobalDisaprityL0 = new GDV[uiNumNonAnchorViewsL0];
g_pcGlobalDisaprityL1 = new GDV[uiNumNonAnchorViewsL1];
}
#endif
//===== 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 ) );
#if JMVM_ONLY
if( m_pcEncoderCodingParameter->getMVCmode() && m_pcEncoderCodingParameter->getMotionSkipMode() )
{
delete [] g_pcGlobalDisaprityL0;
delete [] g_pcGlobalDisaprityL1;
}
#endif
//===== 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->getMVCmode() )
{
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();
}
//SEI {
if( m_pcEncoderCodingParameter->getViewScalInfoSEIEnable() )
{
//view scalability information sei message
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
RNOK( m_pcH264AVCEncoder->writeViewScalInfoSEIMessage( &cExtBinDataAccessor ) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
cBinData.reset();
}
//SEI }
if( m_pcWriteBitstreamToFile )
{
RNOK( m_pcWriteBitstreamToFile->uninit() );
RNOK( m_pcWriteBitstreamToFile->destroy() );
}
//SEI {
if( m_pcEncoderCodingParameter->getViewScalInfoSEIEnable() )
{
RNOK ( ViewScalableDealing() );
}
//SEI }
if( ! m_pcEncoderCodingParameter->getMVCmode() )
{
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;
}
//SEI {
ErrVal
H264AVCEncoderTest::ViewScalableDealing()
{
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;
}
//SEI }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -