📄 mbencoder.cpp
字号:
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;
pcFrame->getChannelDistortion()[y*KBlock+x]=(q-p)*(ec_rec+ec_ep)/q;
}
}
else
{
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=pcBaseLayer->getChannelDistortion()[blockIndex];
pcFrame->getChannelDistortion()[y*KBlock+x]=(p*ep_base+(q-p)*(ec_rec+ec_ep))/q;
}
}
}
//JVT-R057 LA-RDO}
m_pcIntMbBestData ->uninit();
m_pcIntMbTempData ->uninit();
m_pcIntMbBest8x8Data->uninit();
m_pcIntMbTemp8x8Data->uninit();
return Err::m_nOK;
}
ErrVal
MbEncoder::xCheckInterMbMode8x8( IntMbTempData*& rpcMbTempData,
IntMbTempData*& rpcMbBestData,
IntMbTempData* pcMbRefData,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
MbDataAccess* pcMbDataAccessBaseMotion )
{
ROTRS( ! rpcMbTempData->getSH().getPPS().getTransform8x8ModeFlag(), Err::m_nOK );
ROTRS( ! pcMbRefData->is8x8TrafoFlagPresent(), Err::m_nOK );
if( pcMbRefData == rpcMbTempData )
{
rpcMbTempData->clearCost ();
rpcMbTempData->getMbTCoeffs ().clear();
rpcMbTempData->setTransformSize8x8( true );
}
else
{
rpcMbTempData->clear ();
rpcMbTempData->setMbMode ( pcMbRefData->getMbMode () );
rpcMbTempData->setBLSkipFlag ( pcMbRefData->getBLSkipFlag () );
rpcMbTempData->setResidualPredFlags ( pcMbRefData->getResidualPredFlags () );
rpcMbTempData->setBlkMode ( B_8x8_0, pcMbRefData->getBlkMode ( B_8x8_0 ) );
rpcMbTempData->setBlkMode ( B_8x8_1, pcMbRefData->getBlkMode ( B_8x8_1 ) );
rpcMbTempData->setBlkMode ( B_8x8_2, pcMbRefData->getBlkMode ( B_8x8_2 ) );
rpcMbTempData->setBlkMode ( B_8x8_3, pcMbRefData->getBlkMode ( B_8x8_3 ) );
rpcMbTempData->setTransformSize8x8 ( true );
rpcMbTempData->getMbMotionData( LIST_0 ).copyFrom( pcMbRefData->getMbMotionData( LIST_0 ) );
rpcMbTempData->getMbMotionData( LIST_1 ).copyFrom( pcMbRefData->getMbMotionData( LIST_1 ) );
rpcMbTempData->getMbMvdData ( LIST_0 ).copyFrom( pcMbRefData->getMbMvdData ( LIST_0 ) );
rpcMbTempData->getMbMvdData ( LIST_1 ).copyFrom( pcMbRefData->getMbMvdData ( LIST_1 ) );
}
#if JMVM_ONLY
//JMVM-W031
if( rpcMbTempData->getMbDataAccess().getSH().getIcEnable() )
{
rpcMbTempData->setIcOn( pcMbRefData->getIcOn() );
if( pcMbRefData->getIcOn() )
rpcMbTempData->getMbIcp().copyFrom( pcMbRefData->getMbIcp() );
else rpcMbTempData->getMbIcp().reset();
rpcMbTempData->getMbDataAccess().getMbData().setSkipFlagTmp( false );
}
#endif
RNOK( xSetRdCost8x8InterMb( *rpcMbTempData, pcMbDataAccessBaseMotion, rcRefFrameList0, rcRefFrameList1 ) );
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
rpcMbTempData->rdCost()+=getEpRef();
//JVT-R057 LA-RDO}
RNOK( xCheckBestEstimation( rpcMbTempData, rpcMbBestData ) );
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-W081
ErrVal
MbEncoder::xCheckInterMbMode8x8MotionSkip( IntMbTempData*& rpcMbTempData,
IntMbTempData*& rpcMbBestData,
IntMbTempData* pcMbRefData,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
MbDataAccess* pcMbDataAccessBaseMotion )
{
ROTRS( ! rpcMbTempData->getSH().getPPS().getTransform8x8ModeFlag(), Err::m_nOK );
ROTRS( ! pcMbRefData->is8x8TrafoFlagPresent(), Err::m_nOK );
if( pcMbRefData == rpcMbTempData )
{
rpcMbTempData->clearCost ();
rpcMbTempData->getMbTCoeffs ().clear();
rpcMbTempData->setTransformSize8x8( true );
}
else
{
rpcMbTempData->clear ();
rpcMbTempData->setMbMode ( pcMbRefData->getMbMode () );
rpcMbTempData->setBLSkipFlag ( pcMbRefData->getBLSkipFlag () );
rpcMbTempData->setResidualPredFlags ( pcMbRefData->getResidualPredFlags () );
rpcMbTempData->setMotionSkipFlag ( pcMbRefData->getMotionSkipFlag () ); //
rpcMbTempData->setFwdBwd ( pcMbRefData->getFwdBwd () ); //
rpcMbTempData->setBlkMode ( B_8x8_0, pcMbRefData->getBlkMode ( B_8x8_0 ) );
rpcMbTempData->setBlkMode ( B_8x8_1, pcMbRefData->getBlkMode ( B_8x8_1 ) );
rpcMbTempData->setBlkMode ( B_8x8_2, pcMbRefData->getBlkMode ( B_8x8_2 ) );
rpcMbTempData->setBlkMode ( B_8x8_3, pcMbRefData->getBlkMode ( B_8x8_3 ) );
rpcMbTempData->setTransformSize8x8 ( true );
rpcMbTempData->getMbMotionData( LIST_0 ).copyFrom( pcMbRefData->getMbMotionData( LIST_0 ) );
rpcMbTempData->getMbMotionData( LIST_1 ).copyFrom( pcMbRefData->getMbMotionData( LIST_1 ) );
rpcMbTempData->getMbMvdData ( LIST_0 ).copyFrom( pcMbRefData->getMbMvdData ( LIST_0 ) );
rpcMbTempData->getMbMvdData ( LIST_1 ).copyFrom( pcMbRefData->getMbMvdData ( LIST_1 ) );
#if JMVM_ONLY //JVT-Z021
rpcMbTempData->m_cMbImsm.copyFrom(pcMbRefData->m_cMbImsm);
#endif
}
RNOK( xSetRdCost8x8InterMbMotionSkip( *rpcMbTempData, pcMbDataAccessBaseMotion, rcRefFrameList0, rcRefFrameList1 ) );
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
rpcMbTempData->rdCost()+=getEpRef();
//JVT-R057 LA-RDO}
MbDataAccess& rcMbDataAccess = rpcMbTempData->getMbDataAccess();
RNOK( xCheckBestEstimation( rpcMbTempData, rpcMbBestData ) );
return Err::m_nOK;
}
#endif // JVT-W081
ErrVal
MbEncoder::encodeMacroblock( MbDataAccess& rcMbDataAccess,
IntFrame* pcFrame,
RefFrameList& rcList0,
RefFrameList& rcList1,
UInt uiNumMaxIter,
UInt uiIterSearchRange,
Double dLambda
#if JMVM_ONLY // JVT-Z021
, Mv cCenterL0
, Mv cCenterL1
#endif // JVT-Z021
)
{
ROF( m_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 );
#if JMVM_ONLY // JVT-W081
rcMbDataAccess.getMbData().setMotionSkipFlag(false);
#endif // JVT-W081
m_pcIntPicBuffer = pcFrame->getFullPelYuvBuffer();
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
m_pcTransform->setQp( rcMbDataAccess, rcMbDataAccess.getSH().getKeyPictureFlag() );
//====== evaluate macroblock modes ======
if( rcMbDataAccess.getSH().isInterP() )
{
RNOK( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1 ) );
}
if( rcMbDataAccess.getSH().isInterB() )
{
RNOK( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, NULL, false ) );
#if JMVM_ONLY // JVT-U052
if( rcMbDataAccess.getSH().getIcEnable() )
{
m_pcIntMbTempData->setIcOn( true );
RNOK( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, NULL, false ) );
m_pcIntMbTempData->setIcOn( false );
}
#endif
}
if( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() )
{
RNOK( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
RNOK( xEstimateMb16x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
RNOK( xEstimateMb8x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
#if JMVM_ONLY // JVT-U052
if( rcMbDataAccess.getSH().getIcEnable() )
{
m_pcIntMbTempData->setIcOn( true );
RNOK( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
m_pcIntMbTempData->setIcOn( false );
}
RNOK( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
#else
RNOK( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, false, uiNumMaxIter, uiIterSearchRange, false, NULL, false ) );
#endif
}
RNOK( xEstimateMbIntra16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isInterB() ) );
RNOK( xEstimateMbIntra8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isInterB() ) );
RNOK( xEstimateMbIntra4 ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isInterB() ) );
RNOK( xEstimateMbPCM ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isInterB() ) );
#if JMVM_ONLY // JVT-W081
//JVT-Z021
if ( /*FMb.m_iViewMode < INTRA_4X4 &&*/ //linsx
!rcMbDataAccess.getSH().getAVCFlag() && rcMbDataAccess.getSH().getMotionSkip() &&
( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) &&
!rcMbDataAccess.getSH().getAnchorPicFlag() )
{
//JVT-Z021
Bool bMSDone = false;
Bool bIsView0, bIsView1;
if(rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD
{
bIsView0 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcMbDataAccess.getSH().getViewId(), LIST_0);
}
else
{
bIsView0 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcMbDataAccess.getSH().getViewId(), LIST_0);
}
if(bIsView0)
{
MBMotion cMbMotionTmp;
for(int k=0; k<rcMbDataAccess.getSH().getMbMotionModeNum(LIST_0); k++)
{
cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_0,k);
if (cMbMotionTmp.m_iViewMode < INTRA_4X4 &&
( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) )
{
bMSDone = true;
MbImsm cMbImsm;
Mv cOffsetPred;
Mv cPosCur;
Mv cCenter;
cCenter.setHor(cCenterL0.getHor());
cCenter.setVer(cCenterL0.getVer());
cPosCur.setHor(k%9 - 9/2);
cPosCur.setVer(k/9 - 9/2);
cMbImsm.m_iListXFlag = LIST_0;
cMbImsm.m_cOffset.setHor(cPosCur.getHor());
cMbImsm.m_cOffset.setVer(cPosCur.getVer());
RNOK( xEstimateMbMotionSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1,
&cMbMotionTmp, cMbImsm) );
}
}
}
{
//JVT-Z021
if(rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD
{
bIsView1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);
}
else
{
bIsView1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);
}
if(bIsView0)
{
MBMotion cMbMotionTmp;
for(int k=0; k<rcMbDataAccess.getSH().getMbMotionModeNum(LIST_1); k++)
{
cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_1,k);
if (cMbMotionTmp.m_iViewMode < INTRA_4X4 &&
( rcMbDataAccess.getSH().isInterP() || rcMbDataAccess.getSH().isInterB() ) )
{
MbImsm cMbImsm;
Mv cOffsetPred;
Mv cPosCur;
Mv cCenter;
cCenter.setHor(cCenterL1.getHor() );
cCenter.setVer(cCenterL1.getVer() );
cPosCur.setHor(k%9 - 9/2);
cPosCur.setVer(k/9 - 9/2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -