📄 mbencoder.cpp
字号:
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( rcMbDataAccess.getSH().getPPS().getEntropyCodingModeFlag() &&
rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
ROF( pcBaseLayerResidual );
cBaseLayerBuffer.loadBuffer ( const_cast<IntFrame*>(pcBaseLayerResidual)->getFullPelYuvBuffer() );
bDefaultResPredFlag = cBaseLayerBuffer.isZero();
}
//===== residual prediction =====
if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
//--- subtract (upsampled) base layer residual from original macroblock data ---
ROF( pcBaseLayerResidual );
cBaseLayerBuffer .loadBuffer ( const_cast<IntFrame*>(pcBaseLayerResidual)->getFullPelYuvBuffer() );
if( ! cBaseLayerBuffer.isZero() ) // HS: search only with residual prediction, when residual signal is non-zero
{
m_pcIntOrgMbPelData->subtract ( cBaseLayerBuffer );
if( ! pcMbDataAccessBase->getMbData().isIntra() && bBLSkipEnable) // JVT-Q065 EIDR
{
//--- only if base layer is in intra mode ---
// TMM_ESS
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() )
RNOK( xEstimateMbBLSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcBaseLayerFrame, bBSlice, iSpatialScalabilityType, pcMbDataAccessBase, true ) );
//-- JVT-R091
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() && rcMbDataAccess.isConstrainedInterLayerPred( ) )
RNOK( xEstimateMbSR ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcBaseLayerResidual, pcMbDataAccessBase, true ) );
//--
}
if( rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
//S051{
if(m_bUseBDir)
//S051}
RNOK( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb16x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, true ) );
RNOK( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, true ) );
}
//--- recover original macroblock data ---
m_pcIntOrgMbPelData->add ( cBaseLayerBuffer );
}
}
//===== intra base layer mode =====
if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
if( pcMbDataAccessBase->getMbData().isIntra() || !rcMbDataAccess.isConstrainedInterLayerPred( ) )
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() ) // TMM_ESS
RNOK ( xEstimateMbIntraBL ( m_pcIntMbTempData, m_pcIntMbBestData, pcBaseLayerFrame, bBSlice, pcMbDataAccessBase ) );
}
//===== without residual prediction =====
if( rcMbDataAccess.getSH().getBaseLayerId () == MSYS_UINT_MAX ||
rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
if( ( pcMbDataAccessBase && pcMbDataAccessBase->getMbData().isIntra() ) || rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
// TMM_ESS
if ( pcMbDataAccessBase->getMbData().getInCropWindowFlag() && bBLSkipEnable) // JVT-Q065 EIDR
RNOK( xEstimateMbBLSkip ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcBaseLayerFrame, bBSlice, iSpatialScalabilityType, pcMbDataAccessBase, bDefaultResPredFlag ) );
}
{
//S051{
if(m_bUseBDir)
//S051}
RNOK ( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcMbDataAccessBase, bDefaultResPredFlag ) );
RNOK ( xEstimateMbDirect ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, pcMbDataAccessBase, false ) ); // skip mode
RNOK ( xEstimateMb16x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, bDefaultResPredFlag ) );
RNOK ( xEstimateMb16x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, bDefaultResPredFlag ) );
RNOK ( xEstimateMb8x16 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, bDefaultResPredFlag ) );
RNOK ( xEstimateMb8x8 ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, bDefaultResPredFlag ) );
RNOK ( xEstimateMb8x8Frext ( m_pcIntMbTempData, m_pcIntMbBestData, rcRefFrameList0, rcRefFrameList1, bBiPredOnly, uiNumMaxIter, uiIterSearchRange, false, pcMbDataAccessBase, bDefaultResPredFlag ) );
}
}
//===== normal intra mode =====
if( rcMbDataAccess.getSH().getBaseLayerId () == MSYS_UINT_MAX ||
rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
RNOK ( xEstimateMbIntra16 ( m_pcIntMbTempData, m_pcIntMbBestData, bBSlice ) );
RNOK ( xEstimateMbIntra8 ( m_pcIntMbTempData, m_pcIntMbBestData, bBSlice ) );
RNOK ( xEstimateMbIntra4 ( m_pcIntMbTempData, m_pcIntMbBestData, bBSlice ) );
RNOK ( xEstimateMbPCM ( m_pcIntMbTempData, m_pcIntMbBestData, bBSlice ) );
}
xStoreEstimation( rcMbDataAccess, *m_pcIntMbBestData, NULL, NULL, true, &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.,(double)(m_uiLayerID+1));
}
else
{
p=100-m_auiPLR[m_uiLayerID];
}
if(mode==INTRA_BL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -