搜索 社区服务 统计排行 帮助
  • 4016阅读
  • 23回复

[尝试]让x264变得更快……(放弃

楼层直达
级别: 工作组
注册时间:
2005-05-03
在线时间:
0小时
发帖:
2914
今天做了个小小的尝试,在x264运行的起始点稍微改了一下,强制所有浮点运算都使用32位长度。因为浮点运算本来就不准确,而且视频编码也不是什么要求特别精确的东西,所以想看看这样能不能提升速度。
实验的结果是,速度稍微有一点点提升。以下是编码日志

x264 [info]: slice I:5 Avg QP:15.14 size: 19088
x264 [info]: slice P:302 Avg QP:15.42 size: 1057
x264 [info]: slice B:193 Avg QP:17.60 size: 308
x264 [info]: consecutive B-frames: 33.7% 33.9% 26.7% 5.7%
x264 [info]: mb I I16..4: 13.3% 49.5% 37.2%
x264 [info]: mb P I16..4: 0.3% 0.4% 0.2% P16..4: 29.3% 3.1% 2.6% 0.1% 0.0%skip:64.0%
x264 [info]: mb B I16..4: 0.2% 0.0% 0.0% B16..8: 6.6% 0.1% 0.1% direct: 7.7% skip:85.2% L0:47.4% L1:50.0% BI: 2.7%
x264 [info]: 8x8 transform intra:45.2% inter:48.6%
x264 [info]: ref P L0 83.2% 9.8% 6.9%
x264 [info]: ref B L0 77.3% 22.7%
x264 [info]: ref B L1 86.4% 13.6%
x264 [info]: SSIM Mean Y:0.9939956
x264 [info]: kb/s:182.1

encoded 500 frames, 12.78 fps, 182.40 kb/s
这个是修改前的


x264 [info]: slice I:5 Avg QP:15.14 size: 19088
x264 [info]: slice P:302 Avg QP:15.42 size: 1057
x264 [info]: slice B:193 Avg QP:17.60 size: 308
x264 [info]: consecutive B-frames: 33.7% 33.9% 26.7% 5.7%
x264 [info]: mb I I16..4: 13.3% 49.5% 37.2%
x264 [info]: mb P I16..4: 0.3% 0.4% 0.2% P16..4: 29.3% 3.1% 2.6% 0.1% 0.0%skip:64.0%
x264 [info]: mb B I16..4: 0.2% 0.0% 0.0% B16..8: 6.6% 0.1% 0.1% direct: 7.7% skip:85.2% L0:47.4% L1:50.0% BI: 2.7%
x264 [info]: 8x8 transform intra:45.2% inter:48.6%
x264 [info]: ref P L0 83.2% 9.8% 6.9%
x264 [info]: ref B L0 77.3% 22.7%
x264 [info]: ref B L1 86.4% 13.6%
x264 [info]: SSIM Mean Y:0.9939956
x264 [info]: kb/s:182.1

encoded 500 frames, 13.09 fps, 182.40 kb/s
这是修改后的

发现ssim的值没有变(不过二进制比较编码结果,是不同的

测试使用的原版和改版下载:
http://www.namipan.com/d/06a68aa3d45a94e71f7dcd05f12afc5a399091b5cbae0500

具体所做的修改,是在程序运行的最开始,加一句代码,把fpu的运算控制寄存器给改了,变成单精度……达到提速的目的(虽然不确定这到底是不是偶然现象……因为速度差别确实是不大)。
步骤:
在x264.exe 0x680字节处(在内存中运行的时候,是0x401280),把
pushebp
mov ebp, esp
sub esp, 8
改为
jmp 00496348
nop

然后在0x95748字节处(内存0x496348)把那一串零改为
pushebp
mov ebp, esp
sub esp, 8
fldcw word ptr [496359]
jmp 00401286


最后把0x95759字节处(内存0x496359)的两个字节改为 7f 00
然后就算改完了
(不过也不能确定x264在运行过程中会不会把这个标志改回来)


ps:以下是发本贴的目的……
有没有人能指导我如何编译自己的x264?最好能从获取代码开始一直到获得编译好的exe……如果能尝试拿源代码来下手,修改起来会容易的多
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 23楼 发表于: 2008-10-24
一般用的是SAD和SSD。这个用C写出来很容易啊。
级别: 工作组
注册时间:
2005-10-19
在线时间:
31小时
发帖:
3613
只看该作者 22楼 发表于: 2008-10-24
引用
最初由 roozhou 发布


MAD是指?

或者是SAD?几个月前弄的这会儿忘了,反正是算差值

凡是未完全安装Office字体的,以下英语短语请无视~~

Knowledge is infinite.


级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 21楼 发表于: 2008-10-23
没用的,函数、变量、asm块通通加volatile都没用。

你见过这种事情吗
asm ( ... );

ok


asm ( ... );
if (xxx) return 0;

asm里面出错

xxx和asm里的东西半点关系都没有,而且出错时return 1;从来没有被执行过。
级别: 工作组
注册时间:
2005-05-03
在线时间:
0小时
发帖:
2914
只看该作者 20楼 发表于: 2008-10-23
引用
最初由 roozhou 发布


x264用的是yasm,其实我也不太懂。我自己加的部分用的是gcc 的inline 汇编,但gcc总莫名其妙的“优化”某些部分导致出错。


asm部分加上 __volatile__
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 19楼 发表于: 2008-10-23
引用
最初由 绿叶之砚 发布
当初就为了整个ME算法,折腾了我1个月……

roozhou,我到现在还不知道如何实现两个MB的MAD值比较,当初都是套用fullsearch的算法


MAD是指?
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 18楼 发表于: 2008-10-23
引用
最初由 sswroom 发布

x264的源碼對我來說不是太親切, 它的寫法跟我所學的寫法(MASM 6.x)差很遠....


x264用的是yasm,其实我也不太懂。我自己加的部分用的是gcc 的inline 汇编,但gcc总莫名其妙的“优化”某些部分导致出错。
级别: 工作组
注册时间:
2005-10-19
在线时间:
31小时
发帖:
3613
只看该作者 17楼 发表于: 2008-10-23
当初就为了整个ME算法,折腾了我1个月……

roozhou,我到现在还不知道如何实现两个MB的MAD值比较,当初都是套用fullsearch的算法

凡是未完全安装Office字体的,以下英语短语请无视~~

Knowledge is infinite.


级别: 新手上路
注册时间:
2006-02-08
在线时间:
0小时
发帖:
17
只看该作者 16楼 发表于: 2008-10-23
引用
最初由 roozhou 发布
唉,可见学好C是多么重要啊。我看到x264源码觉得异常亲切。

x264的源碼對我來說不是太親切, 它的寫法跟我所學的寫法(MASM 6.x)差很遠....
级别: 新手上路
注册时间:
2006-02-08
在线时间:
0小时
发帖:
17
只看该作者 15楼 发表于: 2008-10-23
引用
最初由 雷鸣 发布

测试编码我没有开psnr,只开了ssim
ssim的值是不变的
不过我越来越怀疑是偶然因素,实际上没有提速了

现在学会了编译x264,找时间直接从源代码下手比较好

(源代码真恐怖,然后我又特别不擅长算法……)


是32bit,双精度64,fpu内部运算默认精度80bit

我看了一下源碼, DCT、IDCT部分也是用MMX指令比較多......是用16-bit精度的整數運算, 不是用FPU, 改變FPU精度對DCT、IDCT的影響不大........
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 14楼 发表于: 2008-10-23
唉,可见学好C是多么重要啊。我看到x264源码觉得异常亲切。
级别: 新手上路
注册时间:
2007-06-24
在线时间:
14小时
发帖:
123
只看该作者 13楼 发表于: 2008-10-23
:D 标题变得真快呀~
级别: 工作组
注册时间:
2005-05-03
在线时间:
0小时
发帖:
2914
只看该作者 12楼 发表于: 2008-10-23
看了几下x264的代码,放弃……
这东西哪里可能看得懂嘛。是我想得太简单了
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 11楼 发表于: 2008-10-23
x264用到FPU的部分可能就是DCT了吧,降低精度对画质有明显负面影响
级别: 工作组
注册时间:
2005-05-03
在线时间:
0小时
发帖:
2914
只看该作者 10楼 发表于: 2008-10-23
引用
最初由 sswroom 发布
請問用原代碼壓出來, 和用32-bit FPU壓出來的影片, PSNR分別是多少dB?

测试编码我没有开psnr,只开了ssim
ssim的值是不变的
不过我越来越怀疑是偶然因素,实际上没有提速了

现在学会了编译x264,找时间直接从源代码下手比较好

(源代码真恐怖,然后我又特别不擅长算法……)

引用
最初由 MeteorRain 发布
单精度的话,好像是16bit

是32bit,双精度64,fpu内部运算默认精度80bit
快速回复

限150 字节
上一个 下一个