Firefox 150.0.1 + media.ffmpeg.vaapi.enabled=true + LIBVA_DRIVER_NAME= v4l2_request, executed under Xvfb on ohm. Result: inconclusive at the boolean-correctness level. RDD process dlopens libva.so.2 + libva-drm.so.2 + libva-x11.so.2 for capability probe then immediately closes them; never reaches vaInitialize, never opens /dev/dri/renderD128, never reaches v4l2_request_drv_video.so. Falls back to software H.264 in RDD via FFmpeg-OS-library PDM (Broadcast support from 'RDD', support=H264 SWDEC). Root cause: Xvfb provides software framebuffer with no DRI/DRM render-node integration. Firefox's gfx-environment platform-fitness check rejects VAAPI before adding it to the RDD PDM order list. Not a libva-side or driver-side fault — mpv --hwdec=vaapi-copy in the same headless rig DID engage end-to-end (per phase0_evidence/2026-05-04/findings.md). Definitive Firefox verdict requires retesting inside a live Plasma session — deferred to live-session run (next commit). Also: Phase 0 deliverable #2 (Step 1 reconciliation into fork master) was completed and pushed to marfrit/libva-v4l2-request-fourier between this and the prior Phase 0 commit; status table updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.5 KiB
Phase 0 deliverable #3 — Firefox VAAPI engagement test (2026-05-04)
In-session test of stock Firefox 150.0.1 with media.ffmpeg.vaapi.enabled=true + LIBVA_DRIVER_NAME=v4l2_request env. Headless rig (Xvfb under SSH).
Verdict
Inconclusive at the boolean-correctness level under this rig. Firefox loads our libva backend for a capability probe but does not engage it for the actual H.264 decode — falls back to software via FFmpeg in the RDD process. The decision to skip VAAPI happens at Firefox's gfx-environment gating layer, before VAAPI device init is attempted. Likely cause: Xvfb provides software framebuffer with no DRI/DRM render-node integration, which Firefox requires for VAAPI surface allocation. Not a libva-side or driver-side fault.
A definitive Firefox verdict requires retesting inside a real Plasma/X session with live DRM access. That's a Phase 7 verification task once a session is live.
What was actually run
Firefox 150.0.1, profile at /tmp/firefox-vaapi-test/profile/ (preserved as profile_user.js here), with these prefs on top of stock:
media.ffmpeg.vaapi.enabled = truemedia.ffvpx.enabled = falsemedia.hardware-video-decoding.force-enabled = truemedia.hardware-video-decoding.enabled = truemedia.av1.enabled = falsegfx.x11-egl.force-enabled = truewidget.dmabuf.force-enabled = truemedia.rdd-process.enabled = truemedia.rdd-ffvpx.enabled = falsemedia.rdd-ffmpeg.enabled = truemedia.gpu-process-decoder = truelogging.PlatformDecoderModule = 5,logging.MediaPDM = 5
Env on top of stock:
MOZ_DISABLE_RDD_SANDBOX=1,MOZ_DISABLE_CONTENT_SANDBOX=1,MOZ_DISABLE_GMP_SANDBOX=1,MOZ_DISABLE_SOCKET_PROCESS_SANDBOX=1(rule out sandbox interference)LIBVA_DRIVER_NAME=v4l2_request+LIBVA_V4L2_REQUEST_VIDEO_PATH=/dev/video1+LIBVA_V4L2_REQUEST_MEDIA_PATH=/dev/media0LIBVA_MESSAGING_LEVEL=2
Run command:
xvfb-run -a -s "-screen 0 1280x720x24" -- \
strace -ff -ttt -s 256 -o /tmp/firefox-vaapi-test/strace/ff \
-e trace=ioctl,openat,close,clone,clone3,execve \
firefox -profile /tmp/firefox-vaapi-test/profile -no-remote -new-instance \
file:///tmp/firefox-vaapi-test/test.html
Test page autoplays bbb_1080p30_h264.mp4 via <video src="file://..." autoplay muted>. Run ran to 30 s timeout (exit 124).
Evidence — what the strace shows
| Process | PID | Behavior |
|---|---|---|
| Parent | 143578 | dconf warnings only, no media path |
| RDD | 143696 | Opens /usr/lib/libva.so.2 + libva-drm.so.2 + libva-x11.so.2, immediately closes them all (~9 ms apart, no fd retained). Capability probe pattern: dlopen → dlsym → dlclose. |
| Content | 143725 | No libva opens; talks to RDD via IPC for decode |
| Utility | 143764 | Second probe of libva.so.2 + libva-drm.so.2 + libva-x11.so.2; gets ENETDOWN first try (sandbox path mangling), retries with `O_NOCTTY |
| (forkserver) 143775 | 143775 | Re-probes the same libva chain; same close-immediately pattern |
| Anywhere | — | Zero opens of /dev/dri/renderD128 (the DRM render node libva-v4l2-request would use); only /dev/dri directory enumeration to enumerate render nodes |
| Anywhere | — | 3 V4L2 ioctls total — and the three /dev/video[012] opens at 1777888991.21x are Firefox's webrtc/camera enumeration probe, not libva-driven (timestamps precede the libva opens by ~115 ms) |
| Anywhere | — | v4l2_request_drv_video.so never opened — libva-v4l2-request was never reached |
So the libva backend is reachable from Firefox's process tree and not blocked by sandbox; Firefox just doesn't drive it.
Evidence — what the MOZ_LOG shows
From firefox.log.child-2.moz_log (RDD process, 276 KB):
[RDD 143696: Main Thread]: D/PlatformDecoderModule PDMInitializer, Init PDMs in RDD process
[RDD 143696: Main Thread]: D/PlatformDecoderModule FFMPEG: version: 0x200, macro: 62, micro: 100/101, isFFMpeg: yes
[RDD 143696: Main Thread]: D/PlatformDecoderModule FFVPX: Link result: Success
[RDD 143696: Main Thread]: D/PlatformDecoderModule PDMInitializer, RDD PDM order:
[RDD 143696: Main Thread]: D/PlatformDecoderModule PDMInitializer, 0: FFmpeg(FFVPX)
[RDD 143696: Main Thread]: D/PlatformDecoderModule PDMInitializer, 1: FFmpeg(OS library)
[RDD 143696: Main Thread]: D/PlatformDecoderModule PDMInitializer, 2: Agnostic
PDM order in RDD is FFVPX → FFmpeg(OS library) → Agnostic. No VAAPI PDM in the order list — Firefox's PDM enumerator concluded VAAPI isn't usable on this rig before adding it to the list.
From firefox.log.moz_log (parent, 210 B):
[Parent 143578: Main Thread]: D/PlatformDecoderModule Broadcast support from 'RDD', support=H264 SWDEC
The SWDEC suffix is decisive: parent confirms RDD reports H.264 capability at the software-decode tier, not VAAPI / hardware tier.
Steady-state during playback: many [RDD 143696: MediaPDecoder #4]: V/PlatformDecoderModule ProcessDecode: mDuration=41666µs ; mTime=... lines — RDD is decoding 24 fps content via FFmpeg (mDuration=41666µs = 1/24 sec), software path.
Why this happens
Firefox's VAAPI gating in modern code (since ~115) requires a working EGL+DMABUF environment that can allocate VAAPI surfaces and import them as DMA-BUFs for compositing. The check happens during PDM enumeration in the RDD process, before any VAAPI device init. Under Xvfb:
- Xvfb is a software X server with no
/dev/driintegration (its rendering goes to a software framebuffer, not the GPU). gfx.x11-egl.force-enabled = truelets Firefox try EGL on Xvfb, but the EGL context can't get a GBM device.- DMABUF allocation requires a render node with GBM support, which Xvfb doesn't expose.
So Firefox's PDM enumerator skips VAAPI and the OS-library FFmpeg PDM falls through to software H.264. The probe of libva.so.2 we see is Firefox checking that libva is installed (so it knows to add VAAPI as a candidate for environments that support it), but the platform-fitness check then disqualifies the candidate.
The probe is not the engagement. The engagement is what we'd see if we got a /dev/dri/renderD128 open + vaCreateContext ioctls + __vaDriverInit_1_23 symbol call into our v4l2_request_drv_video.so + the V4L2-stateless contract trace on /dev/video1 + /dev/media0. None of that happened.
Predecessor-claim retest
| Claim | Result |
|---|---|
Firefox 150 + media.ffmpeg.vaapi.enabled=true + LIBVA env vars engages our backend (Mozilla bug 1965646 documents this is "supposed to work" on RK3566/RK3588) |
Not engaged under Xvfb headless rig. Capability probe only; SW fallback. |
LIBVA_DRIVER_NAME=v4l2_request is sufficient for Firefox to choose our backend |
Sufficient at the libva-driver-selection layer (libva.so loaded the right driver), but Firefox doesn't reach that layer because gfx-env check fails first. |
MOZ_DISABLE_RDD_SANDBOX=1 clears sandbox-related blockers |
RDD sandbox not the blocker — even with sandbox disabled, VAAPI isn't engaged. The ENETDOWN-then-retry pattern in some processes is unrelated noise. |
Implication for Phase 1 lock
Firefox-as-test-consumer: ✓ libva backend reachable, ✗ engagement not demonstrable in this rig, ⚠ definitive answer requires real Plasma session.
Two options for closing this Phase 0 deliverable:
- Accept rig limitation, defer Firefox engagement test to Phase 7 verification. Phase 1 binding cells include Firefox as a target consumer; Phase 6 implementation (if any beyond Step 1) goes ahead; Phase 7 retests Firefox in real Plasma session at the end. Risk: if there's a Firefox-specific engagement bug, we discover it late.
- Run the test inside a live Plasma session (drive sddm-greeter through to a user session, or wake the user session via SSH
loginctl unlock-session/etc.). Removes the Xvfb confound. Ohm currently has SDDM greeter on tty1 + no live user session, so this requires either physical interaction or a session-start orchestration script.
mpv --hwdec=vaapi-copy in the same headless rig DID engage the libva backend end-to-end (per phase0_evidence/2026-05-04/findings.md), so the issue isn't "headless can't VAAPI" — it's specifically Firefox's gfx-env requirements being stricter than mpv's.
Artifacts
profile_user.js— Firefox profile prefstest.html— autoplay test pagefirefox.log.{moz_log,child-1.moz_log,child-2.moz_log}— MOZ_LOG outputfirefox_stderr— stderr (mostly dconf-CRITICAL noise from missing XDG_RUNTIME_DIR perms)strace_parent_143578,strace_rdd_143696,strace_content_143725,strace_utility_143764— per-process strace