Skip to content

feat(node): ffmpeg latest pinned + ffmpeg-patches bundled into Dockerfile - #36

Merged
lusoris merged 2 commits into
masterfrom
feat/vmafx-node-ffmpeg-latest
May 28, 2026
Merged

lusoris merged 2 commits into
masterfrom
feat/vmafx-node-ffmpeg-latest

Conversation

@lusoris

@lusoris lusoris commented May 28, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Phase 4b.4 (ADR-0709): ships docker/Dockerfile.node with four targets (node-cpu, node-cuda, node-rocm, node-sycl), each carrying ffmpeg n8.2 compiled from source with all 15 ffmpeg-patches/ patches applied.
  • Adds cmd/vmafx-node Go binary with startup encoder-inventory probe (ffmpeg -encoders cache) and gRPC server scaffold (full gRPC wiring is Phase 4b.5).
  • FFmpeg version policy (ADR-0717): pin to latest stable tagged release (n8.2); update FFMPEG_TAG on each release-sync PR.

What's included

docker/Dockerfile.node

Multi-stage build:

  1. vmaf-builder — libvmaf.so + vmaf CLI from core/ (CPU, release/stripped)
  2. ffmpeg-deps-base — codec build deps + SVT-AV1 from source (Ubuntu's libsvtav1-dev omits SvtAv1Enc.pc)
  3. ffmpeg-builder-cpu — ffmpeg n8.2, patches applied, configured with --enable-libvmaf --enable-libx264 --enable-libx265 --enable-libvpx --enable-libsvtav1 --enable-libdav1d
  4. go-builder — cmd/vmafx-node binary
  5. runtime-base — distroless cc-debian12
    6–9. node-cpu / node-cuda / node-rocm / node-sycl — final targets

libaom excluded: ffmpeg-patches/0007 references aom_roi_map_t fields not present in any released libaom. SVT-AV1 is the production AV1 lane.

cmd/vmafx-node

  • main.go — discovers VMAFX_FFMPEG_BIN, runs startup probe, starts server
  • probe/probe.go + probe_test.go — ffmpeg -encoders inventory cache
  • server/server.go + server_test.go — gRPC server scaffold (Phase 4b.5 wiring deferred)

Documentation / deliverables

  • docs/adr/0717-vmafx-node-ffmpeg-latest.md — version policy decision record
  • docs/development/vmafx-node.md — operator guide (image variants, codec matrix, env vars, smoke tests)
  • changelog.d/added/node-ffmpeg-latest.md — release fragment
  • docs/adr/README.md — index rows for ADR-0710/0711/0712/0717
  • docs/state.md — recently-closed row for Phase 4b.4
  • docs/rebase-notes.md — ffmpeg base bump procedure for future syncs

Smoke test

# Build CPU variant
docker buildx build --target node-cpu -f docker/Dockerfile.node -t vmafx-node:test .

# Verify ffmpeg version
docker run --rm vmafx-node:test ffmpeg -version | head -1
# → ffmpeg version n8.2 ...

# Verify codec inventory
docker run --rm vmafx-node:test ffmpeg -hide_banner -encoders 2>/dev/null \
  | grep -E 'libx264|libx265|libsvtav1|libvpx'

# Netflix golden score (mount test fixtures)
docker run --rm -v "$PWD/python/test/resource:/data:ro" vmafx-node:test \
  /usr/local/bin/vmaf \
    --reference /data/yuv/src01_hrc00_576x324.yuv \
    --distorted  /data/yuv/src01_hrc01_576x324.yuv \
    --width 576 --height 324 --pixel_format 420 --bitdepth 8
# Expected VMAF score: ~76.668 (Netflix golden)

Deliverables checklist

  • Research digest: no digest needed: trivial — version pin + Dockerfile pattern established by dev/Containerfile
  • Decision matrix: ADR-0717 §Alternatives considered (tag vs rolling vs dev-container vs distro)
  • AGENTS.md invariant: no rebase-sensitive invariants — docker/Dockerfile.node is fork-local, no upstream overlap
  • Reproducer / smoke-test command: in PR description above
  • changelog.d/added/node-ffmpeg-latest.md
  • docs/rebase-notes.md entry: ffmpeg base bump procedure added

ADR

ADR-0717 — parent: ADR-0709 Phase 4b item 4b.4.

Notes for reviewers

  • The go.sum checksum mismatch on golang.org/x/sync is pre-existing (not introduced by this PR). Verify with git diff master -- go.sum.
  • NVENC / QSV / AMF encoders in node-cuda / node-sycl / node-rocm require the host's GPU driver at runtime; the probe logs WARN for absent HW encoders but does not block startup.
  • A CI job validating patches against n8.2 specifically is tracked as follow-up; the Dockerfile itself serves as the build-time gate.

🤖 Generated with Claude Code

Phase 4b.4 (ADR-0709): ships docker/Dockerfile.node with four targets
(node-cpu, node-cuda, node-rocm, node-sycl). Each target compiles ffmpeg
n8.2 from source with all 15 ffmpeg-patches/ patches applied (libvmaf,
libvmaf_sycl, libvmaf_vulkan, vmaf_pre, libvmaf_tune filters), plus the
full soft-codec inventory (libx264, libx265, libvpx-vp9, libsvtav1,
libdav1d).

Adds cmd/vmafx-node Go binary with a startup encoder-inventory probe that
runs `ffmpeg -encoders` at boot and caches the result. Server scaffold
(Phase 4b.5 gRPC wiring deferred).

FFmpeg version policy (ADR-0717): pin to latest stable tagged release;
currently n8.2. libaom excluded — ffmpeg-patches/0007 references
aom_roi_map_t fields not present in any released libaom; SVT-AV1 covers
the AV1 production lane.

Deliverables:
- docker/Dockerfile.node (4 targets)
- cmd/vmafx-node/{main,probe,server} + tests
- docs/adr/0717-vmafx-node-ffmpeg-latest.md
- docs/development/vmafx-node.md
- changelog.d/added/node-ffmpeg-latest.md
- docs/state.md row, docs/rebase-notes.md entry
- docs/adr/README.md rows for ADR-0710/0711/0712/0717

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@lusoris
lusoris marked this pull request as ready for review May 28, 2026 12:56
Union-of-rows for docs/state.md, docs/adr/README.md, docs/rebase-notes.md.
Keep PR #36 HEAD version of docker/Dockerfile.node (ffmpeg n8.2 builder stage)
and cmd/vmafx-node/main.go (probe/server architecture, ADR-0717).
@lusoris
lusoris merged commit 39455e7 into master May 28, 2026
16 of 60 checks passed
@lusoris
lusoris deleted the feat/vmafx-node-ffmpeg-latest branch May 28, 2026 13:02
@lusoris lusoris added this to the 1.0.0 — First release milestone Sep 4, 2026
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.

1 participant