FFMPEGのコンパイル | その他ぶろぐ

FFMPEGのコンパイル

お仕事でFFMPEGをライブラリとして使おうとしております
(FFMPEGは動画と音声を変換することのできるフリーソフトウェア@wikipedia
商用で利用しやすいLGPLライセンスでコンパイルしてみた記録

■ 目的
avi,movコンテナのMJPEG形式あたりの動画エンコードデコードで
1フレームずつアクセスできるWindows用ライブラリの作成

■用意するもの
・ffmpegのソース
・コンパイル環境(Windowsで)

■MinGWでコンパイルしてみる
1.MinGWインストール(gcc++とmakeを入れた)
2.MSYSインストール
3.coreutilインストール(pr.exeとか)
4.ffmpegソースダウンロード
5.gccを最新の4.5.0に更新する
gcc4.5.0への更新は結局以下のファイルを持ってきて差し替えた(多分adaは不要)

gmp-4.2.4-mingw32-dll.tar.gz
mpfr-2.4.1-mingw32-dll.tar.gz
binutils-2.20.51-1-mingw32-bin.tar.lzma
gcc-ada-4.5.0-1-mingw32-bin.tar.lzma
gcc-c++-4.5.0-1-mingw32-bin.tar.lzma
gcc-core-4.5.0-1-mingw32-bin.tar.lzma
libgcc-4.5.0-1-mingw32-dll-1.tar.lzma
libgmp-5.0.1-1-mingw32-dll-10.tar.lzma
libgnat-4.5.0_20100311-2-mingw32-dll-4.5.tar.lzma
libmpc-0.8.1-1-mingw32-dll-2.tar.lzma
libstdc++-4.5.0-1-mingw32-dll-6.tar.lzma

6.configure
オプションは"--enable-memalign-hack"は必須、"--enable-shared"がDLL化
./configure --enable-memalign-hack --enable-shared
実行したところ
WARNING: yasm not found, performance will suffer
とのことでyasmを持ってくる

7.ダウンロードしてきたyasmソースをMSYSからコンパイル
./configure --prefix=/mingw
make
make install

8.終わったら6に戻ってconfigure実行
License: LGPL version 2.1 or later
とのことでDLL化して使う分には商用でも使えるライセンス

9.VCから使うのにlibが欲しい
ライブラリを呼ぶ側はlibファイルがあった方が使いやすいので生成しておく
Visual Studio 20xx コマンド プロンプトを実行(入れてあるバージョンによりけり)
これでVCのbinにパスが通ったのでここからmsys.batでMSYS起動
makeを実行すればlibファイルを一緒に作ってくれる

10.最適化してmake
上記の手順で作られるDLLは最低限のオプションフラグしか付けてない
core2で最適化されて配布されているもののフラグを見てみると

configuration: --enable-memalign-hack --enable-gpl --enable-version3 --enable-
postproc --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libgsm -
-enable-libmp3lame --enable-librtmp --enable-libvorbis --enable-libtheora --enab
le-libxvid --enable-libvpx --enable-libx264 --disable-ffserver --disable-ffplay
--disable-ffprobe --enable-avisynth --enable-small --enable-pthreads --extra-ldf
lags=-static --extra-cflags='-mtune=core2 -mfpmath=sse -msse -fno-strict-aliasin
g'

前提としてGPLにはしたくないのでlibxvidやlibx264は指定しない方針

-mtune=core2だとターゲットCPUの閾値がちょっと高いかな
この部分は-mtune=noconaでとりあえず以下でconfigureしてみた
$ ./configure --enable-memalign-hack --enable-shared --extra-ldflags=-static --
extra-cflags='-mtune=nocona -mfpmath=sse -msse -fno-strict-aliasing'
これでmakeをしてみたら以下のエラーになった

libavfilter/parseutils.c:217:5: error: implicit declaration of function 'strcasecmp'

どうやらFFmpeg rev.23823からのバグらしい
そのうち修正されるだろうという話でとりあえず以下の2箇所パッチを当てておけとのこと
===================
--- /mingw/include/string.h.orig Sun Mar 7 12:31:43 2010
+++ /mingw/include/string.h Tue Jun 29 00:53:53 2010
@@ -116,6 +116,9 @@
#endif /* _UWIN */
#endif /* _NO_OLDNAMES */

+#else
+int __cdecl __MINGW_NOTHROW strcasecmp (const char*, const char *);
+int __cdecl __MINGW_NOTHROW strncasecmp (const char *, const char *, size_t);
#endif /* Not __STRICT_ANSI__ */

#ifndef _WSTRING_DEFINED
===================
--- /mingw/include/stdio.h.orig Sun Mar 7 12:31:43 2010
+++ /mingw/include/stdio.h Tue Jun 29 01:05:52 2010
@@ -186,6 +186,8 @@
_CRTIMP int __cdecl __MINGW_NOTHROW rmtmp(void);
_CRTIMP int __cdecl __MINGW_NOTHROW unlink (const char*);
#endif
+#else
+_CRTIMP char* __cdecl __MINGW_NOTHROW tempnam (const char*, const char*);
#endif /* __STRICT_ANSI__ */

_CRTIMP int __cdecl __MINGW_NOTHROW setvbuf (FILE*, char*, int, size_t);
===================

他にLGPLをver.3にして不要なもの削除で最終的に以下でconfigureしました
$ ./configure --enable-memalign-hack --enable-shared --enable-version3 --disabl
e-ffserver --disable-ffplay --disable-ffprobe --enable-small --enable-pthreads
--extra-cflags='-mtune=nocona -mfpmath=sse -msse -fno-strict-aliasing'

バイナリからのinformation表示は以下の通り
FFmpeg version SVN-r24136, Copyright (c) 2000-2010 the FFmpeg developers
built on Jul 22 2010 00:37:23 with gcc 4.5.0
configuration: --enable-memalign-hack --enable-shared --enable-version3 --disa
ble-ffserver --disable-ffplay --disable-ffprobe --enable-small --enable-pthreads
--extra-cflags='-mtune=nocona -mfpmath=sse -msse -fno-strict-aliasing'
libavutil 50.21. 0 / 50.21. 0
libavcodec 52.80. 0 / 52.80. 0
libavformat 52.73. 0 / 52.73. 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.22. 0 / 1.22. 0
libswscale 0.11. 0 / 0.11. 0

以上(´ε` )