momo zone

调核人的blog

Monthly Archives: 五月 2014

autoconf 和 automake 生成 Makefile 文件

之前都是手写Makefile,现在了解一下autoconf和automake吧:

拿个代码目录看一下:

├── LICENSE
├── README.md
└── src
        ├── include
        │        ├── dpu.h
        │        ├── icmp.h
        │        ├── list.h
        │        ├── operation.h
        │        ├── probe.h
        │        └── report.h
        ├── main.c
        ├── icmp.c
        └── operation.c

整体流程如下:

automake_autoconf

 

 

所需要的软件如下:

1. GNU Automake 

2. GNU Autoconf 

3. GNU m4 

4. perl 

5. GNU Libtool (如果你需要产生 shared library) 

 

1. 在dpu目录下执行autoscan生成configure.scan文件

2. 修改configure.scan如下内容:

修改AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])为

AC_INIT([dpu],[0.1],[lp007819@hotmail.com]) 也就是项目名称,版本号,开发者邮件

在AC_INIT后面新增一行

AM_INIT_AUTOMAKE

修改AC_CONFIG_HEADERS([config.h]) 为

AC_CONFIG_HEADERS(config.h)

在# Checks for libraries.后面插入

AC_PROG_RANLIB

更改AC_CONFIG_FILES([Makefile])为

AC_CONFIG_FILES([Makefile src/Makefile]) 因为在src下还要生成一个Makefile

将configure.scan重命名为configure.in

3. 在dpu目录下新建文件Makefile.am

编辑如下内容:

SUBDIRS=src
CURRENTPATH=$(PWD)
INCLUDES=-I$(CURRENTPATH)/src/include
export INCLUDES

在src目录下新建文件Makefile.am

编辑如下内容:

bin_PROGRAMS=dpu
dpu_SOURCES=main.c icmp.c operation.c
dpu_LDFLAGS=-pthread -D_GNU_SOURCE
DEFS+=-pthread -D_GNU_SOURCE

 

4. 在dpu目录下执行autoheader生成config.h.in

5. 在dpu目录下touch如下文件

AUTHORS

COPYING

ChangeLog

INSTALL

LICENSE

NEWS

README

6. 从/usr/share/automake-XX/将如下文件copy到dpu目录下:

compile

depcomp

install-sh

missing

7. 在dpu目录下执行aclocal,它会扫描configure.ac或configure.in生成aclocal.m4文件,该文件中的宏会被autoconf读取

8. 在dpu目录下执行autoconf生成configure

9. 在dpu目录下执行automake生成Makefile.in

 

这里只是记录了configure的产生方法和过程,但如果真的要让项目编译具有更好的移植性需要对configure.in做深入的修改。

参考资料:http://www.ibm.com/developerworks/cn/linux/l-makefile/

Advertisements

linux A卡的UVD加速能用?

确实能用,但方法途径非常龌龊。完全不能和N卡相比, N卡装完闭源驱动打开mplayer -vo vdpau 就完事了。

amd在linux下是通过xvba的接口同UVD解码单元交互的。但支持xvba的播放器很少且不包括mplayer,所以几乎没用。后来intel出来了vaapi接口,有人通过vaapi来调用xvba然后给mplayer打vaapi补丁实现了mplayer=>vaapi=>xvba 硬件解压。我在2010年的时候通过一台HP笔记本的HD4770实现了上述方法的硬解,而且效果很好,播放1080P时cpu利用率为1-5%。不过4年过去了,vaapi依然没有合并到mplayer的主线,xvba已经多年没有更新了,而且令人遗憾的是mplayer-vaapi分支也已经从最初发布的网站上移除http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/

现在刚搞到一块HD6450,再折腾一下。结果发现vaapi补丁已经无法再应用到新的mplay上,只好去google一下旧的mplayer-vaapi分支,configure 用以下参数 –prefix=/usr –enable-vaapi –disable-vdpau 。编译完之后mplayer -va vaapi -vo vaapi  file-path 就ok了,效果不错,但发现不能按“f”全屏,否则cpu利用率会飙升。

资源:

libvdpau-va-gl https://github.com/i-rinat/  vaapi的前端,使用他避免了mplayer没有vaapi分支的问题。实现了mplayer=>vdpau=>vaapi=>xvba的硬解(真蛋疼),它依赖ffmpeg库的头文件,但ffmpeg的pkg-config配置文件放在了/usr/lib/pkgconfig了,导致编译的时候找不到。cp /usr/lib/pkgconfig/* /usr/share/pkgconfig就可以了。

libva1 vaapi的库 http://freedesktop.org/wiki/Software/vaapi

xvba-driver  http://cgit.freedesktop.org/vaapi/xvba-driver/   vaapi的后端

另外xvba的一个bug会导致va-gl调用失败,给xvba-driver应用下面的补丁就ok:

