📄 gopencoder.cpp
字号:
}
//===== loop over macroblocks =====
//for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
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 ) );
}
if( ! m_bLoadMotionInfo )
{
//===== initialisation =====
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
*pcRefFrameList0,
*pcRefFrameList1,
pcBaseLayerFrame,
pcBaseLayerResidual,
*pcOrigFrame,
*pcIntraRecFrame,
bBiPredOnly,
uiNumMaxIter,
uiIterSearchRange,
m_bBLSkipEnable, //JVT-Q065 EIDR
rcControlData.getLambda() ) );
if( m_bSaveMotionInfo )
{
//===== save prediction data =====
RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
}
}
else
{
//===== load prediction data =====
RNOK( pcMbDataAccess->getMbData().loadAll( m_pMotionInfoFile ) );
}
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 ) );
if( ! m_bLoadMotionInfo )
{
RNOK( m_pcMotionEstimation->initSlice( rcSliceHeader ) );
RNOK( pcMbEncoder ->initSlice( rcSliceHeader ) );
RNOK( m_pcMotionEstimation->getSW()->initSlice( rcSliceHeader ) );
}
//===== loop over macroblocks =====
//for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
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 ) );
}
if( ! m_bLoadMotionInfo )
{
//===== initialisation =====
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
*pcRefFrameList0,
*pcRefFrameList1,
pcBaseLayerFrame,
pcBaseLayerResidual,
*pcOrigFrame,
*pcIntraRecFrame,
bBiPredOnly,
uiNumMaxIter,
uiIterSearchRange,
m_bBLSkipEnable, //JVT-Q065 EIDR
rcControlData.getLambda() ) );
if( m_bSaveMotionInfo )
{
//===== save prediction data =====
RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
}
}
else
{
//===== load prediction data =====
RNOK( pcMbDataAccess->getMbData().loadAll( m_pMotionInfoFile ) );
}
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress);
uiNumMBInSlice++;
}
}
}
/*
//===== copy motion if non-adaptive prediction =====
if( ! bEstimateMotion )
{
ROF ( pcBaseLayerCtrl )
RNOK( pcMbDataCtrl->copyMotion( *pcBaseLayerCtrl ) );
// <<<< bug fix by heiko.schwarz@hhi.fhg.de
if( pcBaseLayerFrame ) // the motion data are not just copied, but inferred from the base layer
{
for( UInt uiIndex = 0; uiIndex < m_uiMbNumber; uiIndex++ )
{
pcMbDataCtrl->getMbDataByIndex( uiIndex ).getMbMvdData( LIST_0 ).clear();
pcMbDataCtrl->getMbDataByIndex( uiIndex ).getMbMvdData( LIST_1 ).clear();
}
}
// >>>> bug fix by heiko.schwarz@hhi.fhg.de
return Err::m_nOK;
}
//===== initialization =====
if( ! m_bLoadMotionInfo )
{
RNOK( m_pcMotionEstimation->initSlice( rcSliceHeader ) );
RNOK( pcMbEncoder ->initSlice( rcSliceHeader ) );
RNOK( m_pcMotionEstimation->getSW()->initSlice( rcSliceHeader ) );
}
//===== loop over macroblocks =====
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
//===== init macroblock =====
RNOK ( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
if( ! m_bLoadMotionInfo )
{
//===== initialisation =====
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
*pcRefFrameList0,
*pcRefFrameList1,
pcBaseLayerFrame,
pcBaseLayerResidual,
*pcOrigFrame,
*pcIntraRecFrame,
bBiPredOnly,
uiNumMaxIter,
uiIterSearchRange,
m_bBLSkipEnable, //JVT-Q065 EIDR
rcControlData.getLambda() ) );
if( m_bSaveMotionInfo )
{
//===== save prediction data =====
RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
}
}
else
{
//===== load prediction data =====
RNOK( pcMbDataAccess->getMbData().loadAll( m_pMotionInfoFile ) );
}
}
*/
// JVT-S054 (REPLACE) <-
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xMotionCompensation( IntFrame* pcMCFrame,
RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
MbDataCtrl* pcMbDataCtrl,
SliceHeader& rcSH )
{
Bool bCalcMv = false;
Bool bFaultTolerant = false;
MbEncoder* pcMbEncoder = m_pcSliceEncoder->getMbEncoder();
RNOK( pcMbDataCtrl ->initSlice( rcSH, PRE_PROCESS, false, NULL ) );
RNOK( m_pcMotionEstimation->initSlice( rcSH ) );
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
RNOK( pcMbEncoder->compensatePrediction( *pcMbDataAccess, pcMCFrame,
*pcRefFrameList0, *pcRefFrameList1,
bCalcMv, bFaultTolerant ) );
}
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xGetConnections( Double& rdL0Rate,
Double& rdL1Rate,
Double& rdBiRate )
{
//=== just a guess ===
if( m_bHaarFiltering )
{
rdL0Rate = 1.0;
rdL1Rate = 0.0;
rdBiRate = 0.0;
}
else if( m_bBiPredOnly )
{
rdL0Rate = 0.0;
rdL1Rate = 0.0;
rdBiRate = 1.0;
}
else
{
rdL0Rate = 0.2;
rdL1Rate = 0.2;
rdBiRate = 0.6;
}
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xZeroIntraMacroblocks( IntFrame* pcFrame,
ControlData& rcCtrlData )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader ();
IntYuvPicBuffer* pcPicBuffer = pcFrame ->getFullPelYuvBuffer ();
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
IntYuvMbBuffer cZeroMbBuffer;
cZeroMbBuffer.setAllSamplesToZero();
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
if( pcMbDataAccess->getMbData().isIntra() )
{
pcPicBuffer->loadBuffer( &cZeroMbBuffer );
}
}
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xClipIntraMacroblocks( IntFrame* pcFrame,
ControlData& rcCtrlData, Bool bClipAll )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader ();
IntYuvPicBuffer* pcPicBuffer = pcFrame ->getFullPelYuvBuffer ();
IntYuvMbBuffer cMbBuffer;
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
for( UInt uiMbIndex = 0; uiMbIndex < m_uiMbNumber; uiMbIndex++ )
{
UInt uiMbY = uiMbIndex / m_uiFrameWidthInMb;
UInt uiMbX = uiMbIndex % m_uiFrameWidthInMb;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX ) );
if( bClipAll || pcMbDataAccess->getMbData().isIntra() )
{
cMbBuffer .loadBuffer( pcPicBuffer );
cMbBuffer .clip ();
pcPicBuffer->loadBuffer( &cMbBuffer );
}
}
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xInitExtBinDataAccessor( ExtBinDataAccessor& rcExtBinDataAccessor )
{
ROF( m_pucWriteBuffer );
m_cBinData.reset ();
m_cBinData.set ( m_pucWriteBuffer, m_uiWriteBufferSize );
m_cBinData.setMemAccessor ( rcExtBinDataAccessor );
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xAppendNewExtBinDataAccessor( ExtBinDataAccessorList& rcExtBinDa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -