How To Enable Hardware Accelerated Video Decode In Google Chrome, Brave, Vivaldi And Opera Browsers On Debian, Ubuntu Or Linux Mint
Google Chrome 88 (and newer) has made hardware accelerated video decoding available on Linux, but it's not enabled by default. Google Chrome is not the only Chromium-based web browser to support hardware acceleration on Linux though. This article explains how to enable hardware-accelerated video decoding in Google Chrome, Brave, Vivaldi and Opera web browsers running on Debian, Ubuntu, Pop!_OS or Linux Mint (Xorg only).
Using hardware-accelerated video decode in your web browser should result in using less CPU usage (and thus, less battery draining) when playing online videos.
It's worth noting that Chromium web browser had patches that allowed making hardware accelerated video decoding available on Linux for some time, and some Linux distributions packaged it using those patches. So Chromium users have had hardware acceleration on Linux for some time, depending on their Linux distribution or if they installed the patched Chromium in some other way. E.g. on Ubuntu / Linux Mint there's a PPA with VA-API patched Chromium builds. Thus, these instructions may also work for Chromium browser, depending on how it's built.
I'd also like to add that these instructions to enable hardware accelerated video decoding also work on other Linux distributions, and not just Debian / Ubuntu-based Linux distributions, however, the driver names are different.
I tested these instructions using Ubuntu 20.10 desktop with Nvidia graphics, and the web browsers listed below installed using their original Ubuntu packaging (using a DEB package). Also tested using a laptop with Intel graphics (10th gen) on Ubuntu 20.04 and 20.10. I don't own a device with AMD graphics to test this.
In my test, I was able to get hardware-accelerated video decode to work on Linux using:
- Google Chrome stable 88
- Brave stable 1.19
- Vivaldi snapshot 3.6 / [Edit] The latest Vivaldi stable 3.6 also works
- Opera Beta 74
Obviously, it should continue to work with versions newer than these (so Google Chrome 89, Brave 1.20, etc.).
For me, hardware-accelerated video decode didn't work using:
Vivaldi stable 3.5. Vivaldi stable is now version 36, and that does have working hardware-accelerated video decoding- Opera stable 73
- Microsoft Edge - there's not even a
chrome://flags/#enable-accelerated-video-decode
flag (to enable hardware-accelerated video decode).
You can use VA-API on XWayland, using the --use-gl=egl
command line flag, but I did not try it. Starting with Google Chrome 91 (and other browsers based on Chromium 91), you'll also need to append the --enable-features=VaapiVideoDecoder
and --disable-features=UseChromeOSDirectVideoDecoder
flags.
[[Edit]] I've tried using the instructions below, and then launch the browser with the --use-gl=egl
and --disable-features=UseChromeOSDirectVideoDecoder
flags on Wayland, on a laptop with Intel graphics, and hardware-accelerated video playback works. However, the videos stutter on this laptop with these settings. So in this case I prefer Firefox with hardware-accelerated video playback (on which, using Wayland and Firefox on the same laptop, video playback is fluid, but the CPU usage is greater than using a Chromium-based browser).
How to enable hardware-accelerated video decode in Google Chrome, Brave, Vivaldi And Opera web browsers on Debian, Ubuntu or Linux Mint (X11)
Things you need to enable hardware-accelerated video decode in the web browsers I mentioned above (so Google Chrome 88+, Brave 1.19+, Vivaldi 3.6+ and Opera 74+):
1. Enable the following web browser flags:
For browsers based on Google Chrome 90 and older:
- Override software rendering list:
chrome://flags/#ignore-gpu-blocklist
- Hardware-accelerated video decode:
chrome://flags/#enable-accelerated-video-decode
For browsers based on Google Chrome 91 and newer (there's no hardware-accelerated video decode any more, but we'll need to use a new command line flag - see step 4):
- Override software rendering list:
chrome://flags/#ignore-gpu-blocklist
2. Install the VA-API driver to be able to decode media (source), as well as libva-drm2 and libva-x11-2 (these 2 are probably already installed, but just in case; I added these 2 in a later edit, after I noticed hardware acceleration was not working without them, and as soon as I installed vainfo, which has these 2 packages as dependencies, it would start working):
- For Intel Gen 7 and earlier hardware:
sudo apt install i965-va-driver-shaders libva-drm2 libva-x11-2
- For Intel Gen 8+ hardware:
sudo apt install intel-media-va-driver-non-free libva-drm2 libva-x11-2
- For Nouveau and AMD drivers (I couldn't get any browser to use hardware acceleration with the Nouveau drivers, maybe you have better luck):
sudo apt install mesa-va-drivers libva-drm2 libva-x11-2
- For proprietary Nvidia drivers - you can install them from the repositories or by using the Proprietary GPU Drivers PPA (e.g. launch the Additional Drivers dialog on Ubuntu and install it from there). If you're using proprietary Nvidia drivers, you'll also need a patched
vdpau-va-driver
([[edit]] this patch no longer supports VP9, even if your graphics support it, so you must use the h264ify extension in all cases - see below). You can get it from here (you'll also needlibvdpau1
from here as it's a dependency for vdpau-va-driver) for Debian / Ubuntu / Linux Mint / Pop!_OS, etc. The Ubuntu 20.04 package from there also works on Ubuntu 20.10 and newer. If you want to see the patches used by this package, download the .debian.tar.gz archive (from the same link as above) and look inside the "patches" folder. In case these DEBs don't work on Debian (I did not try it), use the these links for vdpau-va-driver (orig.tar.gz | debian.tar.xz) and libvdpau (orig.tar.gz | debian.tar.xz) to download the .orig.tar.gz and .debian.tar.xz archives, and build the DEB package on your system. Also install libva-drm2 and libva-x11-2:sudo apt install libva-drm2 libva-x11-2
Why the non-free versions of the intel-media-va-driver
and i965-va-driver
? In theory this should work with the free version (?), but in my test on a laptop with Intel Gen 10, hardware-accelerated video decoding only worked with the intel-media-va-driver-non-free
driver, and not intel-media-va-driver
(I'm not sure about the i965 driver, but I assumed it might be similar). There's also someone else here, saying this got it working for them.
3. Only needed for graphics card that don't support VP9 hardware video decoding: install the h264ify browser extension.
If your graphics card doesn't support VP9 hardware video decoding, install the h264ify browser extension (or enhanced-h264ify - some users say this works for them while the original extension doesn't; for me it's the other way around) and make sure it's enabled for VP9.
[[Edit]] Nvidia users: the patched vdpau-va-driver mentioned above no longer hardware accelerates VP9 in Chromium-based browser. So you must use the h264ify extension and avoid VP9 in order to get hardware-accelerated video decode.
If you still don't see MojoVideoDecoder in the chrome://media-internals
tab (see below in the section for how to check if hardware-accelerated video decoding is enabled and actually used by the browser), try to restart the web browser after installing this extension. I've seen cases where this was needed, and some in which it wasn't required.
4. Launch the web browser using the --use-gl=desktop
and flag to enable VA-API hardware acceleration. [Edit] With browsers based on Chromium 91 and newer, you'll also need to launch it with the --enable-features=VaapiVideoDecoder
flag. [[Another edit]] Now it seems for most, also adding the --disable-features=UseChromeOSDirectVideoDecoder
flag is also needed.
To be able to use VA-API for video decoding you'll need to launch the web browser, be it Chromium, Google Chrome, Brave, Opera or Vivaldi, using the following command line flags: --use-gl=desktop
, --enable-features=VaapiVideoDecoder
and --disable-features=UseChromeOSDirectVideoDecoder
.
E.g. to launch Google Chrome using these flags:
google-chrome-stable --use-gl=desktop --enable-features=VaapiVideoDecoder --disable-features=UseChromeOSDirectVideoDecoder
Launch Brave using this:
brave-browser --use-gl=desktop --enable-features=VaapiVideoDecoder --disable-features=UseChromeOSDirectVideoDecoder
And so on.
To make this change permanent, copy the browser .desktop file from /usr/share/applications
to ~/.local/share/applications
(if this folder doesn't exist, create it). By copying the file here, we're making sure it won't be overwritten by an update. Then, open the .desktop file (e.g. brave-browser.desktop
, brave-browser-beta.desktop
, google-chrome.desktop
, etc.) from this ~/.local/share/applications
location, with a text editor. In this file, search for the line starting with Exec=
, and change the executable to include --use-gl=desktop --enable-features=VaapiVideoDecoder --disable-features=UseChromeOSDirectVideoDecoder
. E.g. for Brave: Exec=/usr/bin/brave-browser-stable --enable-features=VaapiVideoDecoder --disable-features=UseChromeOSDirectVideoDecoder
, or for Google Chrome: Exec=/usr/bin/google-chrome-stable --enable-features=VaapiVideoDecoder --disable-features=UseChromeOSDirectVideoDecoder %U
Important note: If you see a completely white video image when launching the browser with --use-gl=desktop
, check chrome://flags
and make sure that Vulkan is not enabled there. Having Vulkan enabled and launching the browser using the --use-gl=desktop
option will cause this to happen.
Another note, this time for Opera users: if after using the h264ify extension, you can no longer play videos on YouTube and other such websites, see the solutions from here to enable h264 support in Opera (note that if the web browser you're using is Opera Beta, the folder must be /opera-beta
).
That's it.
How to check if hardware-accelerated video decoding is enabled and working in any Chromium-based web browser
Now let's check and see if the web browser is using hardware-accelerated video decoding.
First let's check if the browser supports hardware-accelerated video. Do this by opening a new tab and visiting chrome://gpu
. On this page you should see "Video Decode: Hardware accelerated" (in green, like here):
This means that your web browser now supports hardware-accelerated video decoding. But is it able to actually hardware decode video? Let's check that too, by opening a YouTube video, then press Ctrl + Shift + i
to open the Chrome DevTools. From the 3 vertical dots menu, click on More tools -> Media
. Then click on the video title in the left-hand side panel of DevTools (Players
section), and look in the Video Decoder
section of the Media
tab from Chrome DevTools:
If it says the decoder name is VideoDecode Accelerator
or, I've also seen this as VDAVideoDecoder
(previously it was MojoVideoDecoder
, and before that it was GpuVideoDecoder
, so if you get any of those and you're using an older browser version, that's ok, you have hardware acceleration), and Hardware decoder
is true
, then you're using hardware-accelerated video decoding. If it says FFmpegVideoDecoder
, VpxVideoDecoder
or Dav1dVideoDecoder
(and in this case, the Hardware decoder
should say false
), your web browser is not using hardware-accelerated video decoding.