-
2004-10-07
libmpeg2中idct算法的mmx优化
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
libmpeg2中idct算法的mmx优化,俺看了一遍,发现并没有用快速idct算法,只不过是利用idct的定义综合了x86 MMX的非常好的simd特点,进行了一些顺序上的调整。
http://ffmpeg.blogbus.com/logs/429563.html
简要介绍如下:
目标:是将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代码的时候更容易理解而已随机文章:
xvid 代码的几个小bug 2005-01-08rmp4包简单介绍 2004-12-28读取码流的函数 2004-12-23YUV2RGB565(16位色) 2004-12-03oh my god,我改,改,改 2004-11-27
收藏到:Del.icio.us








评论