Skip to content

Commit 0dd636b

Browse files
adeebshihadehclaude
andcommitted
add VAAPI with static libva/libdrm (no runtime deps)
Build libdrm and libva as static libraries so VAAPI support is compiled into ffmpeg without adding any shared library dependencies. At runtime, VA-API gracefully probes for GPU drivers via dlopen — works when a driver is present, silently skipped otherwise. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9cb5f66 commit 0dd636b

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

ffmpeg/build.sh

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ PLATFORM="$(uname -s)"
88
FFMPEG_VERSION="7.1"
99
ZLIB_VERSION="da607da739fa6047df13e66a2af6b8bec7c2a498" # v1.3.2
1010
X264_BRANCH="stable"
11+
LIBDRM_VERSION="libdrm-2.4.124"
12+
LIBVA_VERSION="2.22.0"
1113
INSTALL_DIR="$DIR/ffmpeg/install"
1214

1315
NJOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)"
@@ -68,6 +70,40 @@ if [ "$PLATFORM" = "Linux" ]; then
6870
cmake --install vulkan-headers-src/build >/dev/null
6971
fi
7072

73+
# --- Build libdrm + libva statically (Linux only, for VAAPI without runtime deps) ---
74+
if [ "$PLATFORM" = "Linux" ]; then
75+
if ! command -v meson &>/dev/null; then
76+
pip3 install --quiet meson ninja 2>/dev/null || python3 -m pip install --quiet meson ninja 2>/dev/null || true
77+
command -v meson &>/dev/null || { echo "error: meson is required (apt install meson or pip install meson)" >&2; exit 1; }
78+
fi
79+
80+
if [ ! -d "libdrm-src/.git" ]; then
81+
rm -rf libdrm-src
82+
git clone --depth 1 --branch "$LIBDRM_VERSION" https://gitlab.freedesktop.org/mesa/drm.git libdrm-src
83+
fi
84+
rm -rf libdrm-src/builddir
85+
meson setup libdrm-src/builddir libdrm-src \
86+
--prefix="$PREFIX" --libdir=lib --default-library=static \
87+
-Dintel=disabled -Dradeon=disabled -Damdgpu=disabled -Dnouveau=disabled \
88+
-Dvmwgfx=disabled -Dtests=false -Dman-pages=disabled -Dcairo-tests=disabled \
89+
-Dvalgrind=disabled
90+
ninja -C libdrm-src/builddir install
91+
92+
if [ ! -d "libva-src/.git" ]; then
93+
rm -rf libva-src
94+
git clone --depth 1 --branch "$LIBVA_VERSION" https://github.com/intel/libva.git libva-src
95+
fi
96+
rm -rf libva-src/builddir
97+
# libva hardcodes shared_library(); patch to library() so --default-library=static works
98+
sed -i 's/shared_library(/library(/g' libva-src/va/meson.build
99+
PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \
100+
meson setup libva-src/builddir libva-src \
101+
--prefix="$PREFIX" --libdir=lib --default-library=static \
102+
-Ddisable_drm=false -Dwith_x11=no -Dwith_glx=no -Dwith_wayland=no \
103+
-Dwith_win32=no -Denable_docs=false
104+
ninja -C libva-src/builddir install
105+
fi
106+
71107
# --- Build FFmpeg ---
72108
if [ ! -d "ffmpeg-src/.git" ]; then
73109
rm -rf ffmpeg-src
@@ -82,11 +118,18 @@ cd ffmpeg-src
82118
HW_FLAGS=()
83119
if [ "$PLATFORM" = "Linux" ]; then
84120
HW_FLAGS+=(
121+
# use --static with pkg-config so static libva/libdrm resolve transitive deps
122+
--pkg-config="pkg-config --static"
123+
85124
# NVIDIA CUDA/NVDEC (uses dlopen at runtime)
86125
--enable-ffnvcodec --enable-cuda --enable-cuvid --enable-nvdec
87126
--enable-hwaccel=h264_nvdec,hevc_nvdec
88127
--enable-decoder=h264_cuvid,hevc_cuvid
89128

129+
# VAAPI (Intel/AMD — libva linked statically, driver loaded via dlopen at runtime)
130+
--enable-vaapi
131+
--enable-hwaccel=h264_vaapi,hevc_vaapi
132+
90133
# V4L2 Memory-to-Memory (embedded: RPi, Qualcomm, Rockchip)
91134
--enable-v4l2-m2m
92135
--enable-decoder=h264_v4l2m2m,hevc_v4l2m2m
@@ -144,7 +187,11 @@ cp "$PREFIX/bin/ffmpeg" "$INSTALL_DIR/bin/"
144187
cp "$PREFIX/bin/ffprobe" "$INSTALL_DIR/bin/"
145188

146189
# Libraries
147-
for lib in libavformat.a libavcodec.a libavutil.a libswresample.a libx264.a libz.a; do
190+
LIBS="libavformat.a libavcodec.a libavutil.a libswresample.a libx264.a libz.a"
191+
if [ "$PLATFORM" = "Linux" ]; then
192+
LIBS="$LIBS libva.a libva-drm.a libdrm.a"
193+
fi
194+
for lib in $LIBS; do
148195
cp "$PREFIX/lib/$lib" "$INSTALL_DIR/lib/"
149196
done
150197

0 commit comments

Comments
 (0)