📄 distortion.cpp
字号:
for( n = 0; n < 4; n++ )
{
aai[n][0] = pucOrg[0] - ((pucCur[0] + pPelFix[0] + 1)>>1);
aai[n][1] = pucOrg[1] - ((pucCur[1] + pPelFix[1] + 1)>>1);
aai[n][2] = pucOrg[2] - ((pucCur[2] + pPelFix[2] + 1)>>1);
aai[n][3] = pucOrg[3] - ((pucCur[3] + pPelFix[3] + 1)>>1);
pucCur += iStride;
pucOrg += MB_BUFFER_WIDTH;
pPelFix += 24;
}
for( n = 0; n < 4; n++ )
{
ai[0] = aai[0][n] + aai[3][n];
ai[1] = aai[1][n] + aai[2][n];
ai[2] = aai[1][n] - aai[2][n];
ai[3] = aai[0][n] - aai[3][n];
aai[0][n] = ai[0] + ai[1];
aai[2][n] = ai[0] - ai[1];
aai[1][n] = ai[2] + ai[3];
aai[3][n] = ai[3] - ai[2];
}
for( n = 0; n < 4; n++ )
{
ai[0] = aai[n][0] + aai[n][3];
ai[1] = aai[n][1] + aai[n][2];
ai[2] = aai[n][1] - aai[n][2];
ai[3] = aai[n][0] - aai[n][3];
uiSum += Abs( ai[0] + ai[1] );
uiSum += Abs( ai[0] - ai[1] );
uiSum += Abs( ai[2] + ai[3] );
uiSum += Abs( ai[3] - ai[2] );
}
return uiSum/2;
}
#endif
UInt XDistortion::xGetSAD16x( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSum = 0;
#if JMVM_ONLY // JVT-U052
long offset = 0;
const long shifts = ( pcDSS->iRows==16 ? 8 : ( pcDSS->iRows==8 ? 7 : 0 ) );
if (pcDSS->sIcpInMs.sIcAct)
{
// FIND OFFSET
// In this version, compensation for only luminance is considered
for (; iRows !=0; iRows--)
{
offset += pucOrg[0x0] - pucCur[0x0];
offset += pucOrg[0x1] - pucCur[0x1];
offset += pucOrg[0x2] - pucCur[0x2];
offset += pucOrg[0x3] - pucCur[0x3];
offset += pucOrg[0x4] - pucCur[0x4];
offset += pucOrg[0x5] - pucCur[0x5];
offset += pucOrg[0x6] - pucCur[0x6];
offset += pucOrg[0x7] - pucCur[0x7];
offset += pucOrg[0x8] - pucCur[0x8];
offset += pucOrg[0x9] - pucCur[0x9];
offset += pucOrg[0xa] - pucCur[0xa];
offset += pucOrg[0xb] - pucCur[0xb];
offset += pucOrg[0xc] - pucCur[0xc];
offset += pucOrg[0xd] - pucCur[0xd];
offset += pucOrg[0xe] - pucCur[0xe];
offset += pucOrg[0xf] - pucCur[0xf];
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
offset >>= shifts;
pcDSS->sIcpInMs.sOffset = offset;
pucCur = pcDSS->pYSearch;
pucOrg = pcDSS->pYOrg;
iRows = pcDSS->iRows;
for(; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0x0] - pucCur[0x0] - offset );
uiSum += Abs( pucOrg[0x1] - pucCur[0x1] - offset );
uiSum += Abs( pucOrg[0x2] - pucCur[0x2] - offset );
uiSum += Abs( pucOrg[0x3] - pucCur[0x3] - offset );
uiSum += Abs( pucOrg[0x4] - pucCur[0x4] - offset );
uiSum += Abs( pucOrg[0x5] - pucCur[0x5] - offset );
uiSum += Abs( pucOrg[0x6] - pucCur[0x6] - offset );
uiSum += Abs( pucOrg[0x7] - pucCur[0x7] - offset );
uiSum += Abs( pucOrg[0x8] - pucCur[0x8] - offset );
uiSum += Abs( pucOrg[0x9] - pucCur[0x9] - offset );
uiSum += Abs( pucOrg[0xa] - pucCur[0xa] - offset );
uiSum += Abs( pucOrg[0xb] - pucCur[0xb] - offset );
uiSum += Abs( pucOrg[0xc] - pucCur[0xc] - offset );
uiSum += Abs( pucOrg[0xd] - pucCur[0xd] - offset );
uiSum += Abs( pucOrg[0xe] - pucCur[0xe] - offset );
uiSum += Abs( pucOrg[0xf] - pucCur[0xf] - offset );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
else
{
for( ; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSum += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSum += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSum += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSum += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSum += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSum += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSum += Abs( pucOrg[0x7] - pucCur[0x7] );
uiSum += Abs( pucOrg[0x8] - pucCur[0x8] );
uiSum += Abs( pucOrg[0x9] - pucCur[0x9] );
uiSum += Abs( pucOrg[0xa] - pucCur[0xa] );
uiSum += Abs( pucOrg[0xb] - pucCur[0xb] );
uiSum += Abs( pucOrg[0xc] - pucCur[0xc] );
uiSum += Abs( pucOrg[0xd] - pucCur[0xd] );
uiSum += Abs( pucOrg[0xe] - pucCur[0xe] );
uiSum += Abs( pucOrg[0xf] - pucCur[0xf] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
#else
for( ; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSum += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSum += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSum += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSum += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSum += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSum += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSum += Abs( pucOrg[0x7] - pucCur[0x7] );
uiSum += Abs( pucOrg[0x8] - pucCur[0x8] );
uiSum += Abs( pucOrg[0x9] - pucCur[0x9] );
uiSum += Abs( pucOrg[0xa] - pucCur[0xa] );
uiSum += Abs( pucOrg[0xb] - pucCur[0xb] );
uiSum += Abs( pucOrg[0xc] - pucCur[0xc] );
uiSum += Abs( pucOrg[0xd] - pucCur[0xd] );
uiSum += Abs( pucOrg[0xe] - pucCur[0xe] );
uiSum += Abs( pucOrg[0xf] - pucCur[0xf] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
#endif
return uiSum;
}
UInt XDistortion::xGetYuvSAD16x( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSumY = 0;
UInt uiSumU = 0;
UInt uiSumV = 0;
#if JMVM_ONLY // JVT-U052
long offset = 0;
const long shifts = ( pcDSS->iRows==16 ? 8 : ( pcDSS->iRows==8 ? 7 : 0 ) );
if (pcDSS->sIcpInMs.sIcAct)
{
// FIND OFFSET
// In this version, compensation for only luminance is considered
for (; iRows !=0; iRows--)
{
offset += pucOrg[0x0] - pucCur[0x0];
offset += pucOrg[0x1] - pucCur[0x1];
offset += pucOrg[0x2] - pucCur[0x2];
offset += pucOrg[0x3] - pucCur[0x3];
offset += pucOrg[0x4] - pucCur[0x4];
offset += pucOrg[0x5] - pucCur[0x5];
offset += pucOrg[0x6] - pucCur[0x6];
offset += pucOrg[0x7] - pucCur[0x7];
offset += pucOrg[0x8] - pucCur[0x8];
offset += pucOrg[0x9] - pucCur[0x9];
offset += pucOrg[0xa] - pucCur[0xa];
offset += pucOrg[0xb] - pucCur[0xb];
offset += pucOrg[0xc] - pucCur[0xc];
offset += pucOrg[0xd] - pucCur[0xd];
offset += pucOrg[0xe] - pucCur[0xe];
offset += pucOrg[0xf] - pucCur[0xf];
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
offset >>= shifts;
pcDSS->sIcpInMs.sOffset = offset;
pucCur = pcDSS->pYSearch;
pucOrg = pcDSS->pYOrg;
iRows = pcDSS->iRows;
for(; iRows != 0; iRows-- )
{
uiSumY += Abs( pucOrg[0x0] - pucCur[0x0] - offset );
uiSumY += Abs( pucOrg[0x1] - pucCur[0x1] - offset );
uiSumY += Abs( pucOrg[0x2] - pucCur[0x2] - offset );
uiSumY += Abs( pucOrg[0x3] - pucCur[0x3] - offset );
uiSumY += Abs( pucOrg[0x4] - pucCur[0x4] - offset );
uiSumY += Abs( pucOrg[0x5] - pucCur[0x5] - offset );
uiSumY += Abs( pucOrg[0x6] - pucCur[0x6] - offset );
uiSumY += Abs( pucOrg[0x7] - pucCur[0x7] - offset );
uiSumY += Abs( pucOrg[0x8] - pucCur[0x8] - offset );
uiSumY += Abs( pucOrg[0x9] - pucCur[0x9] - offset );
uiSumY += Abs( pucOrg[0xa] - pucCur[0xa] - offset );
uiSumY += Abs( pucOrg[0xb] - pucCur[0xb] - offset );
uiSumY += Abs( pucOrg[0xc] - pucCur[0xc] - offset );
uiSumY += Abs( pucOrg[0xd] - pucCur[0xd] - offset );
uiSumY += Abs( pucOrg[0xe] - pucCur[0xe] - offset );
uiSumY += Abs( pucOrg[0xf] - pucCur[0xf] - offset );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
else
{
for( ; iRows != 0; iRows-- )
{
uiSumY += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSumY += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSumY += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSumY += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSumY += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSumY += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSumY += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSumY += Abs( pucOrg[0x7] - pucCur[0x7] );
uiSumY += Abs( pucOrg[0x8] - pucCur[0x8] );
uiSumY += Abs( pucOrg[0x9] - pucCur[0x9] );
uiSumY += Abs( pucOrg[0xa] - pucCur[0xa] );
uiSumY += Abs( pucOrg[0xb] - pucCur[0xb] );
uiSumY += Abs( pucOrg[0xc] - pucCur[0xc] );
uiSumY += Abs( pucOrg[0xd] - pucCur[0xd] );
uiSumY += Abs( pucOrg[0xe] - pucCur[0xe] );
uiSumY += Abs( pucOrg[0xf] - pucCur[0xf] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
#else
for( ; iRows != 0; iRows-- )
{
uiSumY += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSumY += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSumY += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSumY += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSumY += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSumY += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSumY += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSumY += Abs( pucOrg[0x7] - pucCur[0x7] );
uiSumY += Abs( pucOrg[0x8] - pucCur[0x8] );
uiSumY += Abs( pucOrg[0x9] - pucCur[0x9] );
uiSumY += Abs( pucOrg[0xa] - pucCur[0xa] );
uiSumY += Abs( pucOrg[0xb] - pucCur[0xb] );
uiSumY += Abs( pucOrg[0xc] - pucCur[0xc] );
uiSumY += Abs( pucOrg[0xd] - pucCur[0xd] );
uiSumY += Abs( pucOrg[0xe] - pucCur[0xe] );
uiSumY += Abs( pucOrg[0xf] - pucCur[0xf] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
#endif
pucCur = pcDSS->pUSearch;
pucOrg = pcDSS->pUOrg;
iStride = pcDSS->iCStride;
iRows = pcDSS->iRows / 2;
for( ; iRows != 0; iRows-- )
{
uiSumU += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSumU += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSumU += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSumU += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSumU += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSumU += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSumU += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSumU += Abs( pucOrg[0x7] - pucCur[0x7] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
pucCur = pcDSS->pVSearch;
pucOrg = pcDSS->pVOrg;
iRows = pcDSS->iRows / 2;
for( ; iRows != 0; iRows-- )
{
uiSumV += Abs( pucOrg[0x0] - pucCur[0x0] );
uiSumV += Abs( pucOrg[0x1] - pucCur[0x1] );
uiSumV += Abs( pucOrg[0x2] - pucCur[0x2] );
uiSumV += Abs( pucOrg[0x3] - pucCur[0x3] );
uiSumV += Abs( pucOrg[0x4] - pucCur[0x4] );
uiSumV += Abs( pucOrg[0x5] - pucCur[0x5] );
uiSumV += Abs( pucOrg[0x6] - pucCur[0x6] );
uiSumV += Abs( pucOrg[0x7] - pucCur[0x7] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
return uiSumY+uiSumU+uiSumV;
}
UInt XDistortion::xGetSSE16x( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSum = 0;
Int iTemp;
for( ; iRows != 0; iRows-- )
{
iTemp = pucOrg[0x0] - pucCur[0x0];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x1] - pucCur[0x1];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x2] - pucCur[0x2];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x3] - pucCur[0x3];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x4] - pucCur[0x4];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x5] - pucCur[0x5];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x6] - pucCur[0x6];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x7] - pucCur[0x7];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x8] - pucCur[0x8];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0x9] - pucCur[0x9];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xa] - pucCur[0xa];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xb] - pucCur[0xb];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xc] - pucCur[0xc];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xd] - pucCur[0xd];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xe] - pucCur[0xe];
uiSum += iTemp * iTemp;
iTemp = pucOrg[0xf] - pucCur[0xf];
uiSum += iTemp * iTemp;
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
return uiSum;
}
UInt XDistortion::xGetSAD8x( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSum = 0;
#if JMVM_ONLY // JVT-U052
long offset = 0;
const long shifts = ( pcDSS->iRows==16 ? 7 : ( pcDSS->iRows==8 ? 6 : 0 ) );
if (pcDSS->sIcpInMs.sIcAct)
{
// FIND OFFSET
// In this version, compensation for only luminance is considered
for (; iRows !=0; iRows--)
{
offset += pucOrg[0] - pucCur[0];
offset += pucOrg[1] - pucCur[1];
offset += pucOrg[2] - pucCur[2];
offset += pucOrg[3] - pucCur[3];
offset += pucOrg[4] - pucCur[4];
offset += pucOrg[5] - pucCur[5];
offset += pucOrg[6] - pucCur[6];
offset += pucOrg[7] - pucCur[7];
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
offset >>= shifts;
pcDSS->sIcpInMs.sOffset = offset;
pucCur = pcDSS->pYSearch;
pucOrg = pcDSS->pYOrg;
iRows = pcDSS->iRows;
for(; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0] - pucCur[0] - offset );
uiSum += Abs( pucOrg[1] - pucCur[1] - offset );
uiSum += Abs( pucOrg[2] - pucCur[2] - offset );
uiSum += Abs( pucOrg[3] - pucCur[3] - offset );
uiSum += Abs( pucOrg[4] - pucCur[4] - offset );
uiSum += Abs( pucOrg[5] - pucCur[5] - offset );
uiSum += Abs( pucOrg[6] - pucCur[6] - offset );
uiSum += Abs( pucOrg[7] - pucCur[7] - offset );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
else
{
for( ; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0] - pucCur[0] );
uiSum += Abs( pucOrg[1] - pucCur[1] );
uiSum += Abs( pucOrg[2] - pucCur[2] );
uiSum += Abs( pucOrg[3] - pucCur[3] );
uiSum += Abs( pucOrg[4] - pucCur[4] );
uiSum += Abs( pucOrg[5] - pucCur[5] );
uiSum += Abs( pucOrg[6] - pucCur[6] );
uiSum += Abs( pucOrg[7] - pucCur[7] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
}
#else
for( ; iRows != 0; iRows-- )
{
uiSum += Abs( pucOrg[0] - pucCur[0] );
uiSum += Abs( pucOrg[1] - pucCur[1] );
uiSum += Abs( pucOrg[2] - pucCur[2] );
uiSum += Abs( pucOrg[3] - pucCur[3] );
uiSum += Abs( pucOrg[4] - pucCur[4] );
uiSum += Abs( pucOrg[5] - pucCur[5] );
uiSum += Abs( pucOrg[6] - pucCur[6] );
uiSum += Abs( pucOrg[7] - pucCur[7] );
pucOrg += MB_BUFFER_WIDTH;
pucCur += iStride;
}
#endif
return uiSum;
}
UInt XDistortion::xGetYuvSAD8x( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSumY = 0;
UInt uiSumU = 0;
UInt uiSumV = 0;
#if JMVM_ONLY // JVT-U052
long offset = 0;
const long shifts = ( pcDSS->iRows==16 ? 7 : ( pcDSS->iRows==8 ? 6 : 0 ) );
if (pcDSS->sIcpInMs.sIcAct)
{
// FIND OFFSET
// In this version, compensation for only luminance is considered
for (; iRows !=0; iRows--)
{
offset += pucOrg[0] - pucCur[0];
offset += pucOrg[1] - pucCur[1];
offset += pucOrg[2] - pucCur[2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -