loopfilter.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,794 行 · 第 1/5 页
CPP
1,794 行
Int C0 = g_acAlphaClip[ iIndexA ].aucClip[ucBs];
if( bLum )
{
Int P2 = pFlt[-3*iOffset] ;
Int Q2 = pFlt[ 2*iOffset] ;
Int aq = (( abs( Q2 - Q0 ) < iBeta ) ? 1 : 0 );
Int ap = (( abs( P2 - P0 ) < iBeta ) ? 1 : 0 );
if( ap )
{
pFlt[-2*iOffset] = P1 + gClipMinMax((P2 + ((P0 + Q0 + 1)>>1) - (P1<<1)) >> 1, -C0, C0 );
}
if( aq )
{
pFlt[ iOffset] = Q1 + gClipMinMax((Q2 + ((P0 + Q0 + 1)>>1) - (Q1<<1)) >> 1, -C0, C0 );
}
C0 += ap + aq -1;
}
C0++;
Int iDiff = gClipMinMax(((iDelta << 2) + (P1 - Q1) + 4) >> 3, -C0, C0 ) ;
pFlt[-iOffset] = gClip( P0 + iDiff );
pFlt[ 0] = gClip( Q0 - iDiff );
return;
}
if( ! bLum )
{
pFlt[ 0] = ((Q1 << 1) + Q0 + P1 + 2) >> 2;
pFlt[ -iOffset] = ((P1 << 1) + P0 + Q1 + 2) >> 2;
}
else
{
Int P2 = pFlt[-3*iOffset] ;
Int Q2 = pFlt[ 2*iOffset] ;
Bool bEnable = (iAbsDelta < ((iAlpha >> 2) + 2));
Bool aq = bEnable & ( abs( Q2 - Q0 ) < iBeta );
Bool ap = bEnable & ( abs( P2 - P0 ) < iBeta );
Int PQ0 = P0 + Q0;
if( aq )
{
pFlt[ 0] = (P1 + ((Q1 + PQ0) << 1) + Q2 + 4) >> 3;
pFlt[ iOffset] = (PQ0 +Q1 + Q2 + 2) >> 2;
pFlt[ 2*iOffset] = (((pFlt[ 3*iOffset] + Q2) <<1) + Q2 + Q1 + PQ0 + 4) >> 3;
}
else
{
pFlt[ 0] = ((Q1 << 1) + Q0 + P1 + 2) >> 2;
}
if( ap )
{
pFlt[ -iOffset] = (Q1 + ((P1 + PQ0) << 1) + P2 + 4) >> 3;
pFlt[-2*iOffset] = (PQ0 +P1 + P2 + 2) >> 2;
pFlt[-3*iOffset] = (((pFlt[-4*iOffset] + P2) <<1) + pFlt[-3*iOffset] + P1 + PQ0 + 4) >> 3;
}
else
{
pFlt[ -iOffset] = ((P1 << 1) + P0 + Q1 + 2) >> 2;
}
}
}
__inline ErrVal LoopFilter::xLumaVerFiltering( const MbDataAccess& rcMbDataAccess, const DFP& rcDFP, YuvPicBuffer* pcYuvBuffer )
{
Int iCurrQp = rcMbDataAccess.getMbDataCurr().getQpLF();
Int iStride = pcYuvBuffer->getLStride();
Pel* pPelLum = pcYuvBuffer->getMbLumAddr();
//===== filtering of left macroblock edge =====
{
Int iLeftQp = rcMbDataAccess.getMbDataLeft().getQpLF();
Int iQp = ( iLeftQp + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
for( Int yBlk = 0; yBlk < 4; yBlk++)
{
const UChar ucBs = m_aaaucBs[VER][0][yBlk];
if( 0 != ucBs )
{
xFilter( pPelLum, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+ iStride, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+2*iStride, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+3*iStride, 1, iIndexA, iIndexB, ucBs, true );
}
pPelLum += 4*iStride;
}
pPelLum -= 16*iStride-4;
}
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iCurrQp, 0, 51);
for( Int xBlk = 1; xBlk < 4; xBlk++)
{
for( Int yBlk = 0; yBlk < 4; yBlk++)
{
const UChar ucBs = m_aaaucBs[VER][xBlk][yBlk];
if( 0 != ucBs )
{
xFilter( pPelLum, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+ iStride, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+2*iStride, 1, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+3*iStride, 1, iIndexA, iIndexB, ucBs, true );
}
pPelLum += 4*iStride;
}
pPelLum -= 16*iStride-4;
}
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xLumaHorFiltering( const MbDataAccess& rcMbDataAccess, const DFP& rcDFP, YuvPicBuffer* pcYuvBuffer )
{
Int iCurrQp = rcMbDataAccess.getMbDataCurr().getQpLF();
Int iStride = pcYuvBuffer->getLStride();
Pel* pPelLum = pcYuvBuffer->getMbLumAddr();
//===== filtering of upper macroblock edge =====
{
//----- any other combination than curr = FRM, above = FLD -----
Int iAboveQp = rcMbDataAccess.getMbDataAbove().getQpLF();
Int iQp = ( iAboveQp + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
for( Int xBlk = 0; xBlk < 4; xBlk++)
{
const UChar ucBs = m_aaaucBs[HOR][xBlk][0];
if( 0 != ucBs )
{
xFilter( pPelLum, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+1, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+2, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+3, iStride, iIndexA, iIndexB, ucBs, true );
}
pPelLum += 4;
}
pPelLum -= 16;
}
pPelLum += 4*iStride;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iCurrQp, 0, 51);
for( Int yBlk = 1; yBlk < 4; yBlk++)
{
for( Int xBlk = 0; xBlk < 4; xBlk++)
{
const UChar ucBs = m_aaaucBs[HOR][xBlk][yBlk];
if( 0 != ucBs )
{
xFilter( pPelLum, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+1, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+2, iStride, iIndexA, iIndexB, ucBs, true );
xFilter( pPelLum+3, iStride, iIndexA, iIndexB, ucBs, true );
}
pPelLum += 4;
}
pPelLum += 4*iStride - 16;
}
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xChromaHorFiltering( 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();
//===== filtering of upper macroblock edge =====
{
//----- any other combination than curr = FRM, above = FLD -----
Int iAboveQp = rcMbDataAccess.getSH().getChromaQp( rcMbDataAccess.getMbDataAbove().getQpLF() );
Int iQp = ( iAboveQp + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
for( Int xBlk = 0; xBlk < 4; xBlk++)
{
const UChar ucBs = m_aaaucBs[HOR][xBlk][0];
if( 0 != ucBs )
{
xFilter( pPelCb, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCb+1, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr+1, iStride, iIndexA, iIndexB, ucBs, false );
}
pPelCb += 2;
pPelCr += 2;
}
pPelCb -= 8;
pPelCr -= 8;
}
pPelCb += 4*iStride;
pPelCr += 4*iStride;
// now we filter the remaining edge
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iCurrQp, 0, 51);
for( Int xBlk = 0; xBlk < 4; xBlk++)
{
const UChar ucBs = m_aaaucBs[HOR][xBlk][2];
if( 0 != ucBs )
{
xFilter( pPelCb, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCb+1, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr, iStride, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr+1, iStride, iIndexA, iIndexB, ucBs, false );
}
pPelCb += 2;
pPelCr += 2;
}
return Err::m_nOK;
}
__inline ErrVal LoopFilter::xChromaVerFiltering( 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();
//===== filtering of left macroblock edge =====
{
//----- curr == FRM && left == FRM or curr == FLD && left == FLD -----
Int iLeftQp = rcMbDataAccess.getSH().getChromaQp( rcMbDataAccess.getMbDataLeft().getQpLF() );
Int iQp = ( iLeftQp + iCurrQp + 1) >> 1;
Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset() + iQp, 0, 51);
for( Int yBlk = 0; yBlk < 4; yBlk++)
{
const UChar ucBs = m_aaaucBs[VER][0][yBlk];
if( 0 != ucBs )
{
xFilter( pPelCb, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCb+iStride, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr+iStride, 1, iIndexA, iIndexB, ucBs, false );
}
pPelCb += 2*iStride;
pPelCr += 2*iStride;
}
}
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( Int yBlk = 0; yBlk < 4; yBlk++)
{
const UChar ucBs = m_aaaucBs[VER][2][yBlk];
if( 0 != ucBs )
{
xFilter( pPelCb, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCb+iStride, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr, 1, iIndexA, iIndexB, ucBs, false );
xFilter( pPelCr+iStride, 1, iIndexA, iIndexB, ucBs, false );
}
pPelCb += 2*iStride;
pPelCr += 2*iStride;
}
return Err::m_nOK;
}
//{{SAMSUNG&KHU (JVT-W024)
#if JMVM_ONLY
#define K1 1
#define K2 3
#define T 5
#endif
//}}
UChar LoopFilter::xCheckMvDataB( const MbData& rcQMbData, const LumaIdx cQIdx,
const MbData& rcPMbData, const LumaIdx cPIdx,
const Short sHorMvThr, const Short sVerMvThr )
{
const MbMotionData& rcMbMotionDataL0Q = rcQMbData.getMbMotionData( LIST_0 );
const MbMotionData& rcMbMotionDataL1Q = rcQMbData.getMbMotionData( LIST_1 );
const MbMotionData& rcMbMotionDataL0P = rcPMbData.getMbMotionData( LIST_0 );
const MbMotionData& rcMbMotionDataL1P = rcPMbData.getMbMotionData( LIST_1 );
const RefPic& rcRefPicL0Q = rcMbMotionDataL0Q.getRefPic( cQIdx );
const RefPic& rcRefPicL1Q = rcMbMotionDataL1Q.getRefPic( cQIdx );
const RefPic& rcRefPicL0P = rcMbMotionDataL0P.getRefPic( cPIdx );
const RefPic& rcRefPicL1P = rcMbMotionDataL1P.getRefPic( cPIdx );
UInt uiNumberOfUsedPic;
{
// check the number of used ref frames
UInt uiQNumberOfUsedPic = (rcRefPicL0Q.isAssigned() ? 1:0) + (rcRefPicL1Q.isAssigned() ? 1:0);
UInt uiPNumberOfUsedPic = (rcRefPicL0P.isAssigned() ? 1:0) + (rcRefPicL1P.isAssigned() ? 1:0);
ROTRS( uiPNumberOfUsedPic != uiQNumberOfUsedPic, 1 );
uiNumberOfUsedPic = uiPNumberOfUsedPic;
}
if( 1 == uiNumberOfUsedPic )
{
// this is the easy part
// check whether they ref diff ref pic or not
const RefPic& rcRefPicQ = ( rcRefPicL0Q.isAssigned() ? rcRefPicL0Q : rcRefPicL1Q );
const RefPic& rcRefPicP = ( rcRefPicL0P.isAssigned() ? rcRefPicL0P : rcRefPicL1P );
ROTRS( rcRefPicQ.getFrame() != rcRefPicP.getFrame(), 1 );
// check the motion vector distance
const Mv& cMvQ = (rcRefPicL0Q.isAssigned() ? rcMbMotionDataL0Q.getMv( cQIdx ) : rcMbMotionDataL1Q.getMv( cQIdx ));
const Mv& cMvP = (rcRefPicL0P.isAssigned() ? rcMbMotionDataL0P.getMv( cPIdx ) : rcMbMotionDataL1P.getMv( cPIdx ));
ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= sHorMvThr, 1 );
ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
//{{SAMSUNG&KHU (JVT-W024)
#if JMVM_ONLY
if ((rcQMbData.getMbIcp().getIcAct() && rcPMbData.getMbIcp().getIcAct() &&
(rcQMbData.getMbIcp().getIcp().getOffset() != rcPMbData.getMbIcp().getIcp().getOffset())) ||
(rcQMbData.getMbIcp().getIcAct() ^ rcPMbData.getMbIcp().getIcAct()))
{
if ( abs(rcQMbData.getMbIcp().getIcp().getOffset() - rcPMbData.getMbIcp().getIcp().getOffset()) >= T)
return K2;
else
return K1;
}
#endif
//}}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?