neon最適化ffmpegのビルドの試行(その1失敗)

概要

この端末(NetWalker)を買った理由のひとつに「ニコニコ動画などの動画ファイルを簡単に見たい」という目的がありました。今までもPSPなどの端末で見れたんですが、そのままの形式では再生不可で再エンコードが必要になる場合がほとんどでした。これがなかなかメンドクサイので、できるならそのままのフォーマットで見たいわけですね。今回のNetWalkerUbuntuベースなので、vlcやffplayなど殆どのフォーマットに対応しているプレイヤーも簡単にインストールできるんじゃね?と思って期待していました。しかし再生ソフトは何種類かあるんですが、NetWalkerのCPUが貧弱(ARM-8000MHz)なのか、デフォルトのvlcとかtotemでは色合いがおかしい、カクカクするなどの不具合があるみたいです。そこで今回はリポジトリ標準バイナリを使うのではなくneonなどの拡張命令に最適化して、負荷を下げて、滑らかに再生されるように頑張ってみようと思います。

目的:youtube、ニコニコの動画ファイルをそのままの形式で問題なく再生できるffplayを作る

比較用ffmpegのインストール

 $ sudo apt-get install ffmpeg libsdl-dev subversion(後で必要になるのでついでに)
 $ ffplay hoge.flv(hoge.flvはveohで落としたもの)

当然のごとくフレーム落ちが酷く、カクカクしまくりでした。

最適化してみる

 $ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
 $ ./configure --arch=armv7l --cpu=cortex-a8
 $ make

cortex-a8で最適化したつもりですが、neonとかvfpとかが有効化されてない気がします(ARMv5TE,ARMv6,ARMv6T2まではサポートされるので少しは最適化されてるのかも)。バイナリが出来たみたいなんで試しに再生してみましたがあんまり変わらなかったです。相変わらずカクカクしてます。やっぱneonへの対応が必要な気がします。

 $ zcat /proc/config.gz

で見る限りカーネルレベルでneonとvfpは有効化されてるはずなのでneonとかも使えると思うんですけどね。「--enable-neon」とかやっても有効化されませんでした。

で、ちょっと検索してみると、BeagleBoardの例でいろいろありました。
http://www.mail-archive.com/ffmpeg-issues@lscube.org/msg01547.html
http://hardwarebug.org/category/compilers/
http://elinux.org/BeagleBoard

どうやらcflagsとldflagsに追加する事でneon等のSIMD命令を有効化できそうです。

./configure --disable-muxers --disable-encoders --arch=armv7l --cpu=cortex-a8 --enable-ffplay --disable-devices --disable-network --disable-shared --enable-pthreads --disable-debug --extra-cflags="-mfpu=neon -mfloat-abi=softfp" --extra-ldflags="-mfpu=neon -mfloat-abi=softfp" 

今回はneonの機能が有効化されたみたいです。(ビルド時間短縮のため色々な機能をOFFに)

ARMv5TE enabled           yes
ARMv6 enabled             yes
ARMv6T2 enabled           yes
ARM VFP enabled           yes
IWMMXT enabled            no
NEON enabled              yes

そして

 $ make clean; make

で作成されたffplayで再生

 $ ./ffplay-opt hoge.flv

再生するとなぜかOSごとフリーズ(これってヤバイ事やってるのかも)、仕方なく強制電源OFFして再起動。
という訳で失敗してしまいました。これからも頑張ってみますが解決策を知ってる方がいらっしゃったらどうか教えてください。それだけが私の望みです。