📄 loopfilter.cpp
字号:
/*************************************************************************
AVS1-P2视频解码器源码
版权所有:联合信源数字音视频技术(北京)有限公司, (c) 2005-2006
AVS1-P2 Video Decoder Source Code
(c) Copyright, NSCC All Rights Reserved, 2005-2006
*************************************************************************
Distributed under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*************************************************************************/
/*************************************************************************
文件名称: loopfilter.cpp
描 述: 环路滤波相关的一些函数
*************************************************************************/
/*************************************************************************
Revision History
data Modification Author
2005-4-6 Created jthou
*************************************************************************/
#include "loopfilter.h"
// BsH00 BsH01
//---------------------
//| | |
//|BsV00 |BsV01 |
//| | |
//| BsH10 | BsH11 |
//---------------------
//| | |
//|BsV10 |BsV11 |
//| | |
//| | |
//---------------------
void DeblockVBs2_Luma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<8; i++)
{
AVS_BYTE p2 = *(p-3);
AVS_BYTE p1 = *(p-2);
AVS_BYTE p0 = *(p-1);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+1);
AVS_BYTE q2 = *(p+2);
if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
{
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p-1) = (p1 + 2*p0 + q0 + 2) >> 2;
*(p-2) = (2*p1 + p0 + q0 + 2) >> 2;
}
else
{
*(p-1) = (2*p1 + p0 + q0 + 2) >> 2;
}
if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p ) = (q1 + 2*q0 + p0 + 2) >> 2;
*(p+1) = (2*q1 + q0 + p0 + 2) >> 2;
}
else
{
*(p ) = (2*q1 + q0 + p0 + 2) >> 2;
}
}
p += iStride;
}
}
void DeblockVBs1_Luma(AVS_BYTE* pStart,AVS_INT C, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<8; i++)
{
AVS_BYTE p2 = *(p-3);
AVS_BYTE p1 = *(p-2);
AVS_BYTE p0 = *(p-1);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+1);
AVS_BYTE q2 = *(p+2);
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-1) = Clip(p0+delta);
*(p ) = Clip(q0+delta);
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta)
*(p-2) = Clip(p1+Clip3(-C, C, (((*(p-1)-p1)*3 + (p2-*(p))+4)>>3)));
if(aq<Beta)
*(p+1) = Clip(q1-Clip3(-C, C, (((q1-*(p))*3 + (*(p-1)-q2)+4)>>3)));
}
p += iStride;
}
}
void DeblockHBs2_Luma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<8; i++)
{
AVS_BYTE p2 = *(p-3*iStride);
AVS_BYTE p1 = *(p-2*iStride);
AVS_BYTE p0 = *(p-iStride);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+iStride);
AVS_BYTE q2 = *(p+2*iStride);
if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
{
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p-iStride) = (p1 + 2*p0 + q0 + 2) >> 2;
*(p-2*iStride) = (2*p1 + p0 + q0 + 2) >> 2;
}
else
{
*(p-iStride) = (2*p1 + p0 + q0 + 2) >> 2;
}
if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p ) = (q1 + 2*q0 + p0 + 2) >> 2;
*(p+iStride) = (2*q1 + q0 + p0 + 2) >> 2;
}
else
{
*(p ) = (2*q1 + q0 + p0 + 2) >> 2;
}
}
p++;
}
}
void DeblockHBs1_Luma(AVS_BYTE* pStart,AVS_INT C, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<8; i++)
{
AVS_BYTE p2 = *(p-3*iStride);
AVS_BYTE p1 = *(p-2*iStride);
AVS_BYTE p0 = *(p-iStride);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+iStride);
AVS_BYTE q2 = *(p+2*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);
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta)
*(p-2*iStride) = Clip(p1+Clip3(-C, C, (((*(p-iStride)-p1)*3 + (p2-*(p))+4)>>3)));
if(aq<Beta)
*(p+iStride) = Clip(q1-Clip3(-C, C, (((q1-*(p))*3 + (*(p-iStride)-q2)+4)>>3)));
}
p++;
}
}
void DeblockVBs2_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<4; i++)
{
AVS_BYTE p2 = *(p-3);
AVS_BYTE p1 = *(p-2);
AVS_BYTE p0 = *(p-1);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+1);
AVS_BYTE q2 = *(p+2);
if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
{
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p-1) = (p1 + 2*p0 + q0 + 2) >> 2;
}
else
{
*(p-1) = (2*p1 + p0 + q0 + 2) >> 2;
}
if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
{
*(p ) = (q1 + 2*q0 + p0 + 2) >> 2;
}
else
{
*(p ) = (2*q1 + q0 + p0 + 2) >> 2;
}
}
p += iStride;
}
}
void DeblockVBs1_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 p2 = *(p-3);
AVS_BYTE p1 = *(p-2);
AVS_BYTE p0 = *(p-1);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+1);
AVS_BYTE q2 = *(p+2);
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-1) = Clip(p0+delta);
*(p ) = Clip(q0+delta);
}
p += iStride;
}
}
void DeblockHBs2_Chroma(AVS_BYTE* pStart, AVS_INT Alpha, AVS_INT Beta, AVS_INT iStride)
{
AVS_INT i;
AVS_BYTE* p = pStart;
for(i=0; i<4; i++)
{
AVS_BYTE p2 = *(p-3*iStride);
AVS_BYTE p1 = *(p-2*iStride);
AVS_BYTE p0 = *(p-iStride);
AVS_BYTE q0 = *p;
AVS_BYTE q1 = *(p+iStride);
AVS_BYTE q2 = *(p+2*iStride);
if(abs(p0-q0)<Alpha && abs(p1-p0)<Beta && abs(q1-q0)<Beta)
{
AVS_INT ap = abs(p2-p0);
AVS_INT aq = abs(q2-q0);
if(ap<Beta && abs(p0-q0)<((Alpha>>2)+2))
*(p-iStride) = (p1 + 2*p0 + q0 + 2) >> 2;
else
*(p-iStride) = (2*p1 + p0 + q0 + 2) >> 2;
if(aq<Beta && abs(p0-q0)<((Alpha>>2)+2))
*(p ) = (q1 + 2*q0 + p0 + 2) >> 2;
else
*(p ) = (2*q1 + q0 + p0 + 2) >> 2;
}
p ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -