📄 gopencoder.cpp
字号:
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xFillAndUpsampleFrame( IntFrame* pcFrame, PicType ePicType, Bool bFrameMbsOnlyFlag )
{
RNOK( m_pcYuvFullPelBufferCtrl->initMb() );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb() );
if( ! pcFrame->isHalfPel() )
{
XPel* pHPData = NULL;
RNOK( pcFrame->initHalfPel( pHPData ) );
}
RNOK( pcFrame->extendFrame( m_pcQuarterPelFilter, ePicType, bFrameMbsOnlyFlag ) );
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xFillAndExtendFrame( IntFrame* pcFrame, PicType ePicType, Bool bFrameMbsOnlyFlag )
{
RNOK( m_pcYuvFullPelBufferCtrl->initMb() );
RNOK( pcFrame->extendFrame( NULL, ePicType, bFrameMbsOnlyFlag ) );
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xMotionEstimation( RefFrameList* pcRefFrameList0,
RefFrameList* pcRefFrameList1,
IntFrame* pcOrigFrame,
IntFrame* pcIntraRecFrame,
ControlData& rcControlData,
Bool bBiPredOnly,
UInt uiNumMaxIter,
UInt uiIterSearchRange,
UInt uiFrameIdInGOP,
PicType ePicType )
{
MbEncoder* pcMbEncoder = m_pcSliceEncoder->getMbEncoder ();
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ( ePicType );
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, uiMbX;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
//===== 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, uiMbX;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
//===== 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( ePicType!=FRAME )
{
if( pcOrigFrame ) RNOK( pcOrigFrame ->addFieldBuffer( ePicType ) );
if( pcIntraRecFrame ) RNOK( pcIntraRecFrame ->addFieldBuffer( ePicType ) );
if( pcBaseLayerFrame ) RNOK( pcBaseLayerFrame ->addFieldBuffer( ePicType ) );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->addFieldBuffer( ePicType ) );
}
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 ) );
}
//===== loop over macroblocks =====
for( uiNumMBInSlice = 0; uiMbAddress <= uiLastMbAddress; )
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
Double dCost = 0;
rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
//===== 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, false ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX, false ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
//===== estimate prediction data =====
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
*pcRefFrameList0,
*pcRefFrameList1,
pcBaseLayerFrame ? pcBaseLayerFrame ->getPic( ePicType ) : NULL,
pcBaseLayerResidual ? pcBaseLayerResidual->getPic( ePicType ) : NULL,
*pcOrigFrame ->getPic( ePicType ),
*pcIntraRecFrame ->getPic( ePicType ),
bBiPredOnly,
uiNumMaxIter,
uiIterSearchRange,
m_bBLSkipEnable, //JVT-Q065 EIDR
rcControlData.getLambda(),
dCost,
true ) );
// TMM_INTERLACE{
/* if( m_bSaveMotionInfo )
{
//===== save prediction data =====
// saveAll is displaced because the Mvs are Ok but the other data could be modified (mode,...).
// Do it after m_pcSliceEncoder->encodeHighPassPicture
// RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
}*/
// TMM_INTERLACE}
}
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; )
{
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
UInt uiMbY, uiMbX;
Double dCost = 0;
rcSliceHeader.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
//===== init macroblock =====
RNOK ( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
if (rcSliceHeader.getAVCRewriteFlag())
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
}
if( ! m_bLoadMotionInfo )
{
//===== initialisation =====
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX, false ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX, false ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
//JVT-U106 Behaviour at slice boundaries{
if( rcSliceHeader.getBaseLayerId() != MSYS_UINT_MAX )
pcMbEncoder->setIntraBLFlag(m_pbIntraBLFlag[uiMbAddress]);
//JVT-U106 Behaviour at slice boundaries}
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
*pcRefFrameList0,
*pcRefFrameList1,
pcBaseLayerFrame ? pcBaseLayerFrame ->getPic( ePicType ) : NULL,
pcBaseLayerResidual ? pcBaseLayerResidual->getPic( ePicType ) : NULL,
*pcOrigFrame ->getPic( ePicType ),
*pcIntraRecFrame ->getPic( ePicType ),
bBiPredOnly,
uiNumMaxIter,
uiIterSearchRange,
m_bBLSkipEnable, //JVT-Q065 EIDR
rcControlData.getLambda(),
dCost,
true ) );
// TMM_INTERLACE{
/* if( m_bSaveMotionInfo )
{
//===== save prediction data =====
// saveAll is displaced because the Mvs are Ok but the other data could be modified (mode,...).
// Do it after m_pcSliceEncoder->encodeHighPassPicture
// RNOK( pcMbDataAccess->getMbData().saveAll( m_pMotionInfoFile ) );
}*/
// TMM_INTERLACE}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -