📄 gopencoder.cpp
字号:
delete [] m_papcSubband;
m_papcSubband = 0;
}
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
if( m_apcFrameTemp[ uiIndex ] )
{
RNOK( m_apcFrameTemp[ uiIndex ]->uninit() );
delete m_apcFrameTemp[ uiIndex ];
m_apcFrameTemp[ uiIndex ] = 0;
}
}
for( uiIndex = 0; uiIndex < 2; uiIndex ++ )
{
for( UInt uiLayerIdx = 0; uiLayerIdx < 4; uiLayerIdx++ )
{
if( m_aapcFGSRecon[uiIndex][uiLayerIdx] )
{
RNOK( m_aapcFGSRecon[uiIndex][uiLayerIdx]->uninit() );
delete m_aapcFGSRecon[uiIndex][uiLayerIdx];
m_aapcFGSRecon[uiIndex][uiLayerIdx] = 0;
}
}
}
if( m_aapcFGSPredFrame)
{
RNOK( m_aapcFGSPredFrame->uninit() );
delete m_aapcFGSPredFrame;
m_aapcFGSPredFrame = 0;
}
if( m_pcLowPassBaseReconstruction )
{
// JVT-R057 LA-RDO{
if(m_bLARDOEnable)
m_pcLowPassBaseReconstruction->uninitChannelDistortion();
// JVT-R057 LA-RDO}
RNOK( m_pcLowPassBaseReconstruction->uninit() );
delete m_pcLowPassBaseReconstruction;
m_pcLowPassBaseReconstruction = 0;
}
if( m_pcAnchorFrameOriginal )
{
RNOK( m_pcAnchorFrameOriginal->uninit() );
delete m_pcAnchorFrameOriginal;
m_pcAnchorFrameOriginal = 0;
}
if( m_pcAnchorFrameReconstructed )
{
RNOK( m_pcAnchorFrameReconstructed->uninit() );
delete m_pcAnchorFrameReconstructed;
m_pcAnchorFrameReconstructed = 0;
}
if( m_pcBaseLayerFrame )
{
RNOK( m_pcBaseLayerFrame->uninit() );
delete m_pcBaseLayerFrame;
m_pcBaseLayerFrame = 0;
}
if( m_pcBaseLayerResidual )
{
RNOK( m_pcBaseLayerResidual->uninit() );
delete m_pcBaseLayerResidual;
m_pcBaseLayerResidual = 0;
}
//========== DELETE MACROBLOCK DATA MEMORIES (and SLICE HEADER) ==========
if( m_pacControlData )
{
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
RNOK( m_pacControlData[ uiIndex ].uninitBQData() );
RNOK( m_pacControlData[ uiIndex ].uninitFGSData() );
RNOK( m_pacControlData[ uiIndex ].getMbDataCtrl()->uninitFgsBQData() );
MbDataCtrl* pcMbDataCtrl = m_pacControlData[ uiIndex ].getMbDataCtrl ();
SliceHeader* pcSliceHeader = m_pacControlData[ uiIndex ].getSliceHeader ();
if( pcMbDataCtrl )
{
RNOK( pcMbDataCtrl->uninit() );
}
delete pcMbDataCtrl;
delete pcSliceHeader;
}
delete [] m_pacControlData;
m_pacControlData = 0;
}
// ICU/ETRI FGS_MOT_USE
if( m_pacControlDataEL )
{
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
RNOK( m_pacControlDataEL[ uiIndex ].uninitBQData() );
RNOK( m_pacControlDataEL[ uiIndex ].uninitFGSData() );
RNOK( m_pacControlDataEL[ uiIndex ].getMbDataCtrl()->uninitFgsBQData() );
MbDataCtrl* pcMbDataCtrlEL = m_pacControlDataEL[ uiIndex ].getMbDataCtrl ();
SliceHeader* pcSliceHeaderEL = m_pacControlDataEL[ uiIndex ].getSliceHeader ();
if( pcMbDataCtrlEL )
{
RNOK( pcMbDataCtrlEL->uninit() );
}
delete pcMbDataCtrlEL;
delete pcSliceHeaderEL;
}
delete [] m_pacControlDataEL;
m_pacControlDataEL = 0;
}
if( m_pcBaseLayerCtrl )
{
RNOK( m_pcBaseLayerCtrl->uninit() );
delete m_pcBaseLayerCtrl;
m_pcBaseLayerCtrl = 0;
}
// ICU/ETRI FGS_MOT_USE
if( m_pcBaseLayerCtrlEL )
{
RNOK( m_pcBaseLayerCtrlEL->uninit() );
delete m_pcBaseLayerCtrlEL;
m_pcBaseLayerCtrlEL = 0;
}
//========== DELETE UPDATE WEIGHTS ARRAY and WRITE BUFFER ==========
delete [] m_pucWriteBuffer;
m_pucWriteBuffer = 0;
m_uiWriteBufferSize = 0;
//S051{
delete[] m_auiFrameBits;
//S051}
return Err::m_nOK;
}
ErrVal
MCTFEncoder::uninit()
{
m_bInitDone = false;
xDeleteData();
if( m_pMotionInfoFile )
{
::fclose( m_pMotionInfoFile );
}
if( m_pFGSFile )
{
::fclose( m_pFGSFile );
}
// JVT-S054 (ADD) ->
if( m_puiFirstMbInSlice )
{
free(m_puiFirstMbInSlice);
m_puiFirstMbInSlice = 0;
}
if( m_puiLastMbInSlice )
{
free(m_puiLastMbInSlice);
m_puiLastMbInSlice = 0;
}
// JVT-S054 (ADD) <-
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xFillAndUpsampleFrame( IntFrame* rcFrame )
{
RNOK( m_pcYuvFullPelBufferCtrl->initMb() );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb() );
if( ! rcFrame->isHalfPel() )
{
RNOK( rcFrame->initHalfPel() );
}
RNOK( rcFrame->extendFrame( m_pcQuarterPelFilter ) );
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xFillAndExtendFrame( IntFrame* rcFrame )
{
RNOK( m_pcYuvFullPelBufferCtrl->initMb() );
RNOK( rcFrame->extendFrame( NULL ) );
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xMotionEstimation( RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
const IntFrame* pcOrigFrame,
IntFrame* pcIntraRecFrame,
ControlData& rcControlData,
Bool bBiPredOnly,
UInt uiNumMaxIter,
// JVT-S054 (REPLACE) ->
//UInt uiIterSearchRange )
UInt uiIterSearchRange,
UInt uiFrameIdInGOP )
// JVT-S054 (REPLACE) <-
{
MbEncoder* pcMbEncoder = m_pcSliceEncoder->getMbEncoder ();
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ();
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
IntFrame* pcBaseLayerFrame = rcControlData.getBaseLayerRec ();
IntFrame* pcBaseLayerResidual = rcControlData.getBaseLayerSbb ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
Int iSpatialScalabilityType = rcControlData.getSpatialScalabilityType();
Bool bEstimateBase = rcSliceHeader.getBaseLayerId () == MSYS_UINT_MAX && ! pcBaseLayerCtrl;
Bool bEstimateMotion = rcSliceHeader.getAdaptivePredictionFlag() || bEstimateBase;
// JVT-S054 (ADD)
MbDataCtrl* pcMbDataCtrlL1 = xGetMbDataCtrlL1( rcSliceHeader, uiFrameIdInGOP );
// JVT-S054 (REPLACE) ->
//===== copy motion if non-adaptive prediction =====
if( ! bEstimateMotion )
{
ROF ( pcBaseLayerCtrl )
if (m_bIroiSliceDivisionFlag)
{
for (UInt uiSliceId=0; uiSliceId <= m_uiNumSliceMinus1; uiSliceId++)
{
rcSliceHeader.setFirstMbInSlice(m_puiFirstMbInSlice[uiSliceId]);
rcSliceHeader.setLastMbInSlice(m_puiLastMbInSlice[uiSliceId]);
// JVT-S054 (2) (ADD)
rcSliceHeader.setNumMbsInSlice(rcSliceHeader.getFMO()->getNumMbsInSlice(rcSliceHeader.getFirstMbInSlice(), rcSliceHeader.getLastMbInSlice()));
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice();
UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice();
UInt uiNumMBInSlice;
//===== initialization =====
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
//===== loop over macroblocks =====
for( uiNumMBInSlice = 0; uiMbAddress <= uiLastMbAddress; )
{
UInt uiMbY = uiMbAddress / m_uiFrameWidthInMb;
UInt uiMbX = uiMbAddress % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
//===== init macroblock =====
RNOK ( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( pcMbDataCtrl->getMbData(uiMbX, uiMbY).copyMotion( pcBaseLayerCtrl->getMbData(uiMbX, uiMbY), pcMbDataCtrl->getSliceId() ) );
// <<<< bug fix by heiko.schwarz@hhi.fhg.de
if( pcBaseLayerFrame ) // the motion data are not just copied, but inferred from the base layer
{
pcMbDataCtrl->getMbDataByIndex( uiMbAddress ).getMbMvdData( LIST_0 ).clear();
pcMbDataCtrl->getMbDataByIndex( uiMbAddress ).getMbMvdData( LIST_1 ).clear();
}
// >>>> bug fix by heiko.schwarz@hhi.fhg.de
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress);
uiNumMBInSlice++;
}
}
}
else
{
FMO* pcFMO = rcControlData.getSliceHeader()->getFMO();
for (UInt iSliceGroupID=0;!pcFMO->SliceGroupCompletelyCoded(iSliceGroupID);iSliceGroupID++)
{
rcSliceHeader.setFirstMbInSlice(pcFMO->getFirstMacroblockInSlice(iSliceGroupID));
rcSliceHeader.setLastMbInSlice(pcFMO->getLastMBInSliceGroup(iSliceGroupID));
// JVT-S054 (2) (ADD)
rcSliceHeader.setNumMbsInSlice(rcSliceHeader.getFMO()->getNumMbsInSlice(rcSliceHeader.getFirstMbInSlice(), rcSliceHeader.getLastMbInSlice()));
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice();
UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice();
UInt uiNumMBInSlice;
//===== initialization =====
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
//===== loop over macroblocks =====
for( uiNumMBInSlice = 0; uiMbAddress <= uiLastMbAddress; )
{
UInt uiMbY = uiMbAddress / m_uiFrameWidthInMb;
UInt uiMbX = uiMbAddress % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
//===== init macroblock =====
RNOK ( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( pcMbDataCtrl->getMbData(uiMbX, uiMbY).copyMotion( pcBaseLayerCtrl->getMbData(uiMbX, uiMbY), pcMbDataCtrl->getSliceId() ) );
// <<<< bug fix by heiko.schwarz@hhi.fhg.de
if( pcBaseLayerFrame ) // the motion data are not just copied, but inferred from the base layer
{
pcMbDataCtrl->getMbDataByIndex( uiMbAddress ).getMbMvdData( LIST_0 ).clear();
pcMbDataCtrl->getMbDataByIndex( uiMbAddress ).getMbMvdData( LIST_1 ).clear();
}
// >>>> bug fix by heiko.schwarz@hhi.fhg.de
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress);
uiNumMBInSlice++;
}
}
}
return Err::m_nOK;
}
if (m_bIroiSliceDivisionFlag)
{
for (UInt uiSliceId=0; uiSliceId <= m_uiNumSliceMinus1; uiSliceId++)
{
rcSliceHeader.setFirstMbInSlice(m_puiFirstMbInSlice[uiSliceId]);
rcSliceHeader.setLastMbInSlice(m_puiLastMbInSlice[uiSliceId]);
// JVT-S054 (2) (ADD)
rcSliceHeader.setNumMbsInSlice(rcSliceHeader.getFMO()->getNumMbsInSlice(rcSliceHeader.getFirstMbInSlice(), rcSliceHeader.getLastMbInSlice()));
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice();
UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice();
UInt uiNumMBInSlice;
//===== initialization =====
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
if( ! m_bLoadMotionInfo )
{
RNOK( m_pcMotionEstimation->initSlice( rcSliceHeader ) );
RNOK( pcMbEncoder ->initSlice( rcSliceHeader ) );
RNOK( m_pcMotionEstimation->getSW()->initSlice( rcSliceHeader ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -