Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Build once, deploy anywhere. No hunting for system FFmpeg. No version mismatches

## Features ✨

- **FFmpeg 8.1.1** - Latest release with AV1, H.265, H.264, VP8/9
- **FFmpeg 8.1.2** - Latest release with AV1, H.265, H.264, VP8/9
- **Truly static** - Builds into your binary (just needs system `m` and `stdc++` libraries)
- **Cross-platform** - Linux and macOS (arm64, amd64)
- **Hardware acceleration** - NVENC/NVDEC, QuickSync, VA-API, VideoToolbox, and Vulkan support
Expand Down Expand Up @@ -62,23 +62,23 @@ ffmpeg-statigo ships a curated FFmpeg static library focused on the core strengt

| Library | Version | Description |
|------------------|-------------|-------------------------------------------------------------------------------------|
| FFmpeg | 8.1.1 | A complete, cross-platform solution to record, convert, and stream audio and video |
| FFmpeg | 8.1.2 | A complete, cross-platform solution to record, convert, and stream audio and video |
| dav1d | 1.5.3 | AV1 cross-platform decoder, open-source, and focused on speed, size, and correctness|
| glslang | 16.3.0 | Khronos-reference front end for GLSL/ESSL and a SPIR-V generator |
| libdrm | 2.4.134 | Direct Rendering Manager library and headers (*Linux only*) |
| libiconv | 1.19 | A character set conversion library (*macOS only*) |
| libsrt | 1.5.5 | A transport protocol for ultra low latency live video and audio streaming |
| libva | 2.23.0 | An implementation for VA-API (Video Acceleration API) (*Linux only*) |
| libvpl | 2.16.0 | Intel Video Processing Library (Intel VPL) API (*Linux only*) |
| libva | 2.24.0 | An implementation for VA-API (Video Acceleration API) (*Linux only*) |
| libvpl | 2.17.0 | Intel Video Processing Library (Intel VPL) API (*Linux only*) |
| libvpx | 1.16.0 | High-quality, open video format for the web that's freely available to everyone |
| libwebp | 1.6.0 | A modern image format providing superior lossless and lossy compression |
| libxml2 | 2.15.2 | An XML parser and toolkit implemented in C |
| libxml2 | 2.15.3 | An XML parser and toolkit implemented in C |
| mp3lame | 3.100 | A high quality MPEG Audio Layer III (MP3) encoder |
| nv-codec-headers | 13.0.19.0 | Headers required to interface with Nvidias codec APIs (*Linux only*) |
| openssl | 3.6.2 | Open Source Toolkit for the TLS, DTLS, and QUIC protocols. |
| openssl | 3.6.3 | Open Source Toolkit for the TLS, DTLS, and QUIC protocols. |
| opus | 1.6.1 | A totally open, royalty-free, highly versatile audio codec |
| rav1e | 0.8.1 | The fastest and safest AV1 encoder. |
| Vulkan-Headers | 1.4.352 | Vulkan header files and API registry |
| Vulkan-Headers | 1.4.356 | Vulkan header files and API registry |
| x264 | head | H.264/MPEG-4 AVC compression format library for encoding video streams |
| x265 | 4.2 | H.265/MPEG-H HEVC compression format library for encoding video streams |
| zimg | 3.0.6 | Scaling, colorspace conversion, and dithering library |
Expand Down
2 changes: 1 addition & 1 deletion doc.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Package ffmpeg provides Go bindings to FFmpeg 8.1.1 libraries.
// Package ffmpeg provides Go bindings to FFmpeg 8.1.2 libraries.
//
// This package includes static FFmpeg libraries with hardware acceleration
// support (NVENC, VideoToolbox, Vulkan, QuickSync) and contemporary codecs
Expand Down
6 changes: 3 additions & 3 deletions docs/API-COVERAGE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# API coverage

As of FFmpeg 8.1.1 (measured 2026-06-08), ffmpeg-statigo binds **~90%** of the
As of FFmpeg 8.1.2 (measured 2026-07-05), ffmpeg-statigo binds **~90%** of the
public C functions in the parsed FFmpeg headers.

## Metric definition
Expand All @@ -23,7 +23,7 @@ coverage = bound functions / parsed public functions
A function the generator skips but a topic file re-binds counts as covered, not
missing.

## Counts (FFmpeg 8.1.1)
## Counts (FFmpeg 8.1.2)

| Quantity | Value | Source |
| --- | --- | --- |
Expand Down Expand Up @@ -53,7 +53,7 @@ The figure covers the **parsed public API only**. Headers excluded by design in
VideoToolbox, QSV, VA-API, CUDA, Vulkan, OpenCL, AMF, MediaCodec/JNI,
OpenHarmony) that need vendor SDKs or risk link failures on the static Linux
and macOS builds.
- `smpte_436m.h` (symbols absent from the FFmpeg 8.1.1 static lib).
- `smpte_436m.h` (symbols absent from the FFmpeg 8.1.2 static lib).
- Non-API or union-only headers (`attributes.h`, `intreadwrite.h`,
`refstruct.h`).

Expand Down
6 changes: 3 additions & 3 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -287,10 +287,10 @@ The root package has three source tiers. The generator skips C symbols it cannot

Two distinct version schemes:

- **Library releases** (`lib-8.1.1.x`): Static library builds, distributed via GitHub Releases
- **Module releases** (`v8.1.1.x`): Go module versions
- **Library releases** (`lib-8.1.2.x`): Static library builds, distributed via GitHub Releases
- **Module releases** (`v8.1.2.x`): Go module versions

The download tool automatically fetches the latest `lib-8.1.1.x` release matching the FFmpeg version in `lib/fetch.go`.
The download tool automatically fetches the latest `lib-8.1.2.x` release matching the FFmpeg version in `lib/fetch.go`.

## Troubleshooting

Expand Down
4 changes: 2 additions & 2 deletions ffmpeg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import (
)

func TestVersions(t *testing.T) {
// FFmpeg 8.1.x: libavcodec version 62.28.101 (0x3E1C65 = 4070501)
assert.Equal(t, 4070501, int(ffmpeg.AVCodecVersion()), "AVCodec version should match expected")
// FFmpeg 8.1.x: libavcodec version 62.28.102 (0x3E1C66 = 4070502)
assert.Equal(t, 4070502, int(ffmpeg.AVCodecVersion()), "AVCodec version should match expected")
assert.Equal(t, ffmpeg.LIBAVCodecVersionInt, int(ffmpeg.AVCodecVersion()), "AVCodec version func and const should match")
}

Expand Down
2 changes: 1 addition & 1 deletion include/libavcodec/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include "version_major.h"

#define LIBAVCODEC_VERSION_MINOR 28
#define LIBAVCODEC_VERSION_MICRO 101
#define LIBAVCODEC_VERSION_MICRO 102

#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libavdevice/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include "version_major.h"

#define LIBAVDEVICE_VERSION_MINOR 3
#define LIBAVDEVICE_VERSION_MICRO 101
#define LIBAVDEVICE_VERSION_MICRO 102

#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libavfilter/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#include "version_major.h"

#define LIBAVFILTER_VERSION_MINOR 14
#define LIBAVFILTER_VERSION_MICRO 101
#define LIBAVFILTER_VERSION_MICRO 102


#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libavformat/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#include "version_major.h"

#define LIBAVFORMAT_VERSION_MINOR 12
#define LIBAVFORMAT_VERSION_MICRO 101
#define LIBAVFORMAT_VERSION_MICRO 102

#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libavutil/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@

#define LIBAVUTIL_VERSION_MAJOR 60
#define LIBAVUTIL_VERSION_MINOR 26
#define LIBAVUTIL_VERSION_MICRO 101
#define LIBAVUTIL_VERSION_MICRO 102

#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libswresample/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include "version_major.h"

#define LIBSWRESAMPLE_VERSION_MINOR 3
#define LIBSWRESAMPLE_VERSION_MICRO 101
#define LIBSWRESAMPLE_VERSION_MICRO 102

#define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \
LIBSWRESAMPLE_VERSION_MINOR, \
Expand Down
2 changes: 1 addition & 1 deletion include/libswscale/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#include "version_major.h"

#define LIBSWSCALE_VERSION_MINOR 5
#define LIBSWSCALE_VERSION_MICRO 101
#define LIBSWSCALE_VERSION_MICRO 102

#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
LIBSWSCALE_VERSION_MINOR, \
Expand Down
12 changes: 6 additions & 6 deletions internal/builder/digests.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,19 @@ var archiveDigests = map[string]string{
"https://bitbucket.org/multicoreware/x265_git/get/4.2.tar.bz2": "04978f795943e49fcea76eb5ede9c1bd0fe9b6c073518897be6fc43b44f60850",
"https://code.videolan.org/videolan/dav1d/-/archive/1.5.3/dav1d-1.5.3.tar.bz2": "e099f53253f6c247580c554d53a13f1040638f2066edc3c740e4c2f15174ce22",
"https://code.videolan.org/videolan/x264/-/archive/0480cb05fa188d37ae87e8f4fd8f1aea3711f7ee/x264-0480cb05fa188d37ae87e8f4fd8f1aea3711f7ee.tar.bz2": "f05c59f2e83d494c36307025dca2d3afc6b4d185f3a3453d06cc4fecd7094057",
"https://download.gnome.org/sources/libxml2/2.15/libxml2-2.15.2.tar.xz": "c8b9bc81f8b590c33af8cc6c336dbff2f53409973588a351c95f1c621b13d09d",
"https://download.gnome.org/sources/libxml2/2.15/libxml2-2.15.3.tar.xz": "78262a6e7ac170d6528ebfe2efccdf220191a5af6a6cd61ea4a9a9a5042c7a07",
"https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz": "ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e",
"https://downloads.xiph.org/releases/opus/opus-1.6.1.tar.gz": "6ffcb593207be92584df15b32466ed64bbec99109f007c82205f0194572411a1",
"https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.19.tar.gz": "88dd96a8c0464eca144fc791ae60cd31cd8ee78321e67397e25fc095c4a19aa6",
"https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n8.1.1.tar.gz": "918929faccab2700c9cc7be2531c0b74f054a4dd5d3862bc485b0ab17af76486",
"https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n8.1.2.tar.gz": "9fd092511605bbebafe095ea6d38d9e40f34d12f7386e1258372df8be0576eb7",
"https://github.com/FFmpeg/nv-codec-headers/releases/download/n13.0.19.0/nv-codec-headers-13.0.19.0.tar.gz": "13da39edb3a40ed9713ae390ca89faa2f1202c9dda869ef306a8d4383e242bee",
"https://github.com/Haivision/srt/archive/refs/tags/v1.5.5.tar.gz": "c3518bc43a71b5289032395b2db4c3e09e73d78b54247d56c14553a503b491cf",
"https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.352.tar.gz": "4850909d22a8a9767c27daea2b972e49d7c298560573d5b6221ee50db9bf49db",
"https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.356.tar.gz": "f0aac83f32b2895a15fb0686defc16755810e2705a3fd917cb9535ca79c71d4f",
"https://github.com/KhronosGroup/glslang/archive/refs/tags/16.3.0.tar.gz": "efff5a15258dce1ca2d323bf64c974f5fca03778174615dbc30c8d36db645bf5",
"https://github.com/intel/libva/releases/download/2.23.0/libva-2.23.0.tar.bz2": "9ac190a87017bfd49743248f5df7cf3b18a99a9962175caf6bbe3f1ea41b6dbb",
"https://github.com/intel/libvpl/archive/refs/tags/v2.16.0.tar.gz": "d60931937426130ddad9f1975c010543f0da99e67edb1c6070656b7947f633b6",
"https://github.com/intel/libva/releases/download/2.24.0/libva-2.24.0.tar.bz2": "56fab4e482dca2c9e8280d5057294b9faa789d637f97cc394a0c6ec08159060c",
"https://github.com/intel/libvpl/archive/refs/tags/v2.17.0.tar.gz": "4de3e2faf1e8307fb282e4a43f443191810f6a6b0a484fffa7995ba1c814c6ec",
"https://github.com/madler/zlib/releases/download/v1.3.2/zlib-1.3.2.tar.gz": "bb329a0a2cd0274d05519d61c667c062e06990d72e125ee2dfa8de64f0119d16",
"https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz": "aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f",
"https://github.com/openssl/openssl/releases/download/openssl-3.6.3/openssl-3.6.3.tar.gz": "243a86649cf6f23eeb6a2ff2456e09e5d77dd9018a54d3d96b0c6bdd6ba6c7f1",
"https://github.com/sekrit-twc/zimg/archive/refs/tags/release-3.0.6.tar.gz": "be89390f13a5c9b2388ce0f44a5e89364a20c1c57ce46d382b1fcc3967057577",
"https://github.com/webmproject/libvpx/archive/refs/tags/v1.16.0.tar.gz": "7a479a3c66b9f5d5542a4c6a1b7d3768a983b1e5c14c60a9396edc9b649e015c",
"https://github.com/xiph/rav1e/archive/refs/tags/v0.8.1.tar.gz": "06d1523955fb6ed9cf9992eace772121067cca7e8926988a1ee16492febbe01e",
Expand Down
12 changes: 6 additions & 6 deletions internal/builder/libraries.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ var libiconv = &Library{
// libxml2 - XML parsing library
var libxml2 = &Library{
Name: "libxml2",
URL: "https://download.gnome.org/sources/libxml2/2.15/libxml2-2.15.2.tar.xz",
URL: "https://download.gnome.org/sources/libxml2/2.15/libxml2-2.15.3.tar.xz",
FFmpegEnables: []string{"libxml2"},
BuildSystem: &AutoconfBuild{},
ConfigureArgs: func(os string) []string {
Expand Down Expand Up @@ -243,7 +243,7 @@ var nvcodecheaders = &Library{
// vulkanheaders - Vulkan API headers (cross-platform)
var vulkanheaders = &Library{
Name: "Vulkan-Headers",
URL: "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.352.tar.gz",
URL: "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.356.tar.gz",
FFmpegEnables: []string{"vulkan"},
BuildSystem: &CMakeBuild{},
ConfigureArgs: func(os string) []string {
Expand Down Expand Up @@ -333,7 +333,7 @@ var libdrm = &Library{
// libva - Video Acceleration API (Linux only, provides VA-API backend for QSV)
var libva = &Library{
Name: "libva",
URL: "https://github.com/intel/libva/releases/download/2.23.0/libva-2.23.0.tar.bz2",
URL: "https://github.com/intel/libva/releases/download/2.24.0/libva-2.24.0.tar.bz2",
Platform: []string{"linux"},
Dependencies: []*Library{libdrm},
FFmpegEnables: []string{"vaapi"},
Expand Down Expand Up @@ -373,7 +373,7 @@ var libva = &Library{
// libvpl - Intel VPL/oneVPL headers (Linux only, for QuickSync)
var libvpl = &Library{
Name: "libvpl",
URL: "https://github.com/intel/libvpl/archive/refs/tags/v2.16.0.tar.gz",
URL: "https://github.com/intel/libvpl/archive/refs/tags/v2.17.0.tar.gz",
Platform: []string{"linux"},
FFmpegEnables: []string{"libvpl"},
BuildSystem: &CMakeBuild{},
Expand Down Expand Up @@ -686,7 +686,7 @@ var vvenc = &Library{
// - BIO, EVP APIs
var openssl = &Library{
Name: "openssl",
URL: "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz",
URL: "https://github.com/openssl/openssl/releases/download/openssl-3.6.3/openssl-3.6.3.tar.gz",
FFmpegEnables: []string{"openssl"},
BuildSystem: &OpenSSLBuild{},
ConfigureArgs: func(os string) []string {
Expand Down Expand Up @@ -774,7 +774,7 @@ var libsrt = &Library{
// ffmpeg - FFmpeg multimedia framework
var ffmpeg = &Library{
Name: "ffmpeg",
URL: "https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n8.1.1.tar.gz",
URL: "https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n8.1.2.tar.gz",
BuildSystem: &AutoconfBuild{},
SkipAutoFlags: true, // FFmpeg uses --extra-cflags and --extra-ldflags instead
PostExtract: func(_ context.Context, srcPath string) error {
Expand Down
2 changes: 1 addition & 1 deletion internal/generator/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ var files = []string{
////"libavcodec/mediacodec.h", // Android-only symbols, link risk
"libavcodec/packet.h",
////"libavcodec/qsv.h", // needs <mfxvideo.h> (Intel Media SDK)
////"libavcodec/smpte_436m.h", // header vendored but symbols absent from FFmpeg 8.1.1 static lib (link error); needs a build that ships the SMPTE 436M/291M code
////"libavcodec/smpte_436m.h", // header vendored but symbols absent from FFmpeg 8.1.2 static lib (link error); needs a build that ships the SMPTE 436M/291M code
////"libavcodec/vdpau.h", // needs <vdpau/vdpau.h>
"libavcodec/version.h",
"libavcodec/version_major.h",
Expand Down
4 changes: 2 additions & 2 deletions lib/fetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import (
)

// Version is the FFmpeg library version (major.minor.patch)
// The downloader will find the latest internal release (e.g., lib-8.1.1.0)
const Version = "8.1.1"
// The downloader will find the latest internal release (e.g., lib-8.1.2.0)
const Version = "8.1.2"

// DownloadLibs downloads the FFmpeg static libraries for the current platform
func DownloadLibs() error {
Expand Down
12 changes: 6 additions & 6 deletions lib/fetch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestFindCompatibleRelease_VersionParsing(t *testing.T) {
t.Run("valid_version_format", func(t *testing.T) {
// Valid versions should produce a release string (even if API fails, fallback works)
validVersions := []string{
"8.1.1",
"8.1.2",
"1.2.3",
"10.20.30",
}
Expand Down Expand Up @@ -67,8 +67,8 @@ func TestFindCompatibleRelease_VersionParsing(t *testing.T) {

t.Run("release_prefix_construction", func(t *testing.T) {
// Verify that release prefix is constructed correctly
moduleVersion := "8.1.1"
expectedPrefix := "lib-8.1.1"
moduleVersion := "8.1.2"
expectedPrefix := "lib-8.1.2"
actualPrefix := "lib-" + moduleVersion

if actualPrefix != expectedPrefix {
Expand Down Expand Up @@ -888,8 +888,8 @@ func TestStreamDownloadAndExtract_ErrorHandling(t *testing.T) {
func TestFindCompatibleRelease_APIFailureRecovery(t *testing.T) {
t.Run("fallback_when_api_unavailable", func(t *testing.T) {
// Test the fallback pattern construction
moduleVersion := "8.1.1"
expectedFallback := "lib-8.1.1.0"
moduleVersion := "8.1.2"
expectedFallback := "lib-8.1.2.0"

// Simulate what happens when API fails: fallback to predictable pattern
fallbackRelease := "lib-" + moduleVersion + ".0"
Expand All @@ -907,7 +907,7 @@ func TestFindCompatibleRelease_APIFailureRecovery(t *testing.T) {
expected string
}{
{"8.0.0", "lib-8.0.0.0"},
{"8.1.1", "lib-8.1.1.0"},
{"8.1.2", "lib-8.1.2.0"},
{"9.1.0", "lib-9.1.0.0"},
{"10.0.0", "lib-10.0.0.0"},
}
Expand Down
Loading