diff -ur xvba-video-0.8.0/src/xvba_image.c xvba-video-0.8.0-patched/src/xvba_image.c
--- xvba-video-0.8.0/src/xvba_image.c	2011-06-14 13:07:13.000000000 +0200
+++ xvba-video-0.8.0-patched/src/xvba_image.c	2012-07-22 14:55:14.186667413 +0200
@@ -423,7 +423,7 @@
 }
 
 #if USE_GLX
-const HWImageHooks hw_image_hooks_glx attribute_hidden;
+extern const HWImageHooks hw_image_hooks_glx attribute_hidden;
 #endif
 
 // Commit image to the HW

编译玩之后copy到/usr/lib64/dri然后创建软链接fglrx_drv_video.so到上面。

安装了vaapi-tools后可以用vainfo查看vaapi及后端状态:

libva: VA-API version 0.33.0
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib64/dri/fglrx_drv_video.so
libva: Found init function __vaDriverInit_0_32
libva: va_openDriver() returns 0
vainfo: VA-API version: 0.33 (libva 1.1.0)
vainfo: Driver version: Splitted-Desktop Systems XvBA backend for VA-API - 0.8.0
vainfo: Supported profile and entrypoints
      VAProfileH264High               : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD

Update:
升级为opensuse13.2之后编译不通过,提示:

utils_glx.h:138:5: error: unknown type name 'PFNGLMULTITEXCOORD2FPROC'
     PFNGLMULTITEXCOORD2FPROC             gl_multi_tex_coord_2f;

以及

xvba_dump.c: In function 'string_of_VABufferType':
xvba_dump.c:153:11: error: 'VAEncH264VUIBufferType' undeclared (first use in this function)
         _(VAEncH264VUIBufferType);

以及

xvba_dump.c:154:11: error: 'VAEncH264SEIBufferType' undeclared (first use in this function)
         _(VAEncH264SEIBufferType);
.......
utils_glx.c: In function 'gl_init_vtable':
utils_glx.c:740:23: error: 'GLVTable' has no member named 'gl_multi_tex_coord_2f'
         if (!gl_vtable->gl_multi_tex_coord_2f)

报错的原因是新系统中gl库里面已经没有这些定义了。所以把报错的代码都注释掉就ok了。
编译mplayer的时候提示

libvo/vo_vaapi.c:41:20: fatal error: GL/glu.h: No such file or directory
 #include <GL/glu.h>

安装这两个包解决问题:
freeglut-devel
glu-devel

此外还会遇到png_structp的问题,原因是libpng的版本太高了,需要安装libpng12-devel libpng12-compat-devel,把libpng16-compat-devel替换掉。

最后一个问题是libvo/vo_vappi.c:vaCreateSurfaces()提示参数不对。原因是libva里面的api接口变化了。将报错的那一行修改为如下就可以了:

    status = vaCreateSurfaces(va_context->display,format, width, height, 
                              &surface->id, 1, NULL, 0);

安装了最新的fglrx omega驱动之后也可以不用xvba-driver,而是创建软链接fglrx_drv_video.so到/usr/lib64/libXvBAW.so也可以获得硬件加速,但效果反而不如xvba-driver。

 

附aticonfig的一些命令:

$ aticonfig --od-getclocks可以获知当前显卡/显存频率。

$ aticonfig --pplib-cmd "get fanspeed 0"可以获知风扇转速(显卡);

$ aticonfig --odgt可以获知显卡温度。

$ aticonfig --pplib-cmd "set fanspeed 0 50"可以设置风扇转速,其中查询索引50代表速度百分比。

 

新发现的mplayer-vaapi 分支, 更新到2013年:

https://gitorious.org/vaapi/mplayer

clone之后checkout到vaapi分支。

另外archlinux的包也源自这里:

aur.archlinux.org/packages/mplayer-vaapi

lenovo yoga2 pro13

败了一个yoga2 pro13顶配,用了几个月了,感觉硬件没的说,但win8.1 u1的bug还是扯了大后腿。13871832601466y8hrbez6h 13871832601468eegw5mo5a 13871832601467h2941hq2c 1387183260146268k2ahe50 13871832601469h88nspe16 13871832601464p2rsyk61o 1387183260146z62lwhap6g 1387183260146x38v6t8j9l 1387183260146x6umso32pn 1387183260146vdl5lgd54s 1387183260146v31v11zuts 1387183260146u7omnwvwqu 1387183260146s7xn44n8bh 1387183260146s0keqz309k 1387183260146q7r9ya1ico 1387183260146p0uzl7vktr 1387183260146n0o12dnvuy 1387183260146mheiu5yz94 1387183260146m7u00pk6x4 1387183260146kdksjgb9b8 1387183260146jar2ss9ifs 1387183260146gd8tuvgvx3 1387183260146canoyu71mt 1387183260146beaf6p22jg