labunix's blog

labunixのラボUnix

mpv+vaapiで動画再生(ハードウェアアクセラレーションによるデコード)を試してみる。

■mpv+vaapiで動画再生(ハードウェアアクセラレーションによるデコード)を試してみる。

$ find . \! -type d -cmin +0 -a -cmin -120 -exec mpv --hwdec=vaapi --vo=vaapi {} +

■検索語句として、カクカクは、スタッタリング (screen stuttering) 、
 複数フレームの画像が混ざるのは、ティアリング(screen tearing)と言うらしい。
 環境はdebian。

$ lsb_release -d
Description:	Debian GNU/Linux 9.9 (stretch)

■特別なGPUは無い環境なので、Intel第3世代CPUに内蔵されているグラフィックコントローラを使う。

 VDPAUはNvidia主導の、VA-APIはIntel主導のAPI。
 VDPAUは再生のみ。VA-APIはエンコードもできる。

$ ls -l /dev/dri/
合計 0
crw-rw----+ 1 root video 226,   0  61 00:53 card0
crw-rw----  1 root video 226,  64  61 00:53 controlD64
crw-rw----+ 1 root video 226, 128  61 00:53 renderD128

$ lspci | grep Gra
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)

$ lspci -vvv -s 00:02.0
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09) (prog-if 00 [VGA controller])
	Subsystem: Acer Incorporated [ALI] 3rd Gen Core processor Graphics Controller
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 30
	Region 0: Memory at c0000000 (64-bit, non-prefetchable) [size=4M]
	Region 2: Memory at b0000000 (64-bit, prefetchable) [size=256M]
	Region 4: I/O ports at 2000 [size=64]
	[virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
	Capabilities: <access denied>
	Kernel driver in use: i915
	Kernel modules: i915

■まずはVA-API動画再生支援の情報を採取してみる。

$ sudo apt-get install -y vainfo

$ vainfo
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.3)
vainfo: Driver version: Intel i965 driver for Intel(R) Ivybridge Mobile - 1.7.3
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Simple            :	VAEntrypointEncSlice
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSlice
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSlice
      VAProfileH264StereoHigh         :	VAEntrypointVLD
      VAProfileVC1Simple              :	VAEntrypointVLD
      VAProfileVC1Main                :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD
      VAProfileNone                   :	VAEntrypointVideoProc
      VAProfileJPEGBaseline           :	VAEntrypointVLD

■VA-API方式の動画再生支援に対応している方式の一覧

$ vainfo 2>&1 | awk '/VAEntrypointVLD/{print $1}'
VAProfileMPEG2Simple
VAProfileMPEG2Main
VAProfileH264ConstrainedBaseline:
VAProfileH264Main
VAProfileH264High
VAProfileH264StereoHigh
VAProfileVC1Simple
VAProfileVC1Main
VAProfileVC1Advanced
VAProfileJPEGBaseline

■次にVDPAU方式の動画再生支援の情報を採取してみる。
 va_gl に設定する必要があるのは、Intel Graphics と、 AMD Catalyst
 結局のとろこ、VDPAUは見つからず、VA-APIの情報の一部を表示している。

$ sudo apt-get install -y vdpauinfo
$ vdpauinfo
display: :0   screen: 0
Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory
Error creating VDPAU device: 1

$ env VDPAU_DRIVER=va_gl vdpauinfo
display: :0   screen: 0
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
API version: 1
Information string: OpenGL/VAAPI backend for VDPAU

Video surface:

name   width height types
-------------------------------------------
420     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 
422     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 
444     4096  4096  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 

Decoder capabilities:

name                        level macbs width height
----------------------------------------------------
MPEG1                          --- not supported ---
MPEG2_SIMPLE                   --- not supported ---
MPEG2_MAIN                     --- not supported ---
H264_BASELINE                  51 16384  2048  2048
H264_MAIN                      51 16384  2048  2048
H264_HIGH                      51 16384  2048  2048
VC1_SIMPLE                     --- not supported ---
VC1_MAIN                       --- not supported ---
VC1_ADVANCED                   --- not supported ---
MPEG4_PART2_SP                 --- not supported ---
MPEG4_PART2_ASP                --- not supported ---
DIVX4_QMOBILE                  --- not supported ---
DIVX4_MOBILE                   --- not supported ---
DIVX4_HOME_THEATER             --- not supported ---
DIVX4_HD_1080P                 --- not supported ---
DIVX5_QMOBILE                  --- not supported ---
DIVX5_MOBILE                   --- not supported ---
DIVX5_HOME_THEATER             --- not supported ---
DIVX5_HD_1080P                 --- not supported ---
H264_CONSTRAINED_BASELINE      51 16384  2048  2048
H264_EXTENDED                  --- not supported ---
H264_PROGRESSIVE_HIGH          --- not supported ---
H264_CONSTRAINED_HIGH          --- not supported ---
H264_HIGH_444_PREDICTIVE       --- not supported ---
HEVC_MAIN                      --- not supported ---
HEVC_MAIN_10                   --- not supported ---
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   --- not supported ---
HEVC_MAIN_444                  --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8          8192  8192    y  
R8G8B8A8          8192  8192    y  
R10G10B10A2       8192  8192    y  
B10G10R10A2       8192  8192    y  
A8                8192  8192    y  

Bitmap surface:

name              width height
------------------------------
B8G8R8A8          8192  8192
R8G8B8A8          8192  8192
R10G10B10A2       8192  8192
B10G10R10A2       8192  8192
A8                8192  8192

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             -
DEINTERLACE_TEMPORAL_SPATIAL     -
INVERSE_TELECINE                 -
NOISE_REDUCTION                  -
SHARPNESS                        -
LUMA_KEY                         -
HIGH QUALITY SCALING - L1        -
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              -  
VIDEO_SURFACE_HEIGHT             -  
CHROMA_TYPE                      -  
LAYERS                           -  

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 -  
CSC_MATRIX                       -  
NOISE_REDUCTION_LEVEL            -  
SHARPNESS_LEVEL                  -  
LUMA_KEY_MIN_LUMA                -  
LUMA_KEY_MAX_LUMA                -  

■VDPAU方式が対応している一覧
 この環境では、OpenGL/VAAPIの情報のみ。

$ env VDPAU_DRIVER=va_gl vdpauinfo 2>&1 |     awk 'BEGIN{a=1}{if(/Decoder capabilities:/){a=0}\                
               else{if(/Output surface:/){a=1}\
               else{if((a==0 && $0 !~ /not supported/)||/backend/){print $0}}}}'
Information string: OpenGL/VAAPI backend for VDPAU

name                        level macbs width height
----------------------------------------------------
H264_BASELINE                  51 16384  2048  2048
H264_MAIN                      51 16384  2048  2048
H264_HIGH                      51 16384  2048  2048
H264_CONSTRAINED_BASELINE      51 16384  2048  2048

■mpvのインストール

$ sudo apt-get install -y mpv
$ mpv --list-options | awk '/vaapi|vdpau/'
 --hwdec                          Choices: no auto yes auto-copy vdpau vdpau-copy videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi rpi-copy mediacodec cuda cuda-copy crystalhd (default: no)
 --hwdec-preload                  Choices: no auto yes auto-copy vdpau vdpau-copy videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi rpi-copy mediacodec cuda cuda-copy crystalhd (default: no)
 --vo-vaapi-scaled-osd            Flag (default: no)
 --vo-vaapi-scaling               Choices: default fast hq nla (default: default)
 --vo-vdpau-chroma-deint          Flag (default: yes)
 --vo-vdpau-colorkey              Color
 --vo-vdpau-composite-detect      Flag (default: yes)
 --vo-vdpau-deint                 Integer (-4 to 4) (default: 0)
 --vo-vdpau-denoise               Float (0 to 1) (default: 0.000000)
 --vo-vdpau-force-yuv             Flag (default: no)
 --vo-vdpau-fps                   Float (default: 0.000000)
 --vo-vdpau-hqscaling             Integer (0 to 9) (default: 0)
 --vo-vdpau-output-surfaces       Integer (2 to 15) (default: 3)
 --vo-vdpau-pullup                Flag (default: no)
 --vo-vdpau-queuetime-fs          Integer (default: 50)
 --vo-vdpau-queuetime-windowed    Integer (default: 50)
 --vo-vdpau-sharpen               Float (-1 to 1) (default: 0.000000)

■テスト動画を取得
 選択したのは2DのFull HD (1920x1080)/60fps。
 339Mもあるが、テストは全部ダウンロードしきらなくても行える。

 Download Guide: Big Buck Bunny, Sunflower version
 http://bbb3d.renderfarming.net/download.html

$ wget http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4

■デフォルトの動画再生支援なしの場合、yuv420p
 vaapiが何らかの理由で使えずにfallbackした場合もこれ。

