📄 mbencoder.cpp
字号:
}
//===== inter modes without residual prediction =====
if( bInterEnable && ( ! bIsEnhLayer || rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() || ! bInCropWindow ) )
{
if( bInCropWindow && !pcMbDataAccessBase->getMbData().isIntra() && rcRefFrameList0.getActive() )
{
RNOK( xEstimateMbBLSkip( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1, pcBaseLayerRec, false, 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 && ( !bLowComplexMbEnable ) ) // JVT-V079
{
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 && pcRefFrameList0Base != 0 && ! m_pcIntMbBestData->getMbDataAccess().getMbData().isIntra() )
{
Bool bResidualPredUsed = false;
//===== residual prediction =====
if( bInCropWindow && m_pcIntMbBestData->getMbDataAccess().getMbData().getResidualPredFlag() )
{
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 && ( ! bIsEnhLayer || rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() || ! bInCropWindow ) && rcMbDataAccess.getSH().getSPS().getNumberOfQualityLevelsCGSSNR() == 1 )
{
RNOK ( xEstimateMbIntra16 ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbIntra8 ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbIntra4 ( rcMbDataAccess, m_pcIntMbTempData, m_pcIntMbBestData, false ) );
RNOK ( xEstimateMbPCM ( m_pcIntMbTempData, m_pcIntMbBestData, false ) );
}
// JVT-W043 {
if ( bRateControlEnable && !pcJSVMParams->m_uiLayerId )
{
pcGenericRC->update_rc( jsvmCalcMAD( m_pcIntMbBestData, rcMbDataAccess ) );
}
// JVT-W043 }
// JVT-V079 Low-complexity MB mode decision {
if ( (bLowComplexMbEnable==true) && (!m_pcIntMbBestData->isIntra()) )
{
if ( (m_pcIntMbBestData->getMbMode() == MODE_16x16) & (m_pcIntMbBestData->cbp()==0) &
(m_pcIntMbBestData->getMbMotionData( LIST_0 ).getRefIdx()==1) )
RNOK ( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, cRefFrameList1 ) );
/* Inter mode needs motion compensation */
RNOK( xSetRdCostInterMb ( *m_pcIntMbBestData, pcMbDataAccessBase, rcRefFrameList0, cRefFrameList1 ) );
}
//JVT-V079 Low-complexity MB mode decision }
RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbBestData ) );
RNOK( xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, pcRecSubband, pcPredSignal, &rcRefFrameList0, 0, false, &cBaseLayerBuffer ) );
//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 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));
Frame* pcRefFrame0 = ( iRefIdx [0] > 0 ? rcRefFrameList0[ iRefIdx [0] ] : NULL );
Frame* 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,
Frame* pcOrgFrame,
Frame* pcFrame,
Frame* pcResidual,
Frame* pcBaseSubband,
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=0, uiRate;
Bool bCoded = false;
Double dCost = 1e30;
UInt uiRPred = ( rcMbDataAccess.getSH().getNoInterLayerPredFlag() ? 0 :
rcMbDataAccess.getSH().getAdaptiveBaseModeFlag() ? 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().getTCoeffLevelPredictionFlag();
Bool coeffResidualPredFlag = rcMbDataAccess.getCoeffResidualPredFlag();
//>>> fix (skip mode in hierarchical P pictures) - H. Schwarz
Bool bRemovePSkip= false;
//<<< fix (skip mode in hierarchical P pictures) - H. Schwarz
// JVT-W043 {
UInt bestuiDist = MSYS_UINT_MAX;
// JVT-W043 }
if( ! rcMbDataAccess.getMbDataAccessBase() || ! rcMbDataAccess.getMbDataAccessBase()->getMbData().getInCropWindowFlag() )
{
iMaxCnt = 1;
}
Bool disableCoeffResidualPred = rcMbDataAccess.getDisableCoeffResidualPredFlag();
if (iMaxCnt > 1 && (!avcRewriteFlag && disableCoeffResidualPred))
{
iMaxCnt = 1; // disable residual prediction if it can not be done in transform domain
}
if( (avcRewriteFlag || coeffResidualPredFlag) && (iMaxCnt > 1) )
{
if( (rcMbDataAccess.getMbDataAccessBase()->getMbData().isTransformSize8x8() == true)
&& (uiMaxTrafo < 2) )
{ // if AVC rewrite is enabled, do not allow residual prediction if base layer and enhancement layer transofrm size do not match
iMaxCnt = 1;
}
}
if( rcMbDataAccess.getSH().getSliceSkipFlag() )
{
iMinCnt = 1;
ROF( iMaxCnt == 2 );
}
Bool bDefaultResPredFlag = false;
if( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
!rcMbDataAccess.getSH().getNoInterLayerPredFlag() &&
rcMbDataAccess.getMbDataAccessBase()->getMbData().getInCropWindowFlag() &&
!rcMbDataAccess.getMbDataAccessBase()->getMbData().isIntra() )
{
ROF( pcBaseSubband );
YuvMbBuffer cBaseLayerBuffer;
cBaseLayerBuffer.loadBuffer( const_cast<Frame*>(pcBaseSubband)->getFullPelYuvBuffer() );
if (!avcRewriteFlag && !coeffResidualPredFlag)
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
m_pcTransform ->setStoreCoeffFlag(true);
Int iCnt;
for( iCnt = iMinCnt; iCnt < iMaxCnt; iCnt++ )
{
//-- JVT-R091
YuvMbBuffer cBaseResMbBuffer, cOrgMbBuffer;
// store original residual
cOrgMbBuffer .loadLuma ( *m_pcIntOrgMbPelData );
cOrgMbBuffer .loadChroma( *m_pcIntOrgMbPelData );
for( UChar ucQp = ucMinQp; ucQp <= ucMaxQp; ucQp++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -