neon最適化ffmpegのビルドの試行(その2成功?)

今回のエントリもffmpegの最適化についてですが、前回は最適化っぽいフラグを設定してビルドまでは出来たものの、それを実行するとOSがダウンするという最低バイナリを作ってしまいました。
今回は、id:androidzaurusさんのココのページを参考にして落ちないバイナリを作れたのでリポジトリからインストールしたものと比較してみました。
(NEONの最適化が効いているのか微妙なのでアセンブラコード吐かせて確認してみるしかないかも)

ライブラリのビルド(ffmpeg rev20177)

./configure --disable-debug --enable-libfaad --enable-libtheora --enable-libmp3lame --enable-libxvid --enable-pthreads --enable-shared --enable-gpl --enable-libfaac --enable-nonfree --prefix=/usr --arch=armv7l --cpu=cortex-a8

とconfigureをした後
config.makのCFLAGSの末尾、「〜notree-vectorize」を削除して

 -march=armv7-a -mtune=cortex-a8 -ftree-vectorize -mhard-float -mfloat-abi=softfp -mfpu=neon -mvectorize-with-neon-quad

を追加する

ライブラリのバックアップ置き換え、/usr/lib/vfpとかあるんですけどひょっとしたらarmv6相当まで最適化されてたのかも?

sudo mkdir /usr/lib/vfp/old
sudo mv /usr/lib/vfp/libav* /usr/lib/vfp/old/
sudo cp -a libavcodec/libavcodec.so* /usr/lib/vfp/
sudo cp -a libavdevice/libavdevice.so* /usr/lib/vfp/
sudo cp -a libavformat/libavformat.so* /usr/lib/vfp/
sudo cp -a libavutil/libavutil.so* /usr/lib/vfp/

元のffmpegは.49にリンクされてるので、一応.50で実体も作ってあげる

sudo cp -a libavutil/libavutil.so.50 /usr/lib/vfp/libavutil.so.49

実行バイナリの置き換え

sudo cp -a ffmpeg /usr/bin/
sudo cp -a ffmpeg_g /usr/bin/
sudo cp -a ffplay /usr/bin/
sudo cp -a ffplay_g /usr/bin/
sudo cp -a ffserver /usr/bin/
sudo cp -a ffserver_g /usr/bin/

これでneon最適化済みのffmpeg、ffplayが入ったはず

比較

最適化前の標準ffmpegと最適化したつもりの自作ffmpegを使って、同じファイルを変換してみて比較する

自作版
kazu@netwalker:~$ ffmpeg -benchmark -i デスクトップ/dir/saki\ 01.flv -r 20 /media/disk/test.mpg
FFmpeg version SVN-r20177, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  built on Oct 10 2009 11:40:22 with gcc 4.3.3
  configuration: --disable-debug --enable-libfaad --enable-libtheora --enable-libmp3lame --enable-libxvid --enable-pthreads --enable-shared --enable-gpl --enable-libfaac --enable-nonfree --prefix=/usr --arch=armv7l --cpu=cortex-a8
  libavutil     50. 3. 0 / 50. 3. 0
  libavcodec    52.36. 0 / 52.36. 0
  libavformat   52.39. 0 / 52.39. 0
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0. 7. 1 /  0. 7. 1

Seems stream 0 codec frame rate differs from container frame rate: 48.00 (48/1) -> 24.00 (24/1)
Input #0, flv, from 'デスクトップ/dir/saki 01.flv':
  Duration: 00:23:54.95, start: 0.000000, bitrate: 294 kb/s
    Stream #0.0: Video: h264, yuv420p, 544x302, 294 kb/s, 24 tbr, 1k tbn, 48 tbc
    Stream #0.1: Audio: aac, 22050 Hz, stereo, s16
  Metadata
    audiocodecid    : 10
    audiodatarate   : 64
    audiosamplerate : 44100
    audiosamplesize : 16
    audiosize       : 11540332
    canSeekToEnd    : true
    datasize        : 64177795
    duration        : 1435
    filesize        : 64171395
    framerate       : 24
    hasAudio        : true
    hasCuePoints    : false
    hasKeyframes    : true
    hasMetadata     : true
    hasVideo        : true
    height          : 302
    lasttimestamp   : 1435
    metadatacreator : flvtool++ (Facebook, Motion project, dweatherford)
    stereo          : true
    totalframes     : 34441
    videocodecid    : 7
    videodatarate   : 288
    videosize       : 51616271
    width           : 544