$ mpv bbb_sunflower_1080p_60fps_normal.mp4
Playing: bbb_sunflower_1080p_60fps_normal.mp4
 (+) Video --vid=1 (*) (h264)
 (+) Audio --aid=1 --alang=und (*) (mp3)
     Audio --aid=2 --alang=und (*) (ac3)
File tags:
 Artist: Blender Foundation 2008, Janus Bager Kristensen 2013
 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
 Composer: Sacha Goedegebure
 Genre: Animation
 Title: Big Buck Bunny, Sunflower version
AO: [pulse] 48000Hz stereo 2ch s16
VO: [opengl] 1920x1080 yuv420p
AV: 00:00:10 / 00:10:34 (1%) A-V:  0.132 Dropped: 59

■引数なしで「hwdec」オプションを付与すると、vaapi
 「Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory」の
 行があるので、「自動」を選択したようなもの。

$ mpv --hwdec bbb_sunflower_1080p_60fps_normal.mp4
Playing: bbb_sunflower_1080p_60fps_normal.mp4
 (+) Video --vid=1 (*) (h264)
 (+) Audio --aid=1 --alang=und (*) (mp3)
     Audio --aid=2 --alang=und (*) (ac3)
File tags:
 Artist: Blender Foundation 2008, Janus Bager Kristensen 2013
 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
 Composer: Sacha Goedegebure
 Genre: Animation
 Title: Big Buck Bunny, Sunflower version
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory
AO: [pulse] 48000Hz stereo 2ch s16
Using hardware decoding (vaapi).
VO: [opengl] 1920x1080 vaapi
AV: 00:00:03 / 00:10:34 (0%) A-V:  0.000

■VO(Video Output)も、opengl の代わりにvaapi を使う。

$ mpv --vo=help
Available video outputs:
  opengl         : Extended OpenGL Renderer
  vdpau          : VDPAU with X11
  wayland        : Wayland SHM video output
  xv             : X11/Xv
  sdl            : SDL 2.0 Renderer
  vaapi          : VA API with X11
  x11            : X11 (slow, old crap)
  null           : Null video output
  image          : Write video frames to image files
  tct            : true-color terminals
  drm            : Direct Rendering Manager

$ mpv --hwdec=vaapi --vo=vaapi dlsv/bbb_sunflower_1080p_60fps_normal.mp4 
Playing: dlsv/bbb_sunflower_1080p_60fps_normal.mp4
 (+) Video --vid=1 (*) (h264)
 (+) Audio --aid=1 --alang=und (*) (mp3)
     Audio --aid=2 --alang=und (*) (ac3)
File tags:
 Artist: Blender Foundation 2008, Janus Bager Kristensen 2013
 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
 Composer: Sacha Goedegebure
 Genre: Animation
 Title: Big Buck Bunny, Sunflower version
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
AO: [pulse] 48000Hz stereo 2ch s16
Using hardware decoding (vaapi).
VO: [vaapi] 1920x1080 vaapi
AV: 00:00:02 / 00:10:34 (0%) A-V:  0.000

Exiting... (Quit)

■使えるドライバを探したら、「i965_drv_video.so」が見つかったというイメージ。

$ ls -l /usr/lib/x86_64-linux-gnu/dri/
合計 115472
-rw-r--r-- 5 root root 7273952  426  2017 i915_dri.so
-rw-r--r-- 5 root root 7273952  426  2017 i965_dri.so
-rw-r--r-- 1 root root 2113216 1111  2016 i965_drv_video.so
-rw-r--r-- 8 root root 9969544  426  2017 kms_swrast_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 nouveau_dri.so
-rw-r--r-- 5 root root 7273952  426  2017 nouveau_vieux_dri.so
-rw-r--r-- 5 root root 7273952  426  2017 r200_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 r300_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 r600_dri.so
-rw-r--r-- 5 root root 7273952  426  2017 radeon_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 radeonsi_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 swrast_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 virtio_gpu_dri.so
-rw-r--r-- 8 root root 9969544  426  2017 vmwgfx_dri.so

■(「*.crdownload」のためにファイルを探す「-typd f」ではなく)ディレクトリ以外で、
 ファイルの最終ステータス変更日時が、「0分以上前かつ120分前」なら、
 「mpv --hwdec」に引数としてマッチした複数のファイル名をパラメータで渡す。

 「{} \;」だと1ファイル名毎に起動してしまうので、「{} +」を使う点に注意。

$ find . \! -type d -cmin +0 -a -cmin -120 -exec mpv --hwdec=vaapi --vo=vaapi {} +