motioncompensation.cpp
来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,966 行 · 第 1/5 页
CPP
1,966 行
{
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];
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];
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();
#if JMVM_ONLY // JVT-U052
MbIcp cMbIcp;
#endif
switch( eMbMode )
{
case MODE_16x16:
{
if( bCalcMv )
xCalc16x16( rcMbDataAccess, NULL );
MC8x8D cMC8x8D( B_8x8_0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D );
#if JMVM_ONLY // JVT-U052
if( rcMbDataAccess.getSH().getIcEnable() )
{
if (rcMbDataAccess.getMbData().getMbIcp().getIcAct())
xInverseDPCMIcp( rcMbDataAccess );
cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
xPredLuma( cMbIcp, pcRecBuffer, 16, 16, cMC8x8D );
}
else
{
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
}
#else
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
#endif
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 )
#if JMVM_ONLY // JVT-U052
if( rcMbDataAccess.getSH().getIcEnable() )
{
IntMC8x8D cMC8x8D( B_8x8_0 );
//JVT-W031
if( rcMbDataAccess.getMbData().getSkipFlag() )
{
Icp cIcp = rcMbDataAccess.getMbData().getMbIcp().getIcp();
cIcp.setIcAct( cIcp.getPredIcAct() );
rcMbDataAccess.getMbData().getMbIcp().setAllIcp( cIcp );
}
// ---
if( rcMbDataAccess.getMbData().getMbIcp().getIcAct() )
{
xInverseDPCMIcp( rcMbDataAccess );
cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
xIcForPredLuma( cMbIcp, pcRecBuffer, cMC8x8D.m_cIdx, 16, 16 );
}
}
#endif
}
else
{
if( bCalcMv )
rcMbDataAccess.getMvPredictorSkipMode();
MC8x8D cMC8x8D( B_8x8_0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D );
#if JMVM_ONLY // JVT-U052
if ( rcMbDataAccess.getSH().getIcEnable() )
{
cMbIcp = rcMbDataAccess.getMbData().getMbIcp();
xPredLuma( cMbIcp, pcRecBuffer, 16, 16, cMC8x8D );
}
else
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
#else
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
#endif
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;
}
#if JMVM_ONLY // JVT-W081
ErrVal MotionCompensation::compensateMbMotionSkip ( MbDataAccess& rcMbDataAccess,
YuvMbBuffer* pcRecBuffer,
Bool bFaultTolerant,
Bool bCalcMv )
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
switch( eMbMode )
{
case MODE_16x16:
{
MC8x8D cMC8x8D( B_8x8_0 );
xGetMbPredData( rcMbDataAccess, cMC8x8D );
xPredLuma( pcRecBuffer, 16, 16, cMC8x8D );
xPredChroma( pcRecBuffer, 8, 8, cMC8x8D );
}
break;
case MODE_16x8:
{
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:
{
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( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) ); c8x8Idx++;
ROF ( bValid )
RNOK( compensateDirectBlockMotionSkip( rcMbDataAccess, pcRecBuffer, c8x8Idx, bValid, bFaultTolerant ) );
ROF ( bValid )
}
else
{
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:
{
xPredMb8x8Mode( rcMbDataAccess, pcRecBuffer );
}
break;
default:
break;
}
return Err::m_nOK;
}
ErrVal MotionCompensation::compensateMbMotionSkip ( MbDataAccess& rcMbDataAccess,
RefFrameList& rcRefFrameList0,
RefFrameList& rcRefFrameList1,
IntYuvMbBuffer* pcRecBuffer,
Bool bCalcMv )
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
switch( eMbMode )
{
case MODE_16x16:
{
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:
{
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:
{
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() )
{
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 }}
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 );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?