Add native hardware video decoding, HDR output, and audio continuity - #168
Add native hardware video decoding, HDR output, and audio continuity#168nocell wants to merge 3 commits into
Conversation
|
@nocell && @themartiano: Tested revision These results are from a local integration with build adjustments and a repaired guest dependency set, rather than a clean build of the unmodified PR. Build fixes1. Require the DRM VA-API backend in the private FFmpeg buildOur initial FFmpeg build completed, but hardware decoding failed with Adding the following build-time linker option to the generated compiler wrapper allowed that check to succeed: -Wl,-rpath-link=$root/usr/libWe also added a post-configure assertion so a missing backend fails the build instead of producing an unusable package: grep -q '^#define HAVE_VAAPI_DRM 1$' config.h ||
fail "FFmpeg DRM VA-API backend is required"After rebuilding and installing the package, the decoder tests passed through the normal installed library paths. The 2. Build the
|
| Area | Observed result |
|---|---|
| Hardware video decoding | HEVC 8-bit, HEVC 10-bit, VP9 8-bit, and AV1 10-bit each produced the expected 120 frames: 480 frames total. |
| Guest CPU consumption | Hardware decoding used approximately 83–88% less guest CPU time than software decoding in the short test clips. Software decoding had higher maximum throughput; this does not establish total host CPU or power savings. |
| Installed mpv playback | Confirmed VA-API hardware decoding and playback to completion for 10-bit HEVC, but recorded 7 dropped frames during the four-second clip. |
| Multisampling | Both the default guest Mesa and the private HDR Mesa exposed four samples and passed actual multisample allocation, rendering/clear, resolve, and readback checks. |
| Native Wayland presentation | Approximately 119–120 fps from presentation feedback, including a modest rendering workload. This measures the virtual presentation path, not physical panel scanout. |
| HDR | Guest 10-bit output and BT.2020/PQ metadata handoff were observed; direct host presenter tests passed. End-to-end color accuracy remains unverified. |
| Chromium | WebGL 1 and WebGL 2 passed with explicit ANGLE/GLES selection, using VirGL rather than software rendering. |
Remaining validation
- Audio continuity.
- Firefox.
- A controlled 60 Hz run. One attempted run was restored to 120 Hz by display synchronization, so it has not been counted as 60 Hz coverage.
- Longer playback and soak tests, including dropped-frame measurements.
- Visual HDR correctness.
Separate build reproducibility finding
Initial guest assembly encountered an Aquamarine/hyprtoolkit ABI mismatch in the available package set. We used a compatible local pair to continue testing. I would track that separately unless it can be tied directly to this change.
ARM64 guest applications spend substantial CPU time decoding video, while the existing eight-bit display path loses HDR output. This adds host VideoToolbox decoding, a paired ten-bit HDR presentation path, consistent SDR interface brightness, and a fix for reproduced HDA audio dropouts.
Closes #167. CPU/RAM settings remain separate in #156.
Demonstration
The two owner-supplied recordings show the same Tron 4K60 HDR source. The accelerated setup uses a 120 Hz guest display; this is not a claim of 120 FPS source playback. The recordings are resized to 1920×1242 for upload, retain their original timing and audio, and preserve ten-bit BT.2020/PQ capture metadata.
Before — hardware video decoding and guest HDR disabled (42.64 seconds):
try-omarchy-without-acceleration-and-hdr.mp4
After — hardware video decoding and native HDR enabled (60.52 seconds):
try-omarchy-4k60-hdr-demo.mp4
These are visual demonstrations, not an isolated decoder benchmark: both acceleration and HDR differ, and the window layouts differ. Both files use the Mac's HDR screen-recording format, including the recording of the SDR guest. Playback appearance depends on the viewer's browser and display. Neither recording measures physical panel luminance or proves frame delivery at 120 FPS.
Implementation
Validation
Development machine: M5 Pro, 18 vCPUs and 12 GiB guest RAM. Measurements are specific to the tested streams and machine.
make testpassed with Python 3.12: 219 Swift tests in 48 suites, 87 guest unit tests, guest contracts, build/cache tests and macOS shell/storage suites. Native SDR-white and client-white policy tests passed separately.Hardware decoding reduces guest CPU work but is not always faster for every codec. The AV1 software result is below real-time 60 FPS; this benchmark uses a different fixture from the Tron recordings.
Remaining validation and tradeoffs
This remains a draft for architecture/implementation review. A full from-source Docker guest build is still blocked because pinned Rust
1:1.98.0-1disappeared from the current Arch ARM repository; the clean-image validation reused the verified existing ttfx package without changing that pin. It does not establish a complete from-source rebuild.HDR uses a private paired virtio extension and an exact
7.2.2-2-aarch64-ARCHkernel module. Optional private CoreDisplay APIs supply only a display capability hint and fall back safely when unavailable. The HDR surface pool adds about 190 MiB at 4K, excluding Metal drawables. Dolby Vision dynamic metadata is not transported. Other Mac generations, external displays, Bluetooth and physical acoustic output need separate validation. The 1 ms audio timer increases requested wakeups while audio is active.See native video and native HDR for contracts, reproduction commands and detailed results.