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/
比較
最適化前の標準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を使ってVLCやSMPlayerなど使いやすいプレイヤーに組み込みたいです。
あと自作版でもffplayの再生はまだまだ微妙な気がしました。
オマケ、ffmpegを復元したくなったんだけど
依存しそうなものを全部消して再インストールすれば元に戻るかも
sudo apt-get autoremove ffmpeg libavcodec-dev libavformat-dev libavutil-dev sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libavutil-dev