Message ID | 20240618183816.77597-7-sebastian.reichel@collabora.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | RK3588 VEPU121/VPU121 support | expand |
Hi Sebastian, Detlev is working on rkvdec2 and gstreamer can't deal with two h264 stateless decoders. So it's better to disable h264 decoding feature of this vpu121, just like what we have done for rk3399. If your multicore patch can handle the jpeg enc node at fdb50000 with other VEPU121 nodes properly, we can just use compatible string "rockchip,rk3399-vpu" instead of "rockchip,rk3568-vpu". Best regards, Jianfeng
Hi Jianfeng, Le vendredi 21 juin 2024 à 17:22 +0800, Jianfeng Liu a écrit : > Hi Sebastian, > > Detlev is working on rkvdec2 and gstreamer can't deal with two h264 Just to clarify, since you are right that it won't work well with GStreamer. It does work with multiple decoders (it exposes them all), it is simply that it will randomly pick one when decoding, and it may not pick the best one. > stateless decoders. So it's better to disable h264 decoding feature of > this vpu121, just like what we have done for rk3399. If your multicore > patch can handle the jpeg enc node at fdb50000 with other VEPU121 nodes > properly, we can just use compatible string "rockchip,rk3399-vpu" instead > of "rockchip,rk3568-vpu". In the long term, I'd like to stop having to do "like downstream" and expose them all. I believe the fix is fairly straightforward in GStreamer. We need to expose in the generated element the width/height ranges, and for H.264 the supported profiles and level. With that, we at least won't randomly fail at decoding 4K, and it should be good enough. For RK3588, which is a new SoC, its not a problem to upstream something that does not work with existing userspace. It would only be a regression if we where to enable VDPU121 on RK3399, as now updating linux would cause bugs with existing userspace. For users, it would be best if we get this sorted out in GStreamer by the time we have a second decoder. Note that I have some vacation coming up this month, so there might be extra delays. Yet, its logical to merge this (the "worst" decoder) first, since then randomly picking a better one won't be a regression. Nicolas
Hi Nicolas, On Wed, 26 Jun 2024 13:46:03 -0400, Nicolas Dufresne wrote: >Just to clarify, since you are right that it won't work well with GStreamer. It >does work with multiple decoders (it exposes them all), it is simply that it >will randomly pick one when decoding, and it may not pick the best one. I have tested rkvdec2 and vpu121 with gstreamer 1.24.2 on rk356x to decode a 4K video, and gstreamer always fall with error: "v4l2slh264dec0: Failed to configure H264 decoder". I guess that's because 1080p vpu is at fdea0000 which is always initialized earlier than rkvdec2 at fdf80200, so gstreamer will always choose the 1080p decoder. >In the long term, I'd like to stop having to do "like downstream" and expose >them all. I believe the fix is fairly straightforward in GStreamer. We need to >expose in the generated element the width/height ranges, and for H.264 the >supported profiles and level. With that, we at least won't randomly fail at >decoding 4K, and it should be good enough. Not only gstreamer, chromium also has similar issue. Chromium will only check video resolution globally before starting to use one decoder: if there is a 4K decoder detected before, it will mark 4K resolution as supported. But when decoding videos, it will choose the first decoder supporting profile like H264. So chromium may use a 1080p decoder to decode a 4K video. Chromium's code about v4l2 is complicated for me. I may create a bug about it. But chrome os doesn't support devices with multi v4l2 decoders like rockchip's socs, I don't know if they have the motion to fix it quickly. >For RK3588, which is a new SoC, its not a problem to upstream something that >does not work with existing userspace. It would only be a regression if we where >to enable VDPU121 on RK3399, as now updating linux would cause bugs with >existing userspace. There is an old soc just like RK3399: RK3328, which also has a 1080p hantro h264 decoder and a 4K rkvdec h264 decoder. I guess less people care about its mainline decoding with gstreamer/chromium so it still has 1080p decoder enabled. >For users, it would be best if we get this sorted out in GStreamer by the time >we have a second decoder. Note that I have some vacation coming up this month, >so there might be extra delays. Yet, its logical to merge this (the "worst" >decoder) first, since then randomly picking a better one won't be a regression. Happy vacation days! I will also take a look at chromium's code to see if I can fix it. Best regards, Jianfeng
Le jeudi 27 juin 2024 à 16:13 +0800, Jianfeng Liu a écrit : > Hi Nicolas, > > On Wed, 26 Jun 2024 13:46:03 -0400, Nicolas Dufresne wrote: > > Just to clarify, since you are right that it won't work well with GStreamer. It > > does work with multiple decoders (it exposes them all), it is simply that it > > will randomly pick one when decoding, and it may not pick the best one. > > I have tested rkvdec2 and vpu121 with gstreamer 1.24.2 on rk356x to decode > a 4K video, and gstreamer always fall with error: > "v4l2slh264dec0: Failed to configure H264 decoder". > I guess that's because 1080p vpu is at fdea0000 which is always > initialized earlier than rkvdec2 at fdf80200, so gstreamer will always > choose the 1080p decoder. I've never done any research, but that is plausible. - Probe happen in address order, since DT are in address order - Media notes are assigned in probe order - GStreamer register the element in the same order in its registry - In adsence of a rank or capabilities to differentiate, the probe order is maintained. > > > In the long term, I'd like to stop having to do "like downstream" and expose > > them all. I believe the fix is fairly straightforward in GStreamer. We need to > > expose in the generated element the width/height ranges, and for H.264 the > > supported profiles and level. With that, we at least won't randomly fail at > > decoding 4K, and it should be good enough. > > Not only gstreamer, chromium also has similar issue. Chromium will only > check video resolution globally before starting to use one decoder: if > there is a 4K decoder detected before, it will mark 4K resolution as > supported. But when decoding videos, it will choose the first decoder > supporting profile like H264. So chromium may use a 1080p decoder to > decode a 4K video. > > Chromium's code about v4l2 is complicated for me. I may create a bug about > it. But chrome os doesn't support devices with multi v4l2 decoders like > rockchip's socs, I don't know if they have the motion to fix it quickly. That's an interesting bug, which makes its more of less equal to GStreamer "unimplemented behaviour". Filing a bug is best indeed, ChromeOS team, who maintains this, is probably unaware as they don't have any SoC with multiple decoders. Even on PC side, their Chromebooks only ever have a single GPU, I haven't heard about any eGPU support either. > > > For RK3588, which is a new SoC, its not a problem to upstream something that > > does not work with existing userspace. It would only be a regression if we where > > to enable VDPU121 on RK3399, as now updating linux would cause bugs with > > existing userspace. > > There is an old soc just like RK3399: RK3328, which also has a 1080p > hantro h264 decoder and a 4K rkvdec h264 decoder. I guess less people care > about its mainline decoding with gstreamer/chromium so it still has 1080p > decoder enabled. What I meant by new/old, is supported mainline or not. But yes, on timeline, there is many older SoC with dual decoders in the Rockchip line. > > > For users, it would be best if we get this sorted out in GStreamer by the time > > we have a second decoder. Note that I have some vacation coming up this month, > > so there might be extra delays. Yet, its logical to merge this (the "worst" > > decoder) first, since then randomly picking a better one won't be a regression. > > Happy vacation days! I will also take a look at chromium's code to see if > I can fix it. Great, let's keep everyone on sync, I'm sure we can come up with something better then disabling the possibly useful hardware. Nicolas
diff --git a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi index dd85d4e55922..c0466982646f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi @@ -1159,6 +1159,27 @@ power-domain@RK3588_PD_SDMMC { }; }; + vpu121: video-codec@fdb50000 { + compatible = "rockchip,rk3588-vpu121", "rockchip,rk3568-vpu"; + reg = <0x0 0xfdb50000 0x0 0x800>; + interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>; + interrupt-names = "vdpu"; + clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; + clock-names = "aclk", "hclk"; + iommus = <&vpu121_mmu>; + power-domains = <&power RK3588_PD_VDPU>; + }; + + vpu121_mmu: iommu@fdb50800 { + compatible = "rockchip,rk3588-iommu", "rockchip,rk3568-iommu"; + reg = <0x0 0xfdb50800 0x0 0x40>; + interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>; + clock-names = "aclk", "iface"; + clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; + power-domains = <&power RK3588_PD_VDPU>; + #iommu-cells = <0>; + }; + vepu121_0: video-codec@fdba0000 { compatible = "rockchip,rk3588-vepu121"; reg = <0x0 0xfdba0000 0x0 0x800>;