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.
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.
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.
Bumped the image target to FFmpeg 8.1.2 and updated .gitea/workflows/build.ymlRELEASE_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.
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.
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.
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.
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`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Build and publish an FFmpeg 8.x base image so the ErsatzTV fork can move off
7.1.1.Context
192.168.1.95:3000/timothy/ersatztv-ffmpeg:7.1.1(and:latest).ersatztv-ffmpegfork 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.ErsatzTV/ErsatzTV-ffmpegis archived (Feb 2026), so there's no upstream 8.x Dockerfile to merge — we own this bump entirely.Tasks
images/linux/amd64/DockerfileRELEASE_VERSIONin.gitea/workflows/build.ymlto the new tag (e.g.8.0), keep:latestDownstream
Once a
:8.ximage is published, bumpdocker/Dockerfileintimothy/ersatztvto 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.1is working and unblocks current CI/CD work (ersatztv#4 / ersatztv#3). Do after the pipeline lands.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.
Starting work in isolated worktree
/private/tmp/ersatztv-ffmpeg-issue4on branchissue4-ffmpeg-8from freshorigin/main(d96d3a8).Initial findings:
AGENTS.md; local guidance is inCLAUDE.md.FFMPEG_HARDinimages/linux/amd64/DockerfileandRELEASE_VERSIONin.gitea/workflows/build.yml.8.1.2available, so I’m targeting8.1.2first rather than the older8.0example.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.
Progress update:
8.1.2and updated.gitea/workflows/build.ymlRELEASE_VERSIONaccordingly.RUST=1.94.0CARGOC=0.10.23+cargo-0.97.1CBINDGEN=0.29.4bumblebeehit a 403 API rate limit. Pinning Rust also makes the build reproducible.7.1.1to8.1.2; also corrected stale host wording fromjazztobumblebee.Local verification on
bumblebee:ersatztv-ffmpeg:8.1.2fromimages/linux/amd64/Dockerfile.sha256:f069590b3314df5bad2106503232edec8e9efc4ae11702c43b5c92d057ec503d.ffmpeg -versionreportsffmpeg version 8.1.2.ffprobe -versionreportsffprobe version 8.1.2.libx264encodelibfdk_aacencodevdpau,cuda,vaapi,qsv,drm,opencl,vulkanlibx264,libx265,h264_nvenc,hevc_nvenc,libfdk_aac,libplacebo,scale*,subtitles,zscaleNext: commit/push branch and open the PR for CI/publish verification.
Done
What was done: Upgraded the FFmpeg base image build from
7.1.1to8.1.2, merged PR #5 tomain, and let themainpublish workflow complete successfully. The Gitea registry now has192.168.1.95:3000/timothy/ersatztv-ffmpeg:8.1.2published.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.2locally onbumblebee; smoke-testedffmpeg -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 digestsha256:89bf7b6b563d21d7cf49b102ca495fd143028c05e8c9779cd5c1366d9cf823a7; verified it reportsffmpeg version 8.1.2and successfully runs alibx264lavfi encode.Deferred: ErsatzTV application-side FFmpeg 8 transcode pipeline compatibility remains in
timothy/ersatztv#9as planned.Follow-up issues: Existing downstream follow-up:
timothy/ersatztv#9.Docs updated: Updated repo docs/examples from
7.1.1to8.1.2and corrected the stale Docker host reference fromjazztobumblebee.