sliceencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 623 行 · 第 1/2 页
CPP
623 行
if(uiMbAddress == -1) return Err::m_nOK;
//===== loop over macroblocks =====
for( ; uiMbAddress <= uiLastMbAddress; ) //--ICU/ETRI FMO Implementation
{
ETRACE_NEWMB( uiMbAddress );
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 ) );
}
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbAddress ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess,
pcMbDataAccessBase,
pcFrame,
pcRecSubband,
pcBaseLayer,
pcPredSignal,
dLambda ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess,
pcMbDataAccessBase,
iSpatialScalabilityType,
( uiMbAddress == uiLastMbAddress ) ) );
uiMbAddress = rcSliceHeader.getFMO()->getNextMBNr(uiMbAddress );
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
ErrVal SliceEncoder::encodeHighPassPicture( UInt& ruiMbCoded,
UInt& ruiBits,
SliceHeader& rcSH,
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)
{
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();
Int iQPIntra = rcSH.getPicQp(); //- 2;
IntYuvMbBuffer cZeroBuffer;
cZeroBuffer.setAllSamplesToZero();
//===== loop over macroblocks =====
for( ruiMbCoded = 0; uiMbAddress <= uiLastMbAddress; ) //--ICU/ETRI FMO Implementation
{
ETRACE_NEWMB( uiMbAddress );
UInt uiMbY = uiMbAddress / uiMbInRow;
UInt uiMbX = uiMbAddress % uiMbInRow;
MbDataAccess* pcMbDataAccess = 0;
Bool bCoded;
RNOK( pcMbDataCtrl ->initMb ( pcMbDataAccess, uiMbY, uiMbX ) );
RNOK( m_pcControlMng ->initMbForCoding ( *pcMbDataAccess, uiMbAddress ) );
pcMbDataAccess->getMbData().deactivateMotionRefinement();
MbDataAccess* pcMbDataAccessBase = 0;
if( pcMbDataCtrlBaseMotion)
{
RNOK( pcMbDataCtrlBaseMotion->initMb ( pcMbDataAccessBase, uiMbY, uiMbX ) );
}
if( pcMbDataAccess->getMbData().isIntra() )
{
pcMbDataAccess->getMbData().setQp( iQPIntra );
RNOK( m_pcMbEncoder ->encodeIntra ( *pcMbDataAccess, pcMbDataAccessBase, pcFrame, pcResidual, pcBaseLayer, pcPredSignal, dLambda ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess, pcMbDataAccessBase, iSpatialScalabilityType, (uiMbAddress == uiLastMbAddress ) ) );
//-- 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,
pcFrame,
pcResidual,
pcBaseSubband,
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 ) ) );
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( pcPredSignal->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );
}
uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress);
}
ruiBits += m_pcMbCoder->getBitCount() - uiBits;
return Err::m_nOK;
}
ErrVal
SliceEncoder::encodeSlice( SliceHeader& rcSliceHeader,
IntFrame* 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.isInterB() && ! 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, uiMbAddress ) );
RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
pcFrame,
rcList0,
rcList1,
m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),
dlambda ) );
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess, NULL, SST_RATIO_1,
( uiMbAddress == rcSliceHeader.getLastMbInSlice() ) ) );
}
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,
IntFrame* pOrgFrame,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1)
{
RNOK( rcSH.getPredWeightTable(LIST_0).uninit() );
RNOK( rcSH.getPredWeightTable(LIST_1).uninit() );
RNOK( rcSH.getPredWeightTable(LIST_0).init( rcSH.getNumRefIdxActive( LIST_0) ) );
RNOK( rcSH.getPredWeightTable(LIST_1).init( rcSH.getNumRefIdxActive( LIST_1) ) );
ROTRS( rcSH.isIntra(), Err::m_nOK );
const SampleWeightingParams& rcSWP = m_pcCodingParameter->getSampleWeightingParams(rcSH.getLayerId());
{ // 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.isInterB() )
{
ROTRS( 1 != rcSH.getPPS().getWeightedBiPredIdc(), Err::m_nOK );
}
else
{
ROTRS( ! rcSH.getPPS().getWeightedPredFlag(), Err::m_nOK );
}
if( rcSH.isInterB() )
{
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];
Double fDiscardThr = m_pcCodingParameter->getSampleWeightingParams(rcSH.getLayerId()).getDiscardThr();
/* 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.isInterB() )
{
RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_1, afBwWeight,
pOrgFrame, rcRefFrameList1 ) );
RNOK( rcSH.getPredWeightTable( LIST_1).setPredWeightsAndFlags( iLumaScale, iChromaScale,
afBwWeight, fDiscardThr ) );
}
RNOK( m_pcMbEncoder->getPredWeights( rcSH, LIST_0, afFwWeight, pOrgFrame, rcRefFrameList0 ) );
RNOK( rcSH.getPredWeightTable( LIST_0).setPredWeightsAndFlags( iLumaScale, iChromaScale,
afFwWeight, fDiscardThr ) );
return Err::m_nOK;
}
//TMM_WP
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?