📄 motioncompensation.cpp
字号:
else if( iDy == 0 )
{
XPel A = pucSrc[x];
XPel B = pucSrc[x+1];
XPel b = ( A + B ) >> 1;
pucDest[x] = (Pel)( iDx == 1 ? (A+b+1)>>1 : iDx == 2 ? b : (b+B+1)>> 1 );
}
else if( iDx == 0 )
{
XPel A = pucSrc[x];
XPel C = pucSrc[x+iSrcStride];
XPel h = ( A + C ) >> 1;
pucDest[x] = (Pel)( iDy == 1 ? (A+h+1)>>1 : iDy == 2 ? h : (h+C+1)>> 1 );
}
else
{
XPel A = pucSrc[x];
XPel B = pucSrc[x+1];
XPel C = pucSrc[x+iSrcStride];
XPel D = pucSrc[x+iSrcStride+1];
XPel b = ( A + B ) >> 1;
XPel h = ( A + C ) >> 1;
XPel j = ( B + C ) >> 1;
XPel m = ( B + D ) >> 1;
XPel s = ( C + D ) >> 1;
if ( iDy == 1 ) pucDest[x] = (Pel)( iDx == 1 ? (b+h+1)>>1 : iDx == 2 ? (A+m+1)>>1 : (b+m+1)>> 1 );
else if( iDy == 2 ) pucDest[x] = (Pel)( iDx == 1 ? (C+b+1)>>1 : iDx == 2 ? j : (s+B+1)>> 1 );
else pucDest[x] = (Pel)( iDx == 1 ? (s+h+1)>>1 : iDx == 2 ? (D+h+1)>>1 : (s+m+1)>> 1 );
}
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
__inline Void MotionCompensation::xPredChroma( IntYuvMbBuffer* pcDesBuffer, IntYuvPicBuffer* pcSrcBuffer, LumaIdx cIdx, Mv cMv, Int iSizeY, Int iSizeX)
{
const Int iDesStride = pcDesBuffer->getCStride();
const Int iSrcStride = pcSrcBuffer->getCStride();
cMv.limitComponents( m_cMin, m_cMax );
Int iOffset = (cMv.getHor() >> 3) + (cMv.getVer() >> 3) * iSrcStride;
if( m_bRCDOC )
{
iOffset = ( ( cMv.getHor() + ( (Int)m_uiFrameNum & 1 ) ) >> 3 ) + ( ( cMv.getVer() + ( (Int)m_uiFrameNum & 1 ) ) >> 3 ) * iSrcStride;
}
xPredChromaPel( pcDesBuffer->getUBlk( cIdx ), iDesStride,
pcSrcBuffer->getUBlk( cIdx )+ iOffset, iSrcStride,
cMv, iSizeY, iSizeX );
xPredChromaPel( pcDesBuffer->getVBlk( cIdx ), iDesStride,
pcSrcBuffer->getVBlk( cIdx )+ iOffset, iSrcStride,
cMv, iSizeY, iSizeX );
}
Void MotionCompensation::xPredChroma( IntYuvMbBuffer* pcRecBuffer, Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D )
{
IntYuvMbBuffer* apcTarBuffer[2];
m_pcSampleWeighting->getTargetBuffers( apcTarBuffer, pcRecBuffer, rcMc8x8D.m_apcPW[LIST_0], rcMc8x8D.m_apcPW[LIST_1] );
for( Int n = 0; n < 2; n++ )
{
IntYuvPicBuffer* 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] );
}
Void MotionCompensation::xPredChroma( IntYuvMbBuffer* apcTarBuffer[2], Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx )
{
B4x4Idx cIdx( rcMc8x8D.m_cIdx + eSParIdx );
for( Int n = 0; n < 2; n++ )
{
IntYuvPicBuffer* 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 );
}
}
}
ErrVal MotionCompensation::updateSubMb( B8x8Idx c8x8Idx,
MbDataAccess& rcMbDataAccess,
IntFrame* pcMCFrame,
IntFrame* pcPrdFrame,
ListIdx eListPrd )
{
m_curMbX = rcMbDataAccess.getMbX();
m_curMbY = rcMbDataAccess.getMbY();
xUpdateMb8x8Mode( c8x8Idx, rcMbDataAccess, pcMCFrame, pcPrdFrame, eListPrd );
return Err::m_nOK;
}
Void MotionCompensation::xUpdateMb8x8Mode( B8x8Idx c8x8Idx,
MbDataAccess& rcMbDataAccess,
IntFrame* pcMCFrame,
IntFrame* pcPrdFrame,
ListIdx eListPrd )
{
Par8x8 ePar8x8 = c8x8Idx.b8x8Index();
BlkMode eBlkMode = rcMbDataAccess.getMbData().getBlkMode( ePar8x8 );
IntMC8x8D cMC8x8D( ePar8x8 );
if(eListPrd == LIST_0)
xGetBlkPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D, eBlkMode );
else
xGetBlkPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D, eBlkMode );
switch( eBlkMode )
{
case BLK_SKIP:
{
if( rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag() )
{
xUpdateBlk( pcPrdFrame, 8, 8, cMC8x8D, SPART_4x4_0 );
}
else
{
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_0 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_1 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_2 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_3 );
}
break;
}
case BLK_8x8:
{
xUpdateBlk( pcPrdFrame, 8, 8, cMC8x8D, SPART_4x4_0 );
break;
}
case BLK_8x4:
{
xUpdateBlk( pcPrdFrame, 8, 4, cMC8x8D, SPART_4x4_0 );
xUpdateBlk( pcPrdFrame, 8, 4, cMC8x8D, SPART_4x4_2 );
break;
}
case BLK_4x8:
{
xUpdateBlk( pcPrdFrame, 4, 8, cMC8x8D, SPART_4x4_0 );
xUpdateBlk( pcPrdFrame, 4, 8, cMC8x8D, SPART_4x4_1 );
break;
}
case BLK_4x4:
{
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_0 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_1 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_2 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_3 );
break;
}
default:
{
AF();
break;
}
}
}
ErrVal MotionCompensation::updateMb(MbDataAccess& rcMbDataAccess,
IntFrame* pcMCFrame,
IntFrame* pcPrdFrame,
ListIdx eListPrd,
Int iRefIdx)
{
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
m_curMbX = rcMbDataAccess.getMbX();
m_curMbY = rcMbDataAccess.getMbY();
switch( eMbMode )
{
case MODE_16x16:
{
IntMC8x8D cMC8x8D( B_8x8_0 );
if( rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx() == iRefIdx )
{
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D );
xUpdateBlk( pcPrdFrame, 16, 16, cMC8x8D);
}
}
break;
case MODE_16x8:
{
IntMC8x8D cMC8x8D0( B_8x8_0 );
IntMC8x8D cMC8x8D1( B_8x8_2 );
if( rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx(PART_16x8_0) == iRefIdx )
{
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D0 );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D0 );
xUpdateBlk( pcPrdFrame, 16, 8, cMC8x8D0 );
}
if( rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx(PART_16x8_1) == iRefIdx )
{
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D1 );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D1 );
xUpdateBlk( pcPrdFrame, 16, 8, cMC8x8D1 );
}
}
break;
case MODE_8x16:
{
IntMC8x8D cMC8x8D0( B_8x8_0 );
IntMC8x8D cMC8x8D1( B_8x8_1 );
if( rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx(PART_8x16_0) == iRefIdx )
{
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D0 );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D0 );
xUpdateBlk( pcPrdFrame, 8, 16, cMC8x8D0 );
}
if( rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx(PART_8x16_1) == iRefIdx )
{
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D1 );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D1 );
xUpdateBlk( pcPrdFrame, 8, 16, cMC8x8D1 );
}
}
break;
case MODE_SKIP:
{
if( rcMbDataAccess.getSH().isInterB() )
{
B8x8Idx c8x8Idx;
RNOK( updateDirectBlock( rcMbDataAccess, pcMCFrame, pcPrdFrame, eListPrd, iRefIdx, c8x8Idx ) ); c8x8Idx++;
RNOK( updateDirectBlock( rcMbDataAccess, pcMCFrame, pcPrdFrame, eListPrd, iRefIdx, c8x8Idx ) ); c8x8Idx++;
RNOK( updateDirectBlock( rcMbDataAccess, pcMCFrame, pcPrdFrame, eListPrd, iRefIdx, c8x8Idx ) ); c8x8Idx++;
RNOK( updateDirectBlock( rcMbDataAccess, pcMCFrame, pcPrdFrame, eListPrd, iRefIdx, c8x8Idx ) ); ;
}
else
{
IntMC8x8D cMC8x8D( B_8x8_0 );
if(rcMbDataAccess.getMbMotionData(eListPrd).getRefIdx(PART_8x16_0) != iRefIdx)
return Err::m_nOK;
if(eListPrd == LIST_0)
xGetMbPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D );
else
xGetMbPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D );
xUpdateBlk( pcPrdFrame, 16, 16, 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;
}
ErrVal MotionCompensation::updateDirectBlock( MbDataAccess& rcMbDataAccess,
IntFrame* pcMCFrame,
IntFrame* pcPrdFrame,
ListIdx eListPrd,
Int iRefIdx,
B8x8Idx c8x8Idx )
{
Par8x8 ePar8x8 = c8x8Idx.b8x8Index();
IntMC8x8D cMC8x8D( ePar8x8 );
if(rcMbDataAccess.getMbData().getMbMotionData(eListPrd).getRefIdx(ePar8x8) != iRefIdx)
return Err::m_nOK;
if( rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag() )
{
if(eListPrd == LIST_0)
xGetBlkPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D, BLK_8x8 );
else
xGetBlkPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D, BLK_8x8 );
xUpdateBlk( pcPrdFrame, 8, 8, cMC8x8D, SPART_4x4_0 );
}
else
{
if(eListPrd == LIST_0)
xGetBlkPredData( rcMbDataAccess, pcMCFrame, NULL, cMC8x8D, BLK_4x4 );
else
xGetBlkPredData( rcMbDataAccess, NULL, pcMCFrame, cMC8x8D, BLK_4x4 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_0 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_1 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_2 );
xUpdateBlk( pcPrdFrame, 4, 4, cMC8x8D, SPART_4x4_3 );
}
return Err::m_nOK;
}
Void MotionCompensation::xUpdateBlk( IntFrame* pcPrdFrame, Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D)
{
UShort weight;
xUpdateLuma( pcPrdFrame, iSizeX, iSizeY, rcMc8x8D, &weight);
xUpdateChroma(pcPrdFrame, iSizeX/2, iSizeY/2, rcMc8x8D, &weight);
}
Void MotionCompensation::xUpdateBlk( IntFrame* pcPrdFrame, Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx )
{
UShort weight;
xUpdateLuma( pcPrdFrame, iSizeX, iSizeY, rcMc8x8D, eSParIdx, &weight);
xUpdateChroma(pcPrdFrame, iSizeX/2, iSizeY/2, rcMc8x8D, eSParIdx, &weight);
}
Void MotionCompensation::xUpdateLuma( IntFrame* pcPrdFrame, Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D, UShort *usWeight)
{
for( Int n = 0; n < 2; n++ )
{
IntYuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
const Mv cMv = rcMc8x8D.m_aacMv[n][0];
const Mv dMv = rcMc8x8D.m_aacMvd[n][0];
if( dMv.getAbsHor() + dMv.getAbsVer() >= DMV_THRES)
continue;
updateBlkAdapt( pcPrdFrame->getFullPelYuvBuffer(), pcRefBuffer, rcMc8x8D.m_cIdx, cMv, iSizeY, iSizeX, usWeight);
}
}
}
Void MotionCompensation::xUpdateLuma( IntFrame* pcPrdFrame, Int iSizeX, Int iSizeY, IntMC8x8D& rcMc8x8D, SParIdx4x4 eSParIdx, UShort *usWeight )
{
B4x4Idx cIdx( rcMc8x8D.m_cIdx + eSParIdx );
for( Int n = 0; n < 2; n++ )
{
IntYuvPicBuffer* pcRefBuffer = rcMc8x8D.m_apcRefBuffer[n];
if( NULL != pcRefBuffer )
{
const Mv cMv = rcMc8x8D.m_aacMv[n][eSParIdx];
const Mv dMv = rcMc8x8D.m_aacMvd[n][eSParIdx];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -