motioncompensation.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,927 行 · 第 1/5 页
CPP
1,927 行
Int iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( c8x8Idx.b8x8() );
Int iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( c8x8Idx.b8x8() );
IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xPredMb8x8Mode( c8x8Idx, rcMbDataAccess, pcRefFrame0, pcRefFrame1, pcRecBuffer );
return Err::m_nOK;
}
Void MotionCompensation::xPredMb8x8Mode( B8x8Idx c8x8Idx,
MbDataAccess& rcMbDataAccess,
const IntFrame* pcRefFrame0,
const IntFrame* pcRefFrame1,
IntYuvMbBuffer* pcRecBuffer )
{
IntYuvMbBuffer* apcTarBuffer[2];
Par8x8 ePar8x8 = c8x8Idx.b8x8Index();
BlkMode eBlkMode = rcMbDataAccess.getMbData().getBlkMode( ePar8x8 );
IntMC8x8D cMC8x8D( ePar8x8 );
xGetBlkPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, 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::compensateMb( MbDataAccess& rcMbDataAccess,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
IntYuvMbBuffer* pcRecBuffer,
Bool bCalcMv)
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
switch( eMbMode )
{
case MODE_16x16:
{
if( bCalcMv )
{
xCalc16x16( rcMbDataAccess, NULL );
}
IntMC8x8D cMC8x8D( B_8x8_0 );
Int iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx();
Int iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx();
IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D );
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
xPredChroma( pcRecBuffer, 8, 8, cMC8x8D );
}
break;
case MODE_16x8:
{
if( bCalcMv )
{
xCalc16x8( rcMbDataAccess, NULL );
}
IntMC8x8D cMC8x8D0( B_8x8_0 );
IntMC8x8D cMC8x8D1( B_8x8_2 );
Int iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_16x8_0 );
Int iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_16x8_0 );
IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D0 );
iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_16x8_1 );
iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_16x8_1 );
pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, 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 );
}
IntMC8x8D cMC8x8D0( B_8x8_0 );
IntMC8x8D cMC8x8D1( B_8x8_1 );
Int iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_0 );
Int iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_0 );
IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D0 );
iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_1 );
iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_1 );
pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, 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() )
{
if( bCalcMv )
{
xCalcSDirect( rcMbDataAccess, NULL );
}
B8x8Idx c8x8Idx;
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); c8x8Idx++;
RNOK( compensateDirectBlock( rcMbDataAccess, pcRecBuffer, c8x8Idx, rcRefFrameList0, rcRefFrameList1 ) ); ;
}
else
{
// TMM_EC {{
if ( rcMbDataAccess.getSH().m_eErrorConceal == EC_TEMPORAL_DIRECT)
bCalcMv = true;
// TMM_EC }}
if( bCalcMv )
{
Mv cMvPred;
rcMbDataAccess.getMvPredictorSkipMode ( cMvPred );
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx ( 1 );
rcMbDataAccess.getMbMotionData( LIST_0 ).setAllMv ( cMvPred );
rcMbDataAccess.getMbMotionData( LIST_1 ).setRefIdx ( 0 );
rcMbDataAccess.getMbMotionData( LIST_1 ).setAllMv ( Mv::ZeroMv() );
}
IntMC8x8D cMC8x8D( B_8x8_0 );
Int iRefIdx0 = rcMbDataAccess.getMbMotionData( LIST_0 ).getRefIdx( PART_8x16_0 );
Int iRefIdx1 = rcMbDataAccess.getMbMotionData( LIST_1 ).getRefIdx( PART_8x16_0 );
IntFrame* pcRefFrame0 = ( iRefIdx0 > 0 ? rcRefFrameList0[ iRefIdx0 ] : NULL );
IntFrame* pcRefFrame1 = ( iRefIdx1 > 0 ? rcRefFrameList1[ iRefIdx1 ] : NULL );
xGetMbPredData( rcMbDataAccess, pcRefFrame0, pcRefFrame1, cMC8x8D );
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
xPredChroma( pcRecBuffer, 8, 8, cMC8x8D );
return Err::m_nOK;
}
}
break;
case MODE_8x8:
case MODE_8x8ref0:
printf("function not defined for the case\n");
RERR();
break;
default:
break;
}
return Err::m_nOK;
}
__inline Void MotionCompensation::xGetMbPredData( MbDataAccess& rcMbDataAccess,
const IntFrame* pcRefFrame0,
const IntFrame* pcRefFrame1,
IntMC8x8D& rcMC8x8D )
{
rcMC8x8D.clear();
Int iPredCount = 0;
const SliceHeader& rcSH = rcMbDataAccess.getSH();
const IntFrame* apcFrame[2];
for (Int n = 0; n < 2; n++)
{
const IntFrame* pcRefFrame = n ? pcRefFrame1 : pcRefFrame0;
ListIdx eLstIdx = ListIdx(n);
const MbMvData& rcMbMvdData = rcMbDataAccess.getMbMvdData( eLstIdx );
Mv3D& rcMv3D = rcMC8x8D.m_aacMv[eLstIdx][0];
rcMbDataAccess.getMbMotionData( eLstIdx ).getMv3D( rcMv3D, rcMC8x8D.m_cIdx );
rcMC8x8D.m_aacMvd[eLstIdx][SPART_4x4_0] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_0 );
if( pcRefFrame != NULL )
{
iPredCount++;
rcMv3D.limitComponents( m_cMin, m_cMax );
rcMC8x8D.m_apcRefBuffer [eLstIdx] = const_cast<IntFrame*>(pcRefFrame)->getFullPelYuvBuffer();
apcFrame[n] = pcRefFrame;
rcMC8x8D.m_apcPW[eLstIdx] = &rcSH.getPredWeight( eLstIdx, rcMv3D.getRef() );
}
}
if( ( 2 == iPredCount ) && ( 2 == rcSH.getPPS().getWeightedBiPredIdc() ) )
{
Int iScale = rcSH.getDistScaleFactorWP( apcFrame[0], apcFrame[1] );
rcMC8x8D.m_acPW[LIST_1].scaleL1Weight( iScale );
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];
}
}
__inline Void MotionCompensation::xGetBlkPredData( MbDataAccess& rcMbDataAccess,
const IntFrame* pcRefFrame0,
const IntFrame* pcRefFrame1,
IntMC8x8D& rcMC8x8D,
BlkMode eBlkMode )
{
rcMC8x8D.clear();
Int iPredCount = 0;
const SliceHeader& rcSH = rcMbDataAccess.getSH();
const IntFrame* apcFrame[2];
for( Int n = 0; n < 2; n++)
{
const IntFrame* pcRefFrame = n ? pcRefFrame1 : pcRefFrame0;
ListIdx eLstIdx = ListIdx( n );
Mv3D& rcMv3D = rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_0];
const MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx );
const MbMvData& rcMbMvdData = rcMbDataAccess.getMbMvdData( eLstIdx );
rcMbMotionData.getMv3D( rcMv3D, rcMC8x8D.m_cIdx + SPART_4x4_0 );
rcMv3D.limitComponents( m_cMin, m_cMax );
rcMC8x8D.m_aacMvd[eLstIdx][SPART_4x4_0] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_0 );
if( pcRefFrame != NULL )
{
iPredCount++;
rcMC8x8D.m_apcRefBuffer[eLstIdx] = const_cast<IntFrame*>(pcRefFrame)->getFullPelYuvBuffer();
apcFrame[n] = pcRefFrame;
rcMC8x8D.m_apcPW[eLstIdx] = &rcSH.getPredWeight( eLstIdx, rcMv3D.getRef() );
switch( eBlkMode )
{
case BLK_8x8:
break;
case BLK_8x4:
{
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_aacMvd[eLstIdx][SPART_4x4_2] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_2 );
}
break;
case BLK_4x8:
{
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_1] = rcMbMotionData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_1 );
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_1].limitComponents( m_cMin, m_cMax );
rcMC8x8D.m_aacMvd[eLstIdx][SPART_4x4_1] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_1 );
}
break;
case BLK_SKIP:
case BLK_4x4:
{
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_1] = rcMbMotionData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_1 );
rcMC8x8D.m_aacMv[eLstIdx][SPART_4x4_1].limitComponents( m_cMin, m_cMax );
rcMC8x8D.m_aacMvd[eLstIdx][SPART_4x4_1] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_1 );
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_aacMvd[eLstIdx][SPART_4x4_2] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_2 );
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 );
rcMC8x8D.m_aacMvd[eLstIdx][SPART_4x4_3] = rcMbMvdData.getMv( rcMC8x8D.m_cIdx + SPART_4x4_3 );
}
break;
default:
{
AF();
}
}
}
}
if( ( 2 == iPredCount ) && ( 2 == rcSH.getPPS().getWeightedBiPredIdc() ) )
{
Int iScale = rcSH.getDistScaleFactorWP( apcFrame[0], apcFrame[1] );
rcMC8x8D.m_acPW[LIST_1].scaleL1Weight( iScale );
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 forwardTransformChroma8x8(Transform* pcTransform,
XPel* piChroma,
Int iStride,
TCoeff* piCoeff)
{
pcTransform->e4x4Trafo( piChroma, iStride, piCoeff + 0x00 );
pcTr
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?