• 2004-10-07

    libmpeg2中idct算法的mmx优化

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://ffmpeg.blogbus.com/logs/429563.html

     libmpeg2中idct算法的mmx优化,俺看了一遍,发现并没有用快速idct算法,只不过是利用idct的定义综合了x86 MMX的非常好的simd特点,进行了一些顺序上的调整。

    简要介绍如下:

    目标:是将8点的X矢量变换到8点的Y矢量
         变换矩阵为8×8的C矩阵
    可以写为
         Y=X*C

    C矩阵本来是cos((2n+1)*k*pi/16)的形式

    经过化解得到如下矩阵:
    C4  C1  C2  C3  C4  C5  C6  C7
    C4  C3  C6 -C7 -C4 -C1 -C2 -C5
    C4  C5 -C6 -C1 -C4  C7  C2  C3
    C4  C7 -C2 -C5  C4  C3 -C6 -C1
    C4 -C7 -C2  C5  C4 -C3 -C6  C1
    C4 -C5 -C6  C1 -C4 -C7  C2 -C3
    C4 -C3  C6  C7 -C4  C1 -C2  C5
    C4 -C1  C2 -C3  C4 -C5  C6 -C7
    注:C##n=cos(pi*n/16)

    从上面矩阵可以看出两个特点:
        1。偶数列的上四行和下四行是对称的
        2。奇数列的上四行和下四行是反对称的
    有了这俩规律,下面的IDCT代码就顺理成章了

    a0=x[0]*C4+x[2]*C2+x[4]*C4+x[6]*C6
    a1=x[0]*C4+x[2]*C6-x[4]*C4-x[6]*C2
    a2=x[0]*C4-x[2]*C6-x[4]*C4+x[6]*C2
    a3=x[0]*C4-x[2]*C2+x[4]*C4-x[6]*C6
    b0=x[1]*C1+x[3]*C3+x[5]*C5+x[7]*C7
    b1=x[1]*C3-x[3]*C7-x[5]*C1-x[7]*C5
    b2=x[1]*C5-x[3]*C1+x[5]*C7+x[7]*C3
    b3=x[1]*C7-x[3]*C5+x[5]*C3-x[7]*C1
    y[0]=a0+b0;
    y[7]=a0-b0;
    y[1]=a1+b1;
    y[6]=a1-b1;
    y[2]=a2+b2;
    y[5]=a2-b2;
    y[3]=a3+b3;
    y[4]=a3-b3;

    这么规范的代码,对于MMX来说,正是它的拿手好戏
    这个代码转换成mmx应该不是难事了,其实是现成的,我把它整理一下,是希望读mmx代码的时候更容易理解而已


    收藏到:Del.icio.us




    评论

  • 这个解释好像有问题,中间不是很懂