隙間産業的な記事。
VP9のエンコードはそろそろ早くなったりしないかなあと思いつつlibvpxの中身を眺めていたら、
なんか行けそうな気がしてやってみたら出来たのでメモっておきます。
ちなみに私はlibvpxの中身を熟知しているわけではなく、
部分部分をちょいちょいとつまんで解釈し
なんとなく合ってそうというものであるとご理解ください。
きっかけは、libvpxの中身を見ていたら「gen_msvs_sln.sh」とか「gen_msvs_vcxproj.sh」とかが有るのに気づいたことで、
同時に「これをLinux上で動かしてslnとかvcxprojとか作れればそれを持ってきてVSでビルド出来るんじゃね?」と閃きました。
これらのスクリプトはconfigureでtargetにvsを選択すると使われるようになっています。
例えば、VS12で64bit用にビルドしたい場合はtargetにx86_64-win64-vs12を指定します
# ./configure --target=x86_64-win64-vs12
※targetの一覧はconfigureのhelpに出てきます。
これでmakeすると、指定したVS向けファイルが作成されます。
configureの中のヘッダチェックとかも気になったのですが、主にtargetを確認する処理になっていて、
実際そのヘッダが有るかないかとかは見てないので大丈夫そうです。
細かい手順や注意点は以下になります。
gitのcloneを取る
# git clone https://chromium.googlesource.com/webm/libvpx # cd libvpx
試した時のrevisionはこれでした
# git rev-parse HEAD 44afbbb72d8a5fa0528f8a571a5023a843d02f33
作業用にまるっとコピーします
# mkdir ../export # git archive --format=tar HEAD | tar -x -C ../export # cd ../export
VSプロジェクトファイル内のincludeディレクトリ指定に、configureした時のLinux上のフルパスが現れないように書き換えます
# sed -i -e 's/SRC_PATH_BARE=$source_path/SRC_PATH_BARE=./' build/make/configure.sh # sed -i -e 's/CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)/CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/' -e 's/CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)/CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/' build/make/Makefile
vpxenc以外コンパイルしたくないんじゃあという場合は、examplesの対象をvpxencだけに書き換えます
# sed -i -e 's/ALL_EXAMPLES = $(UTILS) $(EXAMPLES)/ALL_EXAMPLES = vpxenc.c/' examples.mk
お好みのオプションを選択してconfigure
# ./configure --log=no --target=x86_64-win64-vs12 --enable-static-msvcrt --disable-vp8 --disable-unit-tests
vp9のdecoderも要らないのでOFFにしようと思ったのですが
decoderが一個も無くなると一部ソースがコンパイルエラーになるのでやめました。
makeするとVS用のプロジェクトファイルとかソリューションファイルが作成されます
# make
後はこのソースツリーをまるごとWindowsに持ってきてvpx.slnをVSで開けばビルドできます。
※yasmのインストールも必要です
さて、VP9のエンコードは今どのくらいの速度なのでしょうか。
1920 * 1080 FPS30の動画をエンコードしてみました。
CPUはCore i7 3770です。
オプションがまだ完全に把握出来ていないのですが、
まずはおそらく最速の設定であろう「good cpu-used=8」を試しました
vpxenc --output=output.webm --threads=4 --good --cpu-used=8 --passes=1 --codec=vp9 --webm --end-usage=cq --cq-level=10 --i420 --color-space=bt709 --width=1920 --height=1080 input.y4m
思ったより早い!11FPSくらい出ました。
そこそこ使えなくもない早さな気がします。
でも、どうせなら遅くても品質を取りたいので、次は「best」を設定してみました。
vpxenc --output=output.webm --threads=4 --best --passes=1 --codec=vp9 --webm --end-usage=cq --cq-level=10 --i420 --color-space=bt709 --width=1920 --height=1080 input.y4m
結果は14FPMでした。
FPSじゃないです。FPMです。
最初表示がバグったかと思いました。
こんな表示が用意してあるあたり開発側もまだ遅いと思っているのでしょう。
品質についてはbestのエンコード終了を待てなかったので比較していません。