h264avcencodertest.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 927 行 · 第 1/3 页
CPP
927 行
if( m_pcEncoderCodingParameter->getMotionSkipMode() && m_pcEncoderCodingParameter->getMVCmode() )
{
fclose(fMv);
UInt i;
if (!m_pcEncoderCodingParameter->getAVCFlag())
{
if( !m_pcEncoderCodingParameter->getSLDMode() ) // JVT-Y042
{
UInt uiNumRefList0 = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX (m_pcEncoderCodingParameter->getCurentViewId(), 0);
for(i=0; i<uiNumRefList0; i++)
fclose(fFwdMv[i]);
UInt uiNumRefList1 = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX (m_pcEncoderCodingParameter->getCurentViewId(), 1);
for( i=0; i<uiNumRefList1; i++)
fclose(fBwdMv[i]);
}
else
{
if (m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsSldForListX (m_pcEncoderCodingParameter->getCurentViewId(), 0) )
{
fclose(fFwdMvSLD);
}
if (m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsSldForListX (m_pcEncoderCodingParameter->getCurentViewId(), 1) )
{
fclose(fBwdMvSLD);
}
} // ~JVT-Y042
}
}
#endif // JVT-W081
if( m_pcH264AVCEncoder )
{
RNOK( m_pcH264AVCEncoder->uninit() );
RNOK( m_pcH264AVCEncoder->destroy() );
}
for( UInt ui = 0; ui < MAX_LAYERS; ui++ )
{
if( m_apcWriteYuv[ui] )
{
RNOK( m_apcWriteYuv[ui]->destroy() );
}
if( m_apcReadYuv[ui] )
{
RNOK( m_apcReadYuv[ui]->uninit() );
RNOK( m_apcReadYuv[ui]->destroy() );
}
}
RNOK( m_pcEncoderCodingParameter->destroy());
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
AOF( m_acActivePicBufferList[uiLayer].empty() );
//===== delete picture buffer =====
PicBufferList::iterator iter;
for( iter = m_acUnusedPicBufferList[uiLayer].begin(); iter != m_acUnusedPicBufferList[uiLayer].end(); iter++ )
{
delete (*iter)->getBuffer();
delete (*iter);
}
for( iter = m_acActivePicBufferList[uiLayer].begin(); iter != m_acActivePicBufferList[uiLayer].end(); iter++ )
{
delete (*iter)->getBuffer();
delete (*iter);
}
}
delete this;
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xGetNewPicBuffer ( PicBuffer*& rpcPicBuffer,
UInt uiLayer,
UInt uiSize )
{
if( m_acUnusedPicBufferList[uiLayer].empty() )
{
rpcPicBuffer = new PicBuffer( new UChar[ uiSize ] );
}
else
{
rpcPicBuffer = m_acUnusedPicBufferList[uiLayer].popFront();
}
m_acActivePicBufferList[uiLayer].push_back( rpcPicBuffer );
return Err::m_nOK;
}
ErrVal
H264AVCEncoderTest::xRemovePicBuffer( PicBufferList& rcPicBufferUnusedList,
UInt uiLayer )
{
while( ! rcPicBufferUnusedList.empty() )
{
PicBuffer* pcBuffer = rcPicBufferUnusedList.popFront();
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->getMVCmode() ? 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-W080, PDS SEI message
if( m_pcEncoderCodingParameter->getMVCmode() && m_pcEncoderCodingParameter->getPdsEnable() )
{
//write SEI message
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
cBinData.setMemAccessor( cExtBinDataAccessor );
const UInt uiSPSId = 0; //currently only one SPS with SPSId = 0
UInt uiNumView = m_pcEncoderCodingParameter->SpsMVC.getNumViewMinus1()+1;
UInt* num_refs_list0_anc = new UInt [uiNumView];
UInt* num_refs_list1_anc = new UInt [uiNumView];
UInt* num_refs_list0_nonanc = new UInt [uiNumView];
UInt* num_refs_list1_nonanc = new UInt [uiNumView];
for( UInt i = 0; i < uiNumView; i++ )
{
num_refs_list0_anc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumAnchorRefsForListX( i, 0 );
num_refs_list1_anc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumAnchorRefsForListX( i, 1 );
num_refs_list0_nonanc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX( i, 0 );
num_refs_list1_nonanc[i] = m_pcEncoderCodingParameter->SpsMVC.getNumNonAnchorRefsForListX( i, 1 );
}
//#define HELP_INFOR
#ifdef HELP_INFOR
printf("\n");
for( UInt i = 0; i < uiNumView; i++ )
{
printf(" num_refs_list0_anchor: %d\tnum_refs_list0_nonanchor: %d\n num_refs_list1_anchor: %d\tnum_refs_list1_nonanchor: %d\n", num_refs_list0_anc[i], num_refs_list1_anc[i], num_refs_list0_nonanc[i], num_refs_list1_nonanc[i] );
}
#endif
UInt uiInitialPDIDelayAnc = m_pcEncoderCodingParameter->getPdsInitialDelayAnc();
UInt uiInitialPDIDelayNonAnc = m_pcEncoderCodingParameter->getPdsInitialDelayNonAnc();
if( uiInitialPDIDelayAnc < 2 )
uiInitialPDIDelayAnc = 2;
if( uiInitialPDIDelayNonAnc < 2 )
uiInitialPDIDelayNonAnc = 2;
RNOK( m_pcH264AVCEncoder->writePDSSEIMessage( &cExtBinDataAccessor
, uiSPSId
, uiNumView
, num_refs_list0_anc
, num_refs_list1_anc
, num_refs_list0_nonanc
, num_refs_list1_nonanc
, uiInitialPDIDelayAnc
, uiInitialPDIDelayNonAnc
)
);
delete[] num_refs_list0_anc;
delete[] num_refs_list1_anc;
delete[] num_refs_list0_nonanc;
delete[] num_refs_list1_nonanc;
num_refs_list0_anc = NULL;
num_refs_list1_anc = NULL;
num_refs_list0_nonanc = NULL;
num_refs_list1_nonanc = NULL;
if( m_pcEncoderCodingParameter->getCurentViewId() == m_pcEncoderCodingParameter->SpsMVC.m_uiViewCodingOrder[0] )
{
RNOK( m_pcWriteBitstreamToFile->writePacket ( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstreamToFile->writePacket ( &cExtBinDataAccessor ) );
uiWrittenBytes += 4 + cExtBinDataAccessor.size();
}
cBinData.reset();
}
//~JVT-W080
//SEI {
if( m_pcEncoderCodingParameter->getActiveViewSEIEnable() && m_pcEncoderCodingParameter->getCurentViewId() == 0 )
{
//active view information sei message
UChar aucParameterSetBuffer[1000];
BinData cBinData;
cBinData.reset();
cBinData.set( aucParameterSetBuffer, 1000 );
ExtBinDataAccessor cExtBinDataAccessor;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?