0%

Orange Pi Plus 2 LibreElec和Kodi硬件解码适配

几年前在垃圾桶捡到几个Orange Pi Plus 2,配置较低,放在2024年的今天已经做不了什么事情了,唯一还能用是的就是他支持HEVC硬件解码4k30fps输出,可以当机顶盒来用,并在内核主线支持较为完善,有Armbian系统和LibreElec系统可选。

我这里记录的是在Orange Pi Plus 2上安装LibreElec和Armbian,并调整参数使得硬件解码可以正常使用。

请注意文章发布时间,随着时间的推移可能有些描述会变得不准确。

Orange Pi Plus有几个马甲,分别是Orange Pi Plus、Orange Pi Plus 2、Orange Pi Plus 2E。

其中Orange Pi Plus 2在全志的官网是已经找不到描述了,但是他们3个基本一致,固件通用。

Orange Pi Plus soc是Allwinner H3,内存是1+8,带sata口和wifi。

Orange Pi Plus 2 soc是Allwinner H3,内存是2+16,带sata口和wifi。

Orange Pi Plus 2E soc是Allwinner H3,内存是2+16,没有wifi和sata。

在LibreElec官网可以下载到Orange Pi Plus和Orange Pi Plus 2E 固件,我这里用的是Orange Pi Plus固件。直接按照官网的方式写入sd卡,LibreELEC 12.0.0 版本刷入之后,黑屏无法引导,用LibreELEC 11.0.6 的就正常了,原因不明。

LibreElec已经做好了适配,直接播放8bit HEVC和8bit AVC编码的视频可以看到已经在使用硬件解码。H3不支持10bit的硬解,播放10bit视频时候使用cpu软解,卡顿到基本无法观看。

所以这么简单就完了吗?如果是的话就不会有这个记录了。在LibreElec下面无论播放HEVC还是AVC的视频,分辨率1080P还是4K,都会出现绿屏和马赛克。查看dmesg会发现很多报错。

1
2
3
4
5
6
7
8月 04 10:40:24 LibreELEC-PIPLUS2 kernel: vmap allocation for size 12447744 failed: use vmalloc=<size> to increase size
8月 04 10:40:24 LibreELEC-PIPLUS2 kernel: cedrus 1c0e000.video-codec: dma alloc of size 12443648 failed
8月 04 10:40:25 LibreELEC-PIPLUS2 kernel: vmap allocation for size 12447744 failed: use vmalloc=<size> to increase size
8月 04 10:40:25 LibreELEC-PIPLUS2 kernel: cedrus 1c0e000.video-codec: dma alloc of size 12443648 failed
8月 04 10:40:25 LibreELEC-PIPLUS2 kernel: cma: cma_alloc: reserved: alloc failed, req-size: 3038 pages, ret: -12
8月 04 10:40:25 LibreELEC-PIPLUS2 kernel: cedrus 1c0e000.video-codec: dma alloc of size 12443648 failed
8月 04 10:40:25 LibreELEC-PIPLUS2 kernel: cma: cma_alloc: reserved: alloc failed, req-size: 3038 pages, ret: -12

查阅了Google,大致意思就是cma内存和vmalloc的内存分配得不够导致。通过 cat /proc/meminfo 可以看到LibreEleccma默认分配 CmaTotal 320M,VmallocTotal 内存240M。

1
2
3
4
5
6
VmallocTotal:     245760 kB
VmallocUsed: 8780 kB
VmallocChunk: 0 kB
Percpu: 672 kB
CmaTotal: 327680 kB
CmaFree: 309868 kB

把他们增加到512M,问题解决。编辑文件 /flash/extlinux/extlinux.conf (由于 /flash 是只读挂载,现修改为要读写挂载才能顺利编辑),在 APPEND boot= 行的最后加入 cma=512M vmalloc=512M

1
2
3
mount -o remount,rw /flash
vi /flash/extlinux/extlinux.conf
APPEND boot=UUID=xxxx-4xx6 disk=UUID=cxxxx9e-09ae-xxxx-xxxx-76cxxxxxx95c quiet console=ttyS0,115200 console=tty1 cma=512M vmalloc=512M

修改完成后重启系统,再次 cat /proc/meminfo 查看,CmaTotalVmallocTotal 都是 512M 了,播放视频没有马赛克,没有绿屏,也不卡顿了,切换视频也是秒切。问题解决。

1
2
3
4
5
6
VmallocTotal:     524288 kB
VmallocUsed: 8756 kB
VmallocChunk: 0 kB
Percpu: 672 kB
CmaTotal: 524288 kB
CmaFree: 506444 kB

既然LibreElec可以完美支持硬解,那在Armbian上安装Kodi是不是也可以做同样的事情呢?

对比LibreElec,Armbian上可以使用原机的Wifi模块,可以通过开hostapd热点当路由器使用,也可以安装LXC开小鸡,做一个小小的ALL in one。

在Armbian的官网https://www.armbian.com/orange-pi-plus/ 上可以找到 Orange Pi Plus的镜像,和 Orange Pi Plus 2可以通用。

下载后用balenaEtcher写入SD卡,就可以引导进系统了。不过实测发现 Bullseye 和 Bookworm 都是黑屏无法引导,和LibreELEC 12.0.0一样原因不明。在历史版本 https://stpete-mirror.armbian.com/archive/orangepiplus/archive/ 中找到 Buster 也就是对应 Debian 10的版本,刷入后可以正常引导了,然后通过 apt dist-upgrade 一级一级升到 Bookworm 。

/etc/apt/sources.list 改成中科大的apt源,否正几天几夜都升不完。

Buster源

1
2
3
4
5
6
7
8
9
10
11
deb https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free

deb https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free

deb https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free

deb https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free

Bullseye源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
deb https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free 
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free

deb https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free

deb https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free

deb https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free

deb https://mirrors.ustc.edu.cn/deb-multimedia bullseye main non-free
deb https://mirrors.ustc.edu.cn/deb-multimedia bullseye-backports main

Bookworm源

1
2
3
4
5
6
7
8
9
10
11
deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware

deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware

deb https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

deb https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb-src https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware

直接用 apt 安装 kodi 会发现根本无法启动,原因也是 cma内存vmalloc内存 分配有关系,编辑文件 /boot/armbianEnv.txt 加入内核启动参数,然后重启系统。

1
2
##加入一行
extraargs=cma=512M vmalloc=512M

增加 cma内存vmalloc内存kodi 可以正常启动了,但是播放视频会发现只有软解没有硬解。

跟据Google查阅资料 Allwinner 硬解需要用到 libva-v4l2-request ffmpeg 开启v4l2request 选项编译, kodi 开启 gles 选项编译,并且只支持gbm 窗体,不支持waylandx11

Armbian的 kodi 是由 Debian 仓库提供和维护的,不在 kodi 官方的PPA仓库里面,没有开启gles

直接通过 ffmpeg 命令可以看到 ffmpegbuilt 选项,需要有--enable-v4l2-request --enable-libdrm --enable-libudev 才行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 ffmpeg
ffmpeg version 5d5bbd001b-Kodi Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
configuration: --enable-v4l2-request --enable-libdrm --enable-libudev --disable-hwaccel=vp9_v4l2request
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

因为v4l2-request还没并入 ffmpeg 主线,通过apt 安装 ffmpeg 不支持v4l2-request的。

libva-v4l2-request 这个库自然也是没有的,所以全部都需要自行编译。

libva-v4l2-request https://github.com/bootlin/libva-v4l2-request 会报错无法编译,后来翻 issues找到了一份 fork https://github.com/noneucat/libva-v4l2-request.git 总算成功了。

照着 LibreELEC 的源码给 ffmpeg 打 patch 让 ffmpeg 支持 v4l2_request

https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/multimedia/ffmpeg/patches

以上这些编译已经是2021年的时候事情了,期间花费了一周多,中间过程遇到了无数问题,没有一一记录,大部分已经忘记了。

但是到了2024年的今天,已经有人做过同样的事情,并且提供了二进制版本,直接安装就行了。

https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/

可以通过一下命令测试 ffmpeg 的硬解加速是否有效,如果正常播放,并且CPU占有没有达到100%,说明 ffmpeg 可以正常调用硬解解码,测试用的视频文件在这里 https://repo.jellyfin.org/jellyfish/

1
2
ffmpeg -benchmark -hwaccel drm -i jellyfish-3-mbps-hd-h264.mkv -f null -
ffmpeg -benchmark -hwaccel drm -i jellyfish-3-mbps-hd-hevc.mkv -f null -

最后还要把 kodi 重新编译一下,过程过于复杂,限于篇幅,只能在下一文继续了。

Enjoy~~

参考:

https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/
https://github.com/bootlin/libva-v4l2-request/issues/23
https://forum.armbian.com/topic/25473-hardware-accelerated-video-decoding-in-kodi-on-orange-pi-pc-plus/
https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/
https://linux-sunxi.org/Kodi
https://archive.fosdem.org/2018/schedule/event/kodi/attachments/slides/2166/export/events/attachments/kodi/slides/2166/FOSDEM_Presentation_2018___Lukas_Rusak.pdf
https://github.com/yoyoliyang/hi3798m_debian/issues/6
https://github.com/raspberrypi/firmware/issues/1603
https://forum.armbian.com/topic/11551-4kp30-video-on-orange-pi-lite-and-mainline-hardware-acceleration/
https://forum.libreelec.tv/thread/25283-allwinner-h6-hevc/
https://forum.libreelec.tv/thread/17565-nightly-images-for-a64-h3-h5-h6-and-r40-boards/?pageNo=93
https://forum.armbian.com/topic/15018-change-cma-memory-allocation-size/
http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Plus-2E.html
https://linux-sunxi.org/Xunlong_Orange_Pi_Plus_2

https://forum.libreelec.tv/thread/27915-explanation-of-the-ffmpeg-patches/
https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/multimedia/ffmpeg/package.mk

https://github.com/bootlin/libva-v4l2-request/issues/40