A guide that teach you build a custom version of Chrome / Electron on macOS / Windows / Linux that supports hardware / software HEVC decoding.
Get release build?
What's the hardware supported HEVC profile?
HEVC Main (Up to 8192x8192 pixels)
HEVC Main 10 (Up to 8192x8192 pixels)
HEVC Main Still Picture (macOS only, Up to 8192x8192 pixels)
HEVC Rext (macOS only, Up to 8192x8192 pixels)
What's the OS requirement?
macOS Big Sur (11.0) and above
Windows 8 and above
Linux + Vaapi (Not tested)
What's the GPU requirement?
NVIDIA GTX950 and above
AMD RX460 and above
Intel HD4400, HD515 and above
AMD Radeon R7, Vega M and above
Apple M1, M1 Pro, M1 Max, M1 Ultra and above
HDR Supports? (Compared with Edge / Safari)
|PQ (SDR Screen)||PQ (HDR Screen)||HLG (SDR Screen)||HLG (HDR Screen)|
|Chromium Linux||Not Tested||Not Tested||Not Tested||Not Tested|
What's the tech diff? (Compared with Edge / Safari)
VDAVideoDecoder to call
MediaFoundation (need to install
HEVC Video Extension) to finish the HEVC HW decoding which is the same tech behind
Movies and TV builtin system app.
D3D11VideoDecoder to call
D3D11VA (no need to install anything) to finish the HEVC HW decoding which is the same tech behind video players like
Safari and Chromium use the same
VideoToolbox to finish the HEVC HW decoding.
How to verify HEVC hardware support is enabled?
chrome://gpu, and search
Video Acceleration Information, you should see Decode hevc main field and Decode hevc main 10 field (macOS will show Decode hevc main still-picture and Decode hevc range extensions as well) present if hardware decoding is supported (macOS is an exception here, you see this field doesn't means the decode will use hardware, it actually depends on your GPU).
chrome://media-internalsand play some HEVC video (Test Page) if the decoder is
VaapiVideoDecoderthat means the video is using hardware decoding (macOS is an exception here, if the OS >= Big Sur, and the GPU doesn't support HEVC, VideoToolbox will fallback to software decode which has a better performance compared with FFMPEG, the decoder is
VDAVideoDecoderin this case indeed), and if the decoder is
FFMpegVideoDecoderthat means the video is using software decoding.
Activity Monitoron Mac and search
VTDecoderXPCService, if the cpu usage larger than 0 when playing video, that means hardware (or software) decoding is being used.
Windows Task Manageron Windows and switch to
Video Decodingusage larger than 0 when playing video, that means hardware decoding is being used.
Why my GPU support HEVC, but still not able to hardware decode?
OS version is too low
Please make sure you are using Windows 8 and above, this is because the
D3D11VideoDecoder doesn't support Windows 7, and will use
VDAVideoDecoder to hardware decoding. while
VDAVideoDecoder based on
Media Foundation , and
Media Foundation start to support HEVC since Windows 10 1709 (which need you to install the
HEVC Video Extension).
Please make sure you are using macOS Big Sur and above, this is because
CMVideoFormatDescriptionCreateFromHEVCParameterSets API has compatibility issue on lower macOS.
GPU driver has bug
Some GPU driver may has bug which will cause
D3D11VideoDecoder forbidden to use. in this case, you need to upgrade your GPU driver and try again. See reference
GPU hardware has bug
Some GPU hardware may has bug which will cause
D3D11VideoDecoder forbidden to use. in this case, we can't do anything else but to use the FFMPEG software decode. See reference
Will HEVC decoding be enabled in Chrome by default in the future?
Chrome 104 will integrate HEVC hw support for ChromeOS, Mac and Windows, disabled by default, and you can enable it by passing
--enable-features=PlatformHEVCDecoderSupport when opening. it should be enabled by default in the future version when stable. (only platform decoder that provided by the OS will be supported in chrome, thus this will be optional depends on the GPU and OS support)
How to Build?
- Follow the official build doc to prepare the build environment then fetch the source code from
mainbranch (HEVC HW codes has been merged).
- (Optional) To enable HEVC software decoding: switch to
src/third_party/ffmpegdir, then execute
git am /path/to/add-hevc-ffmpeg-decoder-parser.patch.
- (Optional) To enable other HEVC profiles (non main / main 10 profiles): switch to
srcdir, then execute
git am /path/to/remove-main-main10-profile-limit.patch.
- (Optional) To default enable hardware decode: switch to
srcdir, then execute
git am /path/to/enable-hevc-hardware-decoding-by-default.patch.
- (Optional) To integrate Widevine CDM to support EME API (like Netflix): switch to
srcdir, then execute
cp -R /path/to/widevine/* third_party/widevine/cdm(Windows:
xcopy /path/to/widevine third_party\widevine\cdm /E/H).
- If you are using
Mac+ want to build
x64arch (target_cpu to
armalso available) + want to add CDM support, then run
gn gen out/Release64 --args="is_component_build = false is_official_build = true is_debug = false ffmpeg_branding = \"Chrome\" target_cpu = \"x64\" proprietary_codecs = true media_use_ffmpeg = true enable_widevine = true bundle_widevine_cdm = true enable_platform_hevc = true enable_hevc_parser_and_hw_decoder = true", if you are using
Windows, you need to add
enable_media_foundation_widevine_cdm = trueas well, if you are using
Windowsand want to build
arm64arch, then need to change
false, an if you are using
Linuxand don't want to build
x64, then need to change
autoninja -C out/Release64 chrometo start the build.
./out/Release64/Chromium.app/Contents/MacOS/Chromium --args --enable-features=PlatformHEVCDecoderSupportto open chromium if you are using macOS.
- Create a desktop shortcut and passing the args like
C:\Users\Admin\Desktop\Chromium\chrome.exe --enable-features=PlatformHEVCDecoderSupportthen double click the desktop shortcut to open chromium if you are using Windows.
How to integrate this into Chromium based project like Electron?
If Electron = 20 (Chromium 104), then the HEVC hw decoding feature for Mac and Windows should have already been integrated, and you can use
app.commandLine.appendSwitch('enable-features', 'PlatformHEVCDecoderSupport') to enable HEVC hw decoding. to add HEVC ffmpeg sw decoding, the method should be the same with Chromium guide above.
If Electron < 20, please follow the CL in
Trace Crbug to manually integrate HEVC features, pull request of the patch code wecome.
2022-05-25 Update Chrome 104 support status, and Electron 20 enable method
2022-05-24 Update Patch to
2022-05-23 Add CDM compile guide, and update Patch to
2022-05-17 Update detail of tech implement and guide to integrate into electron
2022-05-14 Update Patch to
2022-05-13 Add HEVC Test page
2022-05-10 Update README, add more special detail of the hardware support and GPU models
2022-05-05 Add support for MSP & Rext on macOS, and fix the issue that some HDR & Rec.709 Main10 video can't be hw decoded on Windows
2022-04-27 Replace to
git am patch
2022-04-24 Support chinese README
2022-04-21 Add Crbug trace
2022-04-20 Modify README
2022-04-19 Initial commit