Output #0, mpeg, to '/media/disk/test.mpg':
    Stream #0.0: Video: mpeg1video, yuv420p, 544x302, q=2-31, 200 kb/s, 90k tbn, 23.98 tbc
    Stream #0.1: Audio: mp2, 22050 Hz, stereo, s16, 64 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame=34406 fps= 23 q=31.0 Lsize=   48136kB time=1434.75 bitrate= 274.8kbits/s
video:36509kB audio:11209kB global headers:0kB muxing overhead 0.876616%
bench: utime=1455.050s
標準版
kazu@netwalker:~$ ffmpeg -benchmark -i デスクトップ/dir/saki\ 01.flv -r 20 /media/disk/test.dat
FFmpeg version 0.5-svn17737+3:0.svn20090303-1ubuntu6, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --extra-version=svn17737+3:0.svn20090303-1ubuntu6 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --disable-stripping --disable-vhook --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp --disable-neon --disable-altivec --disable-vis --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Apr 10 2009 23:56:29, gcc: 4.3.3

Seems stream 0 codec frame rate differs from container frame rate: 48.00 (48/1) -> 24.00 (24/1)
Input #0, flv, from 'デスクトップ/dir/saki 01.flv':
  Duration: 00:23:54.95, start: 0.000000, bitrate: 294 kb/s
    Stream #0.0: Video: h264, yuv420p, 544x302, 294 kb/s, 24 tbr, 1k tbn, 48 tbc
    Stream #0.1: Audio: aac, 22050 Hz, stereo, s16
Unable to find a suitable output format for '/media/disk/test.dat'
kazu@netwalker:~$ ffmpeg -benchmark -i デスクトップ/dir/saki\ 01.flv -r 20 /media/disk/test.mpg
FFmpeg version 0.5-svn17737+3:0.svn20090303-1ubuntu6, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --extra-version=svn17737+3:0.svn20090303-1ubuntu6 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --disable-stripping --disable-vhook --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp --disable-neon --disable-altivec --disable-vis --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Apr 10 2009 23:56:29, gcc: 4.3.3

Seems stream 0 codec frame rate differs from container frame rate: 48.00 (48/1) -> 24.00 (24/1)
Input #0, flv, from 'デスクトップ/dir/saki 01.flv':
  Duration: 00:23:54.95, start: 0.000000, bitrate: 294 kb/s
    Stream #0.0: Video: h264, yuv420p, 544x302, 294 kb/s, 24 tbr, 1k tbn, 48 tbc
    Stream #0.1: Audio: aac, 22050 Hz, stereo, s16
Output #0, mpeg, to '/media/disk/test.mpg':
    Stream #0.0: Video: mpeg1video, yuv420p, 544x302, q=2-31, 200 kb/s, 90k tbn, 23.98 tbc
    Stream #0.1: Audio: mp2, 22050 Hz, stereo, s16, 64 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame=34406 fps= 21 q=31.0 Lsize=   48138kB time=1434.70 bitrate= 274.9kbits/s
video:36510kB audio:11209kB global headers:0kB muxing overhead 0.879797%
bench: utime=1567.820s

結果

本当はH.264+AACのデコードだけで比較したかったけど良くわからなかったので断念
実時間ベースで考えても大体7〜8%高速化できた感じがします。
今度はこのlibavcodecを使ってVLCSMPlayerなど使いやすいプレイヤーに組み込みたいです。


あと自作版でもffplayの再生はまだまだ微妙な気がしました。

オマケ、ffmpegを復元したくなったんだけど

依存しそうなものを全部消して再インストールすれば元に戻るかも

sudo apt-get autoremove ffmpeg libavcodec-dev libavformat-dev libavutil-dev
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev