gopencoder.cpp
来自「SVC最新更新代码」· C++ 代码 · 共 1,714 行 · 第 1/5 页
CPP
1,714 行
{
auiRequiredList[uiRequiredListSize++] = uiNextRequired;
}
// set required list elements
while( uiRequiredListSize-- )
{
UInt uiNextId = auiRequiredList[uiRequiredListSize];
m_auiCodingIndexToFrameId [uiCodingNumber++] = uiNextId;
abIndexAssigned [uiNextId] = true;
}
// set current
m_auiCodingIndexToFrameId [uiCodingNumber++] = uiFrameIdInGOP;
abIndexAssigned [uiFrameIdInGOP] = true;
}
}
ROF( uiCodingNumber == uiMaxGOPSize + 1 );
//===== modify according to temporal subsampling =====
UInt uiTempResStep = ( 1U << uiTemporalSubSampling );
UInt uiNotCodeStep = ( 1U << m_uiNotCodedStages );
UInt uiModIdx = 0;
for( ; uiModIdx <= uiMaxGOPSize; uiModIdx++ )
{
UInt uiVirtFrameIdInGOP = m_auiCodingIndexToFrameId[ uiModIdx ];
if( uiVirtFrameIdInGOP % uiTempResStep )
{
m_auiCodingIndexToFrameId[ uiModIdx ] = MSYS_UINT_MAX;
}
else
{
UInt uiFrameIdInGOP = uiVirtFrameIdInGOP >> uiTemporalSubSampling;
m_auiFrameIdToTemporalId [ uiFrameIdInGOP ] = auiTemporalId[ uiVirtFrameIdInGOP ];
Bool bNotCoded = ( ( uiFrameIdInGOP % uiNotCodeStep ) != 0 );
m_auiCodingIndexToFrameId [ uiModIdx ] = ( bNotCoded ? MSYS_UINT_MAX : uiFrameIdInGOP );
}
}
for( ; uiModIdx < uiMaxSize; uiModIdx++ )
{
m_auiCodingIndexToFrameId[ uiModIdx ] = MSYS_UINT_MAX;
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::initParameterSets( const SequenceParameterSet& rcSPS,
const PictureParameterSet& rcPPSLP,
const PictureParameterSet& rcPPSHP )
{
//===== set references =====
m_pcSPS = &rcSPS;
m_pcPPSLP = &rcPPSLP;
m_pcPPSHP = &rcPPSHP;
//===== get and set relevant parameters =====
m_bFrameMbsOnlyFlag = rcSPS.getFrameMbsOnlyFlag ();
m_uiFrameWidthInMb = rcSPS.getFrameWidthInMbs ();
m_uiFrameHeightInMb = rcSPS.getFrameHeightInMbs ();
m_uiMaxGOPSize = ( 1 << m_uiDecompositionStages );
//===== re-allocate dynamic memory =====
RNOK( xDeleteData() );
RNOK( xCreateData( rcSPS ) );
//===== initialize some parameters =====
m_bInitDone = true;
m_bFirstGOPCoded = false;
m_uiFrameCounter = 0;
m_uiFrameNum = 0;
m_uiGOPNumber = 0;
::memset( m_abIsRef, 0x00, sizeof( m_abIsRef ) );
return Err::m_nOK;
}
ErrVal
LayerEncoder::addParameterSetBits( UInt uiParameterSetBits )
{
m_uiParameterSetBits += uiParameterSetBits;
return Err::m_nOK;
}
ErrVal
LayerEncoder::xCreateData( const SequenceParameterSet& rcSPS )
{
UInt uiIndex;
//========== CREATE FRAME MEMORIES ==========
ROFS ( ( m_papcFrame = new Frame* [ m_uiMaxGOPSize + 1 ] ) );
if( m_uiMGSKeyPictureControl && ! m_bHighestMGSLayer )
{
ROFS ( ( m_papcELFrame = new Frame* [ m_uiMaxGOPSize + 1 ] ) );
}
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
RNOK( Frame::create( m_papcFrame [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_papcFrame [ uiIndex ] ->init () );
if( m_papcELFrame )
{
RNOK( Frame::create( m_papcELFrame[ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK( m_papcELFrame [ uiIndex ] ->init () );
}
}
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
RNOK( Frame::create( m_apcFrameTemp [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_apcFrameTemp [ uiIndex ] ->init () );
}
RNOK( Frame::create( m_pcResidual, *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcResidual->init () );
RNOK( Frame::create( m_pcSubband, *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcSubband->init () );
RNOK( Frame::create( m_apcBaseFrame[0], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK( Frame::create( m_apcBaseFrame[1], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_apcBaseFrame[0] ->init () );
RNOK ( m_apcBaseFrame[1] ->init () );
RNOK( Frame::create( m_pcAnchorFrameOriginal , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcAnchorFrameOriginal ->init () );
RNOK( Frame::create( m_pcAnchorFrameReconstructed , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcAnchorFrameReconstructed ->init () );
RNOK( Frame::create( m_pcBaseLayerFrame , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcBaseLayerFrame ->init () );
RNOK( Frame::create( m_pcBaseLayerResidual , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME, 0 ) );
RNOK ( m_pcBaseLayerResidual ->init () );
ROFS ( ( m_pbFieldPicFlag = new Bool[ m_uiMaxGOPSize + 1 ] ));
//========== CREATE MACROBLOCK DATA MEMORIES ==========
ROFS ( ( m_pacControlData = new ControlData[ m_uiMaxGOPSize + 1 ] ) );
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
MbDataCtrl* pcMbDataCtrl = 0;
ROFS ( ( pcMbDataCtrl = new MbDataCtrl () ) );
RNOK ( pcMbDataCtrl ->init ( rcSPS ) );
RNOK ( m_pacControlData[ uiIndex ] . setMbDataCtrl ( pcMbDataCtrl ) );
Bool bLowPass = ( ( uiIndex % ( 1 << m_uiDecompositionStages ) ) == 0 );
SliceHeader* pcSliceHeader = 0;
ROFS ( ( pcSliceHeader = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ) );
RNOK ( m_pacControlData[ uiIndex ] . setSliceHeader ( pcSliceHeader, FRAME ) );
if( m_pcLayerParameters->getPAff() )
{
ROFRS ( ( pcSliceHeader = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ), Err::m_nERR );
RNOK ( m_pacControlData[ uiIndex ] . setSliceHeader ( pcSliceHeader, BOT_FIELD ) );
}
}
ROFS ( ( m_pcBaseLayerCtrl = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrl ->init ( rcSPS ) );
ROFS ( ( m_pcBaseLayerCtrlField = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrlField ->init ( rcSPS ) );
//RPIC bug fix
ROFS ( ( m_pcRedundantCtrl = new MbDataCtrl () ) );
RNOK ( m_pcRedundantCtrl ->init ( rcSPS ) );
ROFS ( ( m_pcRedundant1Ctrl = new MbDataCtrl () ) );
RNOK ( m_pcRedundant1Ctrl ->init ( rcSPS ) );
//RPIC bug fix
//========== CREATE UPDATE WEIGHTS ARRAY and WRITE BUFFER ==========
UInt uiNum4x4Blocks = m_uiFrameWidthInMb * m_uiFrameHeightInMb * 4 * 4;
m_uiWriteBufferSize = 3 * ( uiNum4x4Blocks * 4 * 4 );
ROFS( ( m_pucWriteBuffer = new UChar [ m_uiWriteBufferSize ] ) );
ROT ( m_cDownConvert .init ( m_uiFrameWidthInMb<<4, m_uiFrameHeightInMb<<4 ) );
//S051{
ROFRS( m_auiFrameBits = new UInt[m_uiTotalFrame], Err::m_nERR );
memset( m_auiFrameBits,0,sizeof(UInt)*m_uiTotalFrame);
if(m_bEncSIP)
{
FILE* file=fopen(m_cInSIPFileName.c_str(),"rt");
if(file==NULL)
{
printf("\nCan't open SIP file %s",m_cInSIPFileName.c_str());
return Err::m_nOK;
}
while(!feof(file))
{
UInt tmp;
fscanf(file,"%d",&tmp);
m_cPocList.push_back(tmp);
}
fclose(file);
}
//S051}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xDeleteData()
{
UInt uiIndex;
//========== DELETE FRAME MEMORIES ==========
if( m_papcFrame )
{
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
if( m_papcFrame[ uiIndex ] )
{
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
m_papcFrame[uiIndex]->uninitChannelDistortion();
//JVT-R057 LA-RDO}
RNOK( m_papcFrame[ uiIndex ]->uninit() );
RNOK( m_papcFrame[ uiIndex ]->destroy() );
m_papcFrame[ uiIndex ] = 0;
}
}
delete [] m_papcFrame;
m_papcFrame = 0;
}
if( m_papcELFrame )
{
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
if( m_papcELFrame[ uiIndex ] )
{
RNOK( m_papcELFrame[ uiIndex ]->uninit() );
RNOK( m_papcELFrame[ uiIndex ]->destroy() );
m_papcELFrame[ uiIndex ] = 0;
}
}
delete [] m_papcELFrame;
m_papcELFrame = 0;
}
if( m_pcResidual )
{
RNOK( m_pcResidual->uninit() );
RNOK( m_pcResidual->destroy() );
m_pcResidual = 0;
}
if( m_pcSubband )
{
RNOK( m_pcSubband->uninit() );
RNOK( m_pcSubband->destroy() );
m_pcSubband = 0;
}
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
if( m_apcFrameTemp[ uiIndex ] )
{
RNOK( m_apcFrameTemp[ uiIndex ]->uninit() );
RNOK( m_apcFrameTemp[ uiIndex ]->destroy() );
m_apcFrameTemp[ uiIndex ] = 0;
}
}
for( UInt uiBaseIdx = 0; uiBaseIdx < 2; uiBaseIdx++ )
{
if( m_apcBaseFrame[uiBaseIdx] )
{
if(m_bLARDOEnable)
m_apcBaseFrame[uiBaseIdx]->uninitChannelDistortion();
// JVT-R057 LA-RDO}
RNOK( m_apcBaseFrame[uiBaseIdx]->uninit() );
RNOK( m_apcBaseFrame[uiBaseIdx]->destroy() );
m_apcBaseFrame[uiBaseIdx] = 0;
}
}
if( m_pcAnchorFrameOriginal )
{
RNOK( m_pcAnchorFrameOriginal->uninit() );
RNOK( m_pcAnchorFrameOriginal->destroy() );
m_pcAnchorFrameOriginal = 0;
}
if( m_pcAnchorFrameReconstructed )
{
RNOK( m_pcAnchorFrameReconstructed->uninit() );
RNOK( m_pcAnchorFrameReconstructed->destroy() );
m_pcAnchorFrameReconstructed = 0;
}
if( m_pcBaseLayerFrame )
{
RNOK( m_pcBaseLayerFrame->uninit() );
RNOK( m_pcBaseLayerFrame->destroy() );
m_pcBaseLayerFrame = 0;
}
if( m_pcBaseLayerResidual )
{
RNOK( m_pcBaseLayerResidual->uninit() );
RNOK( m_pcBaseLayerResidual->destroy() );
m_pcBaseLayerResidual = 0;
}
//========== DELETE MACROBLOCK DATA MEMORIES (and SLICE HEADER) ==========
if( m_pacControlData )
{
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
MbDataCtrl* pcMbDataCtrl = m_pacControlData[ uiIndex ].getMbDataCtrl ();
if( pcMbDataCtrl )
{
RNOK( pcMbDataCtrl->uninit() );
}
delete pcMbDataCtrl;
pcMbDataCtrl = 0 ;
SliceHeader* pcSliceHeader = m_pacControlData[ uiIndex ].getSliceHeader( FRAME );
delete pcSliceHeader;
pcSliceHeader = 0 ;
if( m_pcLayerParameters->getPAff() )
{
pcSliceHeader = m_pacControlData[ uiIndex ].getSliceHeader( BOT_FIELD );
delete pcSliceHeader;
pcSliceHeader = 0;
}
if( m_pbFieldPicFlag )
{
delete [] m_pbFieldPicFlag;
m_pbFieldPicFlag = 0;
}
}
delete [] m_pacControlData;
m_pacControlData = 0;
}
//RPIC bug fix
if(m_pcRedundantCtrl)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?