📄 mbencoder.cpp
字号:
//===== 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, rcMbDataAccess, bDefaultResPredFlag ) );// TMM_INTERLACE
}
// if 2 reference frames are supplied, do not evaluate the skip mode here
if( rcRefFrameList0.getActive() ) // JVT-Q065 EIDR
{
if( pcRefFrameList0Base == 0 && bSkipModeAllowed )
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( bInterEnable )
if( pcRefFrameList0Base != 0 && ! m_pcIntMbBestData->getMbDataAccess().getMbData().isIntra() )
{
Bool bResidualPredUsed;
bResidualPredUsed = false;
//===== residual prediction =====
if( bBaseLayerAvailable )
{
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 && bSkipModeAllowed )
{
RNOK ( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, *pcRefFrameList0Base, cRefFrameList1 ) );
}
}
m_pcTransform->setClipMode( true );
//==== normal intra modes =====
if( bIntraEnable )
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++)
{
//Bug_Fix JVT-R057 0806{
//p=p*(100-m_auiPLR[m_uiLayerID]);
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)
{
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;
if(pcRefFrame0)
{
iMvX=rcMbDataAccess.getMbMotionData(LIST_0).getMv(B4x4Idx(n)).getHor();
iMvY=rcMbDataAccess.getMbMotionData(LIST_0).getMv(B4x4Idx(n)).getVer();
getChannelDistortion(rcMbDataAccess,*pcRefFrame0,&iDLIST0,iMvX,iMvY,n%4,n/4,1,1);
}
if(pcRefFrame1)
{
iMvX=rcMbDataAccess.getMbMotionData(LIST_1).getMv(B4x4Idx(n)).getHor();
iMvY=rcMbDataAccess.getMbMotionData(LIST_1).getMv(B4x4Idx(n)).getVer();
getChannelDistortion(rcMbDataAccess,*pcRefFrame1,&iDLIST1,iMvX,iMvY,n%4,n/4,1,1);
iDLIST0=(iDLIST0+iDLIST1)/2;
}
ep_ref=iDLIST0;
x=blockX+n%4;
y=blockY+n/4;
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]=(p*ep_ref+(q-p)*(ec_rec+ec_ep))/q;
}
}
else
{
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;
}
}
}
//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::encodeResidual( MbDataAccess& rcMbDataAccess,
IntFrame* pcOrgFrame,
IntFrame* pcFrame,
IntFrame* pcResidual,
IntFrame* pcBaseSubband,
IntFrame* pcSRFrame, // JVT-R091
Bool& rbCoded,
Double dLambda,
Int iMaxQpDelta )
{
ROF( bInitDone );
m_pcIntPicBuffer = pcFrame->getFullPelYuvBuffer();
UInt uiMinTrafo = 0;
UInt uiMaxTrafo = ( ( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() && rcMbDataAccess.getMbData().is8x8TrafoFlagPresent(rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag()) ) ? 2 : 1 );
UChar ucMinQp = (UChar)min( MAX_QP, max( MIN_QP, rcMbDataAccess.getMbData().getQp() - iMaxQpDelta ) );
UChar ucMaxQp = (UChar)min( MAX_QP, max( MIN_QP, rcMbDataAccess.getMbData().getQp() + iMaxQpDelta ) );
Double dMinCost = 1e30;
UInt uiDist, uiRate;
Bool bCoded = false;
Double dCost = 1e30;
UInt uiRPred = ( rcMbDataAccess.getSH().getBaseLayerId () == MSYS_UINT_MAX ? 0 :
rcMbDataAccess.getSH().getAdaptivePredictionFlag() ? 2 : 1 );
Int iMinCnt = ( uiRPred == 0 || uiRPred == 2 ? 0 : 1 );
Int iMaxCnt = ( uiRPred == 1 || uiRPred == 2 ? 2 : 1 );
Bool bPotentialBSkip = true;
Bool avcRewriteFlag = rcMbDataAccess.getSH().getAVCRewriteFlag();
//>>> fix (skip mode in hierarchical P pictures) - H. Schwarz
Bool bRemovePSkip= false;
//<<< fix (skip mode in hierarchical P pictures) - H. Schwarz
//-- JVT-R091
Bool bSmoothedRef = false;
rcMbDataAccess.getMbData().setSmoothedRefFlag( false );
if ( uiRPred == 2 && rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.isConstrainedInterLayerPred( )
&& rcMbDataAccess.useSmoothedRef() && ( avcRewriteFlag==false) )
{
iMaxCnt = 3;
}
//--
if( avcRewriteFlag && (iMaxCnt > 1) )
{
if( (rcMbDataAccess.getMbDataAccessBase()->getMbData().isTransformSize8x8() == true)
&& (uiMaxTrafo < 2) )
{ // if AVC rewrite is enabledm do not allow residual prediction if base layer and enhancement layer transofrm size do not match
iMaxCnt = 1;
}
}
Bool bDefaultResPredFlag = false;
if( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseSubband );
IntYuvMbBuffer cBaseLayerBuffer;
cBaseLayerBuffer.loadBuffer( const_cast<IntFrame*>(pcBaseSubband)->getFullPelYuvBuffer() );
if (!avcRewriteFlag)
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
Int iCnt;
for( iCnt = iMinCnt; iCnt < iMaxCnt; iCnt++ )
{
//-- JVT-R091
IntYuvMbBuffer cPrdMbBuffer, cBaseResMbBuffer, cMbBuffer, cNewPrdMbBuffer, cOrgMbBuffer;
// store original residual
cOrgMbBuffer .loadLuma ( *m_pcIntOrgMbPelData );
cOrgMbBuffer .loadChroma( *m_pcIntOrgMbPelData );
bSmoothedRef = ( iCnt == 2 );
if ( bSmoothedRef )
{
IntYuvMbBuffer cNewResMbBuffer;
// load pre-stored S(P)
cNewPrdMbBuffer .loadBuffer ( pcSRFrame->getFullPelYuvBuffer() );
// compute residual -> O-S(P)
cNewResMbBuffer .loadBuffer ( pcOrgFrame->getFullPelYuvBuffer() );
cNewResMbBuffer .subtract ( cNewPrdMbBuffer );
// store new residual
m_pcIntOrgMbPelData->loadLuma ( cNewResMbBuffer );
m_pcIntOrgMbPelData->loadChroma ( cNewResMbBuffer );
}
//--
for( UChar ucQp = ucMinQp; ucQp <= ucMaxQp; ucQp++ )
{
for( UInt uiTrafo8x8 = uiMinTrafo; uiTrafo8x8 < uiMaxTrafo; uiTrafo8x8++ )
{
m_pcIntMbTempData ->init( rcMbDataAccess );
if( iCnt )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -