Difference between revisions of "Mainline Hardware Decoding"

From PINE64
Jump to navigation Jump to search
(→‎Software: add info about mpv)
(19 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{hint|This page is incomplete, you're welcome to improve it.}}
{{hint|This page is incomplete, you're welcome to improve it.}}


Onboard most SoCs there is what is referred to as a VPU (Video Processing Unit). The VPU is reponsible for efficient encoding and decoding of videos. Video decoding can be extremely useful for example if you wanted to watch or stream video from your device without a high CPU utilization (which results from software decoding). Below information can be found on the various SoCs used by PINE64 and their state of video decoding as a result of the mainline Linux drivers and software.
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).


=Cedrus and Hantro=
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.


In 2018 Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which became called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].
= Hardware =
 
Here's a table of the current support for different hardware. "In review" means the patch series to enable support has been posted to the mailing lists but is undergoing review, "linux-next" means it has been accepted and staged for the next Linux merge window.
 
{| class="wikitable plainrowheaders" border="1"
! scope="col" {{Diagonal split header|Codec|SoC}}
! scope="col" | RK3328
! scope="col" | RK3399
! scope="col" | RK3566
! scope="col" | RK3588
|-
! scope="row" | JPEG
| style="background:#F99; text-align:center;"| No
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | MPEG-2
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | MPEG-4 Part 2/H.263
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | VP8
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | H.264/AVC
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes <sup style="font-style:italic;color:green">a</sup>
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | H.265/HEVC
| style="background:LightYellow; text-align:center;"| In review
| style="background:LightYellow; text-align:center;"| In review
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | VP9
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:PaleGreen; text-align:center;"| Yes
| style="background:#F99; text-align:center;"| No
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | AVS2
| style="text-align:center;"| N/A
| style="text-align:center;"| N/A
| style="text-align:center;"| N/A
| style="background:#F99; text-align:center;"| No
|-
! scope="row" | AV1
| style="text-align:center;"| N/A
| style="text-align:center;"| N/A
| style="text-align:center;"| N/A
| style="background:#F99; text-align:center;"| No
|}
 
====Notes====
 
<ol style="list-style-type:lower-alpha">
  <li>only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now</li>
</ol>
 
== Cedrus ==
 
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].
 
== Hantro ==


The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.


==GStreamer==
== rkvdec ==
H264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]
 
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.
 
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].
 
== rkdjpeg ==
 
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.
 
No mainline driver exists for it so far.
 
= Software =
 
== GStreamer ==
H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.
 
== FFmpeg ==
 
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists].
 
With the patched ffmpeg, you can utilise hardware decoding using the <code>-hwaccel drm</code> parameter, e.g.:
 
ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark
 
to measure how fast it decodes.
 
== mpv ==
 
mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:
 
  mpv --hwdec=drm ''video''
 
In mpv versions prior to 0.35, you can use the copyback hwdec with:
 
  mpv --hwdec=drm-copy ''video''
 
= More Resources =


==FFmpeg==
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]


* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]


==More Resources==
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]


[https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]
= See Also =


[https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]
* [[Mainline Hardware Encoding]]


[https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:PineBook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:A64-LTS]] [[Category:SOPine]]

Revision as of 18:58, 24 October 2022

This page is incomplete, you're welcome to improve it.

Mainline Hardware Decoding refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).

On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.

Hardware

Here's a table of the current support for different hardware. "In review" means the patch series to enable support has been posted to the mailing lists but is undergoing review, "linux-next" means it has been accepted and staged for the next Linux merge window.

SoC
Codec
RK3328 RK3399 RK3566 RK3588
JPEG No Yes No No
MPEG-2 Yes Yes Yes No
MPEG-4 Part 2/H.263 No No No No
VP8 Yes Yes Yes No
H.264/AVC Yes Yes Yes a No
H.265/HEVC In review In review No No
VP9 Yes Yes No No
AVS2 N/A N/A N/A No
AV1 N/A N/A N/A No

Notes

  1. only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now

Cedrus

In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the Sunxi wiki.

Hantro

The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it was announced that Bootlin was working on encoding support for the driver.

rkvdec

rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, patches for HEVC support are also in the process of review.

RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the AVS2 video codec.

rkdjpeg

rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.

No mainline driver exists for it so far.

Software

GStreamer

H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as Clapper or µPlayer. µPlayer includes a indicator of when hardware acceleration is properly working and in use.

FFmpeg

Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but a fork that can utilise it exists.

With the patched ffmpeg, you can utilise hardware decoding using the -hwaccel drm parameter, e.g.:

ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark

to measure how fast it decodes.

mpv

mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:

 mpv --hwdec=drm video

In mpv versions prior to 0.35, you can use the copyback hwdec with:

 mpv --hwdec=drm-copy video

More Resources

See Also