移植x264到vs2008之二
来源:互联网 发布:建站之星源码 编辑:程序博客网 时间:2024/05/22 02:05
这里讲的是如何把汇编语言添加进来,而不是跑C代码。
1. 首先,要下载到yasm这个汇编语言编译工具,其编译命令可以在vs开发环境当中统一添加为如下格式:
yasm.exe -I..\common\x86\ -f win32 -O2 -DPREFIX -o "$(IntDir)\$(InputName)".obj "$(InputPath)"
注意:如果你的yasm的版本比较老,可能会有一些汇编语言的格式没法识别的问题。
2. 把相关的汇编语言源代码都添加到vs2008里面,注意:64位的汇编不用添加。添加汇编的源文件如下:
上述文件列表里面的vs_aligned.asm是我自己写的,待会叙述。
当然,还要添加MMX的宏定义到工程之中:HAVE_MMX。
上述步骤完成之后可能会有BIT_DEPTH这个宏在汇编文件中没有定义的现象,在汇编当中需要重新定义如下:
%ifndef BIT_DEPTH
%assign BIT_DEPTH 8
%endif
编译链接没有错误的情况下,运行,结果程序crash掉了。其原因在于:
GCC编译器会自动把堆栈16字节对齐,而vs的编译器则不会。而SSE的很多指令都要求地址是16字节对齐的,这样导致内存访问异常。
于是,在函数调用之前,需要自己对齐堆栈。
3. 十六字节对齐堆栈
x264中有这样一段代码:
1 /* No shortcuts here. The SSSE3 implementation of intra_mbcmp_x9 is fast enough. */2 #ifndef VS_ASM_STACK_16ALIGNED3 /* No shortcuts here. The SSSE3 implementation of intra_mbcmp_x9 is fast enough. */4 i_best = h->pixf.intra_mbcmp_x9_4x4( p_src_by, p_dst_by, cost_i4x4_mode-i_pred_mode );5 #else6 i_best = call_func_stack_align16_3((void* )(h->pixf.intra_mbcmp_x9_4x4), (void* )p_src_by, (void* )p_dst_by, (void* )(cost_i4x4_mode-i_pred_mode));7 #endif
上述代码,上面部分是x264原有的,下面的代码是我自己添加的。
函数
call_func_stack_align16_3
其中, 函数名最后面的3,表示函数有 3 + 1 = 4 个参数,其中第一个参数是原来函数的名字,后面的参数与这个函数本身的参数保持一致。
声明如下:
int call_func_stack_align16_3 (void* p_func, void* p1, void* p2, void* p3);
实现如下:
1 _call_func_stack_align16_3: 2 push ebp 3 mov ebp, esp 4 sub esp, 12 + 16 5 and esp, ~15 6 mov ecx, [ebp+8] 7 mov edx, [ebp+12] 8 mov [esp], edx 9 mov edx,[ebp+16]10 mov [esp+4],edx11 mov edx,[ebp+20]12 mov [esp+8],edx13 14 call ecx15 leave16 ret
上述代码请自行理解。
x264代码中还有好些其它crash的地方,用同样的方法,按照参数个数的不同,依葫芦画瓢地修改相应的汇编代码,就可以解决crash的现象。
- 移植x264到vs2008之二
- 移植x264到vs2008
- 移植x264到vs2008之一
- 移植FFMPEG到VS2008系列之二
- 移植最新版x264到vs2008(2012)
- x264移植到MFC
- x264移植到MFC
- 移植FFMPEG到VS2008系列之三
- 移植FFMPEG到VS2008系列之四
- ffmpeg移植到vs2008之文件同名
- 将x264移植到Android
- ffmpeg移植到vs2008
- x264之c64x+平台移植
- x264 移植到 ARM的方法
- x264 移植到 ARM的方法
- VS2008项目移植到Linux
- VS2008项目移植到Linux
- VS2008项目移植到Linux
- java 利用Xstream注解生成和解析xml
- Eclipse+JBoss+EJB3消息驱动Bean
- 数字音乐均衡器
- 会声会影旋转木马制作要点
- 会声会影手翻相册制作要点
- 移植x264到vs2008之二
- 一种高精度低复杂度的非线性函数定点计算方法
- 人脸美化
- 快速高斯滤镜算法
- 数字图像偏色检测及其校正快速实现
- 基于AdaBoost的人脸检测
- 数字图像去雾快速算法
- 谈谈自动瘦脸和自动眼睛放大算法
- MMX指令集系列之一----数据加载与算术运算指令