Hardware Acceleration
Hardware transcoding significantly reduces CPU usage and enables smooth playback of high-bitrate content. Dubby supports Intel Quick Sync, NVIDIA NVENC, and AMD VAAPI. When a GPU is available, Dubby also uses it for HDR-to-SDR tone mapping — converting HDR10/Dolby Vision content for SDR displays without the heavy CPU cost of software tone mapping.
Intel Quick Sync (recommended for Intel CPUs)
Section titled “Intel Quick Sync (recommended for Intel CPUs)”Intel Quick Sync Video (QSV) is available on most Intel CPUs with integrated graphics (6th gen Skylake and newer). It provides both hardware decoding and encoding.
Mount the DRI device to the container:
Docker Compose:
services: dubby: # ... other config devices: - /dev/dri:/dev/driDocker CLI:
docker run -d \ --name dubby \ --device /dev/dri:/dev/dri \ -p 3000:3000 \ -v ./data:/data \ -v ./cache:/cache \ -v /path/to/media:/media \ -e BETTER_AUTH_SECRET="your-secret" \ dubbytv/dubby:betaVerify it’s working
Section titled “Verify it’s working”# Check DRI devices are visibledocker exec dubby ls -la /dev/dri
# Check supported VA-API profilesdocker exec dubby vainfoYou should see renderD128 in the device list and supported codec profiles (H264, HEVC) in the vainfo output.
NVIDIA GPU
Section titled “NVIDIA GPU”Requires the NVIDIA Container Toolkit installed on the host. The toolkit injects the NVIDIA drivers and utilities (including nvidia-smi) into the container at runtime — no GPU drivers are installed in the Dubby image itself.
Docker Compose:
services: dubby: # ... other config deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]Docker CLI:
docker run -d \ --name dubby \ --gpus all \ -p 3000:3000 \ -v ./data:/data \ -v ./cache:/cache \ -v /path/to/media:/media \ -e BETTER_AUTH_SECRET="your-secret" \ dubbytv/dubby:betaVerify it’s working
Section titled “Verify it’s working”# nvidia-smi is injected by the container toolkitdocker exec dubby nvidia-smiYou should see your GPU model and driver version. If this fails, the NVIDIA Container Toolkit is not installed or configured correctly on the host — see the install guide.
AMD VAAPI
Section titled “AMD VAAPI”AMD GPUs use VAAPI (Video Acceleration API) for hardware transcoding. Mount the DRI device the same way as Intel:
Docker Compose:
services: dubby: # ... other config devices: - /dev/dri:/dev/driVerify it’s working
Section titled “Verify it’s working”docker exec dubby ls -la /dev/dridocker exec dubby vainfoYou should see AMD-specific VA-API profiles in the output. If vainfo shows no profiles, the AMD Mesa VAAPI driver may not be loaded — see Troubleshooting below.
Encoder selection
Section titled “Encoder selection”Dubby automatically detects available hardware encoders at startup by testing each one. The selection priority for H.264 encoding is:
- NVENC (NVIDIA) — highest priority
- VideoToolbox (macOS, non-Docker only)
- QSV (Intel Quick Sync)
- VAAPI (AMD / Intel)
- AMF (AMD, Windows)
- libx264 (software fallback)
The same priority applies for HEVC encoding. You don’t need to configure which encoder to use — Dubby picks the best available option automatically.
Platform support matrix
Section titled “Platform support matrix”| Platform | Architecture | Hardware transcoding |
|---|---|---|
| Linux (x86) | amd64 | Intel QSV, NVIDIA NVENC, AMD VAAPI |
| Linux (ARM) | arm64 | Software only |
| macOS (Intel) | amd64 | Software only (Docker limitation) |
| macOS (Apple Silicon) | arm64 | Software only (Docker limitation) |
| Windows (WSL2) | amd64 | NVIDIA NVENC (with setup) |
| Unraid | amd64 | Intel QSV, NVIDIA NVENC |
| Synology | amd64 | Intel QSV (varies by model, see below) |
Configuration
Section titled “Configuration”Hardware transcoding is enabled by default when a GPU device is available. You can control it via the admin UI under Settings > Transcoding, or with an environment variable:
environment: - DUBBY_GPU_ENABLED=true # defaultSet to false to force software transcoding even when a GPU is available.
Troubleshooting
Section titled “Troubleshooting”Permission denied on /dev/dri
Section titled “Permission denied on /dev/dri”On some systems, the container user (UID 1000) may not have access to the GPU device. Check the device group on the host and pass it to Docker:
# Check the group IDs on your hostls -la /dev/dri/renderD128# crw-rw---- 1 root render 226, 128 ... /dev/dri/renderD128
# Pass the render group GID to Dockerdocker run --group-add $(getent group render | cut -d: -f3) ...In Docker Compose, use group_add:
services: dubby: group_add: - '110' # render group GID — check your hostNVIDIA driver version mismatch
Section titled “NVIDIA driver version mismatch”Ensure your host NVIDIA driver is recent enough to support the container’s CUDA libraries. Check with:
nvidia-smi # Check host driver versionThe NVIDIA Container Toolkit requires a host driver that supports the container’s CUDA version. If you see errors about CUDA version incompatibility, update your host driver.
Software transcoding fallback
Section titled “Software transcoding fallback”If hardware transcoding fails for a specific file, Dubby automatically falls back to software transcoding (libx264). This happens transparently — playback continues without interruption. Check the server logs for details:
docker logs dubby 2>&1 | grep -i "falling back\|libx264\|encoder failed"No hardware profiles in vainfo
Section titled “No hardware profiles in vainfo”If vainfo returns no profiles or an error:
- Verify
/dev/dri/renderD128exists inside the container:docker exec dubby ls /dev/dri/ - On AMD, ensure the host has Mesa VAAPI drivers installed (
mesa-va-drivers) - On Intel, ensure the host kernel supports your GPU — Intel Arc requires kernel 6.2+