📄 sliceencoder.cpp
字号:
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] );
if( apcRecSubband [eP] ) apcRecSubband [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferRecSubBand[eP] );
if( apcPredSignal [eP] ) apcPredSignal [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferPredSignal[eP] );
if( apcFrame [eP] ) apcFrame [eP]->getFullPelYuvBuffer()->loadBuffer( &acIntYuvMbBufferFrame [eP] );
}
pcMbDataAccess->setLastQp( uiLastQp );
uiLastQp = pcMbDataAccess->getMbData().getQp();
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
(uiMbAddressMbAff == uiLastMbAddress), (eP == 1) ) );
}
}
ruiBits += m_pcMbCoder ->getBitCount() - uiBits;
return Err::m_nOK;
}
// TMM_INTERLACE}
ErrVal
SliceEncoder::encodeSlice( SliceHeader& rcSliceHeader,
Frame* pcFrame,
MbDataCtrl* pcMbDataCtrl,
RefFrameList& rcList0,
RefFrameList& rcList1,
UInt uiMbInRow,
Double dlambda )
{
ROF( pcFrame );
ROF( pcMbDataCtrl );
//===== get co-located picture =====
MbDataCtrl* pcMbDataCtrlL1 = NULL;
if( rcList1.getActive() && rcList1.getEntry( 0 )->getRecPicBufUnit() )
{
pcMbDataCtrlL1 = rcList1.getEntry( 0 )->getRecPicBufUnit()->getMbDataCtrl();
}
ROT( rcSliceHeader.isBSlice() && ! pcMbDataCtrlL1 );
//===== initialization =====
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
RNOK( m_pcControlMng->initSliceForCoding( rcSliceHeader ) );
//===== loop over macroblocks =====
for( UInt uiMbAddress = rcSliceHeader.getFirstMbInSlice(); uiMbAddress <= rcSliceHeader.getLastMbInSlice(); uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr( uiMbAddress ) )
{
ETRACE_NEWMB( uiMbAddress );
UInt uiMbY = uiMbAddress / uiMbInRow;
UInt uiMbX = uiMbAddress % uiMbInRow;
MbDataAccess* pcMbDataAccess = 0;
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcControlMng->initMbForCoding ( *pcMbDataAccess, uiMbY, uiMbX, false, false ) );
pcMbDataAccess->setMbDataAccessBase ( NULL );
RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
pcFrame,
rcList0,
rcList1,
m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),
dlambda ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
NULL,
( uiMbAddress == rcSliceHeader.getLastMbInSlice() )
,true ) );
}
return Err::m_nOK;
}
//TMM_WP
ErrVal SliceEncoder::xInitDefaultWeights(Double *pdWeights, UInt uiLumaWeightDenom,
UInt uiChromaWeightDenom)
{
const Int iLumaWeight = 1 << uiLumaWeightDenom;
const Int iChromaWeight = 1 << uiChromaWeightDenom;
pdWeights[0] = iLumaWeight;
pdWeights[1] = pdWeights[2] = iChromaWeight;
return Err::m_nOK;
}
ErrVal SliceEncoder::xSetPredWeights( SliceHeader& rcSH,
Frame* pOrgFrame,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1)
{
ROTRS( rcSH.isIntraSlice(), Err::m_nOK );
const SampleWeightingParams& rcSWP = m_pcCodingParameter->getSampleWeightingParams(rcSH.getDependencyId());
{ // determine denoms
const UInt uiLumaDenom = rcSWP.getLumaDenom();
rcSH.setLumaLog2WeightDenom ( ( uiLumaDenom == MSYS_UINT_MAX ) ? gIntRandom(0,7) : uiLumaDenom );
const UInt uiChromaDenom = rcSWP.getChromaDenom();
rcSH.setChromaLog2WeightDenom( ( uiChromaDenom == MSYS_UINT_MAX ) ? gIntRandom(0,7) : uiChromaDenom );
}
const Int iChromaScale = 1<<rcSH.getChromaLog2WeightDenom();
const Int iLumaScale = 1<<rcSH.getLumaLog2WeightDenom();
m_pcControlMng->initSliceForWeighting(rcSH);
if( rcSH.isBSlice() )
{
ROTRS( 1 != rcSH.getPPS().getWeightedBiPredIdc(), Err::m_nOK );
}
else
{
ROTRS( ! rcSH.getPPS().getWeightedPredFlag(), Err::m_nOK );
}
if( rcSH.isBSlice() )
{
RNOK( rcSH.getPredWeightTable(LIST_1).initDefaults( rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom() ) );
}
RNOK( rcSH.getPredWeightTable(LIST_0).initDefaults( rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom() ) );
Double afFwWeight[MAX_REF_FRAMES][3];
Double afBwWeight[MAX_REF_FRAMES][3];
Double afFwOffsets[MAX_REF_FRAMES][3];
Double afBwOffsets[MAX_REF_FRAMES][3];
/* init arrays with default weights */
for (UInt x = 0; x < MAX_REF_FRAMES; x++)
{
xInitDefaultWeights(afFwWeight[x], rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom());
xInitDefaultWeights(afBwWeight[x], rcSH.getLumaLog2WeightDenom(), rcSH.getChromaLog2WeightDenom());
afFwOffsets[x][0] = afFwOffsets[x][1] = afFwOffsets[x][2] = 0;
afBwOffsets[x][0] = afBwOffsets[x][1] = afBwOffsets[x][2] = 0;
}
if( rcSH.isBSlice() )
{
RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_1, afBwWeight,
pOrgFrame, rcRefFrameList1 ) );
RNOK( rcSH.getPredWeightTable( LIST_1).setWeights( afBwWeight, iLumaScale, iChromaScale ) );
}
RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_0, afFwWeight, pOrgFrame, rcRefFrameList0 ) );
RNOK( rcSH.getPredWeightTable( LIST_0).setWeights( afFwWeight, iLumaScale, iChromaScale ) );
return Err::m_nOK;
}
//TMM_WP
ErrVal
SliceEncoder::updatePictureResTransform( ControlData& rcControlData,
UInt uiMbInRow )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ();
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
UInt uiMbAddress = 0;
UInt uiLastMbAddress = rcSliceHeader.getMbInPic() - 1;
//====== initialization ======
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );
// Update the macroblock state
// Must be done after the bit-stream has been constructed
for( ; uiMbAddress <= uiLastMbAddress; )
{
UInt uiMbY = uiMbAddress / uiMbInRow;
UInt uiMbX = uiMbAddress % uiMbInRow;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
}
// modify QP values (as specified in G.8.1.5.1.2)
if( pcMbDataAccess->getMbData().getMbCbp() == 0 && ( pcMbDataAccess->getMbData().getMbMode() == INTRA_BL || pcMbDataAccess->getMbData().getResidualPredFlag() ) )
{
pcMbDataAccess->getMbData().setQp ( pcMbDataAccessBase->getMbData().getQp() );
pcMbDataAccess->getMbData().setQp4LF( pcMbDataAccessBase->getMbData().getQp() );
}
// if cbp==0, tranform size is not transmitted, in this case inherit the transform size from base layer
if( pcMbDataAccess->isSCoeffPred() || ( pcMbDataAccess->getMbData().isIntraBL() && pcMbDataAccessBase->getMbData().isIntraButnotIBL() ) )
{
if( !( pcMbDataAccess->getMbData().getMbCbp() & 0x0F ) )
pcMbDataAccess->getMbData().setTransformSize8x8( pcMbDataAccessBase->getMbData().isTransformSize8x8() );
}
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
}
return Err::m_nOK;
}
ErrVal
SliceEncoder::updateBaseLayerResidual( ControlData& rcControlData,
UInt uiMbInRow )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader ();
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl ();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl ();
Frame* pcBaseLayerSbb = rcControlData.getBaseLayerSbb ();
UInt uiMbAddress = 0;
UInt uiLastMbAddress = rcSliceHeader.getMbInPic() - 1;
//====== initialization ======
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );
for( ; uiMbAddress <= uiLastMbAddress; )
{
UInt uiMbY = uiMbAddress / uiMbInRow;
UInt uiMbX = uiMbAddress % uiMbInRow;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
if( pcBaseLayerCtrl )
{
RNOK( pcBaseLayerCtrl ->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
//pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
}
// Update the state of the baselayer residual data -- it may be reused in subsequent layers - ASEGALL@SHARPLABS.COM
if( !pcMbDataAccess->getMbData().getResidualPredFlag() )
{
if( pcBaseLayerSbb && ( pcMbDataAccess->getMbData().isIntra() || ! pcMbDataAccess->getMbData().getResidualPredFlag() ) )
{
YuvPicBuffer* pcBaseResidual = pcBaseLayerSbb->getFullPelYuvBuffer();
pcBaseResidual->getBufferCtrl().initMb( uiMbY, uiMbX, false);
pcBaseResidual->clearCurrMb();
}
}
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
}
return Err::m_nOK;
}
// JVT-V035
ErrVal
SliceEncoder::updatePictureAVCRewrite( ControlData& rcControlData, UInt uiMbInRow )
{
ROF( m_bInitDone );
SliceHeader& rcSliceHeader = *rcControlData.getSliceHeader();
FMO& rcFMO = *rcSliceHeader.getFMO();
MbDataCtrl* pcMbDataCtrl = rcControlData.getMbDataCtrl();
MbDataCtrl* pcBaseLayerCtrl = rcControlData.getBaseLayerCtrl();
//====== initialization ======
RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );
if( rcSliceHeader.getTCoeffLevelPredictionFlag() == true )
{
// Update the macroblock state
// Must be done after the bit-stream has been constructed
for( Int iSliceGroupId = 0; ! rcFMO.SliceGroupCompletelyCoded( iSliceGroupId ); iSliceGroupId++ )
{
UInt uiFirstMbInSliceGroup = rcFMO.getFirstMBOfSliceGroup( iSliceGroupId );
UInt uiLastMbInSliceGroup = rcFMO.getLastMBInSliceGroup ( iSliceGroupId );
for( UInt uiMbAddress = uiFirstMbInSliceGroup; uiMbAddress <= uiLastMbInSliceGroup; uiMbAddress = rcFMO.getNextMBNr( uiMbAddress ) )
{
UInt uiMbY = uiMbAddress / uiMbInRow;
UInt uiMbX = uiMbAddress % uiMbInRow;
MbDataAccess* pcMbDataAccess = 0;
MbDataAccess* pcMbDataAccessBase = 0;
RNOK( pcMbDataCtrl->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
if( p
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -