先介绍最终真正完成滤波工作的几个函数:
static inline void deblock_luma_c( uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0 ) //!< bS=1~3时的滤波
{
int i, d;
for( i = 0; i < 4; i++ ) //!< 宏块的一条边界分成4段(即4x4块的边界)
{
if( tc0[i] < 0 ) //!< 小于0时bS=0,即不滤波,故跳过
{
pix += 4*ystride;
continue;
}
for( d = 0; d < 4; d++ ) //!< 遍历边界像素点
{
const int p2 = pix[-3*xstride];
const int p1 = pix[-2*xstride];
const int p0 = pix[-1*xstride];
const int q0 = pix[ 0*xstride];
const int q1 = pix[ 1*xstride];
const int q2 = pix[ 2*xstride];
if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta ) //!< 只有三个条件同时满足,才会进行滤波
{
int tc = tc0[i];
int delta;
if( abs( p2 - p0 ) < beta )
{
pix[-2*xstride] = p1 + x264_clip3( (( p2 + ((p0 + q0 + 1) >> 1)) >> 1) - p1, -tc0[i], tc0[i] ); //!< (8-478)
tc++;
}
if( abs( q2 - q0 ) < beta )
{
pix[ 1*xstride] = q1 + x264_clip3( (( q2 + ((p0 + q0 + 1) >> 1)) >> 1) - q1, -tc0[i], tc0[i] ); //!< (8-480)
tc++;
}
delta = x264_clip3( (((q0 - p