【開発メモ】libvpxビルド方法(Android)

ChromMMDVRをAndroidスマホのVR対応しました。原理的には動画圧縮したVR画像を、スマホのクライアントで受信して表示できるようにしているだけです。

動画圧縮のコーデックにはオープンソースのlibvpx(VP8)を使うことにしました。
Android向けのライブラリのビルドはLinuxが必要となりますが、不慣れなLinuxで試行錯誤し苦労しましたので、(主に自分向けに)ビルド手順をメモしておきます。

Linux環境はWindows10のBash on Ubuntu on Windowsを使用しました。

1. Bash on Ubuntu on Windowsのインストール

以下などを参照。

http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html

なお、今回手順確認時のWindows10のバージョンは以下。
バージョン: 1703
OSビルド:15063.674

Linuxのバージョン(/proc/version)は以下。
Linux version 4.4.0-43-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #1-Microsoft Wed Dec 31 14:42:53 PST 2014

2. Bash on Ubuntu on Windowsの再インストール

初期状態からの手順を書くので、念のためLinux環境を初期状態に戻します。
(実行した場合、Linux環境はすべて初期状態に戻るので注意。この手順は行わなくても、おそらくは問題なし。Linux環境インストール後にいろいろ環境をいじった後の前提なので、インストール直後なら必要なし)
http://www.atmarkit.co.jp/ait/articles/1610/05/news033.html

  • Linux環境アンインストール
    Windowsコマンドプロンプトで以下のコマンドを実行
lxrun /uninstall /full
  • Linux環境再インストール
    Windowsコマンドプロンプトで以下のコマンドを実行
lxrun /install
3. 必要コマンドのインストール

Bash on Ubuntsu on Windowsを起動し、unzip,make,pythonをインストールします。
※pythonはtoolchainのインストール(make-standalone-toolchain.sh)で使用します。

sudo apt install unzip
sudo apt install make
sudo apt install python
4. NDKの展開

Linux用NDKをダウンロードし、unzipで解凍します(大文字小文字違いのファイルがあるため?Windowsで解凍するとおそらく失敗します)。
NDKはr14b(android-ndk-r14b-linux-x86_64.zip)を使用しています。
展開したいフォルダにzipファイルを置き、以下を実行。

unzip android-ndk-r14b-linux-x86_64.zip
5. libvpxの展開

libvpxをダウンロードし、展開します。
libvpxは1.6.1(libvpx-0c0a05046db1c0b59a7fcc29785a190fdbbe39c2.tar.gz)を使用しています。

tar xvzf libvpx-0c0a05046db1c0b59a7fcc29785a190fdbbe39c2.tar.gz
6. armeabi-v7aのビルド

ARM v7-A CPU向けのライブラリビルド。
ここでは、4で展開したNDKのパスを次のように環境変数NDKとしておきます。

export NDK=/mnt/g/Dev/android/android-ndk-r14b
  • configure/ビルド実行
    以下で、ビルド出来ます。
    いらないものはビルドしてません。–extra-cflags=”-mfloat-abi=softfp -mfpu=neon” は、これがないと表示されるエラーにより追加してますが、これでいいのかよくわかってません^^;
./configure --target=armv7-android-gcc --sdk-path=$NDK --extra-cflags="-mfloat-abi=softfp -mfpu=neon" --disable-unit-tests --disable-examples --disable-webm-io --disable-libyuv
 make clean
 make
7. x86_64のビルド

x86(64bit) CPU向けのライブラリビルド。
実機でのサポートというより、Windows上でAndroidシミュレータを実行するためにビルドしたものです。–sdk-pathのtoolchainは使われないようなので、手動で設定しています。MMX有効だとリンクでエラーになるので無効にしています(なので処理は遅いと思います)。

  • toolchainのインストール
    $NDK/build/toolsに移動し、以下のコマンドを実行。
./make-standalone-toolchain.sh --arch=x86_64 --install-dir=(toolchainのインストールパス)
  • 環境変数
    環境変数を以下のように設定する。
export CC=x86_64-linux-android-gcc
export CXX=x86_64-linux-android-g++
export AR=x86_64-linux-android-ar
export AS=yasm
export LD=x86_64-linux-android-gcc
export RANLIB=x86_64-linux-android-ranlib
export PATH=(toolchainのインストールパス)/bin:$PATH
  • configure/ビルド実行
    以下で、ビルド出来ます。
./configure --target=x86_64-android-gcc --disable-unit-tests --disable-examples --disable-webm-io --disable-libyuv --disable-mmx
 make clean
 make

 

【MMDVR】Chrom MMDVR V0.85公開

初公開からかなり月日が経ちましたが、ChromMMDVR(くろむ式MMDVR) V0.85を公開します。

ChromMMDVR V0.85

「調整パネル」でモデルの表示サイズを調整できるようになったのと、「ボーン回復モード」の強化が主な改善点です。
また「ボーンJoint」により、今までと操作感の異なる物理操作を実装しました。使い勝手は微妙なのでデフォルトOFFにしていますが、良い点もあるので状況により使用する/しないを切り替えて使うのが良いかと思います。使用する場合は「調整パネル」の[物理操作]タブで、[ボーンJointを使用する]をチェックしてください。
予告通り、スマホのVRにも対応していますが、とりあえず使えるようになったレベルで、トラッキングとか解像度とか厳しいところがあります。あまり期待しない方向でお願いします(スマホのクライアントアプリは近日?公開予定)。その他いろいろ使い勝手を改善しています。
追加した機能は以下の通り(使い方の詳細は添付のManual.txtをご参照ください)。

(V0.85変更点)

○「ボーンJoint」追加
⇒物理操作改善(?)の目的で「ボーン剛体」を結合する「ボーンJoint」を追加しました(「ボーン剛体」はV0.80の「物理ボーン」)。しかし、改善と改悪がありますw

○「調整パネル」追加
⇒[3D表示][視点操作][物理操作][SmartVR]の調整ができる調整パネルを追加しました。
・[3D表示]の[拡大率]によりモデルの表示サイズを調整できるようになりました。
・[物理操作]の[ボーン剛体同期間隔]の調整により、「ボーン回復モード」が効きやすくなりました

○「設定ダイアログ」追加
⇒設定ダイアログを追加しました(V0.85では[自動保存][SmartVR]関連の設定が可能)。

○「SmartVR」スマートフォン向けのVR対応
⇒スマートフォンでVRモードが使用できるSmartVR機能を追加しました。
使用するにはスマートフォン側のクライアントアプリが必要です(近日公開予定)。

○「視点変更モード」/「UIモード」切り替え機能追加
⇒VRモードでの視点変更操作中はカーソルを非表示にして他のウィンドウ操作ができない「視点変更モード」を追加し、「視点変更モード」/「UIモード」を切り替えて使用する機能を追加しました。
※この機能で左クリックを使用するため、VRモード/通常モードの切り替えはマウスボタン左右同時押しに変更になっています。

○「VRデスクトップをこちらに向ける」機能追加
⇒VRデスクトップを視点のほうに向ける機能を追加しました。「VRデスクトップを側に表示する」の挙動も若干修正。

○「視点変更操作による自動Undo登録」機能追加
⇒視点変更操作を行ったとき、それまでVRで行った物理操作を自動でUndo登録するようにしました。これにより物理操作中、常に視点変更時の状態までUndoできるようになりました。

○「物理リセット」機能追加
⇒物理がおかしくなったときのため、物理リセット機能を追加しました。