📄 loopfilter.cpp
字号:
if( filterBlockEdge )
{
xFilter_H241RCDO( pPelCb, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCb+ iStride, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCb+2*iStride, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCb+3*iStride, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCr, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCr+ iStride, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCr+2*iStride, 1, iIndexA, iIndexB, 1, false );
xFilter_H241RCDO( pPelCr+3*iStride, 1, iIndexA, iIndexB, 1, false );
}
pPelCb += 4*iStride; //for the next 4x4 vertical
pPelCr += 4*iStride; //for the next 4x4 vertical
}
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xLumaVerFiltering_H241RCDO( const MbDataAccess& rcMbDataAccess,
const DFP& rcDFP,
IntYuvPicBuffer* pcYuvBuffer,
const MbDataAccess* pcMbDataAccessMot, //HZL added
RefFrameList* pcRefFrameList0, //HZL added
RefFrameList* pcRefFrameList1 ) //HZL added
{
Int iCurrQp = rcMbDataAccess.getMbDataCurr().getQpLF();
Int iStride = pcYuvBuffer->getLStride();
XPel* pPelLum = pcYuvBuffer->getMbLumAddr();
Bool b8x8 = rcMbDataAccess.getMbData().isTransformSize8x8();
Bool filterBlockEdge = false;
Bool bFilterTopOnly = false;
Bool bFilterBotOnly = false;
Short sHorMvThr = 4;
Short sVerMvThr = ( FRAME == rcMbDataAccess.getMbPicType() ? 4 : 2 );
Int CheckMVandRefVal;
Int xBlk, yBlk, iLeftQp = 0, iLeftQpTop = 0, iLeftQpBot = 0;
B4x4Idx cIdx=0;
for( yBlk = 0; yBlk <= 8; yBlk+=8 ) //On the left edge of a macroblock
{
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( ! 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 )
{
ROF( pcMbDataAccessMot );
if ( pcMbDataAccessMot->getMbDataCurr().isInterPMb() && pcMbDataAccessMot->getMbDataLeft().isInterPMb() )
{
if( pcRefFrameList0 )
CheckMVandRefVal = xCheckMvDataP_RefIdx( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr, *pcRefFrameList0, *pcRefFrameList1 );
else
CheckMVandRefVal = xCheckMvDataP ( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
else
{
if( pcRefFrameList0 && pcRefFrameList1 )
CheckMVandRefVal = xCheckMvDataB_RefIdx( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr, *pcRefFrameList0, *pcRefFrameList1 );
else
CheckMVandRefVal = xCheckMvDataB ( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->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
//Inside of the macroblock
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 )
{
ROF( pcMbDataAccessMot );
if ( pcMbDataAccessMot->getMbDataCurr().isInterPMb() )
{
if( pcRefFrameList0 )
CheckMVandRefVal = xCheckMvDataP_RefIdx( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataCurr(), cIdx + CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr, *pcRefFrameList0, *pcRefFrameList1 );
else
CheckMVandRefVal = xCheckMvDataP ( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataCurr(), cIdx + CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
}
else
{
if( pcRefFrameList0 && pcRefFrameList1 )
CheckMVandRefVal = xCheckMvDataB_RefIdx( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->getMbDataCurr(), cIdx + CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr, *pcRefFrameList0, *pcRefFrameList1 );
else
CheckMVandRefVal = xCheckMvDataB ( pcMbDataAccessMot->getMbDataCurr(), cIdx, pcMbDataAccessMot->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, IntYuvPicBuffer* pcYuvBuffer )
{
Int iCurrQp = rcMbDataAccess.getSH().getChromaQp( rcMbDataAccess.getMbDataCurr().getQpLF() );
Int iStride = pcYuvBuffer->getCStride();
XPel* pPelCb = pcYuvBuffer->getMbCbAddr();
XPel* 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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -