移植x264到vs2008

最新的x264已经没有提供windows版的可编译工程,微软的VS编程开发工具无疑是最好的调试工具,要把它移植到vs开发环境下面有很多的工作要做。

网上也有很多人在问找x264的vs版本,本人根据之前在项目中的移植经验,总结如下:

1.从官网上下载最新的x264代码,我下载代码是2012年的版本x264-snapshot-20120108-2245。

2.x264在不同的目录下面有好几个文件名字是相同的,需要重新命名,否则会出现你无法想象到的链接错误。

3.把所有的代码添加到微软的VS2008的开发环境里面,编译。这时候,你会发现有很多编译错误,注意先不要加汇编。

  这些编译错误,总的来说,主要是由两类原因引起的。

 3.1 x264采用的C99的语法标准,而VS2008的开发环境是不支持这些语法的。

 3.2 相应的宏开关没有打开。

 

对于第一类错误,是一个体力活,也就是把这些C99的语法改成标准的C语言语法。这项工作大概需要2到3天的时间。

对于第二类错误,就是根据相应错误,找到其代码所在的宏,把相应的宏加到工程里面去。需要增加的宏主要如下:

 HAVE_STRING_H
__ICL
_WIN32
SYS_WINDOWS
HAVE_THREAD
HAVE_VISUALIZE
ARCH_X86
ARCH_X86_32

4. 这时候,你会发现,还有一些没有定义的宏和其它一些编译错误,有一个宏BIT_DEPTH,这个要重新定义为8。还有有些文件是没有必要加进来的,可以去掉。比如,output目录下面的mp4,flv相关的文件从工程中去掉,input目录里面同样有些文件可以去掉。

5. x264里的有一类宏定义的参数可变的,这种vs开发环境当中不支持的。需要把可变参数宏修改为固定的参数宏定义,代码中用到了几个参数的宏就重新定义几个参数的宏。

6.  当所有的编译错误已经解决之后,就是链接错误。这个比较容易解决,一般都是相关的宏没有打开。找到这些代码对应宏,将宏重新定义上。

7.  如果你完成了上面的过程,你基本上可以再vs平台用c代码跑x264了。



这里讲的是如何把汇编语言添加进来,而不是跑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_16ALIGNED
3                 /* 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 #else
6      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 个参数,其中第一个参数是原来函数的名字,后面的参数与这个函数本身的参数保持一致。

声明如下:

[csharp] view plaincopy

  1. 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],edx
11     mov   edx,[ebp+20]
12     mov  [esp+8],edx
13         
14     call ecx
15     leave
16     ret

上述代码请自行理解。

x264代码中还有好些其它crash的地方,用同样的方法,按照参数个数的不同,依葫芦画瓢地修改相应的汇编代码,就可以解决crash的现象。


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值