📄 distortion.cpp
字号:
}
uiOffset1 += MB_BUFFER_WIDTH-8;
uiOffset2 += iStride;
}
pucSrc1 = pcDSS->pVSearch;
pucSrc2 = pcDSS->pVFix;
pucOrg = pcDSS->pVOrg;
iRows = pcDSS->iRows / 2;
uiOffset1 = 0;
uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 8; x != 0; x-- )
{
uiSumV += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-8;
uiOffset2 += iStride;
}
return uiSumY+uiSumU+uiSumV;
}
UInt XDistortion::xGetBiSAD8x( XDistSearchStruct* pcDSS )
{
UInt x;
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt uiSum = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
iStride -= 8;
for( ; iRows != 0; iRows-- )
{
for( x = 8; x != 0; x-- )
{
uiSum += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-8;
uiOffset2 += iStride;
}
return uiSum;
}
UInt XDistortion::xGetBiYuvSAD8x( XDistSearchStruct* pcDSS )
{
UInt x;
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride - 8;
Int iRows = pcDSS->iRows;
UInt uiSumY = 0;
UInt uiSumU = 0;
UInt uiSumV = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 8; x != 0; x-- )
{
uiSumY += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-8;
uiOffset2 += iStride;
}
pucSrc1 = pcDSS->pUSearch;
pucSrc2 = pcDSS->pUFix;
pucOrg = pcDSS->pUOrg;
iStride = pcDSS->iCStride - 4;
iRows = pcDSS->iRows / 2;
uiOffset1 = 0;
uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 4; x != 0; x-- )
{
uiSumU += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-4;
uiOffset2 += iStride;
}
pucSrc1 = pcDSS->pVSearch;
pucSrc2 = pcDSS->pVFix;
pucOrg = pcDSS->pVOrg;
iRows = pcDSS->iRows / 2;
uiOffset1 = 0;
uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 4; x != 0; x-- )
{
uiSumV += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-4;
uiOffset2 += iStride;
}
return uiSumY+uiSumU+uiSumV;
}
UInt XDistortion::xGetBiSAD4x( XDistSearchStruct* pcDSS )
{
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt x;
UInt uiSum = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
iStride -= 4;
for( ; iRows != 0; iRows-- )
{
for( x = 4; x != 0; x-- )
{
uiSum += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-4;
uiOffset2 += iStride;
}
return uiSum;
}
UInt XDistortion::xGetBiYuvSAD4x( XDistSearchStruct* pcDSS )
{
UInt x;
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride - 4;
Int iRows = pcDSS->iRows;
UInt uiSumY = 0;
UInt uiSumU = 0;
UInt uiSumV = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 4; x != 0; x-- )
{
uiSumY += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-4;
uiOffset2 += iStride;
}
pucSrc1 = pcDSS->pUSearch;
pucSrc2 = pcDSS->pUFix;
pucOrg = pcDSS->pUOrg;
iStride = pcDSS->iCStride - 2;
iRows = pcDSS->iRows / 2;
uiOffset1 = 0;
uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 2; x != 0; x-- )
{
uiSumU += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-2;
uiOffset2 += iStride;
}
pucSrc1 = pcDSS->pVSearch;
pucSrc2 = pcDSS->pVFix;
pucOrg = pcDSS->pVOrg;
iRows = pcDSS->iRows / 2;
uiOffset1 = 0;
uiOffset2 = 0;
for( ; iRows != 0; iRows-- )
{
for( x = 2; x != 0; x-- )
{
uiSumV += Abs( pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) );
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-2;
uiOffset2 += iStride;
}
return uiSumY+uiSumU+uiSumV;
}
UInt XDistortion::xGetBiSSE16x( XDistSearchStruct* pcDSS )
{
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt x;
UInt uiSum = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
Int iTemp;
iStride -= 16;
for( ; iRows != 0; iRows-- )
{
for( x = 16; x != 0; x-- )
{
iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
uiSum += iTemp * iTemp;
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-16;
uiOffset2 += iStride;
}
return uiSum;
}
UInt XDistortion::xGetBiSSE8x( XDistSearchStruct* pcDSS )
{
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt x;
UInt uiSum = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
Int iTemp;
iStride -= 8;
for( ; iRows != 0; iRows-- )
{
for( x = 8; x != 0; x-- )
{
iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
uiSum += iTemp * iTemp;
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-8;
uiOffset2 += iStride;
}
return uiSum;
}
UInt XDistortion::xGetBiSSE4x( XDistSearchStruct* pcDSS )
{
XPel* pucSrc1 = pcDSS->pYSearch;
XPel* pucSrc2 = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows;
UInt x;
UInt uiSum = 0;
UInt uiOffset1 = 0;
UInt uiOffset2 = 0;
Int iTemp;
iStride -= 4;
for( ; iRows != 0; iRows-- )
{
for( x = 4; x != 0; x-- )
{
iTemp = pucOrg[uiOffset1] - ((pucSrc1[uiOffset2] + pucSrc2[uiOffset1] + 1) >> 1) ;
uiSum += iTemp * iTemp;
uiOffset1++;
uiOffset2++;
}
uiOffset1 += MB_BUFFER_WIDTH-4;
uiOffset2 += iStride;
}
return uiSum;
}
UInt XDistortion::xGetBiHAD16x ( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucFix = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows>>2;
UInt uiSum = 0;
for( ; iRows != 0; iRows-- )
{
uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
uiSum += xCalcBiHadamard4x4( pucOrg+0x4, pucFix+0x4, pucCur+0x4, iStride );
uiSum += xCalcBiHadamard4x4( pucOrg+0x8, pucFix+0x8, pucCur+0x8, iStride );
uiSum += xCalcBiHadamard4x4( pucOrg+0xc, pucFix+0xc, pucCur+0xc, iStride );
pucOrg += 4*MB_BUFFER_WIDTH;
pucCur += 4*iStride;
pucFix += 4*MB_BUFFER_WIDTH;
}
return uiSum;
}
UInt XDistortion::xGetBiHAD8x ( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucFix = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows>>2;
UInt uiSum = 0;
for( ; iRows != 0; iRows-- )
{
uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
uiSum += xCalcBiHadamard4x4( pucOrg+0x4, pucFix+0x4, pucCur+0x4, iStride );
pucOrg += 4*MB_BUFFER_WIDTH;
pucCur += 4*iStride;
pucFix += 4*MB_BUFFER_WIDTH;
}
return uiSum;
}
UInt XDistortion::xGetBiHAD4x ( XDistSearchStruct* pcDSS )
{
XPel* pucCur = pcDSS->pYSearch;
XPel* pucFix = pcDSS->pYFix;
XPel* pucOrg = pcDSS->pYOrg;
Int iStride = pcDSS->iYStride;
Int iRows = pcDSS->iRows>>2;
UInt uiSum = 0;
for( ; iRows != 0; iRows-- )
{
uiSum += xCalcBiHadamard4x4( pucOrg+0x0, pucFix+0x0, pucCur+0x0, iStride );
pucOrg += 4*MB_BUFFER_WIDTH;
pucCur += 4*iStride;
pucFix += 4*MB_BUFFER_WIDTH;
}
return uiSum;
}
//TMM_WP
Void XDistortion::xGetWeight(XPel *pucRef, XPel *pucOrg, const UInt uiStride,
const UInt uiHeight, const UInt uiWidth,
Double &dDCOrg, Double &dDCRef)
{
/* get dc of org & ref frame */
for (UInt y = 0; y < uiHeight; y++)
{
for (UInt x = 0; x < uiWidth; x++)
{
dDCOrg += (Double)pucOrg[x];
dDCRef += (Double)pucRef[x];
}
pucOrg += uiStride;
pucRef += uiStride;
}
}
ErrVal XDistortion::getLumaWeight( YuvPicBuffer* pcOrgPicBuffer,
YuvPicBuffer* pcRefPicBuffer, Double& rfWeight,
UInt uiLumaLog2WeightDenom)
{
ROT( NULL == pcRefPicBuffer );
ROT( NULL == pcOrgPicBuffer );
const Int iStride = pcRefPicBuffer->getLStride();
const Int iHeight = pcRefPicBuffer->getLHeight();
const Int iWidth = pcRefPicBuffer->getLWidth();
AOT_DBG( iStride != pcOrgPicBuffer->getLStride() );
XPel* pucRef = pcRefPicBuffer->getLumOrigin();
XPel* pucOrg = pcOrgPicBuffer->getLumOrigin();
Double dDCOrg = 0;
Double dDCRef = 0;
xGetWeight( pucRef, pucOrg, iStride, iHeight, iWidth, dDCOrg, dDCRef);
if(dDCRef)
{
rfWeight = (Int) (rfWeight * dDCOrg / dDCRef + 0.5);
if(rfWeight < -64 || rfWeight > 127)
rfWeight = 1 << uiLumaLog2WeightDenom;
}
return Err::m_nOK;
}
ErrVal XDistortion::getChromaWeight( YuvPicBuffer* pcOrgPicBuffer,
YuvPicBuffer* pcRefPicBuffer,
Double& rfWeight, UInt uiChromaLog2WeightDenom, Bool bCb )
{
ROT( NULL == pcRefPicBuffer );
ROT( NULL == pcOrgPicBuffer );
/* no weights for chroma */
rfWeight = 1 << uiChromaLog2WeightDenom;
return Err::m_nOK;
}
ErrVal XDistortion::getLumaOffsets( YuvPicBuffer* pcOrgPicBuffer,
YuvPicBuffer* pcRefPicBuffer, Double& rfOffset )
{
ROT( NULL == pcRefPicBuffer );
ROT( NULL == pcOrgPicBuffer );
const Int iStride = pcRefPicBuffer->getLStride();
const Int iHeight = pcRefPicBuffer->getLHeight();
const Int iWidth = pcRefPicBuffer->getLWidth();
AOT_DBG( iStride != pcOrgPicBuffer->getLStride() );
XPel* pucRef = pcRefPicBuffer->getLumOrigin();
XPel* pucOrg = pcOrgPicBuffer->getLumOrigin();
Double dDCOrg = 0;
Double dDCRef = 0;
xGetWeight( pucRef, pucOrg, iStride, iHeight, iWidth, dDCOrg, dDCRef);
rfOffset = (Int) ( ( (dDCOrg - dDCRef)/ (iHeight * iWidth) ) + 0.5);
rfOffset = (rfOffset < -128) ? -128 : (rfOffset > 127 ? 127 : rfOffset);
return Err::m_nOK;
}
ErrVal XDistortion::getChromaOffsets( YuvPicBuffer* pcOrgPicBuffer,
YuvPicBuffer* pcRefPicBuffer,
Double& rfOffset, Bool bCb )
{
ROT( NULL == pcRefPicBuffer );
ROT( NULL == pcOrgPicBuffer );
/* no offsets for chroma */
rfOffset = 0;
return Err::m_nOK;
}
//TMM_WP
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -