c7d8050cc9
V4L2 stateless decoder for Pi 5, backed by sibling
daedalus-fourier kernel library (VP9 + AV1 CDEF + H.264 video
decode kernels on VideoCore VII compute + ARM NEON).
Architecture locked 2026-05-18 by mfritsche per
daedalus-fourier/docs/phase8_scoping.md:
- Option B: Linux kernel V4L2 shim + userspace daemon (not
v4l2loopback). Real /dev/videoNN; proper DRM PRIME for
browser zero-copy.
- Option γ: dlopen FFmpeg at runtime as parser. No vendoring;
fastest to v1.
- Sibling repo (this repo): V4L2-side work outside of
daedalus-fourier so kernel-library API stays clean.
Components:
kernel/ - Linux out-of-tree kernel module (GPLv2; V4L2
device + chardev bridge to userspace daemon)
daemon/ - userspace decoder daemon (BSD-2-Clause; links
libdaedalus_core.a from sibling; dlopens FFmpeg)
docs/ - architecture + 7-phase roadmap (8.1..8.7)
include/ - shared headers between kernel and daemon
Roadmap (7 sub-phases, ~1 week each):
8.1 kernel skeleton (/dev/videoNN with no-op ioctls)
8.2 chardev bridge (kernel ↔ daemon ping-pong)
8.3 daemon FFmpeg dlopen + parse path
8.4 VP9 end-to-end via daedalus_dispatch_*
8.5 dmabuf / DRM PRIME for zero-copy
8.6 AV1 + H.264 codec support
8.7 performance: hit 30fps@1080p (project floor)
No code yet — only README + design docs + directory structure.
First implementation work starts in Phase 8.1 next session.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
84 lines
3.5 KiB
Markdown
84 lines
3.5 KiB
Markdown
# daedalus-v4l2
|
||
|
||
V4L2 stateless decoder for the Raspberry Pi 5 / CM5, backed by the
|
||
`daedalus-fourier` kernel library (VP9 + AV1 CDEF + H.264 video
|
||
decode kernels on VideoCore VII compute + ARM NEON).
|
||
|
||
**Status:** scaffold (2026-05-18). Architecture locked per
|
||
[daedalus-fourier session memory](https://git.reauktion.de/marfrit/daedalus-fourier);
|
||
implementation not yet begun.
|
||
|
||
## What this is
|
||
|
||
A two-piece userspace + kernel-module stack that exposes a V4L2
|
||
stateless decoder interface (`/dev/videoNN`) so that
|
||
`libva-v4l2-request-fourier` → `firefox-fourier` /
|
||
`chromium-fourier` can drive it the same way they drive existing
|
||
hardware-decode pipelines on Pi 5 / RK3588.
|
||
|
||
```
|
||
+-----------------------------------------------------------+
|
||
| firefox-fourier / chromium-fourier (existing) |
|
||
+-----------------------------------------------------------+
|
||
| VA-API |
|
||
+-----------------------------------------------------------+
|
||
| libva-v4l2-request-fourier (existing, sibling project) |
|
||
+-----------------------------------------------------------+
|
||
| V4L2 stateless ioctl uAPI |
|
||
+-----------------------------------------------------------+
|
||
| daedalus-v4l2 kernel module (`kernel/`) |
|
||
| - registers /dev/videoNN |
|
||
| - parses V4L2 stateless ioctls (VP9/AV1/H.264 controls) |
|
||
| - forwards bitstream + controls to userspace daemon |
|
||
| via chardev or netlink |
|
||
+-----------------------------------------------------------+
|
||
| daedalus-v4l2 userspace daemon (`daemon/`) |
|
||
| - takes bitstream blobs + per-slice controls |
|
||
| - drives FFmpeg parsers via dlopen (Option γ) |
|
||
| - dispatches per-block ops via daedalus-fourier |
|
||
| public API (daedalus_dispatch_*) |
|
||
| - posts decoded frames back to kernel module |
|
||
+-----------------------------------------------------------+
|
||
| daedalus-fourier kernel library (sibling project) |
|
||
| - exports include/daedalus.h public API |
|
||
| - per-kernel CPU NEON + opportunistic V3D QPU dispatch |
|
||
| - 9 closed cycles across VP9, AV1 CDEF, H.264 |
|
||
+-----------------------------------------------------------+
|
||
| V3D 7.1 (Mesa userspace v3dv) + ARM NEON (BCM2712) |
|
||
+-----------------------------------------------------------+
|
||
```
|
||
|
||
## Why this architecture (Option B + γ + sibling)
|
||
|
||
Locked by user 2026-05-18 from 3 options in
|
||
`daedalus-fourier/docs/phase8_scoping.md`:
|
||
|
||
- **Option B** over A (userspace v4l2loopback): real `/dev/videoNN`,
|
||
proper DRM PRIME / dmabuf for browser zero-copy.
|
||
- **Option γ**: dlopen FFmpeg as parser at runtime. No vendoring,
|
||
fastest to v1.
|
||
- **Sibling repo**: per `project_consumer_target` convention,
|
||
V4L2-side work lives outside daedalus-fourier so the
|
||
kernel-library has a clean API boundary.
|
||
|
||
## Status
|
||
|
||
Initial scaffold only. See `docs/architecture.md` for the
|
||
deeper design and `docs/roadmap.md` for the
|
||
sub-phase breakdown.
|
||
|
||
## Repo layout
|
||
|
||
- `kernel/` — Linux kernel module (V4L2 device registration +
|
||
ioctl handling + userspace chardev bridge). Out-of-tree.
|
||
- `daemon/` — userspace decoder daemon (links
|
||
`libdaedalus_core.a` from sibling daedalus-fourier; uses
|
||
dlopen for FFmpeg parser).
|
||
- `include/` — shared headers between kernel and daemon.
|
||
- `docs/` — architecture + roadmap.
|
||
|
||
## License
|
||
|
||
Kernel module: GPLv2 (required for kernel-tree compatibility).
|
||
Userspace daemon: BSD-2-Clause (matches daedalus-fourier).
|