Skip to content

Bump the older tracks to FFmpegKit 7.1.7 and 6.0.4 - #24

Merged
sbokatuk merged 3 commits into
mainfrom
bump-ffmpegkit-older-tracks
Oct 30, 2026
Merged

sbokatuk merged 3 commits into
mainfrom
bump-ffmpegkit-older-tracks

Conversation

@sbokatuk

@sbokatuk sbokatuk commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Bumps the two older tracks to their newest upstream releases. Both are respins of an FFmpeg these tracks already ship (read from libavcodec.so in all 8 variants on both ABIs), so the packages move to their next binding revision.

Track FFmpeg FFmpegKit Package
7.* n7.1.5 7.1.6 → 7.1.7 7.1.5.4 → 7.1.5.5
6.* n6.1.6 6.0.3 → 6.0.4 6.1.6.4 → 6.1.6.5

Merging this publishes both packages to nuget.org. It needs the maintainer's go-ahead.

Before you merge

  1. CI doesn't test these tracks. pr.yml passes no native-version, so G6 packs and tests 8.x only, and release.yml runs with verify: false. The local gate below is the only verification of 7.1.7 and 6.0.4.
  2. x86_64 was not run on any device. Local emulators and the Pixel are arm64, and CI's x86_64 emulator only sees 8.x. Per ELF analysis, the x86_64 builds of 7.1.6/6.0.3 have the defect in Audio too, and 7.1.7/6.0.4 are clean.
  3. This PR's CI publishes 8.x -beta builds to nuget.org, as every PR does. It doesn't publish 7.x or 6.x betas.
  4. Two releases from one merge haven't happened here before. From reading the workflows it should work: auto-release.yml loops over added notes, and each tag gets its own release-<tag> concurrency group. The three July tags were pushed, not dispatched.

Why this release matters

Both failures below were run against the published packages from nuget.org, in the repo's device test app.

Published package Android 12 (API 31) emulator API 35 emulator Pixel 10, Android 17
Min, MinGpl, Https, HttpsGpl Every FFmpeg command fails Not run in an app Not run in an app
Video Every FFmpeg command fails Loads, then freezes Loads, then freezes
Full Loads, then freezes Not run Not run
  • Load failure: UnsatisfiedLinkError: dlopen failed: can't enable GNU RELRO protection for ".../libswresample.so": Out of memory. All 5 variants on both lines fail this way, and only the first device check passes, because it doesn't run FFmpeg. PT_GNU_RELRO ends past the last PT_LOAD in those builds. It is specific to the Android version; only API 31, 35 and 37 were tried. The linker test also ran all 8 variants of all 4 versions on API 31: the same 5 variants fail, as the ELF analysis predicted, and all 160 libraries of 7.1.7 and 6.0.4 pass.
  • Freeze: the GC device check never finishes, with no verdict after 5 minutes. This is the SIGXCPU hazard fixed in Bump FFmpegKit to 8.1.9 (FFmpeg n8.1.3) and fix the SIGXCPU freeze #23, now seen on these lines for the first time. The fix reaches them through main.

What changed

  • build/native-versions.tsv: rows replaced, as the maintainer approved ("Yes, replace rows"), because both columns must be unique and the lookup stops at the first match. The old pairs are recorded in the header comment.
  • FFmpegKit 7.1.6 and 6.0.3 can no longer be built from main. Their tags still resolve through the file as it stood at the tag, the packages stay on nuget.org, and their checksum baselines stay in the repo.
  • "Append-only" reworded in native-versions.instructions.md and NativeVersionMapTests.cs: one row per FFmpeg version, a respin replaces its row, never drop a track.
  • New baselines build/checksums/7.1.7.sha256 and 6.0.4.sha256. All 16 .aar digests match both Maven's sidecars and an independent download, and the smart-exception digests match the 8.1.9 baseline.
  • Examples and the README tables moved to the new pairs. .pom wording corrected: 7.1.7 and 6.0.4 also declare smart-exception.
  • Directory.Build.props stays on the 8.x default.
  • release.yml: notify-parents now runs only for the default track. build/notify-parents.sh keeps one open issue per package and matches any v tag, so without this 7.1.5.5 and 6.1.6.5 would comment on FFMpegKit.Net#10 (about 8.1.3.1) and retitle it to the older version, telling the umbrella to move down a major. The version job compares the tag's FFmpeg with FFmpegVersion in the tag's own Directory.Build.props, so it follows the default by itself. The check is in release.yml because notify-parents.* are kept byte-identical across 17 repositories, and those are unchanged.
    • Checked locally: the real resolve step gives false for v7.1.5.5, v6.1.6.5 and v8.1.2.6, and true for v8.1.3.x. The real script with a stub gh confirmed the comment and retitle.
    • Not covered: release.yml doesn't run on a PR, so this first runs on GitHub at the release. A hand-run workflow_dispatch of notify-parents.yml bypasses the check.
  • Left alone: the comment at release.yml:179 still says 6.0.3.2. It was already stale, and it's release automation.

API changes

  • From the native update: none. classes.jar is byte-identical in all 16 old/new pairs, so the Java API diff is empty and Metadata.xml is unchanged. JNI exports stay at 14.
  • New to these tracks since 7.1.5.4/6.1.6.4, from 8.1.2.5: FFmpegKitConfig.DisableLogCallback(), DisableStatisticsCallback(), nullable annotations on the hand-written additions, and the FFMPEGKIT001/FFMPEGKIT002 build warnings. All are in the notes.

Test report — 7.1.5.5-local.20261030145239 and 6.1.6.5-local.20261030153509

Toolchain: .NET 8.0.427 / 9.0.320 / 10.0.403, Android workloads 34 / 35 / 36. net8 used the 8.0.33 mono packs through DOTNETSDK_WORKLOAD_PACK_ROOTS (protocol §0), each verified against nuget.org's catalog hash.

Devices: ffmpegkit_e2e (arm64, API 35), noolite_tv (Android TV image, arm64, API 31, booted read-only) and a Pixel 10 (Android 17, API 37, 4 KB pages, Russian locale).

Results are the same for both lines. The preflight pack of unmodified main was clean.

Gate Target TFM Result Evidence
G1 pack all 8 variants net8, net9, net10 PASS 8 nupkgs per line; descriptions state the right FFmpeg and FFmpegKit
G2 package tests all 8 PASS 190/190 per line
G3 device API 35 emulator, 8 variants net10.0-android36.0 PASS 15/15 checks, FFMPEGKIT_E2E_DONE PASS
G3 device API 35 emulator, Full, Video net8.0-android34.0 PASS 15/15
G3 device Pixel 10, 8 variants net10.0-android36.0 PASS 15/15
G3 device Pixel 10, Full, Video net8.0-android34.0 PASS 15/15
Extra API 31 emulator, Min, MinGpl, Https, HttpsGpl, Video net10.0-android36.0 PASS 15/15; these are the 5 that fail in the published packages
G4 sample API 35 emulator net10, net9, net8 PASS Probe, 3 conversions, playback of each result
G4 sample Pixel 10 net10, net9, net8 PASS Same, under the Russian locale
Hand: version every device run above PASS ffmpeg=n7.1.5 / ffmpeg=n6.1.6 in all 25 runs per line
Hand: drawtext API 31 Video, Full, FullGpl; Pixel Video net10.0-android36.0 PASS Rendered text changes the output. Control: No such filter: 'drawtext' on published Full and Video
G5 umbrella N/A The umbrella pins 8.x
G6 PR CI Pending Covers 8.x only, see above
G7 consumer path N/A Packaging and targets unchanged since 8.1.2.5

There are no SKIPPED checks: nothing here needs credentials.

Not verified:

  • x86_64 on a device, and Android versions other than API 31, 35 and 37.
  • Percentage progress in the sample UI. The 3-second clip finishes in about a second, so screenshots catch "Starting…" and "Converting…" but no percentage. The device check reports progress while encoding passes in every run.
  • Upstream's CVE fixes, which the notes attribute to upstream.
  • Upstream's -filter_complex crash. A graph naming an unknown filter returned an error on the published packages too, so the old crash didn't reproduce. The notes say so.

The hand checks ran from a scratch copy of SmokeTests.cs, so no test code from them is in this PR. Nothing in the smoke tests covers drawtext or asserts the FFmpeg version.

🤖 Generated with Claude Code

sbokatuk and others added 2 commits October 30, 2026 16:32
Both are respins of an FFmpeg these tracks already ship: libavcodec.so
still reports n7.1.5 and n6.1.6, so packages stay on 7.1.5.x and 6.1.6.x.

A respin has to replace its row in native-versions.tsv. Both columns must
be unique and the lookup stops at the first match, so an appended row
would keep resolving the old .aar. That means 7.1.6 and 6.0.3 can no
longer be built from main, though their tags still resolve through the
file as it stood at the tag and their baselines stay for comparison.
The file was described as append-only, which a respin can't honour, so
the rule is now one row per FFmpeg version and never drop a track.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merging these tags and publishes both packages, so they say what a
consumer of 7.1.5.4 or 6.1.6.4 most needs to know: five variants of those
packages can't load FFmpeg on API 31, and every variant that loads freezes
at the next garbage collection. Both failures were run against the
published packages, so the notes describe what was seen rather than what
upstream reports. Upstream's claims stay attributed, and the one that
could not be confirmed here says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 30, 2026 13:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The older-version procedure omits explicit version arguments, causing verification to fail on missing 8.x artifacts and packaging to target 8.x instead of the selected track.

1 open issue
What changed in this PR

Updates the Android binding’s older tracks to FFmpegKit 6.0.4 and 7.1.7, preparing package releases 6.1.6.5 and 7.1.5.5 while leaving the 8.x default unchanged.

Changes:

  • Replaces the older native-version mappings and adds checksum baselines for both releases.
  • Adds release notes covering native fixes, inherited binding changes, and verification limits.
  • Updates documentation, examples, and comments to reflect the new mappings and respin policy.
File Description
tests/​FFmpegKit.Android.PackageTests/​NativeVersionMapTests.cs Updates the mapping-policy comment; assertions are unchanged.
src/​FFmpegKit.Android/​Jars/​FetchJars.sh Corrects the dependency declaration comment.
src/​FFmpegKit.Android/​FFmpegKit.Android.csproj Corrects the embedded-dependency comment.
src/​FFmpegKit.Android/​BuildNugets.sh Updates the older-track usage example.
README.md Refreshes version tables and build examples.
docs/​release-notes/​7.1.5.5.md Documents the 7.x release and verification results.
docs/​release-notes/​6.1.6.5.md Documents the 6.x release and verification results.
build/​update-checksums.sh Updates the checksum-generation example.
build/​native-versions.tsv Replaces older-track mappings and records prior pairs.
build/​checksums/​7.1.7.sha256 Adds checksums for eight AARs and two dependency jars.
build/​checksums/​6.0.4.sha256 Adds checksums for eight AARs and two dependency jars.
.github/​workflows/​build.yml Updates the native-version input description only.
.github/​instructions/​native-versions.instructions.md Clarifies respin mapping and older-track adoption.
.github/​copilot-instructions.md Refreshes mapping and release examples.

Review effort: Balanced

4. **Then** bump `FFmpegVersion` and `FFmpegKitNativeVersion` in `Directory.Build.props` (both, together — they are different schemes) and fetch: `./src/FFmpegKit.Android/Jars/FetchJars.sh <ffmpegkit version>`.
3. **Add the mapping row** to `build/native-versions.tsv`: `<ffmpeg>\t<ffmpegkit>`, tab-separated, keeping the existing comment header. There is one row per FFmpeg version, because the lookup stops at the first match and a test requires both columns to be unique. A new FFmpeg gets a new row. A respin of the same FFmpeg replaces that row: note the old pair in the header comment, keep its checksum baseline, and say in the release note that the old FFmpegKit release can no longer be built from `main`. Existing tags are unaffected, because a release reads the file as it stood at its tag. Never drop a track.
4. **Then**, if this is the default line, bump `FFmpegVersion` and `FFmpegKitNativeVersion` in `Directory.Build.props` (both, together — they are different schemes). Older lines leave the props alone. Either way, fetch: `./src/FFmpegKit.Android/Jars/FetchJars.sh <ffmpegkit version>`.
5. Verify and pack: `./src/FFmpegKit.Android/Jars/FetchJars.sh --verify`, then `./src/FFmpegKit.Android/BuildNugets.sh`, then `dotnet test tests/FFmpegKit.Android.PackageTests` (it asserts the mapping and the props agree).
build/notify-parents.sh keeps one open issue per package and matches any
v tag, so releasing 7.1.5.5 or 6.1.6.5 would comment on FFMpegKit.Net#10,
which is about 8.1.3.1, and retitle it to the older version. Anyone
following that issue would be told to move the umbrella down a major.

The parent pins the default track, so release.yml now runs that job only
when the tag's FFmpeg is the FFmpegVersion in the tag's own
Directory.Build.props. That follows the default by itself, with no list
of versions to maintain. It lives in release.yml because notify-parents.*
are kept byte-identical across the repositories, and this is the only one
publishing parallel tracks on one tag prefix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sbokatuk
sbokatuk merged commit 1372e53 into main Oct 30, 2026
7 checks passed
@sbokatuk
sbokatuk deleted the bump-ffmpegkit-older-tracks branch October 30, 2026 14:32

This branch was successfully deployed

1 active deployment
nuget.org — 862fe480 Deployed Oct 30, 2026 by sbokatuk via publish beta to nuget.org #34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants