Libmpeg2 学习笔记

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代码的时候更容易理解而已

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值