📄 mbencoder.cpp
字号:
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}
m_pcIntMbBestData ->uninit();
m_pcIntMbTempData ->uninit();
m_pcIntMbBest8x8Data->uninit();
m_pcIntMbTemp8x8Data->uninit();
return Err::m_nOK;
}
ErrVal
MbEncoder::encodeResidual( MbDataAccess& rcMbDataAccess,
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() ) ? 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;
Double dCost;
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 );
//-- JVT-R091
Bool bSmoothedRef = false;
rcMbDataAccess.getMbData().setSmoothedRefFlag( false );
if ( uiRPred == 2 && rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.isConstrainedInterLayerPred( ) )
{
iMaxCnt = 3;
}
//--
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() );
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
for( Int 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 )
{
// obtain P & Rb
cPrdMbBuffer .loadBuffer( pcSRFrame->getFullPelYuvBuffer() );
cBaseResMbBuffer.loadBuffer( pcBaseSubband->getFullPelYuvBuffer() );
// P+Rb & save to pcPredSR
cMbBuffer .loadBuffer( pcSRFrame->getFullPelYuvBuffer() );
cMbBuffer .add ( cBaseResMbBuffer );
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cMbBuffer );
// S(P+Rb) & save to cMbBuffer
pcSRFrame->getFullPelYuvBuffer()->smoothMbInside();
if ( rcMbDataAccess.isAboveMbExisting() )
{
pcSRFrame->getFullPelYuvBuffer()->smoothMbTop();
}
if ( rcMbDataAccess.isLeftMbExisting() )
{
pcSRFrame->getFullPelYuvBuffer()->smoothMbLeft();
}
cMbBuffer.loadBuffer( pcSRFrame->getFullPelYuvBuffer() );
// restore pcPredSR
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPrdMbBuffer );
// compute new prediction -> S(P+Rb)-Rb
cNewPrdMbBuffer.loadLuma ( cMbBuffer );
cNewPrdMbBuffer.loadChroma ( cMbBuffer );
cNewPrdMbBuffer.subtract ( cBaseResMbBuffer );
// compute new residual -> O-S(P+Rb)+Rb
m_pcIntOrgMbPelData->add ( cPrdMbBuffer );
m_pcIntOrgMbPelData->subtract ( cNewPrdMbBuffer );
}
//--
for( UChar ucQp = ucMinQp; ucQp <= ucMaxQp; ucQp++ )
{
for( UInt uiTrafo8x8 = uiMinTrafo; uiTrafo8x8 < uiMaxTrafo; uiTrafo8x8++ )
{
m_pcIntMbTempData ->init( rcMbDataAccess );
if( iCnt )
{
m_pcIntMbTempData->loadBuffer( pcBaseSubband->getFullPelYuvBuffer() );
}
else
{
m_pcIntMbTempData->setAllSamplesToZero();
}
m_pcIntMbTempData ->getTempYuvMbBuffer().loadLuma( *m_pcIntMbTempData );
m_pcIntMbTempData ->setQp( ucQp );
//-- JVT-R091
// note: use intra offset as IntraBL does
if ( bSmoothedRef )
{
m_pcTransform ->setQp( *m_pcIntMbTempData, true );
}
else
{
m_pcTransform ->setQp( *m_pcIntMbTempData, rcMbDataAccess.getSH().isIntra() );
}
//--
//----- encode luminance signal -----
UInt uiExtCbp = 0;
UInt uiCoeffCost = 0;
UInt uiMbBits = 0;
UInt uiB8Thres = 4;
UInt uiMBThres = 5;
if( uiTrafo8x8 )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
xSetCoeffCost( 0 );
UInt uiBits = 0;
UInt uiCbp = 0;
RNOK( xEncode8x8InterBlock( *m_pcIntMbTempData, c8x8Idx, uiBits, uiCbp ) );
if( uiCbp )
{
//-- JVT-R091
// note: do not use coefficient skip as IntraBL does
if( !bSmoothedRef && xGetCoeffCost() <= uiB8Thres )
//--
{
m_pcIntMbTempData->loadLuma( m_pcIntMbTempData->getTempYuvMbBuffer(), c8x8Idx );
m_pcIntMbTempData->clearLumaLevels8x8Block( c8x8Idx );
}
else
{
uiCoeffCost += xGetCoeffCost();
uiExtCbp += uiCbp;
uiMbBits += uiBits;
}
}
}
}
else
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
xSetCoeffCost( 0 );
UInt uiBits = 0;
UInt uiCbp = 0;
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
RNOK( xEncode4x4InterBlock( *m_pcIntMbTempData, cIdx, uiBits, uiCbp ) );
}
if( uiCbp )
{
//-- JVT-R091
// note: do not use coefficient skip as IntraBL does
if( !bSmoothedRef && xGetCoeffCost() <= uiB8Thres )
//--
{
m_pcIntMbTempData->loadLuma( m_pcIntMbTempData->getTempYuvMbBuffer(), c8x8Idx );
m_pcIntMbTempData->clearLumaLevels8x8( c8x8Idx );
}
else
{
uiCoeffCost += xGetCoeffCost();
uiExtCbp += uiCbp;
uiMbBits += uiBits;
}
}
}
}
//-- JVT-R091
// note: do not use coefficient skip as IntraBL does
if( !bSmoothedRef && 0 != uiExtCbp && uiCoeffCost <= uiMBThres )
//--
{
m_pcIntMbTempData->loadLuma( m_pcIntMbTempData->getTempYuvMbBuffer() );
uiExtCbp = 0;
m_pcIntMbTempData->clearLumaLevels();
}
m_pcIntMbTempData->distY() = m_pcXDistortion->getLum16x16( m_pcIntMbTempData->getMbLumAddr(), m_pcIntMbTempData->getLStride() );
//----- encode chrominance signal -----
RNOK( xEncodeChromaTexture( *m_pcIntMbTempData, uiExtCbp, uiMbBits ) );
//----- set parameters ----
bCoded = ( uiExtCbp > 0 );
m_pcIntMbTempData->bits() = uiMbBits;
m_pcIntMbTempData->cbp() = xCalcMbCbp( uiExtCbp );
m_pcIntMbTempData->coeffCost() = uiCoeffCost;
Bool b8x8Trafo = ( uiTrafo8x8 && ( m_pcIntMbTempData->getMbCbp() & 0x0F ) );
m_pcIntMbTempData ->setTransformSize8x8( b8x8Trafo );
//----- fix QP ------
RNOK( m_pcRateDistortionIf->fixMacroblockQP( *m_pcIntMbTempData ) );
//--- set parameters ---
uiDist = m_pcIntMbTempData->distY ();
uiDist += m_pcXDistortion ->get8x8Cb ( m_pcIntMbTempData->getMbCbAddr (), m_pcIntMbTempData->getCStride() );
uiDist += m_pcXDistortion ->get8x8Cr ( m_pcIntMbTempData->getMbCrAddr (), m_pcIntMbTempData->getCStride() );
RNOK( BitCounter::init() );
RNOK( MbCoder::m_pcMbSymbolWriteIf->cbp( *m_pcIntMbTempData ) );
if( m_pcIntMbTempData->cbp() )
{
RNOK( MbCoder::m_pcMbSymbolWriteIf->deltaQp( *m_pcIntMbTempData ) );
}
uiRate = uiMbBits + BitCounter::getNumberOfWrittenBits();
Bool bPotentialBSkip = false;
if( rcMbDataAccess.getSH().getSliceType() == B_SLICE &&
rcMbDataAccess.getMbData().getMbMode() == MODE_SKIP &&
iCnt == 0 /* no residual prediction */ && uiExtCbp == 0 )
{
uiRate = ( rcMbDataAccess.getSH().getBaseLayerId() == MSYS_UINT_MAX ? 1 : 0 );
bPotentialBSkip = true;
}
dCost = (Double)uiDist + dLambda * (Double)uiRate;
if( dCost < dMinCost )
{
dMinCost = dCost;
rbCoded = bCoded;
//----- store parameters and reconstructed signal to Frame and MbDataAccess -----
m_pcIntPicBuffer ->loadBuffer ( m_pcIntMbTempData );
pcResidual->getFullPelYuvBuffer() ->loadBuffer ( m_pcIntMbTempData );
m_pcIntMbTempData ->copyResidualDataTo( rcMbDataAccess );
//----- set residual prediction flag -----
rcMbDataAccess.getMbData().setResidualPredFlag( iCnt > 0 ? true : ( bPotentialBSkip ? false : bDefaultResPredFlag ) );
//-- JVT-R091
if ( bSmoothedRef )
{
// update prediction signal
pcSRFrame->getFullPelYuvBuffer()->loadBuffer ( &cNewPrdMbBuffer );
// set flag
rcMbDataAccess.getMbData().setSmoothedRefFlag( true );
}
//--
}
m_pcIntMbTempData->uninit();
}
}
//-- JVT-R091
// restore original residual
m_pcIntOrgMbPelData->loadLuma ( cOrgMbBuffer );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -