📄 quarterpelfilter.cpp
字号:
pucDest += iDestStride;
}
}
Void QuarterPelFilter::xPredDx2Dy13( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
Short asTemp[16*(16+6)];
Short* psTemp = asTemp;
xPredDx2( asTemp, pucSrc, iSrcStride, uiSizeY, uiSizeX );
iDy = (iDy == 1) ? 0 : 0x10;
for( UInt y = 0; y < uiSizeY; y++)
{
for( UInt x = 0; x < uiSizeX; x++)
{
Int iIndex = x + 0x20;
Int iTemp;
iTemp = psTemp[ 0x00 + iIndex];
iTemp += psTemp[ 0x10 + iIndex];
iTemp = iTemp << 2;
iTemp -= psTemp[-0x10 + iIndex];
iTemp -= psTemp[ 0x20 + iIndex];
iTemp += iTemp << 2;
iTemp += psTemp[-0x20 + iIndex];
iTemp += psTemp[ 0x30 + iIndex];
iTemp = gClip( (iTemp + 512) / 1024 );
pucDest[x] = (iTemp + gClip( (psTemp[iDy + iIndex] + 16) / 32 ) + 1) / 2;
}
psTemp += 0x10;
pucDest += iDestStride;
}
}
Void QuarterPelFilter::xPredDy2Dx13( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
iDx = (iDx == 1) ? 2 : 3;
for( UInt y = 0; y < uiSizeY; y++)
{
Int aiTemp[6+16];
for( UInt n = 0; n < 6+uiSizeX; n++)
{
Pel* puc = pucSrc + n - 2;
aiTemp[n] = puc[ 0*iSrcStride];
aiTemp[n] += puc[ 1*iSrcStride];
aiTemp[n] = aiTemp[n] << 2;
aiTemp[n] -= puc[-1*iSrcStride];
aiTemp[n] -= puc[ 2*iSrcStride];
aiTemp[n] += aiTemp[n] << 2;
aiTemp[n] += puc[-2*iSrcStride];
aiTemp[n] += puc[ 3*iSrcStride];
}
for( UInt x = 0; x < uiSizeX; x++)
{
Int iTemp = 0;
for( Int n = 0; n < 6; n++ )
{
iTemp += aiTemp[n+x]*g_aiTapCoeff[n];
}
iTemp = gClip( (iTemp + 512) / 1024 );
pucDest[x] = (iTemp + gClip( (aiTemp[x+iDx] + 16) / 32 ) + 1) / 2;
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
Void QuarterPelFilter::xPredElse( Pel* pucDest, Pel* pucSrc, Int iDestStride, Int iSrcStride, Int iDx, Int iDy, UInt uiSizeY, UInt uiSizeX )
{
Pel* pucSrcX = pucSrc;
Pel* pucSrcY = pucSrc;
pucSrcY += (iDx == 1) ? 0 : 1;
pucSrcX += (iDy == 1) ? 0 : iSrcStride;
for( UInt y = 0; y < uiSizeY; y++)
{
for( UInt x = 0; x < uiSizeX; x++)
{
Int iTempX;
iTempX = pucSrcX[x - 0];
iTempX += pucSrcX[x + 1];
iTempX = iTempX << 2;
iTempX -= pucSrcX[x - 1];
iTempX -= pucSrcX[x + 2];
iTempX += iTempX << 2;
iTempX += pucSrcX[x - 2];
iTempX += pucSrcX[x + 3];
iTempX = gClip( (iTempX + 16) / 32 );
Int iTempY;
iTempY = pucSrcY[x - 0*iSrcStride];
iTempY += pucSrcY[x + 1*iSrcStride];
iTempY = iTempY << 2;
iTempY -= pucSrcY[x - 1*iSrcStride];
iTempY -= pucSrcY[x + 2*iSrcStride];
iTempY += iTempY << 2;
iTempY += pucSrcY[x - 2*iSrcStride];
iTempY += pucSrcY[x + 3*iSrcStride];
iTempY = gClip( (iTempY + 16) / 32 );
pucDest[x] = (iTempX + iTempY + 1) >> 1;
}
pucDest += iDestStride;
pucSrcX += iSrcStride;
pucSrcY += iSrcStride;
}
}
ErrVal QuarterPelFilter::filterFrame( YuvPicBuffer *pcPelBuffer, YuvPicBuffer *pcHalfPelBuffer )
{
ROT( NULL == pcPelBuffer );
ROT( NULL == pcHalfPelBuffer );
Pel* pucSrc = pcPelBuffer->getMbLumAddr ();
Int iHeight = pcPelBuffer->getLHeight ();
Int iWidth = pcPelBuffer->getLWidth ();
Int iStride = pcPelBuffer->getLStride ();
Int iMargin = pcPelBuffer->getLXMargin ();
UInt uiTmpXSize = (iMargin + iWidth + iMargin) * 2;
UInt uiTmpYSize = iMargin + iHeight + iMargin;
Int iMarginNew = iMargin-4;
Int x, y;
XPel* psTemp = new XPel[uiTmpXSize * uiTmpYSize];
::memset( psTemp, 0x00, (uiTmpXSize * uiTmpYSize)*sizeof(XPel) );
ROT( NULL == psTemp )
XPel* ps = &psTemp[ iMargin * uiTmpXSize + 2*iMargin ];
if( m_b4Tap) // V090
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp += iTemp << 3;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
ps[2*x] = pucSrc[x]<<4;
ps[2*x+1] = iTemp;
}
ps += uiTmpXSize;
pucSrc += iStride;
}
} // V090
else if( m_bRCDO )
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp = iTemp << 2;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
iTemp += iTemp << 2;
iTemp += pucSrc[x - 2];
iTemp += pucSrc[x + 3];
ps[2*x] = pucSrc[x];
ps[2*x+1] = (XPel)xClip((iTemp + 6) >> 5);
}
ps += uiTmpXSize;
pucSrc += iStride;
}
}
else
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp = iTemp << 2;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
iTemp += iTemp << 2;
iTemp += pucSrc[x - 2];
iTemp += pucSrc[x + 3];
ps[2*x] = pucSrc[x]<<5;
ps[2*x+1] = iTemp;
}
ps += uiTmpXSize;
pucSrc += iStride;
}
}
// bot
ps -= iMargin*2;
for( y = 0; y < iMargin; y++ )
{
::memcpy( &ps[y*uiTmpXSize], &ps[(y-1)*uiTmpXSize], uiTmpXSize*sizeof(XPel) );
}
//top
ps = &psTemp[ iMargin * uiTmpXSize ];
for( y = 0; y < iMargin; y++ )
{
::memcpy( &ps[-(y+1)*uiTmpXSize], &ps[-y*uiTmpXSize], uiTmpXSize*sizeof(XPel) );
}
ps = &psTemp[ 4*uiTmpXSize + 2*iMargin ];
iStride = uiTmpXSize;
Int iDesStrideHP = pcHalfPelBuffer->getLStride();
Pel* pucDesHP = pcHalfPelBuffer->getMbLumAddr();
pucDesHP -= (iMarginNew*iDesStrideHP)<<1;
if( m_b4Tap) // V090
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
Int iTemp;
iTemp = ps[x - 0*iStride];
iTemp += ps[x + 1*iStride];
iTemp += iTemp << 3;
iTemp -= ps[x - 1*iStride];
iTemp -= ps[x + 2*iStride];
pucDesHP[x] = xClip( ( ps[x] + 8) >> 4);
pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 128) >> 8);
}
pucDesHP += iDesStrideHP<<1;
ps += iStride;
}
} // V090
else if( m_bRCDO )
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
pucDesHP[x] = (Pel)ps[x];
if( ( x & 1 ) == 0 )
pucDesHP[x+iDesStrideHP] = (Pel)xClip( ( (ps[x+iStride]+ps[x])*5 - ps[x+2*iStride] - ps[x-iStride] + 1 ) >> 3 );
else
pucDesHP[x+iDesStrideHP] = (Pel)( ps[x+iStride-1] + ps[x+1] ) >> 1;
}
pucDesHP += iDesStrideHP<<1;
ps += iStride;
}
}
else
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
Int iTemp;
iTemp = ps[x - 0*iStride];
iTemp += ps[x + 1*iStride];
iTemp = iTemp << 2;
iTemp -= ps[x - 1*iStride];
iTemp -= ps[x + 2*iStride];
iTemp += iTemp << 2;
iTemp += ps[x - 2*iStride];
iTemp += ps[x + 3*iStride];
pucDesHP[x] = xClip( ( ps[x] + 16) / 32);
pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 512) / 1024);
}
pucDesHP += iDesStrideHP<<1;
ps += iStride;
}
}
delete [] psTemp;
psTemp = NULL;
return Err::m_nOK;
}
ErrVal QuarterPelFilter::filterFrame( IntYuvPicBuffer *pcPelBuffer, IntYuvPicBuffer *pcHalfPelBuffer )
{
ROT( NULL == pcPelBuffer );
ROT( NULL == pcHalfPelBuffer );
XPel* pucSrc = pcPelBuffer->getMbLumAddr ();
Int iHeight = pcPelBuffer->getLHeight ();
Int iWidth = pcPelBuffer->getLWidth ();
Int iStride = pcPelBuffer->getLStride ();
Int iMargin = pcPelBuffer->getLXMargin ();
UInt uiTmpXSize = (iMargin + iWidth + iMargin) * 2;
UInt uiTmpYSize = iMargin + iHeight + iMargin;
Int iMarginNew = iMargin-4;
Int x, y;
XXPel* psTemp = new XXPel[uiTmpXSize * uiTmpYSize];
::memset( psTemp, 0x00, (uiTmpXSize * uiTmpYSize)*sizeof(XXPel) );
ROT( NULL == psTemp )
XXPel* ps = &psTemp[ iMargin * uiTmpXSize + 2*iMargin ]; // fix provided by Shijun Sun
if( m_b4Tap) // V090
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp += iTemp << 3;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
ps[2*x] = pucSrc[x]<<4;
ps[2*x+1] = iTemp;
}
ps += uiTmpXSize;
pucSrc += iStride;
}
} // V090
else if( m_bRCDO )
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp = iTemp << 2;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
iTemp += iTemp << 2;
iTemp += pucSrc[x - 2];
iTemp += pucSrc[x + 3];
ps[2*x] = pucSrc[x];
ps[2*x+1] = (XPel)xClip((iTemp + 6) >> 5);
}
ps += uiTmpXSize;
pucSrc += iStride;
}
}
else
{
for( y = 0; y < iHeight; y++ )
{
for( x = -iMarginNew; x < iWidth+iMarginNew; x++ )
{
Int iTemp;
iTemp = pucSrc[x - 0];
iTemp += pucSrc[x + 1];
iTemp = iTemp << 2;
iTemp -= pucSrc[x - 1];
iTemp -= pucSrc[x + 2];
iTemp += iTemp << 2;
iTemp += pucSrc[x - 2];
iTemp += pucSrc[x + 3];
ps[2*x] = pucSrc[x]<<5;
ps[2*x+1] = iTemp;
}
ps += uiTmpXSize;
pucSrc += iStride;
}
}
// bot
ps -= iMargin*2; // fix provided by Shijun Sun
for( y = 0; y < iMargin; y++ ) // fix provided by Shijun Sun
{
::memcpy( &ps[y*uiTmpXSize], &ps[(y-1)*uiTmpXSize], uiTmpXSize*sizeof(XXPel) );
}
//top
ps = &psTemp[ iMargin * uiTmpXSize ]; // fix provided by Shijun Sun
for( y = 0; y < iMargin; y++ ) // fix provided by Shijun Sun
{
::memcpy( &ps[-(y+1)*uiTmpXSize], &ps[-y*uiTmpXSize], uiTmpXSize*sizeof(XXPel) );
}
ps = &psTemp[ 4*uiTmpXSize + 2*iMargin ]; // fix provided by Shijun Sun
iStride = uiTmpXSize;
Int iDesStrideHP = pcHalfPelBuffer->getLStride();
XPel* pucDesHP = pcHalfPelBuffer->getMbLumAddr();
pucDesHP -= (iMarginNew*iDesStrideHP)<<1;
if( m_b4Tap) // V090
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
Int iTemp;
iTemp = ps[x - 0*iStride];
iTemp += ps[x + 1*iStride];
iTemp += iTemp << 3;
iTemp -= ps[x - 1*iStride];
iTemp -= ps[x + 2*iStride];
pucDesHP[x] = xClip( ( ps[x] + 8) >> 4);
pucDesHP[x+iDesStrideHP] = xClip( ( iTemp + 128) >> 8);
}
pucDesHP += iDesStrideHP<<1;
ps += iStride;
}
} // V090
else if( m_bRCDO )
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
pucDesHP[x] = (XPel)ps[x];
if( ( x & 1 ) == 0 )
pucDesHP[x+iDesStrideHP] = (XPel)xClip( ( (ps[x+iStride]+ps[x])*5 - ps[x+2*iStride] - ps[x-iStride] + 1 ) >> 3 );
else
pucDesHP[x+iDesStrideHP] = (XPel)( ps[x+iStride-1] + ps[x+1] ) >> 1;
}
pucDesHP += iDesStrideHP<<1;
ps += iStride;
}
}
else
{
for( y = -iMarginNew; y < iHeight+iMarginNew; y++ )
{
for( x = -2*iMarginNew; x < 2*(iWidth+iMarginNew); x++ )
{
Int iTemp;
iTemp = ps[x - 0*iStride];
iTemp += ps[x + 1*iStride];
iTemp = iTemp << 2;
iTemp -= ps[x - 1*iStride];
iTemp -= ps[x + 2*iStride];
iTemp += iTemp << 2;
iTemp += ps[x - 2*iStride];
iTemp += ps[x + 3*iStride];
pucDesHP[x] = xClip( ( ps[x] + 16) / 32);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -