vs2013编译ffmpeg之二十二 opencl、opengl

opencl

对应ffmpeg configure选项–enable-opencl。
https://www.khronos.org/opencl/

http://blog.csdn.net/leonwei/article/details/8880012

https://github.com/KhronosGroup/OpenCL-Headers

通用开源并行计算标准。下一代的图形和并行计算的标准是vulkan,https://www.khronos.org/vulkan/。

确定windows上的显卡类型:
vs2013编译ffmpeg之二十二 opencl、opengl_第1张图片
针对不同的公司的显卡,其开发包是不一样的,下面分别来描述。

NVIDIA

这个地址有如何搭建OpenCL环境:http://kode-stuff.blogspot.com/2012/11/setting-up-opencl-in-visual-studio_1.html

开发包是CUDA,下载地址:

https://developer.nvidia.com/cuda-downloads

选择版本cuda_7.5.18_windows_64.exe。安装后的头文件、库文件路径分别是:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\Win32

64位的库在lib/x64下。

cuda_7.5.18_windows_64.exe安装的时候,就算系统里面没有NVIDIA显卡,也可以安装的。这个版本的CUDA能识别VS2013及以前的版本,VS2015识别不了,安装的时候会检查VS版本。

由于头文件和库文件路径里面有空格,ffmpeg-3.0的configure怎么弄也通不过,主要问题是是configure里面用eval对变量进行替换,compat\windows\mslink是个脚本,也会对传进去的参数进行转换,搞了2天始终无法将最终执行的cl、link命令中的带空格路径用”“括起来。最后只能将头文件、库文件目录放到不带空格的目录下。

configure里面–enable-opencl检测的是CL/cl.h,用的是路径../../contribute/MSVC/CUDA_NVIDIA/include下面的,这个下面的文件是cuda_7.5.18_windows_64.exe安装后从安装目录拷贝过来的。

ffmpeg-3.3打开–enable-cuda后,configure的时候报下面的错误:

ffconf.FvfVVefI.o : error LNK2019: 无法解析的外部符号 _cuInit,该符号在函数 _main 中被引用

将configure里面的cuda规则:

enabled cuda              && { check_lib cuda.h cuInit –lcuda

改成:

enabled cuda              && { check_lib2 cuda.h cuInit -lcuda

即将check_lib改成check_lib2
这个问题的根本原因,cuda.h里面的接口都有CUDAAPI前缀,其定义如下:

#ifdef _WIN32
#define CUDAAPI __stdcall
#else
#define CUDAAPI
#endif

用MSVC cl编译器的时候_WIN32是有定义的,而cuda windows版本的库在编译的时候,cuda.h里面接口也是带了__stdcall前缀,接口形式为00000000 T _cuInit@4,函数名后面有个@4,表示函数的参数长度为4字节。
从config.log里面可以看到,check_lib检测cuda所用的代码如下:

extern int cuInit();
int main(void){ cuInit(); }

代码里面没有include cuda.h,所以这段代码所调用的接口没有加__stdcall前缀,编译器认为cuInit的符号为_cuInit,按_cuInit在cuda.lib里面搜索符号当然找不到了。
解决此问题的办法就是将check_lib改成check_lib2,让生成的代码包含cuda.h,生成的检测代码为:

#include 
#include 
long check_cuInit(void) { return (long) cuInit; }
int main(void) { int ret = 0;
ret |= ((intptr_t)check_cuInit) & 0xFFFF;
return ret; }

–enable-cuvid也有类似的问题,解决的办法也是一样。

AMD

AMD的没有做验证。先下载开发包,目前用的版本是3.0:

http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/

Intel

opencl_runtime_16.1.1_x64_setup.msi,安装目录C:\Program Files (x86)\Common Files\Intel\OpenCL,下面只有库文件,包括32位和64位的。

Opengl

对应ffmpeg configure选项–enable-opengl。

ffmpeg-3.0打开–enable-opengl,编译的时候报下面的错误,解决的办法是直接将/MinGW/include下的GL目录拷贝到ffmpeg-3.0/inc/下面。

libavdevice/opengl_enc.c(43) : fatal error C1083: 无法打开包括文件: “GL/glext.h”: No such file or directory

opengl的库和相关头文件应该是MSVC2013自带的。

你可能感兴趣的:(vs2013编译ffmpeg)