📄 mbencoder.cpp
字号:
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
{
Int x,y;
MbMode mode=rcMbDataAccess.getMbData().getMbMode();
Bool bInter= !rcMbDataAccess.getSH().getNoInterLayerPredFlag();
Int KBlock = m_pcIntPicBuffer->getLWidth()/4;
Int blockX=rcMbDataAccess.getMbX()*4;
Int blockY=rcMbDataAccess.getMbY()*4;
Int ec_rec,ec_ep;
m_pcIntPicBuffer->getYuvBufferCtrl().initMb();
UInt p=1;
UInt q=100;
if(bInter)
{
for(UInt i=0;i<=m_uiLayerID;i++)
{
//Bug_Fix JVT-R057 0806{
p=p*(100-m_auiPLR[i]);
//Bug_Fix JVT-R057 0806}
}
//q=(UInt)pow(100,(m_uiLayerID+1));
q=(UInt)pow(100.0,(int)(m_uiLayerID+1));
}
else
{
p=100-m_auiPLR[m_uiLayerID];
}
if(mode!=INTRA_BL)
{
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}
rdCost = m_pcIntMbBestData->rdCost();
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,
Bool bBLSkip,
MbDataAccess* pcMbDataAccessBaseMotion,
Frame* pcBaseLayerRec
)
{
ROTRS( ! rpcMbTempData->getSH().getPPS().getTransform8x8ModeFlag(), Err::m_nOK );
ROTRS( ! pcMbRefData->is8x8TrafoFlagPresent( rpcMbTempData->getSH().getSPS().getDirect8x8InferenceFlag() ), 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->setResidualPredFlag ( pcMbRefData->getResidualPredFlag () );
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 ) );
}
RNOK( xSetRdCost8x8InterMb( *rpcMbTempData, pcMbDataAccessBaseMotion, rcRefFrameList0, rcRefFrameList1,
bBLSkip, 0, false, pcBaseLayerRec ) );
//JVT-R057 LA-RDO{
if(m_bLARDOEnable)
rpcMbTempData->rdCost()+=getEpRef();
//JVT-R057 LA-RDO}
RNOK( xCheckBestEstimation( rpcMbTempData, rpcMbBestData ) );
return Err::m_nOK;
}
ErrVal
MbEncoder::encodeMacroblock( MbDataAccess& rcMbDataAccess,
Frame* pcFrame,
RefFrameList& rcList0,
RefFrameList& rcList1,
UInt uiNumMaxIter,
UInt uiIterSearchRange,
Double dLambda )
{
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 );
m_pcIntPicBuffer = pcFrame->getFullPelYuvBuffer();
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
m_pcTransform->setQp( rcMbDataAccess, rcMbDataAccess.getSH().getTemporalId() == 0 );
//====== evaluate macroblock modes ======
if( rcMbDataAccess.getSH().isPSlice() )
{
RNOK( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1 ) );
}
if( rcMbDataAccess.getSH().isBSlice() )
{
RNOK( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcList0, rcList1, NULL, false, rcMbDataAccess.getMbData().getQp() ) );
}
if( rcMbDataAccess.getSH().isPSlice() || rcMbDataAccess.getSH().isBSlice() )
{
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 ) );
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 ) );
}
RNOK( xEstimateMbIntra16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isBSlice() ) );
RNOK( xEstimateMbIntra8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isBSlice() ) );
RNOK( xEstimateMbIntra4 ( rcMbDataAccess, m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isBSlice() ) );
RNOK( xEstimateMbPCM ( m_pcIntMbTempData, m_pcIntMbBestData, rcMbDataAccess.getSH().isBSlice() ) );
//===== fix estimation =====
RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbBestData ) );
RNOK( xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, NULL, NULL, &rcList0, &rcList1, false, NULL ) );
//===== uninit =====
m_pcIntMbBestData ->uninit();
m_pcIntMbTempData ->uninit();
m_pcIntMbBest8x8Data->uninit();
m_pcIntMbTemp8x8Data->uninit();
return Err::m_nOK;
}
ErrVal
MbEncoder::encodeInterP( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
Frame* pcOrgFrame,
Frame* pcFrame,
Frame* pcRecSubband,
Frame* pcPredSignal,
Frame* pcBaseLayerRec,
Frame* pcBaseLayerSbb,
RefFrameList& rcRefFrameList0,
RefFrameList* pcRefFrameList0Base,
Double dLambda,
Double& rdCost,
Bool bSkipModeAllowed )
{
ROF( bInitDone );
UInt uiQp = rcMbDataAccess.getMbData().getQp();
if (rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag())
{
uiQp = rcMbDataAccess.getLastQp(); // to avoid QP get changed by fixMacroblockQP
rcMbDataAccess.getMbData().setQp( uiQp );
}
RNOK( m_pcRateDistortionIf->setMbQpLambda( rcMbDataAccess, uiQp, dLambda ) )
rcMbDataAccess.setMbDataAccessBase(pcMbDataAccessBase);
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( pcOrgFrame->getFullPelYuvBuffer(), m_pcIntOrgMbPelData );
m_pcTransform->setQp ( rcMbDataAccess, true );
m_pcTransform->setClipMode( false );
//JVT-V079 Low-complexity MB mode decision
Bool bLowComplexMbEnable = m_bLowComplexMbEnable[rcMbDataAccess.getSH().getDependencyId()];
RefFrameList cRefFrameList1;
YuvMbBuffer cBaseLayerBuffer;
ROT( !rcMbDataAccess.getSH().getNoInterLayerPredFlag() && ! pcMbDataAccessBase );
Bool bIsEnhLayer = ! rcMbDataAccess.getSH().getNoInterLayerPredFlag();
Bool bInCropWindow = ( bIsEnhLayer && pcMbDataAccessBase->getMbData().getInCropWindowFlag() );
pcMbDataAccessBase = ( bInCropWindow ? pcMbDataAccessBase : 0 );
Bool bIntraEnable = ! rcMbDataAccess.isFieldMbInMbaffFrame() || rcMbDataAccess.isTopMb() || rcMbDataAccess.getMbDataComplementary().isIntra();
Bool bInterEnable = ! rcMbDataAccess.isFieldMbInMbaffFrame() || rcMbDataAccess.isTopMb() || ! rcMbDataAccess.getMbDataComplementary().isIntra();
if( rcMbDataAccess.isFieldMbInMbaffFrame() && rcMbDataAccess.getMbPicType() == BOT_FIELD && rcMbDataAccess.getMbDataComplementary().isIntra() && bInCropWindow )
{
if( ! pcMbDataAccessBase->getMbData().isIntra() || ! pcMbDataAccessBase->getMbDataComplementary().isIntra() )
{
bInterEnable = true;
}
}
Bool bDefaultResPredFlag = false;
Bool avcRewriteFlag = rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag();
Bool coeffResidualPredFlag = rcMbDataAccess.getCoeffResidualPredFlag();
if( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
!rcMbDataAccess.getSH().getNoInterLayerPredFlag() &&
rcMbDataAccess.getMbDataAccessBase()->getMbData().getInCropWindowFlag() &&
!rcMbDataAccess.getMbDataAccessBase()->getMbData().isIntra() )
{
ROF( pcBaseLayerSbb );
cBaseLayerBuffer.loadBuffer ( const_cast<Frame*>(pcBaseLayerSbb)->getFullPelYuvBuffer() );
if (!avcRewriteFlag && !coeffResidualPredFlag)
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
Bool disableCoeffResidualPred = rcMbDataAccess.getDisableCoeffResidualPredFlag();
//===== inter modes with residual prediction =====
if( bInCropWindow && bInterEnable && ( !disableCoeffResidualPred || avcRewriteFlag ) )
{
ROF( pcBaseLayerSbb );
if( avcRewriteFlag )
{
cBaseLayerBuffer.setAllSamplesToZero();
}
else if( coeffResidualPredFlag )
{
pcMbDataAccessBase->getMbTCoeffs().copyPredictionTo( cBaseLayerBuffer );
}
else
{
cBaseLayerBuffer.loadBuffer( pcBaseLayerSbb->getFullPelYuvBuffer() );
}
m_pcIntOrgMbPelData->subtract ( cBaseLayerBuffer );
if( !pcMbDataAccessBase->getMbData().isIntra() && rcRefFrameList0.getActive() )
{
if( !cBaseLayerBuffer.isZero() || coeffResidualPredFlag || avcRewriteFlag || !rcMbDataAccess.getSH().getAdaptiveResidualPredictionFlag() )
{
RNOK( xEstimateMbBLSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, pcBaseLayerRec, false, pcMbDataAccessBase, rcMbDataAccess, true ) );
}
}
if( rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() && 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_BL =====
if( bInCropWindow && bIntraEnable && pcMbDataAccessBase->getMbData().isIntra() )
{
RNOK( xEstimateMbIntraBL( rcMbDataAccess, m_pcIntMbTempData, m_pcIntMbBestData, pcBaseLayerRec, false, pcMbDataAccessBase ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -