Cross-Compiling libvpx for ARM
This article provides a practical overview of how the
libvpx video codec library supports cross-compilation for
ARM architectures. It covers the configuration process, the role of
target triplets, toolchain integration, and the enabling of
hardware-specific optimizations like ARM NEON.
The Custom Configure Script and Target Triplets
Unlike many open-source projects that rely on standard Autotools,
libvpx uses a custom shell-based configure script. This
script simplifies cross-compilation by utilizing pre-defined target
triplets specified via the --target option.
These target templates are structured as
[architecture]-[operating system]-[compiler]. For ARM
architectures, common target values include: *
armv7-linux-gcc (for 32-bit ARMv7 Linux platforms) *
arm64-linux-gcc / aarch64-linux-gcc (for
64-bit ARMv8/AArch64 Linux platforms) * armv7-android-gcc
(for Android ARMv7 development) * arm64-android-gcc (for
Android 64-bit development)
By passing one of these targets, the configuration script automatically adjusts compiler flags, assembly optimizations, and architecture-specific definitions.
Specifying the Toolchain
To cross-compile, libvpx needs to know where the
cross-compiler resides on the host system. This is done by specifying
the path to the compiler toolchain prefix using the CROSS
environment variable or the --sdk-path option for mobile
platforms.
For a standard Linux host cross-compiling to a 64-bit ARM target, the build command looks like this:
CROSS=aarch64-linux-gnu- ./configure --target=arm64-linux-gcc
makeThe CROSS variable prefix is prepended to standard build
tools, transforming gcc, ar, and
as into aarch64-linux-gnu-gcc,
aarch64-linux-gnu-ar, and
aarch64-linux-gnu-as.
ARM NEON and SIMD Vectorization
libvpx contains highly optimized assembly and intrinsic
code specifically written to leverage ARM NEON technology, which
significantly accelerates VP8 and VP9 encoding and decoding.
The configuration script automatically handles NEON detection: *
ARMv8 / AArch64: NEON is mandatory in the ARMv8-A
architecture, so the libvpx configuration enables NEON
instructions by default. * ARMv7: NEON is optional in
ARMv7-A. The build system can be instructed to compile with NEON support
using flags like --enable-neon or assembly optimization
flags like --enable-neon-asm. If targeting a system without
NEON, --disable-neon can be passed to ensure compatibility
with older ARM devices.
Handling Assembly Compilers
Many of the low-level optimizations in libvpx rely on
runtime CPU detection and hand-coded assembly. For 32-bit ARM, the build
system uses the GNU Assembler (gas). For 64-bit ARM
(AArch64), inline assembly and intrinsics are typically processed
directly by the cross-compiler (gcc or clang).
No external assembler like yasm or nasm (which
are x86-specific) is required for ARM cross-compilation, reducing
external dependency bottlenecks during the build process.