📄 mbencoder.cpp
字号:
cMbImsm.m_iListXFlag = LIST_1;
cMbImsm.m_cOffset.setHor(cPosCur.getHor());
cMbImsm.m_cOffset.setVer(cPosCur.getVer());
RNOK( xEstimateMbMotionSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1,
&cMbMotionTmp, cMbImsm) );
}
}
}
}
}
#endif // JVT-W081
//===== fix estimation =====
RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbBestData ) );
xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, NULL, NULL, false, NULL );
//===== uninit =====
m_pcIntMbBestData ->uninit();
m_pcIntMbTempData ->uninit();
m_pcIntMbBest8x8Data->uninit();
m_pcIntMbTemp8x8Data->uninit();
return Err::m_nOK;
}
#if JMVM_ONLY
FILE*
MbEncoder::getMotionFile( SliceHeader& rcSliceHeader, Int ViewId, Int iListIdx )
{
SpsMvcExtension* rcSpsMvc = rcSliceHeader.getSPS().getSpsMVC();
UInt uiNumNonAnchorRefs = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), iListIdx);
Int iMotionFileViewId;
//=== return motion file having same view_id with this disparity ===
for(UInt ui=0; ui<uiNumNonAnchorRefs; ui++)
{
iMotionFileViewId = rcSpsMvc->getNonAnchorRefForListX (rcSliceHeader.getViewId(),ui, iListIdx);
if( iMotionFileViewId == ViewId )
{
if(iListIdx==0)
return fFwdMv[ui];
else
return fBwdMv[ui];
}
}
return 0;
}
//JVT-Z021
ErrVal MbEncoder::getNeighborMbMotionInfo( MbDataAccess& rcMbDataAccess,
const Mv& cCenterL0, const Mv& cCenterL1,
MBMotion& FMb )
{
UInt uiIdx = 0;
UInt uiIdxL0 = 0;
UInt uiIdxL1 = 0;
UInt uiIdxLX = 0;
SliceHeader& rcSliceHeader = rcMbDataAccess.getSH();
UInt uiNumNonAnchorViewL0 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(rcSliceHeader.getViewId(),0);
UInt uiNumNonAnchorViewL1 = rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(rcSliceHeader.getViewId(),1);
UInt uiNumNonAnchorViewLX = uiNumNonAnchorViewL0 + uiNumNonAnchorViewL1;
FMb.m_iViewMode = INTRA_4X4;
if ( uiNumNonAnchorViewLX )
{
while(1)
{
if( uiIdxL0 < uiNumNonAnchorViewL0 )
{
uiIdx = 9*cCenterL0.getVer() + cCenterL0.getHor();
FMb = rcSliceHeader.getMbMotionInfo(LIST_0, uiIdx);
uiIdxL0 ++;
if( FMb.m_iViewMode != INTRA_4X4 )
break;
}
if( uiIdxL1 < uiNumNonAnchorViewL1 )
{
uiIdx = 9*cCenterL1.getVer() + cCenterL1.getHor();
FMb = rcSliceHeader.getMbMotionInfo(LIST_1, uiIdx);
uiIdxL1 ++;
if( FMb.m_iViewMode != INTRA_4X4 )
break;
}
uiIdxLX = uiIdxL0 + uiIdxL1;
if( uiIdxLX == uiNumNonAnchorViewLX )
break;
}
}
return Err::m_nOK;
}
//JVT-Z021
#endif //JMVM_ONLY
ErrVal
MbEncoder::encodeInterP( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
Int iSpatialScalabilityType,
IntFrame* pcFrame,
IntFrame* pcRecSubband,
IntFrame* pcPredSignal,
IntFrame* pcBaseLayerRec,
IntFrame* pcBaseLayerSbb,
RefFrameList& rcRefFrameList0,
RefFrameList* pcRefFrameList0Base,
Double dLambda )
{
ROF( bInitDone );
UInt uiQp = rcMbDataAccess.getMbData().getQp();
RNOK( m_pcRateDistortionIf->setMbQpLambda( rcMbDataAccess, uiQp, dLambda ) )
m_pcIntMbBestIntraChroma = NULL;
m_pcIntMbBestData ->init( rcMbDataAccess );
m_pcIntMbTempData ->init( rcMbDataAccess );
m_pcIntMbBest8x8Data->init( rcMbDataAccess );
m_pcIntMbTemp8x8Data->init( rcMbDataAccess );
m_pcIntPicBuffer = pcFrame->getFullPelYuvBuffer();
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
m_pcTransform->setQp ( rcMbDataAccess, true );
m_pcTransform->setClipMode( false );
RefFrameList cRefFrameList1;
IntYuvMbBuffer cBaseLayerBuffer;
Bool bDefaultResPredFlag = false;
if( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseLayerSbb );
cBaseLayerBuffer.loadBuffer ( const_cast<IntFrame*>(pcBaseLayerSbb)->getFullPelYuvBuffer() );
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
//===== residual prediction =====
if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseLayerSbb );
cBaseLayerBuffer .loadBuffer ( pcBaseLayerSbb->getFullPelYuvBuffer() );
if( ! cBaseLayerBuffer.isZero() ) // HS: search only with residual prediction, when residual signal is non-zero
{
m_pcIntOrgMbPelData->subtract ( cBaseLayerBuffer );
if( ! pcMbDataAccessBase->getMbData().isIntra() && rcRefFrameList0.getActive() ) // JVT-Q065 EIDR
{
//--- only if base layer is in inter mode ---
// TMM_ESS
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() )
RNOK( xEstimateMbBLSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, pcBaseLayerRec, false, iSpatialScalabilityType, pcMbDataAccessBase, true ) );
}
if( rcMbDataAccess.getSH().getAdaptivePredictionFlag() && rcRefFrameList0.getActive() ) // JVT-Q065 EIDR
{
//--- only if adaptive inter-layer prediction ---
RNOK( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb16x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, true ) );
}
m_pcIntOrgMbPelData->add( cBaseLayerBuffer );
}
}
//===== intra base layer mode =====
if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
//===== only when intra BL is allowed =====
if( pcMbDataAccessBase->getMbData().isIntra() || ! rcMbDataAccess.isConstrainedInterLayerPred( ) )
{
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() ) // TMM_ESS
RNOK( xEstimateMbIntraBL( m_pcIntMbTempData, m_pcIntMbBestData, pcBaseLayerRec, false, pcMbDataAccessBase ) );
}
}
//===== without residual prediction =====
if( rcMbDataAccess.getSH().getBaseLayerId () == MSYS_UINT_MAX ||
rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
if(( ( pcMbDataAccessBase && pcMbDataAccessBase->getMbData().isIntra() ) || rcMbDataAccess.getSH().getAdaptivePredictionFlag() ) && rcRefFrameList0.getActive() ) // JVT-Q065 EIDR
{
//--- only if base layer is in intra mode or adaptive prediction is enabled ---
// TMM_ESS
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() )
RNOK( xEstimateMbBLSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, pcBaseLayerRec, false, iSpatialScalabilityType, pcMbDataAccessBase, bDefaultResPredFlag ) );
}
// if 2 reference frames are supplied, do not evaluate the skip mode here
if( rcRefFrameList0.getActive() ) // JVT-Q065 EIDR
{
if( pcRefFrameList0Base == 0 )
RNOK ( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1 ) );
RNOK ( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
RNOK ( xEstimateMb16x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
RNOK ( xEstimateMb8x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
RNOK ( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
RNOK ( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, false, 0, 0, false, pcMbDataAccessBase, false ) );
}
}
// motion estimation was made with the enhancement reference frame
// cost evaluation with the actual reference frame
if( pcRefFrameList0Base != 0 && ! m_pcIntMbBestData->getMbDataAccess().getMbData().isIntra() )
{
Bool bResidualPredUsed;
bResidualPredUsed = false;
if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
if( m_pcIntMbBestData->getMbDataAccess().getMbData().getResidualPredFlag( PART_16x16 ) )
bResidualPredUsed = true;
}
if( bResidualPredUsed )
{
ROF( pcBaseLayerSbb );
cBaseLayerBuffer .loadBuffer ( pcBaseLayerSbb->getFullPelYuvBuffer() );
m_pcIntOrgMbPelData->subtract( cBaseLayerBuffer );
}
if(m_pcIntMbBestData->getMbDataAccess().getMbData().isTransformSize8x8())
{
RNOK( xSetRdCost8x8InterMb( *m_pcIntMbBestData, pcMbDataAccessBase, *pcRefFrameList0Base, cRefFrameList1 ) );
}
else
{
RNOK( xSetRdCostInterMb ( *m_pcIntMbBestData, pcMbDataAccessBase, *pcRefFrameList0Base, cRefFrameList1 ) );
}
if( bResidualPredUsed )
m_pcIntOrgMbPelData->add( cBaseLayerBuffer );
// get skip mode motion vector
Mv cMvPredL0, cCurrentMv;
m_pcIntMbBestData->getMbDataAccess().getMvPredictorSkipMode( cMvPredL0 );
cCurrentMv = m_pcIntMbBestData->getMbMotionData( LIST_0 ).getMv();
// check skip mode only when motion vector is equal to skip mode motion vector
if (m_pcIntMbBestData->getMbMode() == MODE_16x16 && cCurrentMv == cMvPredL0 )
{
RNOK ( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, *pcRefFrameList0Base, cRefFrameList1 ) );
}
}
m_pcTransform->setClipMode( true );
//==== normal intra modes =====
if( rcMbDataAccess.getSH().getBaseLayerId () == MSYS_UINT_MAX ||
rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
RNOK ( xEstimateMbIntra16 ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbIntra8 ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbIntra4 ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbPCM ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
}
RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbBestData ) );
xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, pcRecSubband, pcPredSignal, false, &cBaseLayerBuffer );
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
{
Int x,y;
MbMode mode=rcMbDataAccess.getMbData().getMbMode();
Bool bInter=rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX;
Int KBlock = m_pcIntPicBuffer->getLWidth()/4;
Int blockX=rcMbDataAccess.getMbX()*4;
Int blockY=rcMbDataAccess.getMbY()*4;
Int ep_ref,ec_rec,ec_ep;
m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
UInt p=1;
UInt q=100;
if(bInter)
{
for(UInt i=0;i<=m_uiLayerID;i++)
{
p=p*(100-m_auiPLR[m_uiLayerID]);
}
q=(UInt)pow(100.,(double)(m_uiLayerID+1));
}
else
{
p=100-m_auiPLR[m_uiLayerID];
}
if(mode==INTRA_BL)
{
Int ep_base;
Int blockIndex;
Int xx,yy;
for(y=blockY;y<(blockY+4);y++)
for(x=blockX;x<(blockX+4);x++)
{
if(m_pcFrameEcEp)
ec_ep=m_pcFrameEcEp->getChannelDistortion()[y*KBlock+x];
else
ec_ep=0;
m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
if(m_pcFrameEcEp)
ec_rec=GetEC_REC(m_pcIntPicBuffer,m_pcFrameEcEp->getFullPelYuvBuffer(),x,y);
else
ec_rec=0;
xx=(Int)(x/m_aadRatio[m_uiLayerID][0]);
yy=(Int)(y/m_aadRatio[m_uiLayerID][1]);
blockIndex=yy*(Int)(KBlock/m_aadRatio[m_uiLayerID][0])+xx;
ep_base=pcBaseLayerRec->getChannelDistortion()[blockIndex];
pcFrame->getChannelDistortion()[y*KBlock+x]=(p*ep_base+(q-p)*(ec_rec+ec_ep))/q;
}
}
else if(mode==MODE_SKIP||mode==MODE_16x16||mode==MODE_16x8||mode==MODE_8x16||mode==MODE_8x8||mode==MODE_8x8ref0)
{
for( Int n = 0; n <16; n++)
{
Int iRefIdx[2];
iRefIdx [0]=rcMbDataAccess.getMbMotionData(LIST_0).getRefIdx(B4x4Idx(n));
iRefIdx [1]=rcMbDataAccess.getMbMotionData(LIST_1).getRefIdx(B4x4Idx(n));
IntFrame* pcRefFrame0 = ( iRefIdx [0] > 0 ? rcRefFrameList0[ iRefIdx [0] ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx [1] > 0 ? cRefFrameList1[ iRefIdx [1] ] : NULL );
Int iMvX;
Int iMvY;
Int iDLIST0=0,iDLIST1=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -