Highlights
- FFmpeg 9.0 (was 8.1).
- Subtitle rendering:
libassis now built and enabled, together withfribidi
(bidirectional text),harfbuzz(text shaping),libunibreak(Unicode line breaking for
CJK/Thai) andfontconfig(font lookup by name). SRT/ASS subtitles can be burned into video
via thesubtitlesandassfilters, anddrawtextnow acceptsfont=Helveticainstead of
requiring an explicitfontfile=path. - AviSynth+ support (
--enable-avisynth, GPL/non-free builds only). Only the headers are
built; the AviSynth+ library is loaded at runtime and has to be installed separately. - libxml2 is built and enabled, which the DASH and IMF demuxers require.
- lcms2 is now actually enabled, giving ICC profile support in the image decoders and the
iccdetect/iccgenfilters. - CUDA 13.3.1 for the CUDA docker image (was 12.6.2/12.9.0).
- The README now documents what every optional library actually enables.
Fixes
- ffplay was silently not being built. ffmpeg 9.0 requires SDL2 (
sdl2 >= 2.0.1, < 3.0.0),
so the SDL3 build produced no usablesdl2.pcand configure quietly dropped ffplay. The build
still reported success and the docker images then failed copying a binary that never existed.
The script is back on SDL2. --enable-vaapiwas never passed.library_exists()tested pkg-config's (empty) output
instead of its exit code and always reported the library as missing.- A failed
cdafter extraction only exited a subshell, so the script kept building in the
previous package's directory. - Unknown
--optionswere silently ignored. The argument parser now has one explicit case
per option and errors out on anything else; cleanup is deferred until the whole command line
has been parsed. .gitis restored from.git.bakvia anEXITtrap, so a failed build no longer leaves
the repository renamed.- Binaries are portable again: removed
-march=native(zix) and-C target-cpu=native
(rav1e). - The install step checks each copy, only handles ffplay and manpages when they were actually
built, and no longer prints a misleading "already built" message for ffmpeg itself. --enable-libzmqwas only added inside the libzmq build block, so it was dropped on rebuilds.- Fixed the giflib 6.x install, the fontconfig tools linking against static brotli, GNU mirror
downloads, and the OpenCL ICD loader building its test suite unnecessarily. gperfis now built, since fontconfig needs it on Linux.- Fontconfig configuration and DejaVu fonts are shipped in the docker images
(FONTCONFIG_PATH=/etc/fonts); without this,drawtextcannot resolve fonts by name and
libass falls back to a default font. - The
full-staticCI job pulled a CUDA base image it never used — it buildsFROM ubuntu:24.04.
Build script / CI
- Every dependency now builds in its own
build_<package>()function, dispatched from the
orderedPACKAGE_BUILD_ORDERarray. Behavior is unchanged — verified against stubbed execution
transcripts in 17 configurations and a full docker build producing an identical ffmpeg
configure line. - Shell formatting is pinned with
.editorconfigand enforced in CI by a new lint job running
shfmtandshellcheck --severity=error. The reformatting commits are listed in
.git-blame-ignore-revs. actions/checkoutupdated to v5 (v4 runs on the deprecated Node.js 20 runtime).- The
cuda-samplescheckout is pinned to a tag matching the CUDA version instead of tracking
master, whose directory layout changed in v13.0.
Dependency updates
FreeType2 2.14.3, VapourSynth R78, amf 1.5.2, autoconf 2.73, av1 3.14.1, cmake 4.4.2,
dav1d 1.5.4, giflib 6.1.3, gnutls 3.8.13, lame 4.0, lcms2 2.19.1, libjxl 0.12.0, libpng 1.6.58,
libsdl 2.32.10, libtiff 4.7.2, libtool 2.6.2, lilv 0.28.0, m4 1.4.21, nasm 3.02, nettle 4.0,
nv-codec 13.1.15.0, opencl-headers/icd-loader 2026.05.29, openssl 4.0.1, serd 0.32.10,
srt 1.5.6, svtav1 4.2.0, vid.stab 1.1.2, vulkan-headers 1.4.358, x265 b81f650, zix 0.8.2,
plus new: avisynth 3.7.5, fontconfig 2.18.3, fribidi 1.0.16, gperf 3.3, harfbuzz 14.3.0,
libass 0.17.5, libunibreak 7.0, libxml2 2.15.3.
glslang is no longer built: ffmpeg 9.0 dropped --enable-libglslang.
Full changelog: v1.59...v1.60