= Video Acceleration
* https://en.wikipedia.org/wiki/Category:Video_acceleration
* https://en.wikipedia.org/wiki/Category:Video_compression_and_decompression_ASIC
* https://wiki.archlinux.org/index.php/Hardware_video_acceleration
= APIs
== VAAPI
VAAPI was specified by intel but can be used with hardware of different vendors. It is well supported in gstreamer and ffmpeg. In most cases this is you best option. Only for some hardware / driver combinations you may get better results with one of the more proprietary APIs / drivers.
* https://01.org/linuxgraphics/community/vaapi
* https://freedesktop.org/wiki/Software/vaapi/
The tool ''vainfo'' from the libva-utils repository ( https://github.com/intel/libva-utils/tree/master/vainfo ) can give you an overview what is supported on you system. The results differ depending on lib, cpu and driver version. vainfo is also packaged in many linux. distributions.
Vainfo can be forced to use a specific render device
vainfo --display drm --device /dev/dri/renderD129
Also the driver to use can be choosen
LIBVA_DRIVER_NAME=iHD
Output on a kabylake microarchitecture based CPU will e.g. look like this:
libva info: VA-API version 1.5.0
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_1_4
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.5 (libva 2.5.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Broxton - 2.3.0
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
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
VAProfileVP9Profile0 : VAEntrypointVLD
== VDPAU
* https://en.wikipedia.org/wiki/VDPAU
== OMX / OpenMAX
* https://en.wikipedia.org/wiki/OpenMAX
= Hardware
Hardware en/decoder can be found in a number of chips. The probably most common type are GPUs or GPU components of CPUs and SOCs.
Besides that there are also some dedicated de/encoder cards available. You probably can also use FPGAs but we didn't look into that (yet)
== Intel
Intel implement the video acceleration in the GPU parts of their CPUs. Its mostly available in Desktop and Tablet CPUs but also in some Xeon Server CPUs.
The hardware feature is called QuickSync an can be used via different APIs / Libs. Intel makes it not easy to user to figure out which CPU/GPU can do what,
below are some links that might help.
* https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video
* https://en.wikipedia.org/wiki/Xeon
* https://en.wikichip.org/wiki/intel/microarchitectures/gen9#Hardware_Accelerated_Video
* https://en.wikichip.org/wiki/intel/microarchitectures/gen9.5#Hardware_Accelerated_Video
* https://wiki.gentoo.org/wiki/Intel#Feature_support
* https://wiki.archlinux.org/index.php/intel_graphics
There are two userspace drivers availiable to enable usage of the igpu with vaapi.
* intel-media-driver (Gen8+ / Broadwell+)
* i965-va-driver (up to Gen7)
Gen9+ / Skylake to Gen11 need GuC/HuC firmware to be loaded to enable all features (https://github.com/intel/media-driver#known-issues-and-limitations)
The ffmpeg wiki has a clear list of the capabilities each Intel GPU generation offers:
* https://trac.ffmpeg.org/wiki/Hardware/QuickSync
The TL;DR on this is: If your CPU is at least a SandyBridge based CPU with a GPU core to en/decode h264. If you need VP9 you should at least have an kabylake core. Depending of what exactly you do you will be able to have more than 10 streams in parallel.
To see the load of your GPU, which also will tell you how much headroom you have for more streams, you can use intels intel_gpu_top
which is packaged e.g. on debian with '''intel-gpu-tools'''.
== Nvidia
As usual NVIDIA provides the worst user experience possible by limiting the feature not based on hardware capabilities but on the price of the card.
This means you will not be able to en- / decode much stream in parallel if you don't pay a an absurd amount of money. But never the less you might already own a card ....
Also NVIDIA basically only supports H264 and H265 on the encoder side. Depending on your card and driver you can use your card with VAAPI or need to go for the nvenc / nvdec
* https://developer.nvidia.com/video-encode-decode-gpu-support-matrix
{{tablelayout?rowsHeaderSource=Auto&float=left}}
^ Number of Streams (h264 1080p30 8bit 4:2:0) / NVenc ||||
^ Architecture ^ Highest Quality ^ Low Latency ^ Highest Quantity ^
| Kepler | 2 | | 7 |
| Maxwell 1st Gen | 4 | | 12 |
| Maxwell 2nd Gen | 6 | | 13 |
| Pascal/Volta | 9 | 13 | 21 |
| Turing | 11 | 17 | |
* http://web.archive.org/web/20190505115654im_/https://developer.nvidia.com/sites/default/files/akamai/designworks/images-videocodec/VCSDK_TU003a.png
* http://web.archive.org/web/20180913160347im_/https://developer.nvidia.com/sites/default/files/akamai/designworks/images-videocodec/nvenc_perf_B_001.png
* http://web.archive.org/web/20170214143849im_/https://developer.nvidia.com/sites/default/files/akamai/designworks/images/VidEncode_HP_002.png
To see the load of your GPU use nvidia's
nvidia-smi pmon
== AMD / ATI
=== Radeon
The AMD stand alone GPUs provide also video en/ decoder capabilities. With recent Linux Kernels e.g. the NAVI Gpus (Radeon GT 5xxx) can be used without binary drivers.
The first AMD/ATI GPU with video accelerator was R600 architecture from 2007. AMD developed different accelerator suites over time:
* https://en.wikipedia.org/wiki/Unified_Video_Decoder
* https://en.wikipedia.org/wiki/Video_Coding_Engine
* https://en.wikipedia.org/wiki/Video_Core_Next
which provide different encoding and decoding capabilities as well as different offloading features.
E.g. a Radeon gt 5500 XT provides the following encoders through libva with opensource drivers on 5.4.0 Kernel
libva info: VA-API version 1.6.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_6
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.6 (libva 2.6.0)
vainfo: Driver version: Mesa Gallium driver 20.0.2 for AMD NAVI14 (DRM 3.35.0, 5.4.0-18-generic, LLVM 9.0.1)
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
while gstreamer seems not support the usage jet.
== Broadcom
=== Christal HD
Broadcoms Christal HD cards where mostly used for decoding video on devices not capably to to it in CPU. It can only do decoding so it is not that relevant here.
* https://en.wikipedia.org/wiki/Broadcom_Crystal_HD
=== Raspberry Pi 1-4
The SOCs used in the raspberrypis can be used for de/encoding of video. It can be accessed with OMX api which is present in gstreamer and ffmpeg
* https://wiki.matthiasbock.net/index.php/Hardware-accelerated_video_playback_on_the_Raspberry_Pi
On an raspberrypi (1-4) the following omx features are supported (at least according to gstreamer)
omxmpeg2videodec: OpenMAX MPEG2 Video Decoder
omxmpeg4videodec: OpenMAX MPEG4 Video Decoder
omxh263dec: OpenMAX H.263 Video Decoder
omxh264dec: OpenMAX H.264 Video Decoder
omxtheoradec: OpenMAX Theora Video Decoder
omxvp8dec: OpenMAX VP8 Video Decoder
omxmjpegdec: OpenMAX MJPEG Video Decoder
omxvc1dec: OpenMAX WMV Video Decoder
omxh264enc: OpenMAX H.264 Video Encoder
omxanalogaudiosink: OpenMAX Analog Audio Sink
omxhdmiaudiosink: OpenMAX HDMI Audio Sink
= Software
== FFMPEG
* https://trac.ffmpeg.org/wiki/HWAccelIntro
* https://trac.ffmpeg.org/wiki/Hardware/VAAPI,
== Gstreamer
To see which de/encoder gstreamer can use on your system you can run e.g.:
sudo gst-inspect-1.0 vaapi
gstreamer1.0-vaapi needs to be installed for this to work. Replace vaapi with the API you want to use e.g. omx.
There are some envirement variables that can be set to change gstreamers behavior / driver usage
LIBVA_DRIVER_NAME=iHD DRI_PRIME=/dev/dri/renderD128 GST_VAAPI_ALL_DRIVERS=1
where the first one is in most cases enough.
The output will look like:
sudo gst-inspect-1.0 vaapi
Plugin Details:
Name vaapi
Description VA-API based elements
Filename /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstvaapi.so
Version 1.16.1
License LGPL
Source module gstreamer-vaapi
Source release date 2019-09-23
Binary package gstreamer-vaapi
Origin URL http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer
vaapih264enc: VA-API H264 encoder
vaapijpegenc: VA-API JPEG encoder
vaapivp8enc: VA-API VP8 encoder
vaapih265enc: VA-API H265 encoder
vaapisink: VA-API sink
vaapidecodebin: VA-API Decode Bin
vaapipostproc: VA-API video postprocessing
vaapih265dec: VA-API H265 decoder
vaapivp9dec: VA-API VP9 decoder
vaapivp8dec: VA-API VP8 decoder
vaapivc1dec: VA-API VC1 decoder
vaapih264dec: VA-API H264 decoder
vaapimpeg2dec: VA-API MPEG2 decoder
vaapijpegdec: VA-API JPEG decoder
* https://blogs.igalia.com/vjaquez/2018/03/28/gstreamer-va-api-troubleshooting/ <= trouble shooting guide
* https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-vaapi-plugins/html/ch01.html
* https://gstreamer.freedesktop.org/documentation/tutorials/playback/hardware-accelerated-video-decoding.html