mbencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,628 行 · 第 1/5 页
CPP
1,628 行
if (m_pcIntMbBestData->getMbMode() == MODE_16x16 && cCurrentMv == cMvPredL0 )
{
RNOK ( xEstimateMbSkip ( m_pcIntMbTempData, m_pcIntMbBestData, *pcRefFrameList0Base, cRefFrameList1 ) );
}
}
m_pcTransform->setClipMode( true );
//==== normal intra modes =====
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++)
{
p=p*(100-m_auiPLR[m_uiLayerID]);
}
q=(UInt)pow(100,(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}
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 INDEPENDENT_PARSING
if( rcMbDataAccess.getSH().getSPS().getIndependentParsing() &&
rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseSubband );
IntYuvMbBuffer cBaseLayerBuffer;
cBaseLayerBuffer.loadBuffer( const_cast<IntFrame*>(pcBaseSubband)->getFullPelYuvBuffer() );
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
#endif
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 ) );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?