📄 sliceencoder.cpp
字号:
}
}
}
#endif // JVT-W081
//===== initialization =====
RNOK( pcMbDataCtrl ->initSlice ( rcSliceHeader, ENCODE_PROCESS, false, pcMbDataCtrlL1 ) );
RNOK( m_pcControlMng->initSliceForCoding( rcSliceHeader ) );
//JVT-W080
if( getPdsEnable() )
{
m_pcMbEncoder->setPdsEnable( getPdsEnable() );
m_pcMbEncoder->setFrameWidthInMbs( rcSliceHeader.getSPS().getFrameWidthInMbs() );
m_pcMbEncoder->setPdsBlockSize( getPdsBlockSize() );
UInt **ppuiPdsInitialDelayMinus2L0 = getPdsInitialDelayMinus2L0();
UInt **ppuiPdsInitialDelayMinus2L1 = getPdsInitialDelayMinus2L1();
m_pcMbEncoder->setPdsInitialDelayMinus2L0( ppuiPdsInitialDelayMinus2L0[rcSliceHeader.getViewId()] );
m_pcMbEncoder->setPdsInitialDelayMinus2L1( ppuiPdsInitialDelayMinus2L1[rcSliceHeader.getViewId()] );
}
//~JVT-W080
//===== 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 ) );
//JVT-W080
if( getPdsEnable() )
{
m_pcMbEncoder->setCurrMBX ( uiMbX );
m_pcMbEncoder->setCurrMBY ( uiMbY );
}
//~JVT-W080
#if JMVM_ONLY // JVT-W081
class MBMotion FMb;
FMb.m_iViewMode=INTRA_4X4;
//JVT-Z021
Mv cDis;
Bool bIsViewLevel1;
Mv cCenterL0, cCenterL1;
//JVT-Z021
if ( !rcSliceHeader.getAVCFlag() && rcSliceHeader.getMotionSkip() )
{
//JVT-Z021
if(rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD
{
bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;
}
else
{
bIsViewLevel1 = (!rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1)) ? true : false;
}
//JVT-Z021
FILE* fMotionFwd = NULL;
FILE* fMotionBwd = NULL;
//JVT-Z021
FILE* fMotion = NULL;
Int iVIdL0=-1;
Int iVIdL1=-1;
Int iCurVId = rcSliceHeader.getViewId();
uiNumNonAnchorRefsL0 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_0);
uiNumNonAnchorRefsL1 = rcSpsMvc->getNumNonAnchorRefsForListX (rcSliceHeader.getViewId(), LIST_1);
if ( !rcSliceHeader.getAnchorPicFlag() )
{
if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() ) // JVT-Y042
{
for(UInt i=0; i<uiNumNonAnchorRefsL0; i++)
{
RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL0[i], gdvL0[i] ) );
}
}
else
{
if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0) > 0)
{
RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL0[0], gdvL0[0] ) );
}
}
if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() ) // JVT-Y042
{
for(UInt i=0; i<uiNumNonAnchorRefsL1; i++)
{
RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL1[i], gdvL1[i] ) );
}
}
else
{
if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1) > 0)
{
RNOK( pcMbDataAccess->deriveDisparity(*pcMbDataAccess, disparityL1[0], gdvL1[0] ) );
}
}
//JVT-Z021
if (!rcSliceHeader.getSPS().getSpsMVC()->getSingleLoopDecoding() )
{
if(uiNumNonAnchorRefsL0>0)
{
iVIdL0 = rcSliceHeader.getSPS().getSpsMVC()->getNonAnchorRefForListX(iCurVId,0,0);
fMotionFwd = m_pcMbEncoder->getMotionFile(rcSliceHeader, iVIdL0, 0);
}
if(uiNumNonAnchorRefsL1>0)
{
iVIdL1 = rcSliceHeader.getSPS().getSpsMVC()->getNonAnchorRefForListX(iCurVId,0,1);
fMotionBwd = m_pcMbEncoder->getMotionFile(rcSliceHeader, iVIdL1, 1);
}
pcMbDataAccess->getOrgMbMotionInfo(fMotionFwd, fMotionBwd, disparityL0[0], disparityL1[0], uiCodedFrames, bIsViewLevel1, uiMbInRow, sizeofMB, sizeofFrame);
pcMbDataAccess->getNewMbMotionInfo(disparityL0[0], disparityL1[0], cCenterL0, cCenterL1);
RNOK( m_pcMbEncoder->getNeighborMbMotionInfo( *pcMbDataAccess, cCenterL0, cCenterL1, FMb ) );
}
else
{
if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0) > 0)
{
fMotionFwd = fFwdMvSLD;
}
if( rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1) > 0)
{
fMotionBwd = fBwdMvSLD;
}
pcMbDataAccess->getOrgMbMotionInfo(fMotionFwd, fMotionBwd, disparityL0[0], disparityL1[0], uiCodedFrames, bIsViewLevel1, uiMbInRow, sizeofMB, sizeofFrame);
pcMbDataAccess->getNewMbMotionInfo(disparityL0[0], disparityL1[0], cCenterL0, cCenterL1);
Mv sldDisparityL0, sldDisparityL1;
sldDisparityL0.setHor(disparityL0[0].getHor());
sldDisparityL0.setVer(disparityL0[0].getVer());
sldDisparityL1.setHor(disparityL1[0].getHor());
sldDisparityL1.setVer(disparityL1[0].getVer());
if (rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_0) > 0 )
{
RNOK( pcMbDataAccess->xReadMbInfoFile(fFwdMvSLD, &FMb, sldDisparityL0) );
}
if ( FMb.m_iViewMode >= INTRA_4X4 )
{
if (rcSliceHeader.getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX(rcSliceHeader.getViewId(), LIST_1) > 0 )
{
RNOK( pcMbDataAccess->xReadMbInfoFile ( fBwdMvSLD, &FMb, sldDisparityL1) );
}
}
}
//JVT-Z021
}
}
RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
pcFrame,
rcList0,
rcList1,
m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),
dlambda,
//FMb linsx
//JVT-Z021
cCenterL0, cCenterL1
//JVT-Z021
) );
#else // JVT-W081
RNOK( m_pcMbEncoder ->encodeMacroblock( *pcMbDataAccess,
pcFrame,
rcList0,
rcList1,
m_pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter(),
m_pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange(),
dlambda ) );
#endif
#if JMVM_ONLY // JVT-W081
if ( m_bMotionSkipEnalbe )
{
RNOK( pcMbDataAccess->xWriteMbInfoFile(*pcMbDataAccess, &rcList0, &rcList1 ) );
}
#endif // JVT-W081
RNOK( m_pcMbCoder ->encode ( *pcMbDataAccess, NULL, SST_RATIO_1,
( uiMbAddress == rcSliceHeader.getLastMbInSlice() ) ) );
}
#if JMVM_ONLY
if ( !rcSliceHeader.getAVCFlag() && rcSliceHeader.getMotionSkip())
{
delete [] disparityL0;
delete [] disparityL1;
}
#endif //JMVM_ONLY
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -