enable HW VPU decoding for SoCs that have stateless VPUs

v4l2codecs is the gstreamer plugin for V4L2 stateless video hardware
decoding. The Rockchip SoCs that have a VPU all seems to be based on
Hantro, RKVDEC or RKVDECv2, all stateless encoding/decoding VPUs.

Therefore, let's enable VPU decoding in Gstreamer whenever possible,
when the SoC supports it.

PX30, RK3066, RK3188, RK3288, RK3328, RK3399, RK356x and RK3588(s) all
have at least one Hantro VPU.

RK3328, RK3399, RK356x and RK3588(s) all have at least one
RKVDEC/RKVDECv2 VPU (though not necessarily supported in the upstream
kernel just yet).

=== PX30
Tested on PX30 Ringneck with with Haikou+Haikou Video Demo adapter:

$ gst-launch-1.0 filesrc location=$FILE ! parsebin ! v4l2slh264dec ! fakesink

with FILE storing the path to any h264 file, e.g.
https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_720p_h264.mov
https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov

Needed packages are:
- gstreamer1.0-plugins-bad (for fakesink and v4l2slh264dec)
- gstreamer1.0-plugins-base (for parsebin)

waylandsink isn't used with weston because of rendering glitches, c.f.
https://gitlab.freedesktop.org/wayland/weston/-/issues/839. While the
link specifies it is for RK3399, PX30 is also impacted, albeit
differently since a different kind of glitch can be seen (like seeing
the image through a negative filter).
This is fixed in Styhead.

=== RK3399
Tested on RK3399 Puma with Haikou:

$ gst-launch-1.0 filesrc location=$FILE ! parsebin ! v4l2slh264dec ! fakesink

with FILE storing the path to any h264 file, e.g.
https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov
https://download.blender.org/demo/movies/BBB/bbb_sunflower_2160p_30fps_normal.mp4.zip

Needed packages are:
- gstreamer1.0-plugins-bad (for fakesink and v4l2codecs)
- gstreamer1.0-plugins-base (for parsebin)

waylandsink isn't used with weston because of rendering glitches, c.f.
https://gitlab.freedesktop.org/wayland/weston/-/issues/839.
This is fixed in Styhead.

=== RK3588

Tested on a RK3588 Jaguar with HDMI - on a downstream v6.11-rc6
(upstream-based, not Rockchip BSP-based) with a bunch of patches - :

$ gst-launch-1.0 filesrc location=$FILE ! parsebin ! v4l2slh264dec ! fakesink

with FILE storing the path to any h264 file, e.g.
https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov

$ gst-launch-1.0 filesrc location=$FILE ! parsebin ! v4l2slmpeg2dec ! fakesink

with FILE storing the path to any MPEG2 file, e.g.
https://drive.google.com/file/d/0BwxFVkl63-lETXlOa3hEMmVyZGM/view?resourcekey=0-FG5JbjCsd8QduRhkZ2aT8A

$ gst-launch-1.0 filesrc location=$FILE ! parsebin ! v4l2slvp8dec ! fakesink

with FILE storing the path to any VP8 file, e.g.
https://test-videos.co.uk/vids/bigbuckbunny/webm/vp8/1080/Big_Buck_Bunny_1080_10s_30MB.webm

Needed packages are:
- gstreamer1.0-plugins-bad (for fakesink and v4l2codecs)
- gstreamer1.0-plugins-base (for parsebin)

waylandsink isn't used with weston because starting gst-launch makes
weston segfault.

(cherry picked from commit 91a694e250)
[adapt commit log to Scarthgap]
[replace waylandsink with fakesink as weston has glitches or segfaults]
[no av1 decoding in gst 1.22 in Scarthgap]
[rk3588 has gained h264, mpeg2 and vp8 decoding, added to the commit log]
[update setup for RK3588]
[note: only RK3588 was tested for this commit in Scarthgap]
[note: use fpsdisplaysink gst plugin with gst-launch in verbose mode for
 more information on on-going decoding session:
 $ gst-launch-1.0 -v filesrc location=$FILE ! parsebin ! v4l2slvp8dec ! fpsdisplaysink signal-fps-measurements=true text-overlay=false video-sink=fakesink
 /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 287, dropped: 0, current: 30.02, average: 30.17
]

Reviewed-by: Trevor Woerner <twoerner@gmail.com>
Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
This commit is contained in:
Quentin Schulz 2024-09-25 12:13:51 +02:00 committed by Trevor Woerner
parent 6adc7a5bfe
commit e641dba980
11 changed files with 41 additions and 0 deletions

22
README
View File

@ -103,6 +103,28 @@ Notes:
this layer, perform the same steps as above except for the step enabling
RK_RAUC_DEMO.
HW video decoding with gstreamer
Most Rockchip SoCs have some integrated VPU, either Hantro, RKVDEC or
RKVDECv2. Those are called stateless VPUs and they require tools to be
adapted so they can be used. Upstream ffmpeg doesn't support them (yet)
but gstreamer does, via the v4l2sl* plugins. However, by default those
aren't built in OE-Core. This layer enables these plugins by default for
all SoCs that have at least one VPU (at the time of writing, all SoCs
supported by this layer to the exception of RK3308).
If you wish to NOT build those plugins anymore, you can set
ENABLE_STATELESS_VPU_GST = "0"
in any appropriate conf file (or in a
gstreamer1.0-plugins-bad_%.bbappend in your own layer).
Note that this is only relevant for upstream-based Linux kernels as
Rockchip have developed their own ABI for their own kernel that isn't
compatible (see Rockchip Media Process Platform (MPP) and
downstream gstreamer-rockchip plugin for those kernels).
U-Boot Environment:
------------------
In order to configure U-Boot to be able to store its environment into the

View File

@ -19,3 +19,5 @@ TFA_BUILD_TARGET = "bl31"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -12,3 +12,5 @@ SERIAL_CONSOLES = "115200;ttyS2"
KBUILD_DEFCONFIG = "multi_v7_defconfig"
KERNEL_FEATURES:append:rk3066 = " bsp/rockchip/remove-non-rockchip-arch-arm.scc"
KERNEL_IMAGETYPE ?= "zImage"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -12,3 +12,5 @@ SERIAL_CONSOLES = "115200;ttyFIQ0"
KBUILD_DEFCONFIG = "multi_v7_defconfig"
KERNEL_FEATURES:append:rk3188 = " bsp/rockchip/remove-non-rockchip-arch-arm.scc"
KERNEL_IMAGETYPE ?= "zImage"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -14,3 +14,5 @@ KERNEL_FEATURES:append:rk3288 = " bsp/rockchip/remove-non-rockchip-arch-arm.scc"
KERNEL_IMAGETYPE ?= "zImage"
UBOOT_SUFFIX ?= "bin"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -20,3 +20,5 @@ TFA_BUILD_TARGET = "bl31"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -20,3 +20,5 @@ TFA_BUILD_TARGET = "bl31"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -19,3 +19,5 @@ PREFERRED_PROVIDER_optee-os = "rockchip-rkbin"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -19,3 +19,5 @@ PREFERRED_PROVIDER_optee-os = "rockchip-rkbin"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -18,3 +18,5 @@ PREFERRED_PROVIDER_optee-os = "rockchip-rkbin"
UBOOT_SUFFIX ?= "itb"
UBOOT_ENTRYPOINT ?= "0x06000000"
ENABLE_STATELESS_VPU_GST ?= "1"

View File

@ -0,0 +1 @@
PACKAGECONFIG:append:rockchip = "${@' v4l2codecs' if bb.utils.to_boolean(d.getVar('ENABLE_STATELESS_VPU_GST'), False) else ''}"