📄 gopencoder.cpp
字号:
// 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( ePicType )->getFMO(); //TMM
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 =====
RefFrameList rcRefFrameList1 = rcControlData.getPrdFrameList( LIST_1 );
if( rcSliceHeader.isMbaffFrame() )
RNOK( pcMbDataCtrl->initUsedField( rcSliceHeader, rcRefFrameList1 ) );
//===== 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.getTCoeffLevelPredictionFlag())
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 ) );
if( !rcSliceHeader.getNoInterLayerPredFlag() )
{
pcMbEncoder->setBaseModeAllowedFlag( m_apabBaseModeFlagAllowedArrays[0][uiMbAddress] );
}
RNOK( pcMbEncoder->estimatePrediction ( *pcMbDataAccess,
pcMbDataAccessBase,
*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++;
}
}
}
if( ePicType!=FRAME )
{
if( pcOrigFrame ) RNOK( pcOrigFrame ->removeFieldBuffer( ePicType ) );
if( pcIntraRecFrame ) RNOK( pcIntraRecFrame ->removeFieldBuffer( ePicType ) );
if( pcBaseLayerFrame ) RNOK( pcBaseLayerFrame ->removeFieldBuffer( ePicType ) );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xMotionCompensation( Frame* 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 ) );
MbDataCtrl* pcBaseMbDataCtrl = getBaseMbDataCtrl();
RefFrameList* apcRefFrameList0[4] = { NULL, NULL, NULL, NULL };
RefFrameList* apcRefFrameList1[4] = { NULL, NULL, NULL, NULL };
const PicType ePicType = rcSH.getPicType();
const Bool bMbAff = rcSH.isMbaffFrame ();
Frame* apcBLFrame[3] = { 0, 0, m_pcBaseLayerFrame };
if( bMbAff )
{
RefFrameList acRefFrameList0[2];
RefFrameList acRefFrameList1[2];
RNOK( gSetFrameFieldLists( acRefFrameList0[0], acRefFrameList0[1], *pcRefFrameList0 ) );
RNOK( gSetFrameFieldLists( acRefFrameList1[0], acRefFrameList1[1], *pcRefFrameList1 ) );
apcRefFrameList0[ TOP_FIELD ] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[0];
apcRefFrameList0[ BOT_FIELD ] = ( NULL == pcRefFrameList0 ) ? NULL : &acRefFrameList0[1];
apcRefFrameList1[ TOP_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[0];
apcRefFrameList1[ BOT_FIELD ] = ( NULL == pcRefFrameList1 ) ? NULL : &acRefFrameList1[1];
apcRefFrameList0[ FRAME ] = pcRefFrameList0;
apcRefFrameList1[ FRAME ] = pcRefFrameList1;
if( m_pcBaseLayerFrame )
{
m_pcBaseLayerFrame->addFrameFieldBuffer();
apcBLFrame[0] = m_pcBaseLayerFrame->getPic( TOP_FIELD );
apcBLFrame[1] = m_pcBaseLayerFrame->getPic( BOT_FIELD );
}
}
else
{
RNOK( pcMCFrame->addFieldBuffer( ePicType ) );
apcRefFrameList0[ ePicType ] = pcRefFrameList0;
apcRefFrameList1[ ePicType ] = pcRefFrameList1;
}
//===== loop over macroblocks =====
const UInt uiMbNumber = rcSH.getMbInPic(); //TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = 0;
UInt uiMbY, uiMbX;
rcSH.getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if ( pcBaseMbDataCtrl )
{
RNOK( pcBaseMbDataCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcYuvFullPelBufferCtrl->initMb( uiMbY, uiMbX, bMbAff ) );
RNOK( m_pcYuvHalfPelBufferCtrl->initMb( uiMbY, uiMbX, bMbAff ) );
RNOK( m_pcMotionEstimation ->initMb( uiMbY, uiMbX, *pcMbDataAccess ) );
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcMbDataAccess->setMbDataAccessBase(pcMbDataAccessBase);
pcMbEncoder->setBaseLayerRec( apcBLFrame[ eMbPicType - 1 ] );
RNOK( pcMbEncoder->compensatePrediction( *pcMbDataAccess,
pcMCFrame->getPic( eMbPicType ),
*apcRefFrameList0 [ eMbPicType ],
*apcRefFrameList1 [ eMbPicType ],
bCalcMv, bFaultTolerant) );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::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
LayerEncoder::xZeroIntraMacroblocks( Frame* pcFrame,
ControlData& rcCtrlData,
PicType ePicType )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader (ePicType);
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
YuvMbBuffer cZeroMbBuffer;
cZeroMbBuffer.setAllSamplesToZero();
const Bool bMbAff = pcSliceHeader->isMbaffFrame();
if( ePicType!=FRAME )
{
RNOK( pcFrame->addFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->addFrameFieldBuffer() );
}
//===== loop over macroblocks =====
const UInt uiMbNumber = pcSliceHeader->getMbInPic(); //TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ ) //TMM
{
MbDataAccess* pcMbDataAccess = NULL;
UInt uiMbY, uiMbX;
pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb ( uiMbY, uiMbX, bMbAff ) );
if( pcMbDataAccess->getMbData().isIntra() )
{
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cZeroMbBuffer );
}
}
if( ePicType!=FRAME )
{
RNOK( pcFrame->removeFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->removeFrameFieldBuffer() );
}
return Err::m_nOK;
}
ErrVal
LayerEncoder::xClipIntraMacroblocks( Frame* pcFrame,
ControlData& rcCtrlData,
Bool bClipAll,
PicType ePicType )
{
MbDataCtrl* pcMbDataCtrl = rcCtrlData.getMbDataCtrl ();
SliceHeader* pcSliceHeader = rcCtrlData.getSliceHeader( ePicType );
ROF( pcSliceHeader );
YuvPicBuffer* pcPicBuffer;
YuvMbBuffer cMbBuffer;
RNOK( pcMbDataCtrl->initSlice( *pcSliceHeader, PRE_PROCESS, false, NULL ) );
const Bool bMbAff = pcSliceHeader->isMbaffFrame();
if( ePicType!=FRAME )
{
RNOK( pcFrame->addFieldBuffer ( ePicType ) );
}
else if( bMbAff )
{
RNOK( pcFrame->addFrameFieldBuffer() );
}
//===== loop over macroblocks =====
const UInt uiMbNumber = pcSliceHeader->getMbInPic();//TMM
for( UInt uiMbAddress = 0 ; uiMbAddress < uiMbNumber; uiMbAddress++ )//TMM
{
MbDataAccess* pcMbDataAccess = 0;
UInt uiMbY, uiMbX;
pcSliceHeader->getMbPositionFromAddress( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcYuvFullPelBufferCtrl->initMb ( uiMbY, uiMbX, bMbAff ) );
if( bClipAll || pcMbDataAccess->getMbData().isIntra() )
{
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer();
cMb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -