Table of Contents
chromium-fourier — what we get + how we approach Brave
Update 2026-04-28: This page captures the state on 2026-04-26. The
campaign has since grown into 4 sibling patch series + 1 kernel RFC;
the current 4-patch chromium-fourier shape and the end-to-end ohm
validation (~3.8× CPU reduction onbbb_1080p30_h264.mp4) are tracked
infourier:startandpatch_series.
(a) What chromium-fourier gets us
When the cross-compile build on CT220 (chromium-builder-x86 on data) finishes, we get a stock Chromium 147 aarch64 binary at out/Default/chrome plus support files (*.pak, locales/, icudtl.dat, v8_context_snapshot.bin, chromedriver, chrome_sandbox). Packaged as chromium-fourier-147.0.7727.116-1-aarch64.pkg.tar.zst via the marfrit PKGBUILD — total install ~250-400 MB.
Built with use_v4l2_codec=true, use_v4lplugin=true, use_linux_v4l2_only=true baked in at compile time. That's the part brave-bin does not have. Whether those flags actually flip the right factory for our hantro stateless decoder is the test we run post-install on ohm; if not, the next iteration adds a small source patch to the factory check (original chromium-fourier NEXT.md plan B — much smaller scope than full libva-multiplanar).
What we lose vs brave-bin: Brave Shields (ad-block), Brave Wallet, Brave-specific sync, Brave Search integration, Talk, Rewards. UX downgrade for power users; for “video plays, browser browses” it is a wash.
(b) The rug-pull on Brave
Rug-pull does not reach the code that needs to change.
brave-bin links some things as shared libraries — those CAN be swapped:
libva— already done withLIBVA_DRIVER_NAME=v4l2_requestpointing at ourlibva-v4l2-request-fourier/opt/brave-bin/lib/libffmpeg.so— ourffmpeg-v4l2-request-gitlibavcodec could be dropped in there
But the decoder factory gating is statically baked into the brave binary as compile-time BUILDFLAG(IS_CHROMEOS) guards, not a runtime function call. There is no symbol to LD_PRELOAD over. The V4L2VideoDecoder class exists in brave-bin (verified via strings), but the factory that decides “should I instantiate it?” is hard-coded IS_CHROMEOS-only at compile time. A library swap cannot undo a #ifdef.
Library swap also does not help with the chromeos pipeline ImageProcessor failure that we hit on stock brave-bin — that is also static.
Viable Brave paths (ascending effort)
- Use
chromium-fourier— ship the result of today's build, accept the loss of Brave-specific features. Quickest. - Rebuild Brave from source with the same
use_v4l2_codecgn args we use forchromium-fourier. Brave's source = chromium + abrave-coreoverlay; same gn build, same cross-compile environment on CT220, same chromium-fourier patches on top of brave-core's tree. Another 6-10 h build. Ships abrave-fouriernext tochromium-fourier. Real Brave with V4L2 unlocked. - Binary-patch
brave-binto flip the IS_CHROMEOS check at the call sites. Find the conditional jump in theV4L2VideoDecoderfactory, NOP-out the chromeos gate. Fragile, has to be redone every Brave version, and the chromium guards are usually inlined past easy patching. - Wait for upstream Brave/Chromium to enable V4L2 on Linux non-ChromeOS. Vaporware horizon.
Recommended: (1) for ohm right now, (2) as the proper followup once chromium-fourier proves the V4L2 unlock actually engages decode. The real validation is “does it decode?” — once confirmed on chromium-fourier, the same patches are guaranteed to work on Brave's tree because Brave is chromium + UI/feature additions; the decoder code is unchanged.
Captured from a Fourier session on 2026-04-26. Live PKGBUILD source: marfrit-packages/arch/chromium-fourier.
