static void predict_8x8_filter_c( pixel *src, pixel edge[36], int i_neighbor, int i_filters )
{
int have_lt = i_neighbor & MB_TOPLEFT;
if( i_filters & MB_LEFT ) //总是true
{
edge[15] = (src[(0)+(-1)*32] + 2*src[(-1)+(-1)*32] + src[(-1)+(0)*32] + 2) >> 2; //第一个像素的,左,上,左上三个像素的均值
edge[14] = ((have_lt ? src[(-1)+(-1)*32] : src[(-1)+(0)*32])
+ 2*src[(-1)+(0)*32] + src[(-1)+(1)*32] + 2) >> 2;
//左上角那个像素的值
edge[14-1] = (((src[(-1)+(1 -1)*32])+2*(src[(-1)+(1)*32])+(src[(-1)+(1 +1)*32])+2)>>2); //左边一列三个像素的均值
edge[14-2] = (((src[(-1)+(2 -1)*32])+2*(src[(-1)+(2)*32])+(src[(-1)+(2 +1)*32])+2)>>2); //上面三个像素均值,窗口往下滑动一个
edge[14-3] = (((src[(-1)+(3 -1)*32])+2*(src[(-1)+(3)*32])+(src[(-1)+(3 +1)*32])+2)>>2); //再滑动一个
edge[14-4] = (((src[(-1)+(4 -1)*32])+2*(src[(-1)+(4)*32])+(src[(-1)+(4 +1)*32])+2)>>2); //再滑动一个
edge[14-5] = (((src[(-1)+(5 -1)*32])+2*(src[(-1)+(5)*32])+(src[(-1)+(5 +1)*32])+2)>>2); //再滑动一个
edge[14-6] = (((src[(-1)+(6 -1)*32])+2*(src[(-1)+(6)*32])+(src[(-1)+(6 +1)*32])+2)>>2); //再滑动一个
edge[6] = edge[7] = (src[(-1)+(6)*32] + 3*src[(-1)+(7)*32] + 2) >> 2;
//最后两个左边缘像素不滑动窗口。 直接是当前这一列的左侧 + 3倍第7列 + 2 >> 2
}
if( i_filters & MB_TOP ) //总是true
{
int have_tr = i_neighbor & MB_TOPRIGHT;
edge[16] = ((have_lt ? src[(-1)+(-1)*32] : src[(0)+(-1)*32])
+ 2*src[(0)+(-1)*32] + src[(1)+(-1)*32] + 2) >> 2;
//有left top,就是左上角这个像素值
edge[16+1] = (((src[(1 -1)+(-1)*32])+2*(src[(1)+(-1)*32])+(src[(1 +1)+(-1)*32])+2)>>2); //上一行的0像素 + 1 像素 + 2 像素 >> 2
edge[16+2] = (((src[(2 -1)+(-1)32])+2(src[(2)+(-1)32])+(src[(2 +1)+(-1)32])+2)>>2); //上一行的0像素 + 1 像素 + 2 像素 >> 2 往右滑动窗口
edge[16+3] = (((src[(3 -1)+(-1)*32])+2*(src[(3)+(-1)*32])+(src[(3 +1)+(-1)*32])+2)>>2); //上一行的0像素 + 1 像素 + 2 像素 >> 2 往右滑动窗口
edge[16+4] = (((src[(4 -1)+(-1)*32])+2*(src[(4)+(-1)*32])+(src[(4 +1)+(-1)*32])+2)>>2); //上一行的0像素 + 1 像素 + 2 像素 >> 2 往右滑动窗口
edge[16+5] = (((src[(5 -1)+(-1)*32])+2*(src[(5)+(-1)*32])+(src[(5 +1)+(-1)*32])+2)>>2); //上一行的0像素 + 1 像素 + 2 像素 >> 2 往右滑动窗口
edge[16+6] = (((src[(6 -1)+(-1)*32])+2*(src[(6)+(-1)*32])+(src[(6 +1)+(-1)*32])+2)>>2);//上一行的0像素 + 1 像素 + 2 像素 >> 2 往右滑动窗口
edge[23] = (src[(6)+(-1)*32] + 2*src[(7)+(-1)*32]
+ (have_tr ? src[(8)+(-1)*32] : src[(7)+(-1)*32]) + 2) >> 2;
//最右边的像素, 6 + 2*7 + 右上方的两个相邻像素 求均值。
if( i_filters & MB_TOPRIGHT )
{
if( have_tr )
{
edge[16+8] = (((src[(8 -1)+(-1)*32])+2*(src[(8)+(-1)*32])+(src[(8 +1)+(-1)32])+2)>>2); // 上一行像素7 + 2 右上像素 1 + 右上像素2
edge[16+9] = (((src[(9 -1)+(-1)*32])+2*(src[(9)+(-1)*32])+(src[(9 +1)+(-1)*32])+2)>>2); // 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[16+10] = (((src[(10 -1)+(-1)*32])+2*(src[(10)+(-1)*32])+(src[(10 +1)+(-1)*32])+2)>>2);
// 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[16+11] = (((src[(11 -1)+(-1)*32])+2*(src[(11)+(-1)*32])+(src[(11 +1)+(-1)*32])+2)>>2);
// 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[16+12] = (((src[(12 -1)+(-1)*32])+2*(src[(12)+(-1)*32])+(src[(12 +1)+(-1)*32])+2)>>2);
// 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[16+13] = (((src[(13 -1)+(-1)*32])+2*(src[(13)+(-1)*32])+(src[(13 +1)+(-1)*32])+2)>>2);
// 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[16+14] = (((src[(14 -1)+(-1)*32])+2*(src[(14)+(-1)*32])+(src[(14 +1)+(-1)*32])+2)>>2);
// 上一行像素7 + 2 右上像素 1 + 右上像素2 往右 滑动一个
edge[31] =
edge[32] = (src[(14)+(-1)*32] + 3*src[(15)+(-1)*32] + 2) >> 2;
//右上 末尾的2个边缘像素的值
}
else
{
(((s264_union32_t*)(edge+24))->i) = ((src[(7)+(-1)*32])*0x01010101U);
(((s264_union32_t*)(edge+28))->i) = ((src[(7)+(-1)*32])*0x01010101U);
edge[32] = src[(7)+(-1)*32];
}
}
}
}