📄 loopfilter.cpp
字号:
uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress );
}
}
//<- ICU/ETRI DS
m_apcIntYuvBuffer[ TOP_FIELD ] =
m_apcIntYuvBuffer[ BOT_FIELD ] =
m_apcIntYuvBuffer[ FRAME ] = NULL;
return Err::m_nOK;
}
__inline
ErrVal LoopFilter::xFilterMbFast( const MbDataAccess& rcMbDataAccess, bool enhancedLayerFlag ) //V032 of FSL, disabling chroma deblocking in enh. layer
{
const DFP& rcDFP = rcMbDataAccess.getDeblockingFilterParameter();
const Int iFilterIdc = rcDFP.getDisableDeblockingFilterIdc();
ROTRS( iFilterIdc == 1, Err::m_nOK );
xGetFilterStrengthFast( rcMbDataAccess, iFilterIdc );
if( m_apcIntYuvBuffer[ FRAME ] )
{
RNOK( xLumaVerFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
RNOK( xLumaHorFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
//V032 of FSL for disabling chroma deblocking in enh. layer
if (!enhancedLayerFlag || (enhancedLayerFlag && (iFilterIdc !=3 && iFilterIdc != 4)) )
{
RNOK( xChromaVerFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
RNOK( xChromaHorFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
}
return Err::m_nOK;
}
YuvPicBuffer* pcYuvBuffer = m_pcRecFrameUnit->getPic( rcMbDataAccess.getSH().getPicType() )->getFullPelYuvBuffer();
RNOK( xLumaVerFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
RNOK( xLumaHorFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
//V032 of FSL for disabling chroma deblocking in enh. layer
if (!enhancedLayerFlag || (enhancedLayerFlag && (iFilterIdc !=3 && iFilterIdc != 4)) )
{
RNOK( xChromaVerFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
RNOK( xChromaHorFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
}
return Err::m_nOK;
}
ErrVal LoopFilter::xGetFilterStrengthFast( const MbDataAccess& rcMbDataAccess, const Int iFilterIdc )
{
const MbData& rcMbData = rcMbDataAccess.getMbData();
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
const Bool b8x8 = rcMbData.isTransformSize8x8();
const Int iIntraStrength = (bFrame ? 4 : 3);
const Short sVerMvThr = (bFrame ? 4 : 2);
MbMode eMbMode = rcMbData.getMbMode();
if( eMbMode >= INTRA_4X4 )
{
m_aaaucBs[VER][0][0] = m_aaaucBs[VER][0][1] = m_aaaucBs[VER][0][2] = m_aaaucBs[VER][0][3] = 4;
m_aaaucBs[VER][1][0] = m_aaaucBs[VER][1][1] = m_aaaucBs[VER][1][2] = m_aaaucBs[VER][1][3] = 3;
m_aaaucBs[VER][2][0] = m_aaaucBs[VER][2][1] = m_aaaucBs[VER][2][2] = m_aaaucBs[VER][2][3] = 3;
m_aaaucBs[VER][3][0] = m_aaaucBs[VER][3][1] = m_aaaucBs[VER][3][2] = m_aaaucBs[VER][3][3] = 3;
m_aaaucBs[HOR][0][0] = m_aaaucBs[HOR][1][0] = m_aaaucBs[HOR][2][0] = m_aaaucBs[HOR][3][0] = iIntraStrength;
m_aaaucBs[HOR][0][1] = m_aaaucBs[HOR][1][1] = m_aaaucBs[HOR][2][1] = m_aaaucBs[HOR][3][1] = 3;
m_aaaucBs[HOR][0][2] = m_aaaucBs[HOR][1][2] = m_aaaucBs[HOR][2][2] = m_aaaucBs[HOR][3][2] = 3;
m_aaaucBs[HOR][0][3] = m_aaaucBs[HOR][1][3] = m_aaaucBs[HOR][2][3] = m_aaaucBs[HOR][3][3] = 3;
if( b8x8 )
{
m_aaaucBs[VER][1][0] = m_aaaucBs[VER][1][1] = m_aaaucBs[VER][1][2] = m_aaaucBs[VER][1][3] =
m_aaaucBs[VER][3][0] = m_aaaucBs[VER][3][1] = m_aaaucBs[VER][3][2] = m_aaaucBs[VER][3][3] =
m_aaaucBs[HOR][0][1] = m_aaaucBs[HOR][1][1] = m_aaaucBs[HOR][2][1] = m_aaaucBs[HOR][3][1] =
m_aaaucBs[HOR][0][3] = m_aaaucBs[HOR][1][3] = m_aaaucBs[HOR][2][3] = m_aaaucBs[HOR][3][3] = 0;
}
}
else
{
Bool bCheckHorMv = true;
Bool bCheckVerMv = true;
switch( eMbMode )
{
case MODE_16x16:
bCheckHorMv = false;
bCheckVerMv = false;
break;
case MODE_16x8:
bCheckVerMv = false;
break;
case MODE_8x16:
bCheckHorMv = false;
break;
case MODE_SKIP:
if( rcMbData.isInterPMb() )
{
bCheckHorMv = false;
bCheckVerMv = false;
}
break;
case MODE_8x8:
case MODE_8x8ref0:
break;
default:
{
AOT(1)
break;
}
}
const Bool bCoded = (0 != (rcMbData.getMbCbp() & 0x0f));
const MbData& rcMbDataLeft = rcMbDataAccess.getMbDataLeft();
const MbData& rcMbDataAbove = (rcMbData.getFieldFlag()? rcMbDataAccess.getMbDataAboveAbove():
rcMbDataAccess.getMbDataAbove());
{
Bool bLeftIntra = rcMbDataLeft.isIntra();
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( ! b8x8 || (0 == (cIdx.x() & 1)) )
{
m_aaaucBs[VER][cIdx.x()][cIdx.y()] = xGetVerFilterStrengthFast( rcMbData, rcMbDataLeft, cIdx, bLeftIntra, bCheckVerMv, bCoded, sVerMvThr );
}
else
{
m_aaaucBs[VER][cIdx.x()][cIdx.y()] = 0;
}
}
}
{
Bool bAboveIntra = rcMbDataAbove.isIntra();
for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
if( ! b8x8 || (0 == (cIdx.y() & 1)) )
{
m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = xGetHorFilterStrengthFast( rcMbData, rcMbDataAbove, cIdx, bAboveIntra, bCheckHorMv, bCoded, sVerMvThr, iIntraStrength );
}
else
{
m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = 0;
}
}
}
}
Bool bClearAbove = ! rcMbDataAccess.isAboveMbExisting();
Bool bClearLeft = ! rcMbDataAccess.isLeftMbExisting();
if( iFilterIdc == 2 || iFilterIdc == 4 ) //V032 of FSL
{
bClearAbove |= ! rcMbDataAccess.isAvailableAbove();
bClearLeft |= ! rcMbDataAccess.isAvailableLeft();
}
if( bClearAbove )
{
m_aaaucBs[HOR][0][0] = m_aaaucBs[HOR][1][0] = m_aaaucBs[HOR][2][0] = m_aaaucBs[HOR][3][0] = 0;
}
if( bClearLeft )
{
m_aaaucBs[VER][0][0] = m_aaaucBs[VER][0][1] = m_aaaucBs[VER][0][2] = m_aaaucBs[VER][0][3] = 0;
}
return Err::m_nOK;
}
__inline
UInt LoopFilter::xGetVerFilterStrengthFast( const MbData& rcMbDataCurr,
const MbData& rcMbDataLeft,
LumaIdx cIdx,
Bool bLeftIntra,
Bool bCheckMv,
Bool bCoded,
const Short sVerMvThr)
{
if( cIdx.x() )
{
// this is a edge inside of a macroblock
if( bCoded )
{
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
}
ROTRS( ! bCheckMv, 0 );
if( rcMbDataCurr.isInterPMb() )
{
const MbMotionData& rcMbMotionData = rcMbDataCurr.getMbMotionData( LIST_0 );
const LumaIdx cQIdx = cIdx + CURR_MB_LEFT_NEIGHBOUR;
const RefPic& rcRefPicL0Q = rcMbMotionData.getRefPic( cQIdx );
const RefPic& rcRefPicL0P = rcMbMotionData.getRefPic( cIdx );
// different reference pictures
ROTRS( rcRefPicL0Q.getFrame() != rcRefPicL0P.getFrame(), 1 );
// check the motion vector distance
const Mv& cMvQ = rcMbMotionData.getMv( cQIdx );
const Mv& cMvP = rcMbMotionData.getMv( cIdx );
ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= 4, 1 );
ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
return 0;
}
return xCheckMvDataB ( rcMbDataCurr, cIdx, rcMbDataCurr, cIdx + CURR_MB_LEFT_NEIGHBOUR, 4, sVerMvThr );
}
ROTRS( bLeftIntra, 4 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
return xCheckMvDataB ( rcMbDataCurr, cIdx, rcMbDataLeft, cIdx + LEFT_MB_LEFT_NEIGHBOUR, 4, sVerMvThr );
}
__inline
UInt LoopFilter::xGetHorFilterStrengthFast( const MbData& rcMbDataCurr,
const MbData& rcMbDataAbove,
LumaIdx cIdx,
Bool bAboveIntra,
Bool bCheckMv,
Bool bCoded,
const Short sVerMvThr,
Int iIntraStrength )
{
if( cIdx.y() )
{
if( bCoded )
{
// internal edge
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
}
ROTRS( ! bCheckMv, 0 );
if( rcMbDataCurr.isInterPMb() )
{
const MbMotionData& rcMbMotionData = rcMbDataCurr.getMbMotionData( LIST_0 );
const LumaIdx cQIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR;
const RefPic& rcRefPicL0Q = rcMbMotionData.getRefPic( cQIdx );
const RefPic& rcRefPicL0P = rcMbMotionData.getRefPic( cIdx );
// different reference pictures
ROTRS( rcRefPicL0Q.getFrame() != rcRefPicL0P.getFrame(), 1 );
// check the motion vector distance
const Mv& cMvQ = rcMbMotionData.getMv( cQIdx );
const Mv& cMvP = rcMbMotionData.getMv( cIdx );
ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= 4, 1 );
ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
return 0;
}
return xCheckMvDataB ( rcMbDataCurr, cIdx, rcMbDataCurr, cIdx + CURR_MB_ABOVE_NEIGHBOUR, 4, sVerMvThr );
}
ROTRS( bAboveIntra , iIntraStrength );
ROTRS( rcMbDataCurr. is4x4BlkCoded( cIdx ), 2 );
ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
return xCheckMvDataB ( rcMbDataCurr, cIdx, rcMbDataAbove, cIdx + ABOVE_MB_ABOVE_NEIGHBOUR, 4, sVerMvThr );
}
__inline ErrVal LoopFilter::xFilterMb( const MbDataAccess& rcMbDataAccess, bool enhancedLayerFlag) //V032 of FSL
{
if( m_bRCDO )
{
RNOK( xFilterMb_RCDO( rcMbDataAccess ) );
return Err::m_nOK;
}
const DFP& rcDFP = rcMbDataAccess.getDeblockingFilterParameter( m_eLFMode & LFM_NO_INTER_FILTER );
Int iFilterIdc = rcDFP.getDisableDeblockingFilterIdc();
ROTRS( (m_eLFMode & LFM_NO_INTER_FILTER) && ! rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );
ROTRS( iFilterIdc == 1, Err::m_nOK );
Bool b8x8 = rcMbDataAccess.getMbData().isTransformSize8x8();
Bool bFieldFlag = rcMbDataAccess.getMbData().getFieldFlag();
m_bVerMixedMode = (bFieldFlag != rcMbDataAccess.getMbDataLeft().getFieldFlag());
m_bHorMixedMode = (bFieldFlag?(bFieldFlag != rcMbDataAccess.getMbDataAboveAbove().getFieldFlag()):
(bFieldFlag != rcMbDataAccess.getMbDataAbove().getFieldFlag()));
Bool bCurrFrame = (FRAME == rcMbDataAccess.getMbPicType());
m_bAddEdge = true;
if( m_bHorMixedMode && bCurrFrame )
{
for( B4x4Idx cIdx; cIdx.b4x4() < 4; cIdx++ )
{
m_aucBsHorTop[cIdx.x()] = xGetHorFilterStrength( rcMbDataAccess, cIdx, iFilterIdc );
}
}
if( m_bVerMixedMode )
{
for( B4x4Idx cIdx; cIdx.b4x4() < 16; cIdx = B4x4Idx( cIdx + 4 ) )
{
m_aucBsVerBot[cIdx.y()] = xGetVerFilterStrength( rcMbDataAccess, cIdx, iFilterIdc );
}
}
m_bAddEdge = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -