mbencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,628 行 · 第 1/5 页
CPP
1,628 行
}
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 );
m_pcIntOrgMbPelData->loadChroma ( cOrgMbBuffer );
//--
}
return Err::m_nOK;
}
ErrVal
MbEncoder::encodeResidual( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBL,
IntFrame* pcResidual,
Double dLambda,
Bool bLowPass,
Int iMaxQpDelta )
{
ROF( bInitDone );
m_pcIntPicBuffer = pcResidual->getFullPelYuvBuffer();
Bool bIntra16x16 = rcMbDataAccessBL.getMbData().isIntra16x16 ();
Bool bIntra8x8 = rcMbDataAccessBL.getMbData().isIntra4x4 () && rcMbDataAccessBL.getMbData().isTransformSize8x8();
Bool bIntra4x4 = rcMbDataAccessBL.getMbData().isIntra4x4 () && !rcMbDataAccessBL.getMbData().isTransformSize8x8();
Bool bIntra = ( bIntra16x16 || bIntra8x8 || bIntra4x4 );
Bool bInter = ! bIntra;
Bool b8x8Ok = rcMbDataAccessBL.getSH().getPPS().getTransform8x8ModeFlag() && ( bInter ? rcMbDataAccess.getMbData().is8x8TrafoFlagPresent() : rcMbDataAccessBL.getMbData().is8x8TrafoFlagPresent() );
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 ) );
UInt uiMinTrafo = ( bIntra8x8 ? 1 : 0 );
UInt uiMaxTrafo = ( bIntra8x8 || (bInter && b8x8Ok) ? 2 : 1 );
Double dMinCost = 1e30;
UInt uiDist, uiRate;
Double dCost;
m_pcXDistortion->loadOrgMbPelData( m_pcIntPicBuffer, m_pcIntOrgMbPelData );
for( UChar ucQp = ucMinQp; ucQp <= ucMaxQp; ucQp++ )
{
for( UInt uiTrafo8x8 = uiMinTrafo; uiTrafo8x8 < uiMaxTrafo; uiTrafo8x8++ )
{
m_pcIntMbTempData ->init( rcMbDataAccess );
m_pcIntMbTempData ->setAllSamplesToZero();
m_pcIntMbTempData ->getTempYuvMbBuffer().loadLuma( *m_pcIntMbTempData );
m_pcIntMbTempData ->setQp( ucQp );
m_pcTransform ->setQp( *m_pcIntMbTempData, bLowPass || bIntra );
//----- encode luminance signal -----
UInt uiExtCbp = 0;
UInt uiCoeffCost = 0;
UInt uiMbBits = 0;
UInt uiB8Thres = 4;
UInt uiMBThres = 5;
if( uiTrafo8x8 == 2 )
{
AF();
//===== 16x16 trafo =====
RNOK( xEncode16x16ResidualMB( *m_pcIntMbTempData, uiMbBits, uiExtCbp ) );
uiCoeffCost = 1000;
}
else 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 )
{
if( xGetCoeffCost() <= uiB8Thres && ! rcMbDataAccess.getSH().isIntra() && ! bLowPass && ! bIntra )
{
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 )
{
if( xGetCoeffCost() <= uiB8Thres && ! rcMbDataAccess.getSH().isIntra() && ! bLowPass && ! bIntra )
{
m_pcIntMbTempData->loadLuma( m_pcIntMbTempData->getTempYuvMbBuffer(), c8x8Idx );
m_pcIntMbTempData->clearLumaLevels8x8( c8x8Idx );
}
else
{
uiCoeffCost += xGetCoeffCost();
uiExtCbp += uiCbp;
uiMbBits += uiBits;
}
}
}
}
if( 0 != uiExtCbp && uiCoeffCost <= uiMBThres && ! rcMbDataAccess.getSH().isIntra() && ! bLowPass && ! bIntra )
{
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 ----
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();
dCost = (Double)uiDist + dLambda * (Double)uiRate;
if( dCost < dMinCost )
{
dMinCost = dCost;
//----- store parameters to MbDataAccess -----
m_pcIntMbTempData->copyResidualDataTo( rcMbDataAccess );
}
m_pcIntMbTempData->uninit();
}
}
return Err::m_nOK;
}
ErrVal
MbEncoder::estimatePrediction( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
Int iSpatialScalabilityType,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
const IntFrame* pcBaseLayerFrame,
const IntFrame* pcBaseLayerResidual,
const IntFrame& rcOrigFrame,
IntFrame& rcIntraRecFrame,
Bool bBiPredOnly,
UInt uiNumMaxIter,
UInt uiIterSearchRange,
Bool bBLSkipEnable, // JVT-Q065 EIDR
Double dLambda )
{
ROF( bInitDone );
Bool bBSlice = rcMbDataAccess.getSH().getSliceType () == B_SLICE;
UInt uiQp = rcMbDataAccess.getSH().getPicQp ();
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 = rcIntraRecFrame.getFullPelYuvBuffer();
IntYuvPicBuffer* pcOrgPicBuffer = const_cast<IntFrame&>( rcOrigFrame ).getFullPelYuvBuffer();
m_pcXDistortion->loadOrgMbPelData ( pcOrgPicBuffer, m_pcIntOrgMbPelData );
m_pcTransform ->setQp ( rcMbDataAccess, false );
IntYuvMbBuffer cBaseLayerBuffer;
Bool bDefaultResPredFlag = false;
#if INDEPENDENT_PARSING
if( rcMbDataAccess.getSH().getSPS().getIndependentParsing() &&
rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseLayerResidual );
cBaseLayerBuffer.loadBuffer ( const_cast<IntFrame*>(pcBaseLayerResidual)->getFullPelYuvBuffer() );
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?