Hardware video acceleration makes it possible for the video card to decode/encode video, thus offloading the CPU and saving power.

There are several ways to achieve this on Linux:

Video Acceleration API (VA-API) is a specification and open source library to provide both hardware accelerated video encoding and decoding, developed by Intel.

Video Decode and Presentation API for Unix (VDPAU) is an open source library and API to offload portions of the video decoding process and video post-processing to the GPU video-hardware, developed by NVIDIA.

NVDECODE/NVENCODE - proprietary APIs for hardware video acceleration used by NVIDIA Fermi, Kepler, Maxwell and Pascal generation GPUs.

For pre-2007 video cards see XvMC. For comprehensive overview of driver and application support see #Comparison tables.

Installation

Intel

Intel graphics open-source drivers support VA-API:

HD Graphics series starting from Broadwell (2014) and newer are supported by .

GMA 4500 (2008) and newer GPUs, including HD Graphics up to Coffee Lake (2017) are supported by .

GMA 4500 H.264 decoding is supported by AUR , see Intel#Hardware accelerated H.264 decoding on GMA 4500.

, see Intel#Hardware accelerated H.264 decoding on GMA 4500. Haswell refresh to Skylake VP9 decoding and Broadwell to Skylake hybrid VP8 encoding is supported by AUR .

. Skylake or later also need .

Also see VAAPI supported hardware and features.

NVIDIA

Nouveau open-source driver supports both VA-API and VDPAU:

GeForce 8 series and newer GPUs up until GeForce GTX 750 are supported by and .

Requires AUR firmware package, presently extracted from the NVIDIA binary driver.

NVIDIA proprietary driver supports via :

VDPAU on GeForce 8 series and newer GPUs;

NVDECODE on Fermi and newer GPUs [1];

NVENCODE on Kepler and newer GPUs.

ATI/AMD

ATI and AMDGPU open-source drivers support both VA-API and VDPAU:

VA-API on Radeon HD 2000 and newer GPUs is supported by .

VDPAU on Radeon R300 and newer GPUs is supported by .

AMDGPU PRO proprietary driver is built on top of AMDGPU driver and supports both VA-API and VDPAU.

Translation layers

libva-vdpau-driver — A VDPAU-based backend for VA-API.

https://cgit.freedesktop.org/vaapi/vdpau-driver || , AUR , AUR

libvdpau-va-gl — VDPAU driver with OpenGL/VAAPI backend. H.264 only.

Verification

Your system may work perfectly out-of-the-box without needing any configuration. Therefore it is a good idea to start with this section to see that it is the case.

Tip: $ mpv --hwdec=auto video_filename and see mpv with its command-line support is great for testing hardware acceleration. Look at the log ofand see hwdec for more details.

Verifying VA-API

Verify the settings for VA-API by running vainfo , which is provided by :

$ vainfo

libva info: VA-API version 0.39.4 libva info: va_getDriverName() returns 0 libva info: Trying to open /usr/lib/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) Skylake - 1.7.3 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

VAEntrypointVLD means that your card is capable to decode this format, VAEntrypointEncSlice means that you can encode to this format.

In this example the i965 driver is used, as you can see in this line:

vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.7.3

If the following error is displayed when running vainfo :

libva info: va_openDriver() returns -1 vaInitialize failed with error code -1 (unknown libva error),exit

You need to configure the correct driver, see #Configuring VA-API.

Verifying VDPAU

Install to verify if the VDPAU driver is loaded correctly and retrieve a full report of the configuration:

$ vdpauinfo

display: :0 screen: 0 API version: 1 Information string: G3DVL VDPAU Driver Shared Library version 1.0 Video surface: name width height types 420 16384 16384 NV12 YV12 422 16384 16384 UYVY YUYV 444 16384 16384 Y8U8V8A8 V8U8Y8A8 Decoder capabilities: name level macbs width height MPEG1 --- not supported --- MPEG2_SIMPLE 3 9216 2048 1152 MPEG2_MAIN 3 9216 2048 1152 H264_BASELINE 41 9216 2048 1152 H264_MAIN 41 9216 2048 1152 H264_HIGH 41 9216 2048 1152 VC1_SIMPLE 1 9216 2048 1152 VC1_MAIN 2 9216 2048 1152 VC1_ADVANCED 4 9216 2048 1152 ..

Configuration

Although the video driver should automatically enable hardware video acceleration support for both VA-API and VDPAU, it may be needed to configure VA-API/VDPAU manually. Only continue to this section if you went through #Verification.

The default driver names, used if there is no other configuration present, are guess by the system. However, they are often hacked together and may not work. You can see the guessed values by running:

$ grep -iE 'vdpau | dri driver' /var/log/Xorg.0.log

(II) RADEON(0): [DRI2] DRI driver: radeonsi (II) RADEON(0): [DRI2] VDPAU driver: radeonsi

In this case radeonsi is the default for both VA-API and VDPAU.

Note: If you use journalctl -b | grep -iE 'vdpau | dri driver' instead. If you use GDM , runinstead.

This does not represent the configuration however. The values above will not change even if you override them.

Configuring VA-API

You can override the driver for VA-API by using the LIBVA_DRIVER_NAME environment variable:

Intel graphics: For use i965 . For use iHD .

NVIDIA: For Nouveau use nouveau . For NVIDIA use vdpau .

ATI/AMD: For AMDGPU driver use radeonsi . For AMD Catalyst use fglrx .



Note: You can find the installed drivers in /usr/lib/dri/ . They are used as /usr/lib/dri/ ${LIBVA_DRIVER_NAME} _drv_video.so .

