Show full content
Back in the good old days of 2019 I was still a naive youngster who looked at the specifications listed alongside the latest Raspberry Pi and similar ARM-based single-board computers (SBCs) and took the video en- and decoding specifications as gospel. Even a lowly single-core ARMv6 SoC like the BCM2835 [1] as featured on the original Raspberry Pi and Raspberry Pi Zero SBC should be able to decode 1080p h.264 video at 30 FPS, not to mention the much more powerful SoCs by Broadcom and others with support for 60 FPS, HEVC (h.265) and so on. This assumption led me to focus on such SBCs when I embarked on my NymphCast audio-visual streaming project [2] as they seemed like a cheap, powerful platform which most people had lying around.
Fast-forward to today and I have shifted away from ARM-based SBCs, back to the comforting embrace of x86-based platforms. This follows after countless attempts to make video hardware en- and decoding work on ARM-based platforms, both Raspberry Pi boards and those based on Allwinner (H- and V-series, including the S3 on the horrid PineCube [3]) and Amlogic S9-family (e.g. Odroid C2). Whether trying to hardware decode video files or encode camera feeds using the hardware encoding block in the SoC, the problems were always the same: missing or incomplete drivers, or poor API support.
The hilarious part is that these drivers are generally available from the manufacturer, but only in binary form, and restricted to an ancient Linux kernel or obsolete Android version. In the case of Raspberry Pi, the Broadcom drivers are also binary blobs, and come with a dizzying amount of poorly supported APIs and general lack of software support. Whether OpenMAX or MMAL, these APIs were left behind on 32-bit Linux (Raspberry Pi OS), and 64-bit Linux struggles to make Video4Linux work right now.
After giving it yet another shot on the new Raspberry Pi OS ‘Bookworm’ on a Raspberry Pi 3B system with the new KMS driver I had to sadly conclude that the result was basically the same once more. No hardware acceleration with standard ffmpeg or ffplay unless you manually tell it which specific decoder/encoder to use, and countless forum threads filled with people sharing hacks that may or may not work. The best approach for ffmpeg appears to be to compile a custom version which among other changes fixes the broken rendering when on the desktop as hardware-accelerated render surfaces are still a novelty in 2024, it seems.
What I may still try is running NymphCast with the desktop disabled to see whether that’s a viable way to get reasonable h.264 playback at 1080p working, but I remain skeptical.

Meanwhile, what really caught my eye since a few months as an alternative is Intel’s Ander Lake-N series of SoCs. These include a wide range of (Skylake-based) CPU cores and internal GPU (iGPU) configurations, but what they have in common is a quite modern set of video en- and decoding options in the iGPU. This not only includes h.264 and h.265 (HEVC), but also VP9, AV1 and so on. In addition to compact mini PCs featuring most commonly the N95 and N100 SoCs, you also got a few N100-based mini-ITX and microATX mainboards, which often even allow you to put a better GPU into the PCIe slot. This is now my go-to solution.
What does such an x86-based low-power (6-15 Watt TDP, 6 Watt for the N100) system bring you compared to an HEVC-capable SBC like the Raspberry Pi 4 and 5? The ability to run Windows, Linux, FreeBSD with full support, full driver support for every single feature in the SoC and on the mainboard, a regular BIOS, and above all hardware acceleration for video decoding of any format you can throw at it. Even better is that it just works in ffmpeg, ffplay, OBS and whatever else you may want to use.
Although I have learned along the way that the developers behind Kodi and other projects manage to get hardware accelerated decoding working on Raspberry Pi SBCs, this requires a lot of custom code and testing, with still many issues for endusers. Since the goal of NymphCast is to be portable across any platform that supports regular FFmpeg without having to hack in platform-specific code (since I’m just the sole dev on the project), this obviously won’t fly for me. Theoretically the hardware acceleration drivers will some day end up in the mainline Linux kernel, but realistically this will happen shortly after said SoC is firmly obsolete.
Where I like those small ARM-based SoCs is for audio-related tasks, such as running NymphCast in audio-only mode, but as I recently have found, this works great on an ESP32 microcontroller as well [4], which can also boot up a lot faster. Since AV1 decoding is still a rarity on ARM-based SBCs, this makes Alder Lake-N-based systems moreso attractive, and is the reason why the media-focused HTPC I put next to the TV is based around the N100 SoC, running a recent Linux kernel.
In the tragedy that is ARM SoC driver support, this outcome makes me admittedly feel less salty about all the wasted hours, and it’s definitely been educational albeit painfully so. I hope that this post helps to disabuse at least some people of the notion that ARM SoCs and similar (hi RISC-V) with the same proprietary IP blocks and terrible driver support are at all an easy target for a casual video playback or encoding experience.
Long live x86, indeed.
Maya
[1] https://web.archive.org/web/20120513032855/https://www.broadcom.com/products/BCM2835
[2] https://github.com/mayaposch/nymphcast
[3] https://hackaday.com/2021/04/22/hands-on-with-pinecube-an-open-ip-camera-begging-for-better-kernel-support/
[4] https://mayaposch.wordpress.com/2024/02/07/porting-nymphcast-audio-and-ffmpeg-to-the-esp32-microcontroller/




