📄 motioncompensation.cpp
字号:
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_2] = rcMbMotionData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_2 );
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_2].limitComponents( m_cMin, m_cMax );
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_3] = rcMbMotionData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_3 );
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_3].limitComponents( m_cMin, m_cMax );
}
break;
default:
{
AF();
}
}
}
}
if( ( 2 == iPredCount ) && ( 2 == rcSH.getPPS().getWeightedBiPredIdc() ) )
{
Int iScal = rcSH.getDistScaleFactorWP( apcFrame[0], apcFrame[1] );
rcMC8x8D.m_acPW[LIST_1].scaleL1Weight( iScal );
rcMC8x8D.m_acPW[LIST_0].scaleL0Weight( rcMC8x8D.m_acPW[LIST_1] );
rcMC8x8D.m_apcPW[LIST_1] = &rcMC8x8D.m_acPW[LIST_1];
rcMC8x8D.m_apcPW[LIST_0] = &rcMC8x8D.m_acPW[LIST_0];
}
}
Void MotionCompensation::xPredLuma( YuvMbBuffer* apcTarBuffer[2], Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx )
{
B4x4Idx cIdx( rcMc8x8D.m_cIdx + eSParIdx );
for( Int n = 0; n < 2; n++ )
{
YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
const Mv cMv = rcMc8x8D.m_aacMv[n][eSParIdx];
m_pcQuarterPelFilter->predBlk( apcTarBuffer[n], pcRefBuffer, cIdx, cMv, iSizeY, iSizeX );
}
}
}
Void MotionCompensation::xPredChroma( YuvMbBuffer* apcTarBuffer[2], Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx )
{
B4x4Idx cIdx( rcMc8x8D.m_cIdx + eSParIdx );
for( Int n = 0; n < 2; n++ )
{
YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
Mv cMv = rcMc8x8D.m_aacMv[n][eSParIdx];
cMv.setVer( cMv.getVer() + rcMc8x8D.m_sChromaOffset[n] );
xPredChroma( apcTarBuffer[n], pcRefBuffer, cIdx, cMv, iSizeY, iSizeX );
}
}
}
Void MotionCompensation::xPredLuma( YuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D )
{
YuvMbBuffer* apcTarBuffer[2];
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
for( Int n = 0; n < 2; n++ )
{
YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
const Mv cMv = rcMc8x8D.m_aacMv[n][0];
m_pcQuarterPelFilter->predBlk( apcTarBuffer[n], pcRefBuffer, rcMc8x8D.m_cIdx, cMv, iSizeY, iSizeX );
}
}
m_pcSampleWeighting->weightLumaSamples( pcRecBuffer, iSizeX, iSizeY, rcMc8x8D.m_cIdx, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
}
Void MotionCompensation::xPredChroma( YuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, MC8x8D& rcMc8x8D )
{
YuvMbBuffer* apcTarBuffer[2];
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
for( Int n = 0; n < 2; n++ )
{
YuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
Mv cMv = rcMc8x8D.m_aacMv[n][0];
cMv.setVer( cMv.getVer() + rcMc8x8D.m_sChromaOffset[n] );
xPredChroma( apcTarBuffer[n], pcRefBuffer, rcMc8x8D.m_cIdx, cMv, iSizeY, iSizeX );
}
}
m_pcSampleWeighting->weightChromaSamples( pcRecBuffer, iSizeX, iSizeY, rcMc8x8D.m_cIdx, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
}
ErrVal MotionCompensation::compensateMb( MbDataAccess& rcMbDataAccess,
YuvMbBuffer* pcRecBuffer,
Bool bFaultTolerant,
Bool bCalcMv )
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
switch( eMbMode )
{
case MODE_16x16:
{
if( bCalcMv )
xCalc16x16( rcMbDataAccess, NULL );
MC8x8D cMC8x8D( B_8x8_0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D );
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
xPredChroma( pcRecBuffer, 8, 8, cMC8x8D );
}
break;
case MODE_16x8:
{
if( bCalcMv )
xCalc16x8( rcMbDataAccess, NULL );
MC8x8D cMC8x8D0( B_8x8_0 );
MC8x8D cMC8x8D1( B_8x8_2 );
xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D1 );
xPredLuma( pcRecBuffer, 16, 8, cMC8x8D0 );
xPredLuma( pcRecBuffer, 16, 8, cMC8x8D1 );
xPredChroma( pcRecBuffer, 8, 4, cMC8x8D0 );
xPredChroma( pcRecBuffer, 8, 4, cMC8x8D1 );
}
break;
case MODE_8x16:
{
if( bCalcMv )
xCalc8x16( rcMbDataAccess, NULL );
MC8x8D cMC8x8D0( B_8x8_0 );
MC8x8D cMC8x8D1( B_8x8_1 );
xGetMbPredData( rcMbDataAccess, cMC8x8D0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D1 );
xPredLuma( pcRecBuffer, 8, 16, cMC8x8D0 );
xPredLuma( pcRecBuffer, 8, 16, cMC8x8D1 );
xPredChroma( pcRecBuffer, 4, 8, cMC8x8D0 );
xPredChroma( pcRecBuffer, 4, 8, cMC8x8D1 );
}
break;
case MODE_SKIP:
{
if( rcMbDataAccess.getSH().isInterB() )
{
Bool bValid;
B8x8Idx c8x8Idx;
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant, bCalcMv ) );
ROF ( bValid )
}
else
{
if( bCalcMv )
rcMbDataAccess.getMvPredictorSkipMode();
MC8x8D cMC8x8D( B_8x8_0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D );
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
xPredChroma( pcRecBuffer, 8, 8, cMC8x8D );
return Err::m_nOK;
}
}
break;
case MODE_8x8:
case MODE_8x8ref0:
{
if( bCalcMv )
xCalc8x8( rcMbDataAccess, NULL, bFaultTolerant );
xPredMb8x8Mode( rcMbDataAccess, pcRecBuffer );
}
break;
default:
break;
}
return Err::m_nOK;
}
ErrVal MotionCompensation::calculateMb( MbDataAccess& rcMbDataAccess, Bool bFaultTolerant )
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
switch( eMbMode )
{
case MODE_16x16:
{
xCalc16x16( rcMbDataAccess, NULL );
}
break;
case MODE_16x8:
{
xCalc16x8( rcMbDataAccess, NULL );
}
break;
case MODE_8x16:
{
xCalc8x16( rcMbDataAccess, NULL );
}
break;
case MODE_SKIP:
{
if( rcMbDataAccess.getSH().isInterB() )
{
B8x8Idx c8x8Idx;
Bool bOneMv;
AOF( rcMbDataAccess.getMvPredictorDirect( c8x8Idx.b8x8(), bOneMv, bFaultTolerant ) ); c8x8Idx++;
AOF( rcMbDataAccess.getMvPredictorDirect( c8x8Idx.b8x8(), bOneMv, bFaultTolerant ) ); c8x8Idx++;
AOF( rcMbDataAccess.getMvPredictorDirect( c8x8Idx.b8x8(), bOneMv, bFaultTolerant ) ); c8x8Idx++;
AOF( rcMbDataAccess.getMvPredictorDirect( c8x8Idx.b8x8(), bOneMv, bFaultTolerant ) );
}
else
{
rcMbDataAccess.getMvPredictorSkipMode();
return Err::m_nOK;
}
}
break;
case MODE_8x8:
case MODE_8x8ref0:
{
xCalc8x8( rcMbDataAccess, NULL, bFaultTolerant );
}
break;
default:
break;
}
return Err::m_nOK;
}
Void MotionCompensation::xPredMb8x8Mode( MbDataAccess& rcMbDataAccess, YuvMbBuffer* pcRecBuffer )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++)
{
YuvMbBuffer* apcTarBuffer[2];
Par8x8 ePar8x8 = c8x8Idx.b8x8Index();
BlkMode eBlkMode = rcMbDataAccess.getMbData().getBlkMode( ePar8x8 );
MC8x8D cMC8x8D( ePar8x8 );
xGetBlkPredData( rcMbDataAccess, cMC8x8D, eBlkMode );
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
switch( eBlkMode )
{
case BLK_SKIP:
{
if( rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag() )
{
xPredLuma( apcTarBuffer, 8, 8, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
}
else
{
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_1 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_2 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_3 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_1 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_2 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_3 );
}
break;
}
case BLK_8x8:
{
xPredLuma( apcTarBuffer, 8, 8, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
break;
}
case BLK_8x4:
{
xPredLuma( apcTarBuffer, 8, 4, cMC8x8D, SPART_4x4_0 );
xPredLuma( apcTarBuffer, 8, 4, cMC8x8D, SPART_4x4_2 );
xPredChroma( apcTarBuffer, 4, 2, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 4, 2, cMC8x8D, SPART_4x4_2 );
break;
}
case BLK_4x8:
{
xPredLuma( apcTarBuffer, 4, 8, cMC8x8D, SPART_4x4_0 );
xPredLuma( apcTarBuffer, 4, 8, cMC8x8D, SPART_4x4_1 );
xPredChroma( apcTarBuffer, 2, 4, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 2, 4, cMC8x8D, SPART_4x4_1 );
break;
}
case BLK_4x4:
{
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_1 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_2 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_3 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_1 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_2 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_3 );
break;
}
default:
{
AF();
break;
}
}
m_pcSampleWeighting->weightLumaSamples ( pcRecBuffer, 8, 8, c8x8Idx, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
m_pcSampleWeighting->weightChromaSamples( pcRecBuffer, 4, 4, c8x8Idx, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
}
}
ErrVal MotionCompensation::compensateDirectBlock( MbDataAccess& rcMbDataAccess, YuvMbBuffer *pcRecBuffer, B8x8Idx c8x8Idx, Bool& rbValid, Bool bFaultTolerant, Bool bCalcMv )
{
rbValid = false;
Bool bOneMv = false;
if( bCalcMv )
{
ROFRS( rcMbDataAccess.getMvPredictorDirect( c8x8Idx.b8x8(), bOneMv, bFaultTolerant ), Err::m_nOK );
}
else
bOneMv = rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag();
MC8x8D cMC8x8D( c8x8Idx.b8x8Index() );
YuvMbBuffer* apcTarBuffer[2];
if( bOneMv )
{
xGetBlkPredData( rcMbDataAccess, cMC8x8D, BLK_8x8 );
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
xPredLuma( apcTarBuffer, 8, 8, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
}
else
{
xGetBlkPredData( rcMbDataAccess, cMC8x8D, BLK_4x4 );
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_0 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_1 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_2 );
xPredLuma( apcTarBuffer, 4, 4, cMC8x8D, SPART_4x4_3 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_0 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_1 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_2 );
xPredChroma( apcTarBuffer, 2, 2, cMC8x8D, SPART_4x4_3 );
}
m_pcSampleWeighting->weightLumaSamples ( pcRecBuffer, 8, 8, c8x8Idx, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
m_pcSampleWeighting->weightChromaSamples( pcRecBuffer, 4, 4, c8x8Idx, cMC8x8D.m_apcPW[LIST_0], cMC8x8D.m_apcPW[LIST_1] );
rbValid = true;
return Err::m_nOK;
}
ErrVal MotionCompensation::compensateDirectBlock( MbDataAccess& rcMbDataAccess, IntYuvMbBuffer *pcRecBuffer, B8x8Idx c8x8Idx, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1, Bool bSR )
{
Par8x8 ePar8x8 = c8x8Idx.b8x8Index();
IntMC8x8D cMC8x8D( ePar8x8 );
IntYuvMbBuffer* apcTarBuffer[2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -