x264中8x8 INTRA预测边缘像素块构造

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];

            }

        }

    }

}

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值