Upgrade FFmpeg base image to 8.x #4

Closed
opened 2026-06-26 22:15:31 +02:00 by timothy · 4 comments
Owner

Goal

Build and publish an FFmpeg 8.x base image so the ErsatzTV fork can move off 7.1.1.

Context

  • FFmpeg upstream is now at the 8.x series; we currently build and ship 192.168.1.95:3000/timothy/ersatztv-ffmpeg:7.1.1 (and :latest).
  • Our ersatztv-ffmpeg fork compiles FFmpeg + ~30 libraries from source (CUDA/Intel/etc.), so a major bump is non-trivial — library versions, configure flags, and patches may need updating.
  • Upstream ErsatzTV/ErsatzTV-ffmpeg is archived (Feb 2026), so there's no upstream 8.x Dockerfile to merge — we own this bump entirely.

Tasks

  • Bump the FFmpeg source version (and dependent libs as needed) in images/linux/amd64/Dockerfile
  • Resolve any build breakage from the 8.x API/ABI changes
  • Update RELEASE_VERSION in .gitea/workflows/build.yml to the new tag (e.g. 8.0), keep :latest
  • Build + push to the Gitea registry and smoke-test the resulting image
  • Verify ErsatzTV's transcoding/HW-accel paths still work against FFmpeg 8

Downstream

Once a :8.x image is published, bump docker/Dockerfile in timothy/ersatztv to reference it (one-line base-image change, mirrors what ersatztv#4 did for 7.1.1). Track that as a small follow-up in the ersatztv repo.

Priority

Backlog — 7.1.1 is working and unblocks current CI/CD work (ersatztv#4 / ersatztv#3). Do after the pipeline lands.

## Goal Build and publish an FFmpeg **8.x** base image so the ErsatzTV fork can move off `7.1.1`. ## Context - FFmpeg upstream is now at the 8.x series; we currently build and ship `192.168.1.95:3000/timothy/ersatztv-ffmpeg:7.1.1` (and `:latest`). - Our `ersatztv-ffmpeg` fork compiles FFmpeg + ~30 libraries from source (CUDA/Intel/etc.), so a major bump is non-trivial — library versions, configure flags, and patches may need updating. - Upstream `ErsatzTV/ErsatzTV-ffmpeg` is archived (Feb 2026), so there's no upstream 8.x Dockerfile to merge — we own this bump entirely. ## Tasks - [ ] Bump the FFmpeg source version (and dependent libs as needed) in `images/linux/amd64/Dockerfile` - [ ] Resolve any build breakage from the 8.x API/ABI changes - [ ] Update `RELEASE_VERSION` in `.gitea/workflows/build.yml` to the new tag (e.g. `8.0`), keep `:latest` - [ ] Build + push to the Gitea registry and smoke-test the resulting image - [ ] Verify ErsatzTV's transcoding/HW-accel paths still work against FFmpeg 8 ## Downstream Once a `:8.x` image is published, bump `docker/Dockerfile` in `timothy/ersatztv` to reference it (one-line base-image change, mirrors what ersatztv#4 did for 7.1.1). Track that as a small follow-up in the ersatztv repo. ## Priority Backlog — `7.1.1` is working and unblocks current CI/CD work (ersatztv#4 / ersatztv#3). Do after the pipeline lands.
Author
Owner

Split out the application-side work: ersatztv#9 (FFmpeg 8 compatibility for transcode pipelines). This issue stays scoped to building/publishing the 8.x base image; ersatztv#9 covers fixing ErsatzTV's filter chains / encoder options / tests against FFmpeg 8 and depends on a test image from here.

Split out the application-side work: **ersatztv#9** (FFmpeg 8 compatibility for transcode pipelines). This issue stays scoped to building/publishing the 8.x base image; ersatztv#9 covers fixing ErsatzTV's filter chains / encoder options / tests against FFmpeg 8 and depends on a test image from here.
Author
Owner

Starting work in isolated worktree /private/tmp/ersatztv-ffmpeg-issue4 on branch issue4-ffmpeg-8 from fresh origin/main (d96d3a8).

Initial findings:

  • Repo has no local AGENTS.md; local guidance is in CLAUDE.md.
  • The build-affecting FFmpeg version pins are FFMPEG_HARD in images/linux/amd64/Dockerfile and RELEASE_VERSION in .gitea/workflows/build.yml.
  • Official FFmpeg release directory currently has 8.1.2 available, so I’m targeting 8.1.2 first rather than the older 8.0 example.

Approach: make the minimal version/doc bump first, run a local Docker build, and only adjust dependency versions/configure flags if the build proves they are required.

Starting work in isolated worktree `/private/tmp/ersatztv-ffmpeg-issue4` on branch `issue4-ffmpeg-8` from fresh `origin/main` (`d96d3a8`). Initial findings: - Repo has no local `AGENTS.md`; local guidance is in `CLAUDE.md`. - The build-affecting FFmpeg version pins are `FFMPEG_HARD` in `images/linux/amd64/Dockerfile` and `RELEASE_VERSION` in `.gitea/workflows/build.yml`. - Official FFmpeg release directory currently has `8.1.2` available, so I’m targeting `8.1.2` first rather than the older `8.0` example. Approach: make the minimal version/doc bump first, run a local Docker build, and only adjust dependency versions/configure flags if the build proves they are required.
Author
Owner

Progress update:

  • Bumped the image target to FFmpeg 8.1.2 and updated .gitea/workflows/build.yml RELEASE_VERSION accordingly.
  • Kept dependency churn minimal. The only build-support change needed so far was replacing the Dockerfile's dynamic Rust latest lookup with pinned Rust/cargo tooling:
    • RUST=1.94.0
    • CARGOC=0.10.23+cargo-0.97.1
    • CBINDGEN=0.29.4
  • Root cause for that change: the Dockerfile queried the GitHub releases API during build, and bumblebee hit a 403 API rate limit. Pinning Rust also makes the build reproducible.
  • Updated docs/examples from 7.1.1 to 8.1.2; also corrected stale host wording from jazz to bumblebee.

Local verification on bumblebee:

  • Built ersatztv-ffmpeg:8.1.2 from images/linux/amd64/Dockerfile.
  • Image ID: sha256:f069590b3314df5bad2106503232edec8e9efc4ae11702c43b5c92d057ec503d.
  • ffmpeg -version reports ffmpeg version 8.1.2.
  • ffprobe -version reports ffprobe version 8.1.2.
  • Smoke-tested:
    • lavfi video to null muxer
    • libx264 encode
    • libfdk_aac encode
    • hardware accelerator list includes vdpau, cuda, vaapi, qsv, drm, opencl, vulkan
    • expected encoders/filters present: libx264, libx265, h264_nvenc, hevc_nvenc, libfdk_aac, libplacebo, scale*, subtitles, zscale

Next: commit/push branch and open the PR for CI/publish verification.

Progress update: - Bumped the image target to FFmpeg `8.1.2` and updated `.gitea/workflows/build.yml` `RELEASE_VERSION` accordingly. - Kept dependency churn minimal. The only build-support change needed so far was replacing the Dockerfile's dynamic Rust latest lookup with pinned Rust/cargo tooling: - `RUST=1.94.0` - `CARGOC=0.10.23+cargo-0.97.1` - `CBINDGEN=0.29.4` - Root cause for that change: the Dockerfile queried the GitHub releases API during build, and `bumblebee` hit a 403 API rate limit. Pinning Rust also makes the build reproducible. - Updated docs/examples from `7.1.1` to `8.1.2`; also corrected stale host wording from `jazz` to `bumblebee`. Local verification on `bumblebee`: - Built `ersatztv-ffmpeg:8.1.2` from `images/linux/amd64/Dockerfile`. - Image ID: `sha256:f069590b3314df5bad2106503232edec8e9efc4ae11702c43b5c92d057ec503d`. - `ffmpeg -version` reports `ffmpeg version 8.1.2`. - `ffprobe -version` reports `ffprobe version 8.1.2`. - Smoke-tested: - lavfi video to null muxer - `libx264` encode - `libfdk_aac` encode - hardware accelerator list includes `vdpau`, `cuda`, `vaapi`, `qsv`, `drm`, `opencl`, `vulkan` - expected encoders/filters present: `libx264`, `libx265`, `h264_nvenc`, `hevc_nvenc`, `libfdk_aac`, `libplacebo`, `scale*`, `subtitles`, `zscale` Next: commit/push branch and open the PR for CI/publish verification.
Author
Owner

Done

What was done: Upgraded the FFmpeg base image build from 7.1.1 to 8.1.2, merged PR #5 to main, and let the main publish workflow complete successfully. The Gitea registry now has 192.168.1.95:3000/timothy/ersatztv-ffmpeg:8.1.2 published.

Root cause: n/a for the version bump. Build reproducibility issue found during verification: the Dockerfile dynamically queried the GitHub releases API for Rust, which hit a 403 rate limit from bumblebee; fixed by pinning Rust/cargo helper versions in the Dockerfile.

Files changed: .gitea/workflows/build.yml, images/linux/amd64/Dockerfile, README.md, CLAUDE.md.

Verification: Built ersatztv-ffmpeg:8.1.2 locally on bumblebee; smoke-tested ffmpeg -version, ffprobe -version, lavfi video path, libx264, libfdk_aac, hardware accelerator listing, and key encoder/filter availability. PR #5 was merged and the push workflow completed successfully in 37m33s. Pulled the published registry image with digest sha256:89bf7b6b563d21d7cf49b102ca495fd143028c05e8c9779cd5c1366d9cf823a7; verified it reports ffmpeg version 8.1.2 and successfully runs a libx264 lavfi encode.

Deferred: ErsatzTV application-side FFmpeg 8 transcode pipeline compatibility remains in timothy/ersatztv#9 as planned.

Follow-up issues: Existing downstream follow-up: timothy/ersatztv#9.

Docs updated: Updated repo docs/examples from 7.1.1 to 8.1.2 and corrected the stale Docker host reference from jazz to bumblebee.

## Done **What was done**: Upgraded the FFmpeg base image build from `7.1.1` to `8.1.2`, merged PR #5 to `main`, and let the `main` publish workflow complete successfully. The Gitea registry now has `192.168.1.95:3000/timothy/ersatztv-ffmpeg:8.1.2` published. **Root cause**: n/a for the version bump. Build reproducibility issue found during verification: the Dockerfile dynamically queried the GitHub releases API for Rust, which hit a 403 rate limit from `bumblebee`; fixed by pinning Rust/cargo helper versions in the Dockerfile. **Files changed**: `.gitea/workflows/build.yml`, `images/linux/amd64/Dockerfile`, `README.md`, `CLAUDE.md`. **Verification**: Built `ersatztv-ffmpeg:8.1.2` locally on `bumblebee`; smoke-tested `ffmpeg -version`, `ffprobe -version`, lavfi video path, `libx264`, `libfdk_aac`, hardware accelerator listing, and key encoder/filter availability. PR #5 was merged and the push workflow completed successfully in 37m33s. Pulled the published registry image with digest `sha256:89bf7b6b563d21d7cf49b102ca495fd143028c05e8c9779cd5c1366d9cf823a7`; verified it reports `ffmpeg version 8.1.2` and successfully runs a `libx264` lavfi encode. **Deferred**: ErsatzTV application-side FFmpeg 8 transcode pipeline compatibility remains in `timothy/ersatztv#9` as planned. **Follow-up issues**: Existing downstream follow-up: `timothy/ersatztv#9`. **Docs updated**: Updated repo docs/examples from `7.1.1` to `8.1.2` and corrected the stale Docker host reference from `jazz` to `bumblebee`.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: timothy/ersatztv-ffmpeg#4