Docker configuration for Fluster with comprehensive codec support including FFmpeg and GStreamer with hardware acceleration support (VAAPI, VDPAU, NVDEC, QuickSync).
- Customizable Ubuntu version: 20.04, 22.04, or 24.04
- Three FFmpeg installation options:
- System packages (default) - Fast build, but older versions
- Static binaries (7.x) - Newer FFmpeg, but limited backend support
- Build from source (recommended) - Latest FFmpeg with all backends enabled
- Hardware Acceleration Support:
- VAAPI (Intel, AMD, NVIDIA (only on Ubuntu 24.04))
- VDPAU (Intel via VA-GL bridge, AMD, NVIDIA)
- NVDEC/NVENC (NVIDIA) - Available with system packages on Ubuntu 24.04
- Intel QuickSync (Intel Media SDK, Intel OneVPL)
This Docker setup provides three ways to install FFmpeg, each with different trade-offs:
Use case: Quick testing, CI/CD pipelines Pros: Fast build time (~5 minutes) Cons: Older FFmpeg versions, limited backend support
| Ubuntu | FFmpeg | Backend Support |
|---|---|---|
| 20.04 | 4.2.x | Limited (basic VAAPI, VDPAU) |
| 22.04 | 4.4.x | Good (VAAPI, VDPAU, some QuickSync) |
| 24.04 | 6.1.x | Best (VAAPI, VDPAU, NVDEC, QuickSync) |
Note: Ubuntu 24.04's FFmpeg includes CUDA/NVDEC support in system packages.
# Build with system packages (default)
./run-docker.sh --rebuild list -cUse case: Testing specific FFmpeg versions quickly Pros: Easy to use, newer FFmpeg versions available Cons: Limited hardware backend support (no QuickSync/libmfx)
# Build with FFmpeg static binary
docker build --build-arg FFMPEG_INSTALL_METHOD=static -t fluster:ffmpeg-static -f docker/Dockerfile .Note: Static binaries from johnvansickle.com lack libmfx (QuickSync) support.
Use case: Full hardware acceleration testing, production use Pros: Latest FFmpeg 8.0 with ALL backends enabled (VAAPI, VDPAU, QuickSync) Cons: Longer build time (~20-30 minutes), no CUDA/NVDEC support
# Build FFmpeg 8.0 from source with all backends
./run-docker.sh --build-ffmpeg --rebuild list -c
# Or manually specify version
docker build \
--build-arg FFMPEG_INSTALL_METHOD=source \
--build-arg FFMPEG_VERSION=8.0 \
-t fluster:ffmpeg-full \
-f docker/Dockerfile .Included backends when building from source:
- ✅ VAAPI (Intel, AMD, NVIDIA on Ubuntu 24.04)
- ✅ VDPAU (Intel via VA-GL bridge, AMD, NVIDIA)
- ✅ QuickSync (Intel libmfx) - Now included!
- ✅ All software codecs (x264, x265, vpx, aom, dav1d, fdk-aac)
- ❌ NVDEC/NVENC (CUDA) - Not available (requires CUDA SDK installation)
Note: NVIDIA CUDA/NVDEC support is available with system packages (Ubuntu 24.04 default), but NOT when building FFmpeg from source. For NVDEC, use the default system packages. When building from source, NVIDIA hardware decoding is available via VDPAU and VAAPI (Ubuntu 24.04 only).
Recommendation: Use --build-ffmpeg for latest FFmpeg with comprehensive codec and hardware acceleration support.
| Ubuntu | FFmpeg (system) | FFmpeg (source) | GStreamer | Notes |
|---|---|---|---|---|
| 20.04 | 4.2.x | 8.0 | 1.16.x | Legacy support |
| 22.04 | 4.4.x | 8.0 | 1.20.x | Stable |
| 24.04 | 6.1.x | 8.0 | 1.24.x | Latest (recommended) |
docker/
├── Dockerfile - Main Dockerfile with hardware support
├── run-docker.sh - Build and run script with GPU support
└── README.md - This documentation
From the docker/ directory:
# Build and list available decoders with status checks (✔️/❌)
./run-docker.sh --rebuild list -c
# Show hardware acceleration info
./run-docker.sh hw-info
# List decoders for a specific codec
./run-docker.sh list -c -d H.265
# Download test vectors
./run-docker.sh download JVT-AVC_V1
# Run tests with hardware decoder (use -k to keep files)
./run-docker.sh run -d GStreamer-H.264-VAAPI-Gst1.0 -ts JVT-AVC_V1 -k
# Interactive shell
./run-docker.sh shellBuild with specific Ubuntu version:
# Ubuntu 22.04
./run-docker.sh --ubuntu 22.04 --rebuild list -c
# Ubuntu 24.04 (default, recommended)
./run-docker.sh --ubuntu 24.04 --rebuild list -c
# Ubuntu 20.04 (legacy)
./run-docker.sh --ubuntu 20.04 --rebuild list -cBuild FFmpeg from source with all backends (recommended for production):
# Build FFmpeg 8.0 from source with all hardware acceleration backends
./run-docker.sh --build-ffmpeg --rebuild list -c
# Test with Intel QuickSync (requires building from source)
./run-docker.sh --build-ffmpeg --intel --rebuild run -d FFmpeg-H.264-QSV -ts JVT-AVC_V1 -kNote: For NVIDIA CUDA/NVDEC decoders (FFmpeg-H.265-CUDA, etc.), use system packages (default, without --build-ffmpeg flag), as Ubuntu 24.04 includes CUDA support in system FFmpeg packages.
By default, FFmpeg from Ubuntu repositories is used. To test with newer FFmpeg versions (e.g., for future VVC support), use static binaries:
# Build with FFmpeg static binary
docker build --build-arg FFMPEG_INSTALL_METHOD=static -t fluster:ffmpeg-static -f docker/Dockerfile .
# Verify version
docker run --rm fluster:ffmpeg-static ffmpeg -version | head -1Note: Static binaries may have limited hardware acceleration support compared to system packages. Use only when testing specific features not available in system FFmpeg.
# Intel GPU (VAAPI + QuickSync)
./run-docker.sh --intel hw-info
./run-docker.sh --intel list -c | grep -E "(VAAPI|VA|QSV|MSDK)"
# AMD GPU (VAAPI + VDPAU)
./run-docker.sh --amd hw-info
./run-docker.sh --amd list -c | grep VAAPI
# NVIDIA GPU (CUDA/NVDEC on Ubuntu 24.04)
./run-docker.sh --nvidia hw-info
./run-docker.sh --nvidia list -c | grep -E "CUDA|NVDEC"This Docker image includes FFmpeg and GStreamer with comprehensive hardware acceleration support.
Note on H.266/VVC: H.266/VVC decoders are not available in system packages (FFmpeg 4.x-6.1.x, GStreamer 1.16.x-1.24.x) across Ubuntu 20.04, 22.04, and 24.04. Native VVC support requires FFmpeg 7.0+ with VVC libraries and GStreamer 1.26+ with appropriate plugins, which are not yet available in Ubuntu repositories. If you need VVC testing, consider building FFmpeg/GStreamer from source or waiting for future Ubuntu releases.
FFmpeg provides software decoders for all major codecs:
- H.264/AVC, H.265/HEVC
- VP8, VP9, AV1
- MPEG2, MPEG4
Note: H.266/VVC is not available in system FFmpeg packages. Native VVC support requires FFmpeg 7.0+ with VVC libraries, which is not yet available in Ubuntu repositories.
Use the pattern FFmpeg-<CODEC> (e.g., FFmpeg-H.264, FFmpeg-H.265)
GStreamer with libav plugin exposes FFmpeg decoders through GStreamer:
GStreamer-<CODEC>-Libav-Gst1.0(e.g.,GStreamer-H.264-Libav-Gst1.0)
GStreamer-H.264-VAAPI-Gst1.0(vaapih264dec)GStreamer-H.265-VAAPI-Gst1.0(vaapih265dec)GStreamer-H.264-VA-Gst1.0(vah264dec) - newerGStreamer-H.265-VA-Gst1.0(vah265dec) - newerGStreamer-VP8-VAAPI-Gst1.0GStreamer-VP9-VAAPI-Gst1.0GStreamer-AV1-VAAPI-Gst1.0
Note: H.266/VVC VAAPI decoder (vah266dec) requires GStreamer 1.26+ and is not available in current Ubuntu packages.
GStreamer-H.264-QSV-Gst1.0(qsvh264dec)GStreamer-H.264-MSDK-Gst1.0(msdkh264dec)GStreamer-H.265-MSDK-Gst1.0(msdkh265dec)
FFmpeg-H.264-CUDA(h264_cuvid)FFmpeg-H.265-CUDA(hevc_cuvid)FFmpeg-VP8-CUDA(vp8_cuvid)FFmpeg-VP9-CUDA(vp9_cuvid)GStreamer-H.264-NVDEC-Gst1.0(nvh264dec)GStreamer-H.265-NVDEC-Gst1.0(nvh265dec)GStreamer-VP8-NVDEC-Gst1.0(nvvp8dec)GStreamer-VP9-NVDEC-Gst1.0(nvvp9dec)
Requirements:
- GPU with VAAPI support (Intel, AMD, or NVIDIA on Ubuntu 24.04)
- Appropriate drivers installed on host
- User in
videoandrendergroups
Test VAAPI:
./run-docker.sh --intel hw-info
./run-docker.sh --intel run -d GStreamer-H.264-VAAPI-Gst1.0 -ts JVT-AVC_V1 -kRequirements:
- Intel GPU with Quick Sync support (6th gen+)
- Intel Media SDK libraries (included in image)
Packages included:
libmfx1- Intel Media SDK runtimelibmfx-gen1.2- For newer Intel GPUslibvpl2- oneVPL runtime
Test QuickSync:
./run-docker.sh --intel run -d GStreamer-H.264-QSV-Gst1.0 -ts JVT-AVC_V1 -kRequirements:
- NVIDIA GPU with NVDEC support (compute capability >= 3.0)
- NVIDIA drivers installed on host (
nvidia-smiworking on host) - Ubuntu 24.04 (system packages include CUDA/NVDEC support)
- No special Docker configuration needed - uses
--privilegedmode
How it works:
The Docker container uses --privileged mode and mounts /dev/dri which gives automatic access to NVIDIA GPU for hardware decoding. Ubuntu 24.04's FFmpeg includes CUDA/NVDEC support in system packages. No nvidia-docker2 or nvidia-container-toolkit required!
Driver Version Matching: The build script automatically detects your host NVIDIA driver version (e.g., 535, 550, 560) and installs matching VDPAU libraries inside the container. This ensures compatibility between the container and your host drivers.
Test NVDEC:
# Check NVIDIA GPU (also shows detected driver version)
./run-docker.sh --nvidia hw-info
# List NVDEC decoders
./run-docker.sh --nvidia list -c | grep -i "cuda\|nvdec"
# Download test vectors
./run-docker.sh download JCT-VC-HEVC_V1
# Run test with FFmpeg NVDEC
./run-docker.sh --nvidia run -d FFmpeg-H.265-CUDA -ts JCT-VC-HEVC_V1 -k
# Run test with GStreamer NVDEC
./run-docker.sh --nvidia run -d GStreamer-H.265-NVDEC-Gst1.0 -ts JCT-VC-HEVC_V1 -kNote: CUDA/NVDEC support is only available with system packages (default). If you use --build-ffmpeg, NVDEC will NOT be available. Some test vectors may fail with hardware decoders due to specific features or edge cases. This is normal and expected.
The following directories are automatically mounted from your host to the container:
./resources/- Downloaded test vectors (created automatically, persists on host)./test_suites/- Test suite definitions (must exist in repo)
By default, Fluster writes decoder outputs to an internal temp directory (/tmp/fluster_output) inside the container and they are discarded when the container exits.
Persistence is opt-in:
- Without
-k(or--keep): output files are ephemeral (mirrors local non-Docker behavior). - With
-k: the host directory./fluster_output/is mounted at/tmp/fluster_outputand all.outfiles are kept on your machine.
Examples:
# Ephemeral run (no outputs kept)
./run-docker.sh run -d FFmpeg-H.264 -ts JVT-AVC_V1 -tv AUD_MW_E
# Persistent run (-k creates ./fluster_output on host)
./run-docker.sh run -d FFmpeg-H.264 -ts JVT-AVC_V1 -tv AUD_MW_E -k
# Inspect persisted files
ls -lh fluster_output/JVT-AVC_V1/Cleaning up:
rm -rf fluster_output # remove all persisted outputsNote: Large suites (e.g. HEVC) can consume multiple GB. Only use -k when you actually need the raw .out files.
If you want to inspect outputs temporarily without persisting them:
./run-docker.sh shell
python3 fluster.py run -d FFmpeg-H.264 -ts JVT-AVC_V1 -tv AUD_MW_E -k
ls -lh /tmp/fluster_output/JVT-AVC_V1/
exit # files are lost (not persisted) unless -k was used via wrapperThe following variables are set automatically in the container:
TERM=xterm-256color- For emoji display ✔️/❌LANG=C.UTF-8- UTF-8 supportLC_ALL=C.UTF-8- UTF-8 localeLIBVA_DRIVER_NAME- VAAPI driver (iHD, i965, radeonsi, nouveau)VDPAU_DRIVER- VDPAU driver (va_gl, radeonsi, nvidia)
To override the default driver selection, set the variable on the host:
# Use i965 driver instead of iHD for older Intel GPUs
LIBVA_DRIVER_NAME=i965 ./run-docker.sh --intel hw-info# Ubuntu 24.04 with latest software
./run-docker.sh --ubuntu 24.04 --rebuild list -c
# Ubuntu 22.04 for compatibility testing
./run-docker.sh --ubuntu 22.04 --rebuild list -c
# Ubuntu 20.04 for legacy support
./run-docker.sh --ubuntu 20.04 --rebuild list -c# Intel VAAPI (ephemeral)
./run-docker.sh --intel run -d GStreamer-H.264-VAAPI-Gst1.0 -ts JVT-AVC_V1
# Intel VAAPI (keep outputs)
./run-docker.sh --intel run -d GStreamer-H.264-VAAPI-Gst1.0 -ts JVT-AVC_V1 -k
# NVIDIA NVDEC (keep one output, Ubuntu 24.04)
./run-docker.sh --nvidia run -d FFmpeg-H.265-CUDA -ts JCT-VC-HEVC_V1 -tv AMP_A_Samsung_7 -k# Start shell
./run-docker.sh shell
# Inside container:
vainfo # Check VAAPI
vdpauinfo # Check VDPAU
hw-info # Display all hardware info
gst-inspect-1.0 vaapi # Check GStreamer VAAPI plugins
python3 fluster.py list -c # List decodersIf you prefer to build manually without using run-docker.sh:
cd /path/to/fluster
# Default build (Ubuntu 24.04)
docker build -t fluster:latest -f docker/Dockerfile .
# Custom build with specific Ubuntu version
docker build --build-arg UBUNTU_VERSION=22.04 -t fluster:latest -f docker/Dockerfile .
# Force rebuild
docker build --no-cache -t fluster:latest -f docker/Dockerfile .Then run manually:
docker run -it --rm --privileged \
--device=/dev/dri:/dev/dri \
-v $(pwd)/resources:/fluster/resources \
-v $(pwd)/test_suites:/fluster/test_suites \
-e TERM=xterm-256color \
fluster:latest \
python3 fluster.py list -cNote: Output files are stored in /tmp/fluster_output inside the container (ephemeral, matching non-Docker behavior).
Check GPU access:
ls -la /dev/dri # Should show card0, renderD128, etc.Add your user to video/render groups:
sudo usermod -aG video $USER
sudo usermod -aG render $USER
# Log out and back inThe container uses --privileged mode which gives automatic access to GPU. If NVIDIA decoders don't work:
- Verify NVIDIA drivers are installed on host:
nvidia-smi # Should show your GPU
lsmod | grep nvidia # Should show nvidia modules loaded- Check GPU devices are accessible:
ls -la /dev/dri # Should show renderD* devices
ls -la /dev/nvidia* # Should show nvidia devices (if available)- Make sure you're using Ubuntu 24.04 (for CUDA/NVDEC support):
./run-docker.sh --ubuntu 24.04 --rebuild --nvidia hw-info- Run with --nvidia flag:
./run-docker.sh --nvidia hw-info
./run-docker.sh --nvidia list -c | grep -E "CUDA|NVDEC"- Test inside container:
./run-docker.sh --nvidia shell
# Inside container:
ffmpeg -hwaccels # Should show 'cuda' in the listNote: CUDA/NVDEC hardware acceleration is only available with Ubuntu 24.04 system packages (default). If you use --build-ffmpeg, NVDEC will not be available.
cd /path/to/fluster
docker build --no-cache -t fluster:latest -f docker/Dockerfile .Or using the script:
./run-docker.sh --rebuild list -cAll commands also work from the project root:
docker/run-docker.sh list -c
docker/run-docker.sh --intel download JVT-AVC_V1
docker/run-docker.sh --intel run -d GStreamer-H.264-VAAPI-Gst1.0 -ts JVT-AVC_V1 -k