📄 loopfilter.cpp
字号:
}
}
void DeblockHBs1_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT C, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<4; i++)
{
AVS_BYTE p1 = *(p-2*iStride);
AVS_BYTE p0 = *(p-iStride);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+iStride);
if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
{
AVS_INT delta = Clip3(-C, C, (((q0-p0)*3+(p1-q1)+4)>>3));
*(p-iStride) = Clip(p0+delta);
*(p ) = Clip(q0+delta);
}
p++;
}
}
AVS_INT GetStrengthP(AVS_DWORD dwRefIdxP, AVS_DWORD dwRefIdxQ, MOTIONVECTOR* pMvP, MOTIONVECTOR* pMvQ)
{
if(dwRefIdxP != dwRefIdxQ ||
abs(pMvP->x - pMvQ->x) >= 4 ||
abs(pMvP->y - pMvQ->y) >= 4)
return 1;
else
return 0;
}
AVS_INT GetStrengthB(MOTIONVECTOR* pMvP, MOTIONVECTOR* pMvQ, MOTIONVECTOR* pMvBwP, MOTIONVECTOR* pMvBwQ)
{
if(abs(pMvP->x - pMvQ->x) >= 4 ||
abs(pMvP->y - pMvQ->y) >= 4 ||
abs(pMvBwP->x - pMvBwQ->x) >= 4 ||
abs(pMvBwP->y - pMvBwQ->y) >= 4)
return 1;
else
return 0;
}
/************************************************************************/
/* 函数功能:滤波亮度BsV00边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsV00_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex-1]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + imgY*iStride + imgX;
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockVBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockVBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsV10边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsV10_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex-1]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + (imgY+8)*iStride + imgX;
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockVBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockVBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsV01边 */
/* - 位置参见标准文档 */
/************************************************************************/
void DeblockMb_BsV01_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = pMbP->dwMbQp;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + imgY*iStride + (imgX+8);
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockVBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockVBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsV11边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsV11_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = pMbP->dwMbQp;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + (imgY+8)*iStride + (imgX+8);
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockVBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockVBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsH00边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsH00_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex-dwMbWidth]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + imgY*iStride + imgX;
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockHBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsH01边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsH01_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex-dwMbWidth]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + imgY*iStride + (imgX+8);
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockHBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsH00边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsH10_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = pMbP->dwMbQp;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + (imgY+8)*iStride + imgX;
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockHBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波亮度BsH11边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsH11_Luma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = pMbP->dwMbQp;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<4;
AVS_INT imgY = (dwMbIndex/dwMbWidth)<<4;
AVS_BYTE* p = pImgData + (imgY+8)*iStride + (imgX+8);
AVS_INT C = CLIP_TABLE[IndexA];
if(Bs == 2)
DeblockHBs2_Luma(p, Alpha, Beta, iStride);
else if(Bs == 1)
DeblockHBs1_Luma(p, C, Alpha, Beta, iStride);
}
/************************************************************************/
/* 函数功能:滤波色度BsV00边 */
/* - 位置参见标准文档 */
/* - 调用时先判断该边是否在边界处 */
/************************************************************************/
void DeblockMb_BsV00_Chroma(AVS_INT Bs, MBINFO* pMbInfo, AVS_DWORD dwMbIndex, AVS_DWORD dwMbWidth, AVS_INT iImgType, AVS_INT iAlphaOffset, AVS_INT iBetaOffset, AVS_BYTE* pImgData, AVS_INT iStride)
{
MBINFO* pMbP = &(pMbInfo[dwMbIndex-1]);
MBINFO* pMbQ = &(pMbInfo[dwMbIndex]);
AVS_INT QPav = (pMbP->dwMbQp + pMbQ->dwMbQp + 1)/2;
AVS_INT IndexA = Clip3(0, 63, QPav+iAlphaOffset);
AVS_INT IndexB = Clip3(0, 63, QPav+iBetaOffset);
AVS_INT Alpha = ALPHA_TABLE[IndexA];
AVS_INT Beta = BETA_TABLE[IndexB];
AVS_INT imgX = (dwMbIndex%dwMbWidth)<<3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -