2010年05月28日

libvpxのコンパイル&インストール

libvpxは、以下の場所にあります。
The WebM project
http://www.webmproject.org/

メニューのCodeより、
http://www.webmproject.org/code/

Get the Code
snapshots
と、たどっていくと、
http://code.google.com/p/webm/downloads/list

ここに、libvpxのソースコードや、FFmpegでWebM(VP8)動画のエンコードに対応するパッチ、WebM(VP8)動画再生用のDirectShowフィルタなどがあります。

ですが、このままだとFFmpegのビルドができませんでしたので、gitでダウンロードしたlibvpxのソースコードと、修正したパッチを置いておきます。
libvpx-0.9.0-31.tar.bz2

最新のソースコードは、gitでダウンロードできます。
$ git clone git://review.webmproject.org/libvpx.git

snapshotsにあるソースコード
libvpx-v0.9.6.tar.bz2
でも問題ありませんが、当サイトの更新に合わせて、ソースコードも置いておきます。
libvpx-0.9.5-28.tar.bz2

2011/07/31 追記
ソースコードをアップデートしました。
libvpx-0.9.6-485.tar.bz2

MSYSで、ファイルを保存したディレクトリに移動し、
$ tar xjf libvpx-0.9.6-485.tar.bz2
$ cd libvpx

libvpxでpthreadを使用するためのパッチを適用します。
$ patch -p1 < libvpx-0.9.0-20100528.diff

2011/04/12 追記
パッチを更新しました。
libvpx-0.9.6-20110412.diff

$ patch -p1 < libvpx-0.9.6-20110412.diff

その後、
$ CFLAGS="-fno-tree-vectorize" ./configure --target=x86-win32-gcc --cpu=i686 --disable-examples
$ make
$ cp libvpx.a /mingw/lib/
$ mkdir -p /mingw/include/vpx
$ cp vpx/*.h /mingw/include/vpx/

以上で終了です。


【補足】
--cpu=i686 は、これを付けないと、FFmpegがエラーを吐いてエンコードできませんでした。
CFLAGS="-DPTW32_STATIC_LIB" は、pthreadライブラリをスタティックリンクするための、おまじないです。

2011/02/16 追記
試しに、--cpu=athlon64 でコンパイルしてもクラッシュしました。
gccのオプションに、
-fno-tree-vectorize
を追加したらクラッシュしなくなりましたので、--cpu=i686 でも念のため追加することにしました。
-fomit-frame-pointer も、若干速くなるかもしれないので追加しました。


FFmpegでWebM(VP8)動画のエンコードに対応するためには、以下のパッチが必要です。
(libvpxではなく、FFmpeg本体のパッチです。)
ffmpeg-vp8-encdec-20100528.diff


このパッチを適用する前に、もう一つ先に適用するパッチがありますので、FFmpeg本体のコンパイル手順を参照してください。

2010/06/05 追記
FFmpeg rev.23474以降、FFmpeg本体へのパッチは不要になりました。


【更新履歴】を見る
posted by あべちん at 00:57 | Comment(8) | TrackBack(0) | FFmpeg追加ライブラリ
この記事へのコメント
FFmpeg本体のパッチが当たらなかったのですが、FFmpegはどのリビジョンを対象にしていますか?
Posted by mckee at 2010年05月28日 13:45
mckeeさん、こんにちは。管理人です。

もう解決されたかもしれませんが、FFmpeg本体のコンパイル手順も合わせてお読みください。
よろしくお願いします。
Posted by あべちん at 2010年05月30日 17:00
あべちんさん、初めまして。
minaと申します。

ブログを見させていただき、手順通りにlibvpxをコンパイルし、ffmpegに組み込んでコンパイルしようとしたのですが、ffmpegのコンパイルの際に
C:/MinGW/lib/libvpx.a(x86_dsystemdependent.c.o):(.text+0x1d): undefined reference to `vp8_dequantize_b_impl_mmx'
C:/MinGW/lib/libvpx.a(loopfilter_x86.c.o):(.text+0xa6c): undefined reference to `vp8_loop_filter_simple_vertical_edge_sse2
といったエラーが大量に出てしまい。失敗してしまいます。
また、libvpx.aを自作プログラム内に組み込み、libvpx単体で使用を試みたのですが、同様に"undefined reference to ..."のエラーが発生してしまいます。もしこのようなご経験、または対処法をご存知でしたら、教えていたいだけないでしょうか。よろしくお願いします。
Posted by mina at 2011年07月02日 01:51
minaさん、はじめまして。管理人です。

この記事の通りにパッチを当てると、pthreadsライブラリも必要になりますので、パッチを当てないでコンパイルし直してみてください。

とりあえず、それぐらいしか思いつきません…。
Posted by あべちん at 2011年07月02日 13:07
あべちんさん
お返事ありがとうございます。

パッチを当てずにコンパイルしてみましたが、同様の結果でした。
もう少し原因を探ってみたいと思います。
ありがとうございました。
Posted by mina at 2011年07月04日 01:46
minaさん、こんにちは。管理人です。

あと考えられるのは、gccとかbinutilsなどが最新版でないとか?

私は、gcc-4.6.1を自前でビルドして使用しているのですが、MinGW公式のgcc-4.5.2でも問題なかったと思います。

ググってみたら、同じエラーで質問している方を見つけたのですが、それに対する回答はありませんでした。

もし、ご自身で解決できましたら、ご報告いただけるとありがたいです。
Posted by あべちん at 2011年07月06日 11:39
わたしもminaさんと同じ現象でしたが、binutilsを2.17-2から2.21.1へあげるとうまくいきましたよ。
ご参考まで。
Posted by gggk at 2011年10月02日 18:14
gggkさん、こんにちは。管理人です。

binutilsが原因でしたか。
ご報告ありがとうございます。

minaさんも、解決していると良いですが…。
Posted by あべちん at 2011年10月03日 18:43
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/38598936
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック