在ADSP-BF561上使用x264(6):get_ref

下面我们尝试对耗时最多的get_ref函数进行优化,先看看get_ref的代码:

static uint8_t *get_ref( uint8_t *dst,   int *i_dst_stride,

                         uint8_t *src[4], int i_src_stride,

                         int mvx, int mvy,

                         int i_width, int i_height, const x264_weight_t *weight )

{

    int qpel_idx = ((mvy&3)<<2) + (mvx&3);

    int offset = (mvy>>2)*i_src_stride + (mvx>>2);

    uint8_t *src1 = src[hpel_ref0[qpel_idx]] + offset + ((mvy&3) == 3) * i_src_stride;

 

    if( qpel_idx & 5 ) /* qpel interpolation needed */

    {

        uint8_t *src2 = src[hpel_ref1[qpel_idx]] + offset + ((mvx&3) == 3);

        pixel_avg( dst, *i_dst_stride, src1, i_src_stride,

                   src2, i_src_stride, i_width, i_height );

        if( weight->weightfn )

            mc_weight( dst, *i_dst_stride, dst, *i_dst_stride, weight, i_width, i_height );

        return dst;

    }

    else if( weight->weightfn )

    {

        mc_weight( dst, *i_dst_stride, src1, i_src_stride, weight, i_width, i_height );

        return dst;

    }

    else

    {

        *i_dst_stride = i_src_stride;

        return src1;

    }

}

这一段代码完全没有循环,我们尝试调整其使用数据的位置,这里使用了两个全局变量:hpel_ref0hpel_ref1,它们定义为:

static const int hpel_ref0[16] = {0,1,1,1,0,1,1,1,2,3,3,3,0,1,1,1};

static const int hpel_ref1[16] = {0,0,0,0,2,2,3,2,2,2,3,2,2,2,3,2};

我们直接把它们放到L1里面去,再运行:

       encoded 301 frames, 2.02 fps, 1081.88 kb/s

似乎没有什么进步,再看cycles86416M,减少了76Mcycle

近日,我家6岁的小姑娘参加了第六届POP全国少儿英语风采大赛,拉票进行中(2011-6-15前)。

请帮忙点击新东方网站的链接:

http://popdasai.xdf.cn/toupiao.php?do=space&uid=4237

投她一票,谢谢!

你可能感兴趣的:(优化,DST)