📄 sliceencoder.cpp
字号:
if( pcBaseLayerFrame ) RNOK( pcBaseLayerFrame ->removeFieldBuffer( ePicType ) );
if( pcBaseLayerResidual ) RNOK( pcBaseLayerResidual->removeFieldBuffer( ePicType ) );
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
ErrVal SliceEncoder::encodeIntraPicture( UInt& ruiBits,
ControlData& rcControlData,
IntFrame* pcFrame,
IntFrame* pcRecSubband,
IntFrame* pcBaseLayer,
IntFrame* pcPredSignal,
UInt uiMbInRow,
Double dLambda,
PicType ePicType )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ( ePicType );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
Int iSpatialScalabilityType = rcControlData.getSpatialScalabilityType(); // TMM_ESS
//====== initialization ======
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
RNOK( m_pcControlMng ->initSliceForCoding( rcSliceHeader ) );
//====== initialization ======
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice ();
UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice ();
UInt uiBits = m_pcMbCoder ->getBitCount ();
if(uiMbAddress == -1) return Err::m_nOK;
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->addFieldBuffer( ePicType ) );
if( pcRecSubband ) RNOK( pcRecSubband->addFieldBuffer( ePicType ) );
if( pcBaseLayer ) RNOK( pcBaseLayer ->addFieldBuffer( ePicType ) );
if( pcPredSignal ) RNOK( pcPredSignal->addFieldBuffer( ePicType ) );
}
//===== loop over macroblocks =====
for( ; uiMbAddress <= uiLastMbAddress; ) //--ICU/ETRI FMO Implementation
{
ETRACE_NEWMB( uiMbAddress );
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
Double dCost = 0;
rcSliceHeader.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddress );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, false, false ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
//JVT-U106 Behaviour at slice boundaries{
if( rcSliceHeader.getBaseLayerId() != MSYS_UINT_MAX )
m_pcMbEncoder->setIntraBLFlag(m_pbIntraBLFlag[uiMbAddress]);
//JVT-U106 Behaviour at slice boundaries}
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess,
pcMbDataAccessBase,
pcFrame ->getPic( ePicType ),
pcFrame ->getPic( ePicType ),
pcRecSubband ->getPic( ePicType ),
pcBaseLayer ? pcBaseLayer ->getPic( ePicType ) : NULL,
pcPredSignal ->getPic( ePicType ),
dLambda,
dCost) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
( uiMbAddress == uiLastMbAddress ), true ) );
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
}
if( ePicType!=FRAME )
{
if( pcFrame ) RNOK( pcFrame ->removeFieldBuffer( ePicType ) );
if( pcRecSubband ) RNOK( pcRecSubband->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::encodeIntraPictureMbAff( UInt& ruiBits,
ControlData& rcControlData,
IntFrame* pcOrgFrame,
IntFrame* pcFrame,
IntFrame* pcRecSubband,
IntFrame* pcBaseLayer,
IntFrame* pcPredSignal,
UInt uiMbInRow,
Double dLambda )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ( FRAME );
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
MbDataCtrl* pcBaseLayerCtrlField = rcControlData.getBaseLayerCtrlField ();
Int iSpatialScalabilityType = rcControlData.getSpatialScalabilityType();
//====== initialization ======
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, NULL ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
if( pcBaseLayerCtrlField )
{
RNOK( pcBaseLayerCtrlField ->initSlice ( rcSliceHeader, PRE_PROCESS, false, NULL ) );
}
RNOK( m_pcControlMng ->initSliceForCoding( rcSliceHeader ) );
UInt uiBits = m_pcMbCoder ->getBitCount();
IntFrame* apcOrgFrame [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcFrame [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcRecSubband[4] = { NULL, NULL, NULL, NULL };
IntFrame* apcBaseLayer [4] = { NULL, NULL, NULL, NULL };
IntFrame* apcPredSignal[4] = { NULL, NULL, NULL, NULL };
RNOK( gSetFrameFieldArrays( apcOrgFrame, pcOrgFrame ) );
RNOK( gSetFrameFieldArrays( apcFrame, pcFrame ) );
RNOK( gSetFrameFieldArrays( apcRecSubband, pcRecSubband ) );
RNOK( gSetFrameFieldArrays( apcBaseLayer, pcBaseLayer ) );
RNOK( gSetFrameFieldArrays( apcPredSignal, pcPredSignal ) );
IntYuvMbBuffer acIntYuvMbBufferPredSignal[2];
IntYuvMbBuffer acIntYuvMbBufferRecSubBand[2];
IntYuvMbBuffer acIntYuvMbBufferFrame [2];
UInt uiLastQp = rcSliceHeader.getPicQp();
//===== loop over macroblocks =====
UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice ();
const UInt uiLastMbAddress = rcSliceHeader.getLastMbInSlice ();
for( ; uiMbAddress<= uiLastMbAddress; uiMbAddress+=2 )
{
MbDataBuffer acMbData[2];
Double adCost[2] = {0,0};
IntYuvMbBuffer cTempBuffer;
UInt auiLastQpTest[2] = {uiLastQp, uiLastQp};
Int eP;
for( eP = 0; eP < 4; eP++ )
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
Double dCost = 0;
UInt uiMbY, uiMbX;
const Bool bField = (eP < 2);
const UInt uiMbAddressMbAff = uiMbAddress+(eP%2);
rcSliceHeader.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddressMbAff );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if (eP < 2 && pcBaseLayerCtrlField) // field case
{
RNOK( pcBaseLayerCtrlField ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
else if (eP >= 2 && pcBaseLayerCtrl ) //frame case
{
RNOK( pcBaseLayerCtrl ->initMb( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, true, bField ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
pcMbDataAccess->setLastQp( auiLastQpTest[bField] );
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess,
pcMbDataAccessBase,
apcOrgFrame [eP],
apcFrame [eP],
apcRecSubband[eP],
apcBaseLayer [eP],
apcPredSignal[eP],
dLambda,
dCost ) );
auiLastQpTest[bField] = pcMbDataAccess->getMbData().getQp();
adCost [eP>>1] += dCost;
if( bField )
{
acMbData[eP].copy( pcMbDataAccess->getMbData() );
acIntYuvMbBufferPredSignal[eP].loadBuffer( apcPredSignal[eP]->getFullPelYuvBuffer() );
acIntYuvMbBufferRecSubBand[eP].loadBuffer( apcRecSubband[eP]->getFullPelYuvBuffer() );
acIntYuvMbBufferFrame [eP].loadBuffer( apcFrame [eP]->getFullPelYuvBuffer() );
}
}
const Bool bFieldMode = ( adCost[0] < adCost[1] );
#ifdef RANDOM_MBAFF
bFieldMode = gBoolRandom();
#endif
// coding part
for( eP = 0; eP < 2; eP++ )
{
MbDataAccess* pcMbDataAccess = NULL;
MbDataAccess* pcMbDataAccessBase = NULL;
UInt uiMbY, uiMbX;
const UInt uiMbAddressMbAff = uiMbAddress+eP;
ETRACE_NEWMB( uiMbAddressMbAff );
rcSliceHeader.getMbPositionFromAddress ( uiMbY, uiMbX, uiMbAddressMbAff );
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if( bFieldMode && pcBaseLayerCtrlField )
{
RNOK( pcBaseLayerCtrlField ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
else if( !bFieldMode && pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, true, bFieldMode ) );
if( bFieldMode )
{
pcMbDataAccess->getMbData().copy( acMbData[eP] );
apcRecSubband [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferRecSubBand[eP] );
apcPredSignal [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferPredSignal[eP] );
apcFrame [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferFrame [eP] );
}
pcMbDataAccess->setLastQp( uiLastQp );
uiLastQp = pcMbDataAccess->getMbData().getQp();
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
( uiMbAddressMbAff == uiLastMbAddress ),
(eP == 1) ) );
}
}
ruiBits += m_pcMbCoder ->getBitCount() - uiBits;
return Err::m_nOK;
}
// TMM_INTERLACE}
ErrVal SliceEncoder::encodeHighPassPicture( 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,
UInt uiMbInRow,
Double dLambda,
Int iMaxDeltaQp,
Int iSpatialScalabilityType,
PicType ePicType )
{
ROF( m_bInitDone );
RNOK( pcMbDataCtrl ->initSlice ( rcSH, PRE_PROCESS, false, NULL ) );
RNOK( m_pcControlMng->initSliceForCoding( rcSH ) );
//====== initialization ======
UInt uiMbAddress = rcSH.getFirstMbInSlice();
UInt uiLastMbAddress = rcSH.getLastMbInSlice ();
UInt uiBits = m_pcMbCoder->getBitCount();
Int iQPRes = rcSH.getPicQp();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -