18 Jun 2015

x265のMulti-library Interfaceやmultilib buildを使って8bit/10bit両方出力できるようにする

x265はx264と違って一つの実行ファイルで8/10 bit-depth両方出力が可能だ.

その方法はタイトルの通り,(i) Multi-library Interfaceを用いてビルド時にリンクしたのとは違うbit-depthを指定しビルドしたライブラリをLoadLibrary/dlopenして使う方法 と (ii) ビルド時にmultilibなバイナリとしてビルドする方法 の二通りがある.
これでx264の時みたいに異なるpathに2つの実行ファイルを置いたりファイル名を変えたりして使い分ける必要がなくなる.
以下では上記の二通りの方法でのビルド方法を記す.なお通常のビルド方法は理解しているものとする.
MinGW-w64.GCCをコンパイラとして用い,ビルドに必要なツール(cmakeとか)は全て揃っているものとし,MSYS2 bash上で実行することを前提とするが,特にwindows specificな内容ではない.
あとcmake-guiとかは使わないのでgui上でオプション等がどうなってるかとかは知らんです.

(i) Multi-library Interface を用いる

(a) まずは普通に8, 10 bit-depthどちらでもいいので普通にcliをビルドする(詳細略).
この時,libx265とはstatic/shared linkどちらでもいい(自分でイジらないかぎりwindows環境ではx265.exeはstatic buildとなるが…).
(b) 次に先ほどビルドした時とは異なるbit-depthでdllをビルドする.
つまり (a) でビルドしたのが8 bit-depthなら10 bit-depthの,10 bit-depthなら8 bit-depthのdllをビルドする.
この時cliは必要ないのでcmakeのオプションに-DENABLE_CLI:BOOL=OFFを渡すと良い.
(c) (b) でビルドしたdllをリネームする.
(b) でビルドしたのが8 bit-depthなdllならlibx265_main.dll,10 bit-depthならlibx265_main10.dllとする.
このファイル名はハードコードされているので違うファイル名だとLoadLibraryで呼び出されないので注意.

以上でコンパイル作業は終了.ココマデ間違わずにビルドできたとすると以下の2つの組合せが考えられる.
(1) 8 bit-depthなx265.exe,libx265_main10.dll
(2) 10 bit-depthなx265.exe,libx265_main.dll

(1) の場合,特に指定しなければ8 bit-depthの出力となり10 bit-depthで出力したい場合は--output-depth=10を渡せばいい.(2) の場合はその逆.
dllはPATHの通った場所に置いておく必要がある.特にこだわりがなければx265.exeと同じディレクトリに置いておけばいい.

x265をライブラリとしても使うのであればこちらの方法をおすすめする.この方法を使えばx265のMulti-library Interfaceに対応しているその他のソフトウェアでも同様に両bit-depthでの出力ができる(例えばFFmpeg).
因みにMSYS2のMINGW-packagesから手に入るx265パッケージはlibx265_main10.dllが含まれるので特に意識せずともこの方法を使っていることとなる.というか私がlibx265_main10.dllもインストールするようにした (https://github.com/Alexpux/MINGW-packages/pull/670).

(ii) multilibなバイナリとしてビルドする

(a) build/multilib-gmake/README.txt を読め.
以上.
と言うとあまりにもアレなので注意点を幾つか…
まず,win環境で使うcmakeは物によってはデフォルトのGeneratorsが異なる.適宜{8bit,10bit}/build.shを編集して-G'MSYS Makefiles'とか追加するとよい.
また,README.txtに書かれている通り,初めに10 bit-depthをビルドし次に8 bit-depthをビルドする必要がある.
(source/CMakeLists.txtを書き換えれば逆順でもいいが…)

===== 追記 (2016/06/23) =====
build/msys/multilib.sh 叩けばおk.
===== 追記ココマデ =====

この方法を取るとdll無しで完全に一つのx265.exe単体で両bit-depth出力が可能.
FFmpeg等にlibx265を使わないなどの場合こちらでもいいと思う.
ただし,開発者はあまりmultilib buildを気にかけてないっぽくリンクエラーに出くわすことがあるかと.
大抵 source/common/x86/asm-primitives.cpp でのPFX()マクロ使い忘れなので簡単に修正できるのだけれど毎回は面倒い.
===== 追記 (2016/06/23) =====
multilib buildに関してはほぼほぼ修正された.特に何もせずともビルドできるだろう.
===== 追記ココマデ =====

以上.

AVX2乗ってる石欲しい…

No comments:

Post a Comment