📄 loopfilter.cpp
字号:
bLeftIntra = bLI_Top || bLI_Bot;
}
}
}
filterBlockEdge = ( LFM_DEFAULT_FILTER == m_eLFMode || bLeftIntra );
}
if( filterBlockEdge )
{
filterBlockEdge = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 ||
( rcDFP.getDisableDeblockingFilterIdc() == 2 && ! rcMbDataAccess.isAvailableLeft() ) );
}
if( ! m_bVerMixedMode )
{
if( filterBlockEdge )
{
Int iQp = ( iLeftQp + iCurrQp + 1) >> 1;
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
Int iStridex2 = 2*iStride;
Int iStridex5 = 5*iStride;
Int iD = ( abs( (Int)pPelLum[iStridex2-2] - (Int)pPelLum[iStridex2-1] )
+ abs( (Int)pPelLum[iStridex2 ] - ( (Int)pPelLum[iStridex2+1] << 1 ) + (Int)pPelLum[iStridex2+2] )
+ abs( (Int)pPelLum[iStridex5-2] - (Int)pPelLum[iStridex5-1] )
+ abs( (Int)pPelLum[iStridex5 ] - ( (Int)pPelLum[iStridex5+1] << 1 ) + (Int)pPelLum[iStridex5+2] ) );
filterBlockEdge = ( iD < g_aucBetaTab_H241RCDO [ iIndexB ] );
}
if( filterBlockEdge )
{
filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().isIntra() ||
rcMbDataAccess.getMbDataLeft().isIntra() );
if( ! filterBlockEdge && m_pcHighpassYuvBuffer )
{
filterBlockEdge = ( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx ) ||
m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + VER_OFFSET_H241RCDO ) ||
m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero( cIdx + LEFT_MB_LEFT_NEIGHBOUR ) ||
m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero( cIdx + LEFT_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
}
if( ! filterBlockEdge )
{
filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx ) ||
rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + VER_OFFSET_H241RCDO ) ||
rcMbDataAccess.getMbDataLeft().is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ) ||
rcMbDataAccess.getMbDataLeft().is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
}
if( ! filterBlockEdge )
{
if( rcMbDataAccess.getMbDataCurr().isInterPMb() && rcMbDataAccess.getMbDataLeft().isInterPMb() )
{
CheckMVandRefVal= xCheckMvDataP( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
else
{
CheckMVandRefVal= xCheckMvDataB( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
filterBlockEdge = ( CheckMVandRefVal > 0 );
}
}
}
if( filterBlockEdge )
{
if( m_bVerMixedMode && ! rcMbDataAccess.getMbData().getFieldFlag() )
{
if( ! bFilterBotOnly )
{
Int iQp = ( iLeftQpTop + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelLum, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 0, true );
}
if( ! bFilterTopOnly )
{
Int iQp = ( iLeftQpBot + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelLum+ iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 0, true );
}
}
else
{
Int iQp = ( iLeftQp + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelLum, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+ iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 0, true );
xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 0, true );
}
}
pPelLum += 8*iStride; //for the next 8x8 vertical
if( yBlk == 0 )
{
cIdx = cIdx + 8;
}
} //end of the loop
//===== INNER MACROBLOCK EDGES =====
pPelLum -= 16*iStride-4;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iCurrQp, 0, 51);
for( xBlk = 1; xBlk < 4; xBlk++ )
{
cIdx = cIdx - 7;
for( yBlk = 0; yBlk <= 8; yBlk += 8 )
{
filterBlockEdge = ( xBlk == 2 || ! b8x8 );
if( filterBlockEdge )
{
filterBlockEdge = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 );
}
if( filterBlockEdge )
{
Int iStridex2 = 2*iStride;
Int iStridex5 = 5*iStride;
Int iD = ( abs( (Int)pPelLum[iStridex2-3] - ( (Int)pPelLum[iStridex2-2] << 1 ) + (Int)pPelLum[iStridex2-1] )
+ abs( (Int)pPelLum[iStridex2 ] - ( (Int)pPelLum[iStridex2+1] << 1 ) + (Int)pPelLum[iStridex2+2] )
+ abs( (Int)pPelLum[iStridex5-3] - ( (Int)pPelLum[iStridex5-2] << 1 ) + (Int)pPelLum[iStridex5-1] )
+ abs( (Int)pPelLum[iStridex5 ] - ( (Int)pPelLum[iStridex5+1] << 1 ) + (Int)pPelLum[iStridex5+2] ) );
filterBlockEdge = ( iD < g_aucBetaTab_H241RCDO [ iIndexB ] );
}
if( filterBlockEdge )
{
filterBlockEdge = rcMbDataAccess.getMbDataCurr().isIntra();
if( ! filterBlockEdge && m_pcHighpassYuvBuffer )
{
filterBlockEdge = ( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx ) ||
m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + VER_OFFSET_H241RCDO ) ||
m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + CURR_MB_LEFT_NEIGHBOUR ) ||
m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + CURR_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
}
if( ! filterBlockEdge )
{
filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx ) ||
rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + VER_OFFSET_H241RCDO ) ||
rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ) ||
rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
}
if( ! filterBlockEdge )
{
if( rcMbDataAccess.getMbDataCurr().isInterPMb() )
{
CheckMVandRefVal= xCheckMvDataP( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataCurr(), cIdx+CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
else
{
CheckMVandRefVal= xCheckMvDataB( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataCurr(), cIdx+CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
filterBlockEdge = ( CheckMVandRefVal > 0 );
}
}
if( filterBlockEdge )
{
xFilter_H241RCDO( pPelLum, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+ iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 1, true );
xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 1, true );
}
pPelLum += 8*iStride; //for the next 8x8 vertical
if( yBlk == 0 )
{
cIdx = cIdx + 8;
}
} //end of the 1st loop
pPelLum -= 16*iStride-4; //back to the original position
} //end of the 2nd loop
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xChromaVerFiltering_H241RCDO ( const MbDataAccess& rcMbDataAccess, const DFP& rcDFP, YuvPicBuffer* pcYuvBuffer )
{
Int iCurrQp = rcMbDataAccess.getSH().getChromaQp( rcMbDataAccess.getMbDataCurr().getQpLF() );
Int iStride = pcYuvBuffer->getCStride();
Pel* pPelCb = pcYuvBuffer->getMbCbAddr();
Pel* pPelCr = pcYuvBuffer->getMbCrAddr();
Bool filterBlockEdge, bFilterTopOnly, bFilterBotOnly;
Int yBlk, iLeftQp = 0, iLeftQpTop = 0, iLeftQpBot = 0;
//===== filtering of left macroblock edge =====
for( yBlk = 0; yBlk <= 4; yBlk+=4 )
{
filterBlockEdge = rcMbDataAccess.isLeftMbExisting();
bFilterTopOnly = false;
bFilterBotOnly = false;
if( filterBlockEdge )
{
Bool bLeftIntra = rcMbDataAccess.getMbDataLeft().isIntra();
iLeftQp = rcMbDataAccess.getMbDataLeft().getQpLF();
if( m_bVerMixedMode )
{
if ( rcMbDataAccess.getMbData().getFieldFlag() && yBlk == 0 )
{
bLeftIntra = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().isIntra() : rcMbDataAccess.getMbDataAboveLeft().isIntra() );
iLeftQp = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().getQpLF() : rcMbDataAccess.getMbDataAboveLeft().getQpLF() );
}
else if ( rcMbDataAccess.getMbData().getFieldFlag() )
{
bLeftIntra = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().isIntra() : rcMbDataAccess.getMbDataLeft().isIntra() );
iLeftQp = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().getQpLF() : rcMbDataAccess.getMbDataLeft().getQpLF() );
}
else // current pair is frame, left pair is field
{
Bool bLI_Top = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().isIntra() : rcMbDataAccess.getMbDataAboveLeft().isIntra() );
Bool bLI_Bot = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().isIntra() : rcMbDataAccess.getMbDataLeft().isIntra() );
iLeftQpTop = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().getQpLF() : rcMbDataAccess.getMbDataAboveLeft().getQpLF() );
iLeftQpBot = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().getQpLF() : rcMbDataAccess.getMbDataLeft().getQpLF() );
if( ( bLI_Top ^ bLI_Bot ) && LFM_DEFAULT_FILTER != m_eLFMode )
{
bLeftIntra = true;
bFilterTopOnly= bLI_Top;
bFilterBotOnly= bLI_Bot;
}
else
{
bLeftIntra = bLI_Top || bLI_Bot;
}
}
}
filterBlockEdge = ( LFM_DEFAULT_FILTER == m_eLFMode || bLeftIntra );
}
if( filterBlockEdge )
{
filterBlockEdge = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 ||
( rcDFP.getDisableDeblockingFilterIdc() == 2 && ! rcMbDataAccess.isAvailableLeft() ) );
}
if( filterBlockEdge && ! m_bVerMixedMode )
{
filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().isIntra() || rcMbDataAccess.getMbDataLeft().isIntra() );
}
if( filterBlockEdge )
{
if( m_bVerMixedMode && ! rcMbDataAccess.getMbData().getFieldFlag() )
{
if( ! bFilterBotOnly )
{
Int iLQp = rcMbDataAccess.getSH().getChromaQp( iLeftQpTop );
Int iQp = ( iCurrQp + iLQp + 1 ) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelCb, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCb+2*iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+2*iStride, 1, iIndexA, iIndexB, 0, false );
}
if( ! bFilterTopOnly )
{
Int iLQp = rcMbDataAccess.getSH().getChromaQp( iLeftQpBot );
Int iQp = ( iCurrQp + iLQp + 1 ) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelCb+ iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCb+3*iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+ iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+3*iStride, 1, iIndexA, iIndexB, 0, false );
}
}
else
{
Int iLQp = rcMbDataAccess.getSH().getChromaQp( iLeftQp );
Int iQp = ( iCurrQp + iLQp + 1 ) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
xFilter_H241RCDO( pPelCb, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCb+ iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCb+2*iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCb+3*iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+ iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+2*iStride, 1, iIndexA, iIndexB, 0, false );
xFilter_H241RCDO( pPelCr+3*iStride, 1, iIndexA, iIndexB, 0, false );
}
}
pPelCb += 4*iStride;
pPelCr += 4*iStride;
}
//Inside of the macroblock
pPelCb -= 8*iStride-4;
pPelCr -= 8*iStride-4;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iCurrQp, 0, 51);
for( yBlk = 0; yBlk <= 4; yBlk += 4 )
{
filterBlockEdge = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 );
if( filterBlockEdge )
{
filterBlockEdge = rcMbDataAccess.getMbDataCurr().isIntra();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -