📄 sliceencoder.cpp
字号:
Int iQPIntra = rcSH.getPicQp(); //- 2;
IntYuvMbBuffer cZeroBuffer;
cZeroBuffer.setAllSamplesToZero();
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->addFieldBuffer( ePicType ) );
if( pcResidual ) RNOK( pcResidual ->addFieldBuffer( ePicType ) );
if( pcBaseSubband ) RNOK( pcBaseSubband->addFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer ->addFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal ->addFieldBuffer( ePicType ) );
}
//===== loop over macroblocks =====
for( ruiMbCoded = 0; uiMbAddress <= uiLastMbAddress; ) //--ICU/ETRI FMO Implementation
{
ETRACE_NEWMB( uiMbAddress );
MbDataAccess* pcMbDataAccess = NULL;
Bool bCoded;
UInt uiMbY, uiMbX;
rcSH.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, false, false ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
MbDataAccess* pcMbDataAccessBase = 0;
if( pcMbDataCtrlBaseMotion)
{
RNOK( pcMbDataCtrlBaseMotion->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
if( pcMbDataAccess->getMbData().isIntra() )
{
Double dCost = 0;
//JVT-U106 Behaviour at slice boundaries{
if( rcSH.getBaseLayerId() != MSYS_UINT_MAX )
m_pcMbEncoder->setIntraBLFlag(m_pbIntraBLFlag[uiMbAddress]);
//JVT-U106 Behaviour at slice boundaries}
pcMbDataAccess->getMbData().setQp( iQPIntra );
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess,
pcMbDataAccessBase,
pcFrame ->getPic( ePicType ),
pcFrame ->getPic( ePicType ),
pcResidual ->getPic( ePicType ),
pcBaseLayer ? pcBaseLayer->getPic( ePicType ) : NULL,
pcPredSignal ->getPic( ePicType ),
dLambda,
dCost ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
(uiMbAddress == uiLastMbAddress ),
true ) );
//-- JVT-R091
// update with best data (intra)
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( m_pcMbEncoder->getBestIntData() );
//--
ruiMbCoded++;
}
else
{
pcMbDataAccess->getMbData().setQp( iQPRes );
m_pcTransform->setClipMode( false );
RNOK( m_pcMbEncoder ->encodeResidual ( *pcMbDataAccess,
pcOrgFrame->getPic( ePicType ),
pcFrame ->getPic( ePicType ),
pcResidual->getPic( ePicType ),
pcBaseSubband ? pcBaseSubband->getPic( ePicType ) : NULL,
pcSRFrame, // JVT-R091
bCoded,
dLambda,
iMaxDeltaQp ) );
if( pcMbDataAccess->getSH().getBaseLayerId() != MSYS_UINT_MAX && ! pcMbDataAccess->getSH().getAdaptivePredictionFlag() )
{
ROF( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) );
pcMbDataAccess->getMbData().setBLSkipFlag( true );
}
m_pcTransform->setClipMode( true );
RNOK( m_pcMbCoder->encode( *pcMbDataAccess, pcMbDataAccessBase, iSpatialScalabilityType, (uiMbAddress == uiLastMbAddress ), true ) );
if( bCoded )
{
ruiMbCoded++;
}
if( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) && !rcSH.getAVCRewriteFlag() )
{
pcMbDataAccess->getMbData().setMbExtCbp( pcMbDataAccess->getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
}
//-- JVT-R091
// update with best-data (inter)
IntYuvMbBuffer cPredBuffer, cResBuffer;
cPredBuffer.loadBuffer ( ((IntFrame*)pcSRFrame )->getFullPelYuvBuffer() );
cResBuffer. loadBuffer ( ((IntFrame*)pcResidual )->getFullPelYuvBuffer() );
cPredBuffer.add( cResBuffer );
cPredBuffer.clip ();
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPredBuffer );
//--
RNOK( pcPredSignal->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
}
uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress);
}
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->removeFieldBuffer( ePicType ) );
if( pcResidual ) RNOK( pcResidual ->removeFieldBuffer( ePicType ) );
if( pcBaseSubband ) RNOK( pcBaseSubband->removeFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer ->removeFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal ->removeFieldBuffer( ePicType ) );
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
// TMM_INTERLACE{
ErrVal SliceEncoder::encodeHighPassPictureMbAff( UInt& ruiMbCoded,
UInt& ruiBits,
SliceHeader& rcSH,
IntFrame* pcOrgFrame,
IntFrame* pcFrame,
IntFrame* pcResidual,
IntFrame* pcPredSignal,
IntFrame* pcSRFrame, // JVT-R091
IntFrame* pcBaseSubband,
IntFrame* pcBaseLayer,
MbDataCtrl* pcMbDataCtrl,
MbDataCtrl* pcMbDataCtrlBaseMotion,
MbDataCtrl* pcMbDataCtrlInterlBaseMotion,
UInt uiMbInRow,
Double dLambda,
Int iMaxDeltaQp,
Int iSpatialScalabilityType )
{
ROF( m_bInitDone );
//====== initialization ======
RNOK( pcMbDataCtrl ->initSlice ( rcSH, PRE_PROCESS, false, NULL ) );
RNOK( m_pcControlMng->initSliceForCoding( rcSH ) );
UInt uiBits = m_pcMbCoder->getBitCount();
Int iQPRes = rcSH.getPicQp ();
Int iQPIntra = rcSH.getPicQp (); //- 2;
IntYuvMbBuffer cZeroBuffer;
cZeroBuffer.setAllSamplesToZero();
IntFrame* apcFrame [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcOrgFrame [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcResidual [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcPredSignal [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcBaseSubband[4] = { NULL, NULL, NULL, NULL };
IntFrame* apcBaseLayer [4] = { NULL, NULL, NULL, NULL };
RNOK( gSetFrameFieldArrays( apcFrame, pcFrame ) );
RNOK( gSetFrameFieldArrays( apcOrgFrame, pcOrgFrame ) );
RNOK( gSetFrameFieldArrays( apcResidual, pcResidual ) );
RNOK( gSetFrameFieldArrays( apcPredSignal, pcPredSignal ) );
RNOK( gSetFrameFieldArrays( apcBaseSubband, pcBaseSubband ) );
RNOK( gSetFrameFieldArrays( apcBaseLayer, pcBaseLayer ) );
//===== loop over macroblocks =====
UInt uiMbAddress = rcSH.getFirstMbInSlice();
const UInt uiLastMbAddress = rcSH.getLastMbInSlice ();
for( ; uiMbAddress <= uiLastMbAddress; uiMbAddress+=2 )
{
for( Int eP = 0; eP < 2; eP++ )
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
const UInt uiMbAddressMbAff = uiMbAddress+eP;
Bool bCoded;
ETRACE_NEWMB( uiMbAddressMbAff );
rcSH.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddressMbAff );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
const Bool bField = pcMbDataAccess->getMbData().getFieldFlag();
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, true, bField ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
if( bField && pcMbDataCtrlInterlBaseMotion) // field case
{
RNOK( pcMbDataCtrlInterlBaseMotion -> initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
else if( !bField && pcMbDataCtrlBaseMotion) // frame case
{
RNOK( pcMbDataCtrlBaseMotion -> initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
const PicType eMbPicType = pcMbDataAccess->getMbPicType();
const UInt uiLI = eMbPicType - 1;
if( pcMbDataAccess->getMbData().isIntra() )
{
Double dCost = 0;
pcMbDataAccess->getMbData().setQp( iQPIntra );
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
RNOK( m_pcMbEncoder ->encodeIntra( *pcMbDataAccess,
pcMbDataAccessBase,
apcFrame [uiLI],
apcFrame [uiLI],
apcResidual [uiLI],
apcBaseLayer [uiLI],
apcPredSignal[uiLI],
dLambda,
dCost ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
(uiMbAddressMbAff == uiLastMbAddress ),
(eP == 1) ) );
//-- JVT-R091
// update with best data (intra)
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( m_pcMbEncoder->getBestIntData() );
//--
ruiMbCoded++;
}
else
{
pcMbDataAccess->getMbData().setQp( iQPRes );
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
m_pcTransform->setClipMode( false );
RNOK( m_pcMbEncoder ->encodeResidual ( *pcMbDataAccess,
apcOrgFrame [uiLI],
apcFrame [uiLI],
apcResidual [uiLI],
apcBaseSubband[uiLI],
pcSRFrame, // JVT-R091,
bCoded,
dLambda,
iMaxDeltaQp ) );
if( pcMbDataAccess->getSH().getBaseLayerId() != MSYS_UINT_MAX && ! pcMbDataAccess->getSH().getAdaptivePredictionFlag() )
{
ROF( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) );
pcMbDataAccess->getMbData().setBLSkipFlag( true );
}
m_pcTransform->setClipMode( true );
RNOK( m_pcMbCoder->encode( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
(uiMbAddressMbAff == uiLastMbAddress ),
(eP == 1) ) );
if( bCoded )
{
ruiMbCoded++;
}
if( pcMbDataAccess->getMbData().getResidualPredFlag( PART_16x16 ) )
{
pcMbDataAccess->getMbData().setMbExtCbp( pcMbDataAccess->getMbData().getMbExtCbp() | pcMbDataAccessBase->getMbData().getMbExtCbp() );
}
//-- JVT-R091
// update with best-data (inter)
IntYuvMbBuffer cPredBuffer, cResBuffer;
cPredBuffer.loadBuffer ( ((IntFrame*)pcSRFrame )->getFullPelYuvBuffer() );
cResBuffer. loadBuffer ( ((IntFrame*)pcResidual )->getFullPelYuvBuffer() );
cPredBuffer.add ( cResBuffer );
cPredBuffer.clip ();
pcSRFrame->getFullPelYuvBuffer()->loadBuffer( &cPredBuffer );
//--
RNOK( apcPredSignal[uiLI]->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
}
}
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
// TMM_INTERLACE}
// TMM_INTERLACE{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -