libvpx
Author: Ludovic HENRY ludovic.henry@qti.qualcomm.com Date: 2026-06-17 Scope: RISC-V (riscv64/linux) support status for libvpx Audience: Technical leadership, resource allocation strategy Verification policy: Every claim is cross-referenced to a primary upstream source. Items that could not be verified against a second source are marked [NEEDS VERIFICATION].
1. Project Overview
libvpx is the reference implementation of the VP8 and VP9 open video codecs, developed and maintained by Google under the WebM Project umbrella. The upstream canonical repository is at chromium.googlesource.com/webm/libvpx; the github.com/webmproject/libvpx mirror is read-only. Code review is conducted via Gerrit on chromium-review.googlesource.com. Contributors must sign Google’s CLA.
There is no independent foundation, neutral steering committee, or multi-member governance body. Google controls the project entirely. The project is affiliated with the Alliance for Open Media alongside Cisco, Intel, Microsoft, Mozilla, and Netflix, but AOM membership does not affect libvpx governance.
Corporate contributors in the AUTHORS file include:
- Google - primary maintainer; majority of named committers hold @google.com addresses
- ARM - multiple contributors with arm.com addresses for NEON/SVE work
- Intel - multiple contributors with intel.com addresses for SSE/AVX work
- Loongson - loongson.cn contributors who delivered the LoongArch port
- Ittiam Systems - significant optimization contributions
- Mozilla - multiple contributors
- Imagination Technologies / MIPS - MIPS DSPr2 contributions
- Linaro - ARM-related contributions
Hardware supporters listed on webmproject.org include AMD, ARM, Broadcom, Hisilicon, Imagination Technologies, Logitech, Marvell, MIPS, nVidia, Qualcomm, Rockchip, Texas Instruments, Verisilicon, and ZTE. No RISC-V silicon vendor (SiFive, StarFive, Alibaba T-Head, SpacemiT) appears on the supporters list.
The project’s culture toward new architecture ports is clear from the LoongArch precedent: support was added by Loongson employees contributing SIMD-accelerated DSP kernels, CPU detection code, and build system entries. New architectures are accepted when a corporate sponsor contributes and commits to maintaining the SIMD layer. No such sponsor has emerged for RISC-V.
2. Port History and Upstreaming Timeline
| Date | Event | Source |
|---|---|---|
| Pre-2013 | x86/x86_64 (SSE2 through AVX2), ARM/NEON, MIPS support present | configure.sh ARCH_LIST |
| ~2020-2022 | LoongArch port contributed by Loongson employees | AUTHORS file, vpx_dsp/loongarch/ directory |
| 2026-06-17 | RISC-V: zero commits, zero issues, zero PRs in upstream repository | GitHub API search (0 results) |
There is no RISC-V port history. No contributor from any organization has opened an issue, submitted a patch, or started a discussion about a RISC-V port in the upstream Gerrit instance, the GitHub mirror, or the codec-devel mailing list. The configure script’s ARCH_LIST is arm aarch64 mips x86 x86_64 ppc loongarch – riscv is absent.
The RTCD priority ordering in build/make/rtcd.pl includes rvv as a token after sve2, indicating that the dispatch plumbing was stubbed out as a placeholder. However, no riscv/ subdirectory exists under vpx_dsp/, no vpx_ports/riscv.h or vpx_ports/riscv_cpudetect.c exists, and no RTCD entries reference RVV-accelerated functions. The rvv token in rtcd.pl is dead code.
3. Upstream Support Tier
libvpx has no published tier policy document (no PLATFORMS.md, SUPPORT.md, or equivalent). Tier classification must be inferred from CI, release artifacts, and build system treatment.
| Aspect | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Explicit configure target | x86_64-linux-gcc |
arm64-linux-gcc |
not present (falls to generic-gnu) |
| SIMD acceleration | SSE2 through AVX-512 | NEON, dotprod, i8mm, SVE, SVE2 | none |
| CPU feature detection | yes (vpx_ports/x86.h) |
yes (vpx_ports/aarch64_cpudetect.c) |
none |
| CI coverage | no upstream CI of any kind | no upstream CI of any kind | no upstream CI of any kind |
| Official binary releases | source-only | source-only | source-only |
| Arch in configure ARCH_LIST | yes | yes | no |
The absence of upstream CI for all architectures means there is no formal tier hierarchy - the project simply has no CI infrastructure. However, the practical distinction is that amd64 and arm64 have hand-tuned SIMD paths that are tested by Google internally, while riscv64 has no hand-tuned code and no internal testing. riscv64 is an unsupported fallback architecture.
4. Technical Architecture and RISC-V-Specific Subsystems
libvpx is a C/C++ codec library. Its performance-critical paths are SIMD-accelerated via architecture-specific assembly and intrinsics. The RTCD (runtime CPU dispatch) system selects the fastest available implementation at runtime based on CPU feature detection.
| Component | amd64 | arm64 | riscv64 |
|---|---|---|---|
| SAD / variance kernels | hand-tuned (SSE2-AVX2, ~73 files) | hand-tuned (NEON-SVE2, ~86 files) | scalar C fallback |
| DCT / IDCT transforms | hand-tuned SIMD | hand-tuned SIMD | scalar C fallback |
| Motion compensation / convolve | hand-tuned SIMD | hand-tuned SIMD | scalar C fallback |
| Loop filter | hand-tuned SIMD | hand-tuned SIMD | scalar C fallback |
| CPU feature detection | vpx_ports/x86.h, CPUID |
vpx_ports/aarch64_cpudetect.c, HWCAP |
missing – no riscv.h, no riscv_cpudetect.c |
| RTCD dispatch table | populated | populated | not populated (rvv placeholder only) |
| Build system target tuning | x86_64-linux-gcc with nasm | arm64-linux-gcc with NEON flags | generic-gnu, no ISA flags |
| JIT compilation | not applicable | not applicable | not applicable |
| Assembly files | 25 .asm (nasm) | 18 .asm | none |
Architecture-specific file counts by subdirectory:
vpx_dsp/x86/: approximately 73 files (48 .c + 25 .asm)vpx_dsp/arm/andvpx_dsp/aarch64/: approximately 86 files (68 .c + 18 .asm)vpx_dsp/loongarch/: approximately 28 filesvpx_dsp/riscv/: directory does not exist (0 files)
There is no JIT, no cryptographic subsystem, and no garbage collector in libvpx - it is a pure codec library. The performance gap between a SIMD-enabled architecture and riscv64’s scalar-C path is expected to be substantial. No published benchmark data comparing riscv64 to arm64 or amd64 was found. Data not available: published fps or encode-time comparisons for riscv64 vs arm64/amd64 on VP8 or VP9 workloads.
5. Build System, Cross-Compilation, and Toolchain
libvpx uses a custom autotools-like configure system, not CMake. There are no CMakeLists.txt, toolchain files, or -DUSE_X=OFF cmake flags. The configure script accepts a --target=ISA-OS-CC tuple.
Native riscv64 build:
mkdir build && cd build
../libvpx/configure \
--target=generic-gnu \
--enable-pic \
--enable-shared \
--disable-install-bins \
--disable-install-srcs \
--enable-vp9-highbitdepth \
--enable-postproc \
--enable-vp9-postproc \
--enable-temporal-denoising \
--enable-vp9-temporal-denoising \
--enable-multi-res-encoding \
--size-limit=16384x16384
make
Cross-compilation from x86_64 host:
mkdir build && cd build
CROSS=riscv64-linux-gnu- \
../libvpx/configure \
--target=generic-gnu \
--enable-pic \
--enable-shared \
--disable-install-bins \
--disable-install-srcs \
--enable-vp9-highbitdepth
make
The setup_gnu_toolchain() function in build/make/configure.sh reads the CROSS environment variable and constructs CC=${CROSS}gcc, CXX=${CROSS}g++, AR=${CROSS}ar, etc. Individual tool overrides (CC=, CXX=, AR=, LD=, STRIP=) are also supported.
The Debian debian/rules confirms the production cross-compilation setup for riscv64:
| DEB_HOST_ARCH | libvpx –target flag |
|---|---|
| amd64 | --target=x86_64-linux-gcc |
| arm64 | --target=arm64-linux-gcc |
| riscv64 | --target=generic-gnu |
| all others | --target=generic-gnu |
Toolchain requirements: No documented minimum versions for riscv64. The codebase is C99/C++11. In practice, GCC >= 7 (riscv64 target support) or Clang >= 7 (initial RISC-V backend) are sufficient floor versions [NEEDS VERIFICATION - these are inferred from toolchain history, not from libvpx documentation].
nasm: Required only for x86/x86_64 targets. Debian’s build dependency on nasm is gated to [amd64 hurd-i386 i386]. riscv64 builds do not require nasm.
QEMU: Not documented by upstream. For test execution of cross-compiled binaries, qemu-riscv64-static is the standard approach. libvpx has no upstream CI scripts referencing QEMU.
Known build failures: None found. Debian sid builds libvpx 1.16.0-3 on riscv64 with “Installed” status, confirming the generic-gnu path compiles and links without errors.
6. Feature Coverage and Gap Analysis vs arm64 and amd64
| Feature | amd64 | arm64 | riscv64 |
|---|---|---|---|
| VP8 encode | yes (SIMD-accelerated) | yes (SIMD-accelerated) | yes (scalar C only) |
| VP8 decode | yes (SIMD-accelerated) | yes (SIMD-accelerated) | yes (scalar C only) |
| VP9 encode | yes (SIMD-accelerated) | yes (SIMD-accelerated) | yes (scalar C only) |
| VP9 decode | yes (SIMD-accelerated) | yes (SIMD-accelerated) | yes (scalar C only) |
| VP9 high-bit-depth (10/12-bit) | yes | yes | yes (scalar C only) |
| Frame-parallel decode | yes | yes | yes (threading via pthreads) |
| Tile-parallel decode | yes | yes | yes (threading via pthreads) |
| CPU feature detection | yes | yes | missing |
| RVV / SIMD acceleration | N/A | N/A | missing |
| RTCD runtime dispatch | yes | yes | dispatch table exists but selects C-only functions |
Functional gaps: None. libvpx is functionally complete on riscv64. All codec operations are available via the scalar C fallback path.
Performance gaps: All DSP kernels (SAD, variance, DCT/IDCT, motion compensation, loop filter, convolve) run as scalar C code on riscv64. No numeric encode/decode throughput comparison between riscv64 and arm64 or amd64 was found in upstream sources, distribution bug trackers, or public benchmarks. Data not available: quantified fps or encode-time delta between riscv64 scalar and arm64 NEON paths for VP9.
Security hardening: Debian builds libvpx with hardening=+all optimize=-lto (all hardening flags, LTO explicitly disabled). This applies uniformly to all architectures including riscv64. No riscv64-specific security hardening gap was identified.
Floating-point / NaN semantics: libvpx is an integer codec; no floating-point arithmetic is used in the core encode/decode paths. No riscv64 floating-point ABI issue was identified.
7. CI/CD Infrastructure
libvpx has no CI infrastructure of any kind. The webmproject/libvpx GitHub repository has no .github directory. The following CI configuration files were checked at the repository root and all returned 404: .travis.yml, .cirrus.yml, .gitlab-ci.yml, Jenkinsfile, .appveyor.yml, .circleci, azure-pipelines.yml. The upstream canonical repository at chromium.googlesource.com also has no CI configuration files.
The project uses Gerrit (chromium-review.googlesource.com) for code review, implying that Google runs internal CI for submitted CLs, but this infrastructure is not public and its architecture matrix is not documented.
| Aspect | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Public CI pipeline | none | none | none |
| GitHub Actions | none | none | none |
| RISE runners | none | none | none |
| Hardware used for CI | unknown (Google internal) | unknown (Google internal) | unknown / likely none |
| Distro build validation | Debian buildd (passive) | Debian buildd (passive) | Debian buildd (rv-manda-03, passive) |
The only riscv64 build validation that exists is the Debian buildd infrastructure, which is a distribution-side artifact, not upstream CI.
8. Distribution and Release Status
libvpx publishes source-only releases. All tags (v1.17.0-rc1, v1.16.0, v1.15.2, v1.15.1, v1.15.0, v1.14.1, and prior) provide only source archives (.zip, .tar.gz). No pre-built binaries are published for any architecture.
| Channel | riscv64 available | Version | Notes |
|---|---|---|---|
| Upstream GitHub releases | no (source-only) | v1.17.0-rc1 latest | no binary assets at all |
| PyPI | N/A | N/A | no package named “libvpx” exists on PyPI |
| RISE wheel builder | no | N/A | redirects to nonexistent PyPI package |
| Debian sid | yes | 1.16.0-3 | built on rv-manda-03, “Installed” status confirmed |
| Ubuntu 24.04 Noble | yes [NEEDS VERIFICATION - not independently re-confirmed] | 1.14.0-1ubuntu2 | ports repo; security-patched update (1ubuntu2.3) covers amd64/i386 only |
| Arch Linux RISC-V | unconfirmed | 1.15.0-1 | repology shows version; archriscv.felixc.at search returned no result; not in failure list but positive confirmation unavailable |
| Alpine Linux edge | yes | 1.15.2-r0 | community repo |
| AUR (android-riscv64-libvpx) | yes | 1.16.0 | Android riscv64 target |
To obtain a working riscv64 binary of libvpx today: install the distribution package (apt install libvpx-dev on Debian/Ubuntu with a riscv64 sysroot) or cross-compile from source using --target=generic-gnu CROSS=riscv64-linux-gnu-. No additional steps are required; the scalar C fallback compiles without errors.
9. Dependencies
| Dependency | Role | riscv64 build | riscv64 test | riscv64 release | Notes |
|---|---|---|---|---|---|
| glibc / pthreads | C runtime, threading primitives | passing (tier-1 since glibc 2.27) | complete | stable | Debian sid 2.41; riscv64 is upstream tier-1 |
| libyuv (optional) | YUV pixel format conversion | passing (Debian sid 0.0.1922.20260106-1+b1, “Installed” on rv-osuosl-01) | partial RVV coverage | released with RVV | partial – several chroma write-back and luma conversion stubs (RGB24ToYJRow_RVV, RAWToYJRow_RVV, ARGBToUVRow) are empty, falling to scalar C |
| libwebm (optional) | WebM container mux/demux | passing (Debian sid 1.0.0.32-1+b2, “Installed” on rv-osuosl-02) | complete | released | pure C++, no architecture-specific code, no SIMD |
| nasm (build-time) | x86/x86_64 SIMD assembly | not applicable on riscv64 | N/A | N/A | build dependency gated to [amd64 hurd-i386 i386] in Debian; riscv64 builds skip all nasm objects |
libyuv deep-dive: libyuv has partial RVV support contributed by SiFive: row_rvv.cc and scale_rvv.cc contain RVV intrinsics for row-processing and scaling operations. CPU feature detection flags kCpuHasRVV and kCpuHasRVVZVFH are present in cpu_id.h. However, chroma write-back rows and several luma conversion rows (RGB24ToYJRow_RVV, RAWToYJRow_RVV, RAWToYRow_RVV) have empty stubs, meaning those paths still fall to scalar C. The libyuv RVV port is the only RISC-V SIMD work in the libvpx dependency graph.
glibc: Fully supported; riscv64 has been upstream tier-1 since glibc 2.27 (2018). No blockers.
11. Known Bugs and Active Issues
| ID | Title | Status | Severity | Notes |
|---|---|---|---|---|
| - | No riscv64-related issues or PRs | - | - | GitHub issue search “riscv repo:webmproject/libvpx”: 0 results; GitHub PR search “riscv repo:webmproject/libvpx type:pr”: 0 results |
The WebM Project issue tracker at issues.webmproject.org requires authentication; a search for riscv64 issues there was not possible. Data not available: any RISC-V bugs that may exist in the authenticated issue tracker.
No correctness bugs specific to riscv64 were found. The generic-gnu scalar C path is architecture-neutral and does not produce SIMD-specific correctness issues.
12. Objections and Upstream Blockers
No stated objections found. No upstream maintainer has publicly rejected a RISC-V port or stated policy against accepting one. The absence of objections reflects the absence of any patch submission, not a green light.
Organizational blockers:
-
No RISC-V silicon vendor has engaged with the libvpx project. The LoongArch port required sustained effort from Loongson employees. An RVV port would require equivalent investment from a vendor with hardware to test on (SiFive, StarFive, Alibaba T-Head, SpacemiT, or a distro maintainer with access to hardware).
-
Google controls merge decisions. A corporate sponsor would need to negotiate CLA sign-off and maintain the port post-merge, as Google has shown no indication of funding RISC-V work for libvpx internally.
-
The Alliance for Open Media has shifted focus to AV1 (libaom). VP8/VP9 are in maintenance mode. Investment in new architecture ports for VP8/VP9 may be deprioritized in favor of AV1 tooling. This is a strategic risk for any RISC-V sponsorship.
Technical blockers:
-
CPU feature detection infrastructure for RISC-V is entirely absent. A port would require adding
vpx_ports/riscv.h,vpx_ports/riscv_cpudetect.c, build system entries inconfigure.shandbuild/make/configure.sh, and RTCD dispatch entries. -
The RVV extension (RISC-V Vector) has a variable-length vector model that differs from ARM SVE and x86 AVX-512. The RTCD dispatch system would need extension to handle RVV’s VLEN-agnostic programming model.
-
VP9 and VP8 have hundreds of SIMD-accelerated functions. A full RVV port to parity with ARM NEON or x86 SSE2 coverage would be a substantial engineering project.
Acceptance probability: Moderate if a corporate sponsor commits sustained engineering resources and targets parity with the LoongArch port (not full ARM/x86 parity) as an initial milestone.
13. Investment Analysis
The RISE Project has no funded or in-progress libvpx work as of June 2026. All 28 RISE blog posts and 16 funded RFP projects were reviewed; libvpx is not mentioned. No work duplication risk.
13.1 Functional Enablement
libvpx is functionally complete on riscv64 via the generic-gnu scalar C path. No functional enablement work is required. Encoding and decoding VP8 and VP9 work today.
13.2 Performance Optimization
This is the primary gap. All DSP kernels run as scalar C. An RVV acceleration effort would need to cover:
- CPU feature detection:
vpx_ports/riscv.h,riscv_cpudetect.cwithgetauxval(AT_HWCAP)to detect RVV/Zvl/Zve extensions - Build system: new
riscv64-linux-gcctarget inconfigure.shwith-march=rv64gcvflags - RTCD dispatch: add riscv entries to
vpx_dsp_rtcd_defs.pl - Core DSP kernels (highest ROI first): SAD, variance, convolve/MC, loop filter, DCT/IDCT for VP9
- Scope: initial pass targeting VP9 decode acceleration (more widely used than VP8)
A reasonable initial milestone is parity with the LoongArch port (approximately 28 optimized files covering the highest-impact kernels), not full ARM NEON parity (approximately 86 files).
13.3 CI/CD Infrastructure
libvpx has no public CI infrastructure of any kind. Adding riscv64 CI would require either:
- Upstream adoption: proposing a GitHub Actions matrix that the WebM Project team would need to accept; this is a governance discussion with Google, not just a patch
- Distribution-side: Debian buildd already provides passive build validation; this is sufficient for build correctness but not for test suite execution
Sponsoring a RISE runner for cross-compiled test execution via QEMU is a medium-effort CI investment that does not require Google approval.
13.4 Ecosystem Enablement
libvpx has no dependent package ecosystem requiring separate enablement. It is a C library distributed as source; downstream consumers (FFmpeg, GStreamer, Chromium, Firefox) build it as a dependency. Those consumers’ RISC-V status is tracked in their respective reports.
13.5 Summary Table
| Area | Work Item | Effort (person-weeks) | Owner | Priority |
|---|---|---|---|---|
| Performance | CPU feature detection (riscv.h, riscv_cpudetect.c, build system riscv64 target) | 2 | silicon vendor or distro maintainer | High |
| Performance | RTCD dispatch plumbing for riscv64/rvv | 1 | silicon vendor or distro maintainer | High |
| Performance | RVV SAD and variance kernels (VP9 encode critical path) | 4 | silicon vendor engineer with RVV hardware | High |
| Performance | RVV convolve / motion compensation kernels (VP9 decode critical path) | 6 | silicon vendor engineer with RVV hardware | High |
| Performance | RVV loop filter kernels | 4 | silicon vendor engineer with RVV hardware | Medium |
| Performance | RVV DCT/IDCT kernels | 4 | silicon vendor engineer with RVV hardware | Medium |
| CI/CD | QEMU-based riscv64 test execution in GitHub Actions (or RISE runner) | 2 | distro/RISE infrastructure team | Medium |
| Performance | VP8 RVV kernels (lower priority given VP8 usage decline) | 6 | silicon vendor engineer | Low |
Total estimated effort for high-priority items (CPU detection + RTCD plumbing + SAD/variance + convolve): approximately 13 person-weeks for a first RVV acceleration pass covering VP9 decode throughput. Full LoongArch-level parity across both codecs: approximately 29 person-weeks.
Note: VP9 is in maintenance mode relative to AV1. Before committing to this investment, evaluate whether the same effort applied to libaom (AV1) would deliver greater strategic return. libaom is the active development target for the WebM/AOM ecosystem.
14. Updates
No updates yet – initial report dated 2026-06-17.
15. References
- libvpx GitHub mirror (read-only)
- libvpx upstream canonical repository (Google Gerrit)
- WebM Project homepage
- libvpx configure script (ARCH_LIST)
- libvpx build/make/configure.sh (ISA detection)
- libvpx build/make/rtcd.pl (rvv in priority list)
- Debian tracker: libvpx
- Debian buildd status: libvpx riscv64
- Debian packages: libvpx-dev (sid, riscv64)
- Ubuntu 24.04 Noble: libvpx packages
- libyuv (row_rvv.cc, RVV intrinsics for YUV row processing)
- libyuv Debian sid riscv64 build
- libwebm Debian sid riscv64 build
- RISE Project blog (no libvpx posts found)
- RISE Project funded projects (RFPs, no libvpx)
- WebM Project AUTHORS file
- WebM Project hardware supporters