今月に入ってxvidのMLに幾つかビルド関連のパッチを投げたりしてみた。
http://list.xvid.org/pipermail/xvid-devel/2011-September/thread.html
もともと自分はただビルドするだけなのにパッチを当てたりするのは嫌いである。
第一に、パッチの存在を知らない人間にはパッチは役に立たない。
第二に、パッチを管理するのはめんどくさい。
第三に、殆どの場合ビルドエラーの原因はあほらしい理由によるものなので、原因が分かったときに激しい虚しさに襲われることになる。
たしかに開発本家にパッチ投げるのってパッチ書く以上にめんどいけど、やらないといつまでもその状態が続いてしまうので、とりあえず出来そうなところは修正してもらったほうがいいだろう。
で、まあ、結果としていくつか採用されてsvnにコミットされたので、いままで必要だった手間は幾分減ることになった。
次のstable release予定の1.4.0では、インストール時にライブラリを別名でコピーするくらいで済むのかな。
追記 2011年10月22日
Ubuntu11.10上でクロスコンパイルしようかと思いsvnのログを確認してみたら、ライブラリ名変更のリクエストもちゃんと受理してもらえてました。
http://websvn.xvid.org/cvs/viewvc.cgi?view=rev&revision=2044
これで自分としてはパッチは完全に不要になりました。
Isibaarさん、ありがとうございました!
2011年9月20日火曜日
2011年9月4日日曜日
コンパイラによる最適化の押し付けにむかついた件について
GCCの各オプティマイズレベルで有効になる最適化を調べるを読んでちょっと興味がわいたので、いろいろ手元の環境でも確認してみた。
試したマシンはQ9450とT7300のせいかどれもリンク先と同じ結果になったわけですが、とにかく意外だったのは
*-O2と-Osの違いは-finline-functionsの有無だけ(-Osは有り、-O2は無し)。
-Osはサイズ優先の最適化のはずだけど、-O3(とにかくスピード優先)でも-finline-functionsがつくのであれば、これを有効にすればそこそこスピードアップの可能性があるということだろう。
じゃあ、-O2の存在意義って一体なあに?
-O3程ではないが、それなりにスピード優先のはずなんだけど…。
とまあ、前置きはこのくらいにして、今度は各プロジェクトが設定しているデフォルトの最適化設定を調べてみた。
例えばx264は--extra-cflagsを設定しなければ
いかにも互換性を気にしつつも速そうな設定という感じですね。
まあ、クリティカルな部分はほぼすべてasmで書かれてCPU検出で自動的に有効にするので、コンパイラによるCコードの最適化はあまり影響しないそうですが。
これがxvidだと
configure.inには
現在でも更新は続いているんだから、いい加減sseをデフォルトにするくらいはしてもいいのでは?
configure.inにはこのデフォルト値に対して"Default CFLAGS -- Big impact on overall speed"とも書かれているあたり、コンパイラによる最適化はかなり重要みたいなんだけど…自分で設定したほうがよさそうですな。
さて問題はa52dec。
これのconfigure.inは以下のような感じになっている。
たとえば何らかの理由でデバッグビルドしようと思ってCFLAGS="-O0 -g"しても、-O0は削除されて"-g -O3"なんていうへんてこりんなコードが出力されてしまいます。
しかも-O3は勝手につけるのに、-fno-tree-vectorizeはなし。
liba52はとても古いプロジェクトでCVSの最終更新は7年前。もはや死んだといってもおかしくない。
当時は-O3だけでも問題なかったのかも知れませんが、現在ではまともな出力が得られるかどうか非常に疑わしい、地雷コードと化しています。
これは不安定な-ftree-vectorizeを-O3で有効にしたままなかなか直さない(直せない?)GCCが悪いとも言えるかも知れないけど、素人がコードいじらなきゃいけないような自体はなるべく避けて欲しいなぁ。
とりあえずこんなパッチを書いてみたので、何かの事情で今時a52decをビルドしなければならない人は当てたほうがいいかもしれません。
あともう一つ、openjpegプロジェクト。
現在のstable release?であるはずのopenjpeg_v1_4_sources_r697.tgzをビルドしてみたら、設定したCFLAGSが全く反映されません。
なんでかな?とlibopenjpeg/Makefile.amを見てみたら
svnの最新コードなら直ってるかなと見てみると今度はcomfigure.acのほうで
追記:
gcc4.7ではOsに-foptimize-strlenも追加されたようです(O2は追加なし)。
ますますO2の存在意義って…?
試したマシンはQ9450とT7300のせいかどれもリンク先と同じ結果になったわけですが、とにかく意外だったのは
*-O2と-Osの違いは-finline-functionsの有無だけ(-Osは有り、-O2は無し)。
-Osはサイズ優先の最適化のはずだけど、-O3(とにかくスピード優先)でも-finline-functionsがつくのであれば、これを有効にすればそこそこスピードアップの可能性があるということだろう。
じゃあ、-O2の存在意義って一体なあに?
-O3程ではないが、それなりにスピード優先のはずなんだけど…。
とまあ、前置きはこのくらいにして、今度は各プロジェクトが設定しているデフォルトの最適化設定を調べてみた。
例えばx264は--extra-cflagsを設定しなければ
"-O3 -ffast-math -march=i686 -mfpmath=sse -msse -fomit-frame-pointer -fno-tree-vectorize -fno-zero-initialized-in-bss"
がつく(x86の場合)。いかにも互換性を気にしつつも速そうな設定という感じですね。
まあ、クリティカルな部分はほぼすべてasmで書かれてCPU検出で自動的に有効にするので、コンパイラによるCコードの最適化はあまり影響しないそうですが。
これがxvidだと
"-O2 -fstrength-reduce -finline-functions -ffast-math -fomit-frame-pointer"
となっている。configure.inには
First we test if CFLAGS have been passed on command line I do that because autoconf defaults (-g -O2) suck and they would kill performance. To prevent that we define a good defult CFLAGS at the end of the script if and only if CFLAGS has not been passed on the command lineなんて書かれてますが、それにしては中途半端という印象が否めない。
現在でも更新は続いているんだから、いい加減sseをデフォルトにするくらいはしてもいいのでは?
configure.inにはこのデフォルト値に対して"Default CFLAGS -- Big impact on overall speed"とも書かれているあたり、コンパイラによる最適化はかなり重要みたいなんだけど…自分で設定したほうがよさそうですな。
さて問題はa52dec。
これのconfigure.inは以下のような感じになっている。
if test x"$GCC" = x"yes"; then changequote(<<,>>) OPT_CFLAGS=`echo "$CFLAGS"|sed "s/-O[0-9]*//g"` changequote([,]) OPT_CFLAGS="$OPT_CFLAGS -O3" AC_TRY_CFLAGS([$OPT_CFLAGS],[CFLAGS=$OPT_CFLAGS])なんとコンパイラがGCCだったら有無を言わさず-O3強制です。
たとえば何らかの理由でデバッグビルドしようと思ってCFLAGS="-O0 -g"しても、-O0は削除されて"-g -O3"なんていうへんてこりんなコードが出力されてしまいます。
しかも-O3は勝手につけるのに、-fno-tree-vectorizeはなし。
liba52はとても古いプロジェクトでCVSの最終更新は7年前。もはや死んだといってもおかしくない。
当時は-O3だけでも問題なかったのかも知れませんが、現在ではまともな出力が得られるかどうか非常に疑わしい、地雷コードと化しています。
これは不安定な-ftree-vectorizeを-O3で有効にしたままなかなか直さない(直せない?)GCCが悪いとも言えるかも知れないけど、素人がコードいじらなきゃいけないような自体はなるべく避けて欲しいなぁ。
とりあえずこんなパッチを書いてみたので、何かの事情で今時a52decをビルドしなければならない人は当てたほうがいいかもしれません。
あともう一つ、openjpegプロジェクト。
現在のstable release?であるはずのopenjpeg_v1_4_sources_r697.tgzをビルドしてみたら、設定したCFLAGSが全く反映されません。
なんでかな?とlibopenjpeg/Makefile.amを見てみたら
INCLUDES = -I.. -I. COMPILERFLAGS = -Wall -O3 -ffast-math -std=c99 if with_sharedlibs COMPILERFLAGS += -DOPJ_EXPORTS else COMPILERFLAGS += -DOPJ_STATIC libopenjpeg_la_LDFLAGS += -static endif CFLAGS = $(COMPILERFLAGS) $(INCLUDES)お前もかよ(そしてこれも-fno-tree-vectorizeなし)。
svnの最新コードなら直ってるかなと見てみると今度はcomfigure.acのほうで
if test "x${want_debug}" = "xyes" ; then OPJ_COMPILER_FLAG([-g]) OPJ_COMPILER_FLAG([-O0]) else OPJ_COMPILER_FLAG([-O3]) fiあくまでも-O3は決定ですかそーですか...........むかつくわホント
追記:
gcc4.7ではOsに-foptimize-strlenも追加されたようです(O2は追加なし)。
ますますO2の存在意義って…?
2011年2月22日火曜日
2010年10月22日金曜日
2010年9月27日月曜日
JMェ
そーいえば、UbuntuにはJM reference入れてなかったなー、と思い出し、ビルドすることにした。
wget http://iphome.hhi.de/suehring/tml/download/jm17.2.zip
unzip ./jm17.2.zip
cd ./JM
chmod +x ./unixprep.sh && ./uniexprep.sh
make
/JM/binにldecod.exeとlencod.exeの出来上がり!…って、.exe?
どうやらJMの中の人たちにとって、UNIXとはCygwinのことらしいです。
wget http://iphome.hhi.de/suehring/tml/download/jm17.2.zip
unzip ./jm17.2.zip
cd ./JM
chmod +x ./unixprep.sh && ./uniexprep.sh
make
/JM/binにldecod.exeとlencod.exeの出来上がり!…って、.exe?
どうやらJMの中の人たちにとって、UNIXとはCygwinのことらしいです。
2010年9月7日火曜日
x264_L-SMASHのビルド
以前書いたlavf/ffmsつきx264のビルドに関する記事を数ヶ月ぶりに読み返してみた。
なんというか冷や汗ものである。
このまま放置しておくのは色々危険そうな気がするので、もう一度書いておく。
でも、普通のx264では面白くないので、今回は現在開発進行中のx264_L-SMASHのビルドにする。
用意するもの
autoconf/libtoolが使えるmsys環境、mingw、pkg-config、wget、subversion、msysgit、nasm、yasm、pthread-w32、zlib、bzip2
あきれるほどマメなMPC-HC開発者XhmikosR氏がこちらで配布しているセットを使えば、msysgit以外すべて揃っているのでとても楽である。 (説明の手間が省けるので)
あとは自分の環境に合わせて/etc/fstabと/etc/profileをいじり、別にインストールしたmsysgitのgit.exeにPATHを通すなりすればよい。
1.x264_L-SMASH_clone.sh
x264_L-SMASHはこちらで公開されているが、そのままgit cloneすると、バイナリのバージョン表記がおかしくなるので、ここにあるx264_L-SMASH_clone.shを使ってcloneする。
DLしたら、この.shを$HOMEに置いておくこと。
もしくは
wget http://up-cat.net/wiki.cgi?action=ATTACH&page=L-SMASH&file=x264_L-SMASH_clone.sh -O $HOME/x264_L-SMASH_clone.sh
を、スクリプトに追加する。
2.ビルド
あとは以下のスクリプトを実行すればおしまい。現状で使用できるaudio用codecを全部リンクしたx264.exeが出来る。
変数の内容は各自で自分の環境にあわせていじるように。
QuickTime SDKをインストールしていない場合や、libfaacをリンクさせたくない場合は、適当にコメントアウトすること。
なんというか冷や汗ものである。
このまま放置しておくのは色々危険そうな気がするので、もう一度書いておく。
でも、普通のx264では面白くないので、今回は現在開発進行中のx264_L-SMASHのビルドにする。
用意するもの
autoconf/libtoolが使えるmsys環境、mingw、pkg-config、wget、subversion、msysgit、nasm、yasm、
あきれるほどマメなMPC-HC開発者XhmikosR氏がこちらで配布しているセットを使えば、msysgit以外すべて揃っているのでとても楽である。 (説明の手間が省けるので)
あとは自分の環境に合わせて/etc/fstabと/etc/profileをいじり、別にインストールしたmsysgitのgit.exeにPATHを通すなりすればよい。
1.x264_L-SMASH_clone.sh
x264_L-SMASHはこちらで公開されているが、そのままgit cloneすると、バイナリのバージョン表記がおかしくなるので、ここにあるx264_L-SMASH_clone.shを使ってcloneする。
DLしたら、この.shを$HOMEに置いておくこと。
もしくは
wget http://up-cat.net/wiki.cgi?action=ATTACH&page=L-SMASH&file=x264_L-SMASH_clone.sh -O $HOME/x264_L-SMASH_clone.sh
を、スクリプトに追加する。
2.ビルド
あとは以下のスクリプトを実行すればおしまい。現状で使用できるaudio用codecを全部リンクしたx264.exeが出来る。
変数の内容は各自で自分の環境にあわせていじるように。
QuickTime SDKをインストールしていない場合や、libfaacをリンクさせたくない場合は、適当にコメントアウトすること。
#!/bin/sh #Preparation WORK=$HOME/LSMASH PREF32=/mingw/i686-pc-mingw32 PREF64=/mingw/x86_64-w64-mingw32 HOST64=x86_64-w64-mingw32 CROSS64=x86_64-w64-mingw32- QTSDK=/g/quicktime_sdk cp /bin/pkg-config.exe /bin/${CROSS64}-pkg-config.exe mkdir $WORK/src #download src cd $WORK/src wget\ http://downloads.sourceforge.net/project/lame/lame/3.98.4/lame-3.98.4.tar.gz\ http://downloads.sourceforge.net/faac/faac-1.28.tar.bz2\ http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/0.1.2/opencore-amr-0.1.2.tar.gz git clone git://github.com/mstorsjo/vo-aacenc.git git clone git://github.com/mstorsjo/vo-amrwbenc.git git clone git://git.libav.org/libav.git libav svn co http://ffmpegsource.googlecode.com/svn/trunk/ ffms $HOME/x264_L-SMASH_clone.sh cp -r . $WORK/x86 cp -r . $WORK/x64 #32bit cd $WORK/x86 for i in ./*.gz ; do tar zxvf $i ;done for i in ./*.bz2 ; do tar jxvf $i ; done rm ./*.gz ./*.bz2 cd ./lame* ./configure\ --prefix=$PREF32\ --disable-shared\ --enable-nasm make clean && make && make install-strip cd ../faac* ./configure\ --prefix=$PREF32\ --disable-shared\ --without-mp4v2 make clean &% make && make install-strip cd ../opencore* ./configure\ --prefix=$PREF32\ --disable-shared make clean && make && make install-strip cd ../vo-aacenc autoreconf ./configure\ --prefix=$PREF32\ --disable-shared make clean && make && make install-strip cd ../vo-amrwbenc autoreconf ./configure\ --prefix=$PREF32\ --disable-shared make clean && make && make install-strip cd ../libav ./configure\ --prefix=$PREF32\ --cpu=i686\ --disable-doc\ --disable-ffprobe\ --enable-gpl\ --enable-version3\ --enable-postproc\ --disable-network\ --enable-w32threads\ --enable-runtime-cpudetect\ --enable-memalign-hack\ --enable-libopencore-amrnb\ --enable-libopencore-amrwb\ --enable-libvo-aacenc\ --enable-libvo-amrwbenc\ --disable-encoders\ --enable-encoder=aac,ac3,alac,vorbis,libopencore_amrnb,libvo_aacenc,libvo_amrwbenc\ --disable-muxers\ --disable-hwaccels\ --disable-devices\ --disable-protocols\ --enable-protocol=concat,file,pipe,md5\ --disable-debug\ --extra-cflags=-fno-strict-aliasing make clean && make && make install cd ../ffms PKG_CONFIG_PATH=${PREF32}/lib/pkgconfig/ \ ./configure\ --prefix=$PREF32 make clean && make && make install-strip cd ../x264_L-SMASH PKG_CONFIG_PATH=${PREF32}/lib/pkgconfig/ \ ./configure\ --qtsdk=$QTSDK\ --enable-win32thread\ --enable-nonfree make clean && make cp ./x264.exe /usr/local/bin/x264ls_x86_\ `x264 --version|grep "x264"|awk '{print $2}'|awk -F . '{print $3}'`.exe #64bit cd $WORK/x64 for i in ./*.gz ; do tar zxvf $i ;done for i in ./*.bz2 ; do tar jxvf $i ; done rm ./*.gz ./*.bz2 cd ./lame* ./configure\ --host=$HOST64\ --prefix=$PREF64\ --disable-shared\ --enable-nasm make clean && make && make install-strip cd ../faac* ./configure\ --host=$HOST64\ --prefix=$PREF64\ --disable-shared\ --without-mp4v2 make clean && make && make install-strip cd ../opencore* ./configure\ --host=$HOST64\ --prefix=$PREF64\ --disable-shared make clean && make && make install-strip cd ../vo-aacenc autoreconf ./configure\ --host=$HOST64\ --prefix=$PREF64\ --disable-shared make clean && make && make install-strip cd ../vo-amrwbenc autoreconf ./configure\ --host=$HOST64\ --prefix=$PREF64\ --disable-shared make clean && make && make install-strip cd ../libav ./configure\ --prefix=$PREF64\ --target-os=mingw32\ --cross-prefix=$CROSS64\ --cpu=x86_64\ --arch=x86_64\ --disable-doc\ --disable-ffprobe\ --enable-gpl\ --enable-version3\ --enable-postproc\ --disable-network\ --enable-w32threads\ --enable-runtime-cpudetect\ --enable-memalign-hack\ --enable-libopencore-amrnb\ --enable-libopencore-amrwb\ --enable-libvo-aacenc\ --enable-libvo-amrwbenc\ --disable-encoders\ --enable-encoder=aac,ac3,alac,vorbis,libopencore_amrnb,libvo_aacenc,libvo_amrwbenc\ --disable-muxers\ --disable-hwaccels\ --disable-devices\ --disable-protocols\ --enable-protocol=concat,file,pipe,md5\ --disable-debug\ --extra-cflags=-fno-strict-aliasing make clean && make && make install cd ../ffms PKG_CONFIG_PATH=${PREF64}/lib/pkgconfig/ \ ./configure\ --host=$HOST64\ --prefix=$PREF64 make clean && make && make install-strip cd ../x264_L-SMASH PKG_CONFIG_PATH=${PREF64}/lib/pkgconfig/ \ ./configure\ --host=$HOST64\ --cross-prefix=$CROSS64\ --enable-win32thread\ --enable-nonfree make clean && make cp ./x264.exe /usr/local/bin/x264ls_x64_\ `x264 --version|grep "x264"|awk '{print $2}'|awk -F . '{print $3}'`.exe
2010年2月5日金曜日
lavf/ffms付きx264_x64ビルド
ちょっとサボっていたら、前回の更新から一週間以上経っていた。
誰も読まないチラシの裏替わりとはいえ、やはりサボるのはあまり良くないだろう。
ここ数日はx264.exe(x64)の自ビルドでlavf/ffms入力を有効にするために四苦八苦していた。
Windows&AviSynthユーザーとしては、全く要らないといってもいい機能ではあるが、やはり出来る事ならば有効にしておきたいのが人情というもの。
以下にその手順を書いておく
なお、これはr1416現在の情報なので、あとあと使えなくなっても知らない。
クロスコンパイルできるビルド環境構築は各自でやってるものとする。
参考:
http://komisar.gin.by/mingw/add/MinGW%20cross-compile%20toolchain%20(EN)/
http://zoome.jp/VFR_maniac/diary/89/
ちなみに筆者はkomisar氏のcross-mingw.gcc443.generic.20100124を使用している。
fstabは
まずpthread、zlib、bzip2はkomisar氏の配布しているものをそのまま使用しているので省略。
yasm(0.8.0):
$ wget -c http://www.tortall.net/projects/yasm/releases/yasm-0.8.0.tar.gz
$ tar zxvf yasm-0.8.0.tar.gz
$ cd yasm-0.8.0
$ ./configure --prefix=/mingw
$ make
$ make install
$ cd ~
GPAC:
$ cvs -d:pserver:anonymous@gpac.cvs.sourceforge.net:/cvsroot/gpac login
passwordはなし
$ cvs -z3 -d:pserver:anonymous@gpac.cvs.sourceforge.net:/cvsroot/gpac co -P gpac
$ cd gpac
$ cvs update -D "2010-01-23 UTC"
$ wget -c http://pastebin.php?dl=m59b9d49c
$ mv pastebin.php@dl=m59b9d49c muken_20100123.diff
$ patch -uNp0 < muken_20100123.diff
$ ./configure --prefix=/mingw/x86_64-pc-mingw32 --cross-prefix=x86_64-pc-mingw32- --cpu=x86_64 --static- mp4box
$ make lib apps
$ make install-lib
$ cp -p ./bin/gcc/MP4Box.exe /e/mp4tools/mp4box.exe
$ cd ~
ちなみに途中であてているパッチはVFR maniac氏の最新パッチ(どうやら現在、非公開の様子)
/e/mp4toolsは各自適当に変更して欲しい。
FFMPEG(今回は2010-02-01のスナップショット):
$ wget -c http://ffmpeg.org/releases/ffmpeg-checkout-snapshot.tar.bz2
$ tar jxvf ffmpeg-checkout-snapshot.tar.bz2
$ cd ffmpeg-checkout-snapshot
ここで./libswscale/swscale_template.cの2500行目あたりを次のように書き換え
$ ./configure --prefix=/mingw/x86_64-pc-mingw32 --cross-prefix="x86_64-pc-mingw32-" --enable-cross-compile --target-os=mingw32 --host-cc=gcc --enable-gpl --enable-postproc --enable-memalign-hack --enable-runtime-cpudetect --disable-devices --disable-filters --disable-encoders --disable-muxers --disable-network --disable-decoder=aac,ac3,adpcm_*,alac,als,ape,atrac?,cook,dca,dsicinaudio,dxa,eac3,flac,interplay_dpcm,mlp,mp1,mp2,mp3,mp3*,mpc?,pcm_*,qcelp,ra_*,sipr,truehd,truespeech,tta,vorbis,wavpack,wma*,twinvq --disable-demuxer=aac,ac3,pcm_*,ape,amr,ass,au,avs,dts,eac3,flac,mp3,mpc,mpc8,truehd,tta,w64,wav,wv --disable-parser=aac,ac3,dca,mlp,mpegaudio
$ make
$ make install
$ cd ~
configure長すぎる...でもバイナリが小さくなるし、無効にしても影響のない機能はなるべく切るべきだと思う。
なお、pthreadをautostaticでビルドしておけば、--enable-pthreadsもいけるそうだが、今回はパス。
ffms(現時点では275):
$ svn checkout http://ffmpegsource.googlecode.com/svn/trunk/ ffms2
$ cd ffms2
$ PKG-CONFIG="/mingw/x86_64-pc-mingw32/bin/pkg-config.exe" ./configure --prefix=/mingw/x86_64-pc-mingw32 --host=x86_64-pc-mingw32
$ make
$ make install
$ cd ~
なおpkg-config.exeは
http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.23-3_win32.zip
glibは
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.22/glib_2.22.3-1_win32.zip
からDLして、あらかじめ/mingw/x86_64-PC-mingw32以下にまとめてぶちこんでおくこと
x264:
$ git clone git://git.videolan.org/x264.git x264
$ cd x264
$ ./configure --cross-prefix=x86_64-pc-mingw32- --host=x86_64-pc-mingw32
$ make fprofiled VIDS="/g/for_test/soccer_4cif.y4m"
$ make install
$ cp -p /usr/local/bin/x264.exe /e/x264/mine/x264_r1416.exe
$ exit
なんか-march=core2はあまり速くならないようなので、最近はあまりつけていない
fprofiledの動画はなんでもいいらしいが、とりあえずhttp://media.xiph.org/video/derf/y4m/soccer_4cif.y4mを使っている。
mp4box同様、/e/x264/mineのあたりは各自で適当に変えること
上には書いてないが、NAL-HRDパッチとkomisar氏のlog_fileパッチはいつも当てている。
以上で終了。
筆者にIRCで丁寧に教えてくれたVFR maniac氏とJEEB氏に感謝します。
誰も読まないチラシの裏替わりとはいえ、やはりサボるのはあまり良くないだろう。
ここ数日はx264.exe(x64)の自ビルドでlavf/ffms入力を有効にするために四苦八苦していた。
Windows&AviSynthユーザーとしては、全く要らないといってもいい機能ではあるが、やはり出来る事ならば有効にしておきたいのが人情というもの。
以下にその手順を書いておく
なお、これはr1416現在の情報なので、あとあと使えなくなっても知らない。
クロスコンパイルできるビルド環境構築は各自でやってるものとする。
参考:
http://komisar.gin.by/mingw/add/MinGW%20cross-compile%20toolchain%20(EN)/
http://zoome.jp/VFR_maniac/diary/89/
ちなみに筆者はkomisar氏のcross-mingw.gcc443.generic.20100124を使用している。
fstabは
e:/msys/mingw /mingw
e:/msys/local/ /usr/local
e:/msys/tmp /tmp1
まずpthread、zlib、bzip2はkomisar氏の配布しているものをそのまま使用しているので省略。
yasm(0.8.0):
$ wget -c http://www.tortall.net/projects/yasm/releases/yasm-0.8.0.tar.gz
$ tar zxvf yasm-0.8.0.tar.gz
$ cd yasm-0.8.0
$ ./configure --prefix=/mingw
$ make
$ make install
$ cd ~
GPAC:
$ cvs -d:pserver:anonymous@gpac.cvs.sourceforge.net:/cvsroot/gpac login
passwordはなし
$ cvs -z3 -d:pserver:anonymous@gpac.cvs.sourceforge.net:/cvsroot/gpac co -P gpac
$ cd gpac
$ cvs update -D "2010-01-23 UTC"
$ wget -c http://pastebin.php?dl=m59b9d49c
$ mv pastebin.php@dl=m59b9d49c muken_20100123.diff
$ patch -uNp0 < muken_20100123.diff
$ ./configure --prefix=/mingw/x86_64-pc-mingw32 --cross-prefix=x86_64-pc-mingw32- --cpu=x86_64 --static- mp4box
$ make lib apps
$ make install-lib
$ cp -p ./bin/gcc/MP4Box.exe /e/mp4tools/mp4box.exe
$ cd ~
ちなみに途中であてているパッチはVFR maniac氏の最新パッチ(どうやら現在、非公開の様子)
/e/mp4toolsは各自適当に変更して欲しい。
FFMPEG(今回は2010-02-01のスナップショット):
$ wget -c http://ffmpeg.org/releases/ffmpeg-checkout-snapshot.tar.bz2
$ tar jxvf ffmpeg-checkout-snapshot.tar.bz2
$ cd ffmpeg-checkout-snapshot
ここで./libswscale/swscale_template.cの2500行目あたりを次のように書き換え
#if ARCH_X86_64 && AV_GCC_VERSION_AT_LEAST(3,4)を
:: "m" (src1), "m" (dst), "g" (dstWidth), "m" (xInc_shr16), "m" (xInc_mask),
#else
#if ARCH_X86_64 && AV_GCC_VERSION_AT_LEAST(3,4)にする(1行だけ)。
:: "m" (src1), "m" (dst), "g" ((x86_reg)dstWidth), "m" (xInc_shr16), "m" (xInc_mask),
#else
$ ./configure --prefix=/mingw/x86_64-pc-mingw32 --cross-prefix="x86_64-pc-mingw32-" --enable-cross-compile --target-os=mingw32 --host-cc=gcc --enable-gpl --enable-postproc --enable-memalign-hack --enable-runtime-cpudetect --disable-devices --disable-filters --disable-encoders --disable-muxers --disable-network --disable-decoder=aac,ac3,adpcm_*,alac,als,ape,atrac?,cook,dca,dsicinaudio,dxa,eac3,flac,interplay_dpcm,mlp,mp1,mp2,mp3,mp3*,mpc?,pcm_*,qcelp,ra_*,sipr,truehd,truespeech,tta,vorbis,wavpack,wma*,twinvq --disable-demuxer=aac,ac3,pcm_*,ape,amr,ass,au,avs,dts,eac3,flac,mp3,mpc,mpc8,truehd,tta,w64,wav,wv --disable-parser=aac,ac3,dca,mlp,mpegaudio
$ make
$ make install
$ cd ~
configure長すぎる...でもバイナリが小さくなるし、無効にしても影響のない機能はなるべく切るべきだと思う。
なお、pthreadをautostaticでビルドしておけば、--enable-pthreadsもいけるそうだが、今回はパス。
ffms(現時点では275):
$ svn checkout http://ffmpegsource.googlecode.com/svn/trunk/ ffms2
$ cd ffms2
$ PKG-CONFIG="/mingw/x86_64-pc-mingw32/bin/pkg-config.exe" ./configure --prefix=/mingw/x86_64-pc-mingw32 --host=x86_64-pc-mingw32
$ make
$ make install
$ cd ~
なおpkg-config.exeは
http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.23-3_win32.zip
glibは
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.22/glib_2.22.3-1_win32.zip
からDLして、あらかじめ/mingw/x86_64-PC-mingw32以下にまとめてぶちこんでおくこと
x264:
$ git clone git://git.videolan.org/x264.git x264
$ cd x264
$ ./configure --cross-prefix=x86_64-pc-mingw32- --host=x86_64-pc-mingw32
$ make fprofiled VIDS="/g/for_test/soccer_4cif.y4m"
$ make install
$ cp -p /usr/local/bin/x264.exe /e/x264/mine/x264_r1416.exe
$ exit
なんか-march=core2はあまり速くならないようなので、最近はあまりつけていない
fprofiledの動画はなんでもいいらしいが、とりあえずhttp://media.xiph.org/video/derf/y4m/soccer_4cif.y4mを使っている。
mp4box同様、/e/x264/mineのあたりは各自で適当に変えること
上には書いてないが、NAL-HRDパッチとkomisar氏のlog_fileパッチはいつも当てている。
以上で終了。
筆者にIRCで丁寧に教えてくれたVFR maniac氏とJEEB氏に感謝します。
登録:
投稿 (Atom)