NetBSD/amd64-current上でIntel Quick Sync Videoを使ってみる

この記事は、 NetBSD Advent Calendar 2018の10日目の記事です。

はじめに

IntelのCPUに内蔵されているGPUには、Intel Quick Sync Video (QSV)というビデオのデコードとエンコードをする仕組みが入っています。 今回は、KabylakeなIntel Core i7なチップの搭載されているHP Spectre x360 ae019TUで、NetBSD/amd64 8.99.27上で、 H.264のビデオのデコードとエンコードをQSVでさせてみました。 エンコードには、pkgsrc/multimedia/ffmpeg4を使い、 デコードには、pkgsrc/multimedia/mpvを使います。 比較のためにfmpeg4でCPUを使ってH.264を利用しますが、 これには本来はライセンスが必要なはずです。 CPUを使ってH.264のデコード/エンコードをしてはいけないと思います。

Intel QSVを使用する準備

NetBSDでIntel QSVを使うためには、pkgsrc/multimedia/libva (VA API)を使うのが一番良いようです。 Intel Media SDKはもしNetBSDで使えたとしても相当苦労するのが明らかですし、 VDPAUは、2015年以降のコミットは2018年11月の2件のみです。

NetBSD/amd64 8.99.27で必要なものをpkgsrcからインストールします。 pkgsrc/multimedia/ffmpeg4pkgsrc/multimedia/mpvもNetBSD/amd64 8.99.27ではpkgsrc/multimedia/libva に依存するのが既定値になっています。 本当に自分の環境でlibvaサポートが有効になるかを確認したい場合にが、 make show-optionsの出力にvaapiが含まれているかを確認すれば良いでしょう。 libvaからIntel QSVを使うには、pkgsrc/multimedia/intel-vaapi-driverが必要です。 また、libvaの動作確認をするには、pkgsrc/multimedia/libva-utilsがあると良いです。

# cd /usr/pkgsrc/multimedia/ffmpeg4
# make install
# cd /usr/pkgsrc/multimedia/mpv
# make install
# cd /usr/pkgsrc/multimedia/intel-vaapi-driver
# make install
# cd /usr/pkgsrc/multimedia/libva-utils
# make install
これで必要なソフトウェアは準備できました。

本当にIntel QSVが使えるか確認する

mpvffmpeg4を使ってみる前に、libva-utilsパッケージに含まれるvainfoコマンドで、 サポートされているIntel QSVの機能を確認してみます。

$ vainfo
vainfo: VA-API version: 1.3 (libva 2.3.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Kaby Lake - 2.2.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSlice
      VAProfileVP9Profile2            : VAEntrypointVLD
私の環境ではH.264のサポートはデコードもエンコードも有効なようです。

より古いIntel製CPUの場合には、提供されない機能もあるようです。 ですので、全ての環境で同じ結果が表示されるとは限りません。

テスト用のビデオファイルを用意する

良く考えると、私は全くビデオファイルを持っていませんでした。 自由に使えるビデオファイルと言えば、Blender FoundationのBig Buck Bunnyの3Dアニメーションビデオです。 https://download.blender.org/peach/bigbuckbunny_movies/から、 big_buck_bunny_1080p_stereo.aviのファイルをダウンロードしておきます。 これは、MS MPEG4というcodecでエンコードされたファイルのようです。

H.264にエンコードしてみる

ffmpeg4を使ってH.264にエンコードしてみます。 ちょっとマシンの都合が悪く、実際の結果を示せませんが、おおむね以下のような性能でエンコードされました。 大変期待外れな内容です。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 1.7倍程度 1.0倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.avi software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.avi hardware.mp4
QSVエンコードの場合、load averageは2程度で推移しています。 もしかしたらMS MPEG4のデコードが律速になっているのかもしれません。

big_buck_bunny_1080p_stereo.aviのファイルをH.264エンコードのファイルに変換したファイルを変換元ファイルにして 再度挑戦してみます。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 0.3倍程度 0.7倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4
余計に悪くなってしまいました。

次にQSVの場合のH.264のデコードも有効にしてみます。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 0.3倍程度 9.3倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4
これくらい差があれば、ありがたさを実感できます。

mpvでのデコード

pkgsrc/multimedia/mpvでIntel QSVでデコードして視聴する場合には、以下のようにします。

$ mpv --hwdec=vaapi --vo=vaapi big_buck_bunny_1080p_stereo.mp4
これで視聴すると、load averageは上がらないようですし、H.264のライセンスのことも気にしなくて良いのかもしれません。

実際には、VP9等のcodecもIntel QSVはサポートしています。そちらの方が有用かもしれません。

明日は、furandon_pigさんが記事を書いてくれます。

No comments:

Post a Comment

NetBSD/amiga-current on WinUAE Amiga m68k emulator

この記事は、 NetBSD Advent Calendar 2019 の10日目の記事です。 はじめに ウェブを検索してみると、NetBSD/amigaをWinUAEというm68kを搭載したAmigaというマシンでNetBSD/amigaを動かした記録が見付かります。...