動画再生のためVAIO type Pにmplayer-vaapiを導入

先日 VAIO type P に Debian squeeze を入れてみたのだが,動画再生がうまくできていなかった.必要としていなかったので放っておいたのだけれど, Iceweasel(Firefox) の画面が崩れる問題を回避するため Google Chrome for Linux を入れてみたら,動かないと思っていた Flash がぬるぬる動いて,あれ,工夫すれば動画再生できるんじゃないの,ということになって.
ちょっと調べてみると, Ubuntu で mplayer-vaapi を使って問題を解決している事例がすぐに見つかったので,これを試してみることにした.
まず, http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/ から最新版のコードをもらってくる. Quick build notes を参考にビルドしてみる.

% sudo apt-get build-dep mplayer
% wget http://www.splitted-desktop.com/~gbeauchesne/mplayer-vaapi/mplayer-vaapi-20110127-FULL.tar.bz2
% tar jxvf mplayer-vaapi-20110127-FULL.tar.bz2
% cd mplayer-vaapi-20110127
% ./checkout-patch-build.sh 
...
ERROR: you need VA API headers for this project

Quick build notes には

Upstream libVA API >= 0.31.0 is the minimal requirement. OpenGL rendering support requires libVA API >= 0.31.0-sds3: http://www.splitted-desktop.com/~gbeauchesne/libva/

と書いてあるのだが, Debianリポジトリにはもっと新しい libva があるので,私はここで余計な気を利かせて apt を使って libva-dev を導入した.が,これが後々余計な手間を増やしたので,素直に

% wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/i386/libva1_0.32.0-1+sds2_i386.deb
% wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/i386/libva1-dbg_0.32.0-1+sds2_i386.deb
% wget http://www.splitted-desktop.com/~gbeauchesne/libva/pkgs/i386/libva-dev_0.32.0-1+sds2_i386.deb
% sudo dpkg -i libva1_0.32.0-1+sds2_i386.deb libva1-dbg_0.32.0-1+sds2_i386.deb libva-dev_0.32.0-1+sds2_i386.deb

などとしておくのがいいかもしれない.ただ試していないのでこの副作用はわからない.私は,

% sudo aptitude install libva-dev yasm

これで済ませた. yasm を入れておかないと,やはりまた

...
Checking for yasm ... 
Error: yasm not found, use --yasm='' if you really want to compile without
Check "config.log" if you do not understand why it failed.
Makefile:22: config.mak: No such file or directory

などと言ってこける.
必要な準備を済ませてから改めて

% ./checkout-patch-build.sh 

を叩いて暫く放っておくと, mplayer-vaapi というディレクトリの中にバイナリが作られる.指示に従って実行を試みる.

% cd mplayer-vaapi
% ./mplayer -vo vaapi -va vaapi FILE
...
libva: libva version 0.31.0
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/dri/psb_drv_video.so
libva: va_openDriver() returns -1
[vo_vaapi] vaInitialize(): unknown libva error
Error opening/initializing the selected video_out (-vo) device.

調べてみると,確かに /usr/lib/dri/psb_drv_video.so などと言うファイルはない.周辺をうろついたところ, /usr/lib/va/drivers/psb_drv_video.so というやつがそれらしい.ので,リンクを張ってやる.

% sudo ln -s /usr/lib/va/drivers/psb_drv_video.so /usr/lib/dri/psb_drv_video.so
% ./mplayer -vo vaapi -va vaapi FILE
libva: libva version 0.31.0
libva: va_getDriverName() returns 0
libva: Trying to open /usr/lib/dri/psb_drv_video.so
libva error: dlopen of /usr/lib/dri/psb_drv_video.so failed: libva.so.0: cannot open shared object file: No such file or directory
libva: va_openDriver() returns -1
[vo_vaapi] vaInitialize(): unknown libva error
Error opening/initializing the selected video_out (-vo) device.

今度は libva.so.0 が無い.調べてみると,ビルドの要件にあったリンクからたどったパッケージを入れると libva.so.0 は導入されるが, Debianリポジトリから入れると libva.so.1 はあるものの,古い方は導入されないらしい.手で入れようとしたら失敗した.

% sudo dpkg -i libva1_0.32.0-1+sds2_i386.deb
dpkg: warning: downgrading libva1 from 1.0.1-3 to 0.32.0-1+sds2.
(Reading database ... 191841 files and directories currently installed.)
Preparing to replace libva1 1.0.1-3 (using libva1_0.32.0-1+sds2_i386.deb) ...
Unpacking replacement libva1 ...
dpkg: error processing libva1_0.32.0-1+sds2_i386.deb (--install):
 trying to overwrite '/usr/lib/libva-x11.so.1', which is also in package libva-x11-1 1.0.1-3
Errors were encountered while processing:
 libva1_0.32.0-1+sds2_i386.deb

このために関連パッケージを消して手で入れ直すのもアレなので,共有ライブラリだけ頂く.

% dpkg-deb -x libva1_0.32.0-1+sds2_i386.deb
% sudo cp -ra usr/lib /usr/local/lib/libva1_0.32.0-1+sds2_i386
% cd mplayer-vaapi-20110127/mplayer-vaapi
% LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/libva1_0.32.0-1+sds2_i386 ./mplayer -vo vaapi -va vaapi FILE

うまく再生された.
よく見ると debian というディレクトリがあるので,すぐパッケージになりそう.

% dpkg-buildpackage -us -uc
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor): 
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor): 
tail: cannot open `debian/changelog' for reading: No such file or directory

はぁ.

% dch --create --package mplayer
% dpkg-buildpackage -us -uc
dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor): 
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor): 
dpkg-buildpackage: source package mplayer
dpkg-buildpackage: source version 20110127
dpkg-buildpackage: source changed by ******
dpkg-buildpackage: host architecture i386
 dpkg-source --before-build mplayer-vaapi
dpkg-checkbuilddeps: Unmet build dependencies: libmp3lame-dev libx264-dev (>= 2:0.99) libxvidcore-dev
dpkg-buildpackage: warning: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: warning: (Use -d flag to override.)

はいはい.

% dpkg-buildpackage -us -uc -d
% sudo dpkg -i ../mplayer_20110127_i386.deb


色々嘘.せっかくパッチを当てたのに, debianmplayer のルールでビルドしたら VA API は無効化されちゃうので,これでは駄目.

% sudo cp -ra mplayer-vaapi /usr/local/mplayer-vaapi-20110127
% sudo ln -s /usr/local/mplayer-vaapi-20110127/mplayer /usr/local/bin/mplayer

枕詞が些か長すぎるので, ~/.zshrc.bernstein にエイリアスを指定しておく.

alias mplayer='LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/libva1_0.32.0-1+sds2_i386 mplayer -vo vaapi -va vaapi'

これで,

% mplayer FILE

で動画が再生できるようになった.