. They are used as . Some drivers are installed several times under different names for compatibility reasons. You can see which by running sha1sum /usr/lib/dri/* | sort .

. LIBVA_DRIVERS_PATH can be used to overrule the VA-API drivers location.

can be used to overrule the VA-API drivers location. Since version 12.0.1 provides radeonsi instead of gallium .

Configuring VDPAU

You can override the driver for VDPAU by using the VDPAU_DRIVER environment variable.

The correct driver name depends on your setup:

For Intel Graphics or AMD Catalyst you need to set it to va_gl .

. For the open source AMD/ATI driver set it to the proper driver version depending on your GPU, see #Verification.

For the open source Nouveau driver set it to nouveau .

. For NVIDIA's proprietary version set it to nvidia .

Note: You can find the installed drivers in /usr/lib/vdpau/ . They are used as /usr/lib/vdpau/libvdpau_ ${VDPAU_DRIVER} .so .

. They are used as . Some drivers are installed several times under different names for compatibility reasons. You can see which by running sha1sum /usr/lib/vdpau/* .

. For hybrid setups (both NVIDIA and AMD), it may be necessary to set the DRI_PRIME environment variable. For more information see PRIME.

Configuring applications

Multimedia frameworks:

Video players:

Web browsers:

Troubleshooting

Failed to open VDPAU backend

You need to set VDPAU_DRIVER variable to point to correct driver. See #Configuring VDPAU.

VAAPI init failed

An error along the lines of libva: /usr/lib/dri/i965_drv_video.so init failed is encountered. This can happen because of improper detection of Wayland. One solution is to unset $DISPLAY so that mpv, MPlayer, VLC, etc. do not assume it is X11. Another mpv-specific solution is to add the parameter --gpu-context=wayland .

Video decoding corruption or distortion with AMDGPU driver

When experiencing video decoding corruption or distortion with AMDGPU driver, set allow_rgb10_configs=false as environment variable or driconf . [2]

Comparison tables

VA-API drivers

Codec [3] [4] [5] [6]

(VDPAU adapter) Decoding MPEG-2 GMA 4500 and newer Broadwell and newer Radeon HD 6000 and newer

GeForce 8 and newer1 See #VDPAU drivers MPEG-44 No No Radeon HD 6000 and newer VC-1 Sandy Bridge and newer Broadwell and newer Radeon HD 2000 and newer

GeForce 9300 and newer1 H.264/MPEG-4 AVC GMA 45002, Ironlake and newer Radeon HD 2000 and newer

GeForce 8 and newer1 H.265/HEVC 8bit Cherryview/Braswell and newer Skylake and newer Radeon R9 Fury and newer H.265/HEVC 10bit Broxton and newer Broxton/Apollo Lake and newer Radeon 400 and newer VP8 Broadwell and newer Broadwell and newer No No VP9 8bit Broxton and newer

Hybrid: Haswell refresh to Skylake3 Broxton/Apollo Lake and newer Raven Ridge and newer See #VDPAU drivers5 VP9 10bit Kaby Lake and newer Kaby Lake and newer No Encoding MPEG-2 Ivy Bridge and newer Broadwell and newer

except Broxton/Apollo Lake No – H.264/MPEG-4 AVC Sandy Bridge and newer Broadwell and newer Radeon HD 7000 and newer H.265/HEVC 8bit Skylake and newer Skylake and newer Radeon 400 and newer H.265/HEVC 10bit Kaby Lake and newer Kaby Lake and newer Raven Ridge and newer VP8 Cherryview/Braswell and newer

Hybrid: Haswell to Skylake3 No VP9 8bit Kaby Lake and newer Icelake and newer VP9 10bit No

1 Up until GeForce GTX 750.

Up until GeForce GTX 750. 2 Supported by AUR instead.

Supported by instead. 3 Hybrid VP8 encoder and VP9 decoder supported by AUR .

Hybrid VP8 encoder and VP9 decoder supported by . 4 MPEG-4 is disabled by default due to VAAPI limitations. Set the environment variable VAAPI_MPEG4_ENABLED=true to try to use it anyway.

MPEG-4 is disabled by default due to VAAPI limitations. Set the environment variable to try to use it anyway. 5 Experimental VP9 support provided by AUR instead.

VDPAU drivers

Codec [7] [8]

(VA-API adapter) Decoding MPEG-2 Radeon R300 and newer

GeForce 8 and newer1 GeForce 8 and newer No MPEG-4 Radeon HD 6000 and newer

GeForce 200 and newer1 GeForce 200 and newer VC-1 Radeon HD 2000 and newer

GeForce 9300 and newer1 GeForce 8 and newer2 H.264/MPEG-4 AVC Radeon HD 2000 and newer

GeForce 8 and newer1 GeForce 8 and newer See #VA-API drivers H.265/HEVC 8bit Radeon R9 Fury and newer GeForce 900 and newer3 No H.265/HEVC 10bit Radeon 400 and newer No4 VP9 8bit No GeForce 900 and newer3 VP9 10bit No No4

1 Up until GeForce GTX 750.

Up until GeForce GTX 750. 2 Except GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB).

Except GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB). 3 Except GeForce GTX 970 and GTX 980.

Except GeForce GTX 970 and GTX 980. 4 NVIDIA implementation is limited to 8-bit streams [9] [10].

NVIDIA driver only

Codec [11] NVDECODE NVENCODE MPEG-2 Fermi and newer1 No VC-1 H.264/MPEG-4 AVC Kepler and newer2 H.265/HEVC 8bit Maxwell (GM206) and newer Maxwell (2nd Gen) and newer H.265/HEVC 10bit Pascal and newer VP8 Maxwell (2nd Gen) and newer No VP9 8bit Maxwell (GM206) and newer VP9 10bit Pascal and newer

1 Except GM108 (not supported)

Except GM108 (not supported) 2 Except GM108 and GP108 (not supported)

Application support