Jellyfin Intel Quick Sync Hardware Transcoding in Docker

Guide · Jellyfin · Doc-based

Doc-based, not yet hands-on tested. This guide is written from the official documentation and has not yet been tested hands-on by us. Check the current official docs before running anything.

Version/date: Jellyfin Server v12.3 (latest GitHub release, published 2026-10-23 09:30 JST — https://github.com/jellyfin/jellyfin/releases/tag/v12.3). Docker Hub has a matching jellyfin/jellyfin:12.3 tag. Last checked: 2026-10-24.

Transparency note (HomelabWise): This guide is based on official documentation only and was not hands-on tested by us. Check the linked docs before you run anything.

Source for everything below: Jellyfin's HWA Tutorial On Intel GPU (Markdown source: jellyfin.org repo).

Before you buy or configure

This page contains affiliate placeholders. See our affiliate disclosure.

[AFFILIATE: Amazon Associates — Intel mini PC with Quick Sync]

Setup with the official Docker image

The official image already includes the Intel user-mode media drivers and the OpenCL runtime. You only need to pass in the GPU device and the host's render group.

1. Find the render group ID on the host (on some releases the group is video or input instead):

bash
getent group render | cut -d: -f3

2. docker-compose.yml (official example; replace 122 with your group ID). We pinned the image tag to 12.3; the docs example uses jellyfin/jellyfin:

yaml
services:
  jellyfin:
    image: jellyfin/jellyfin:12.3
    user: 1000:1000
    group_add:
      - '122'  # your "render" group ID
    network_mode: 'host'  # Jellyfin listens directly on the host's interfaces
    volumes:
      - <CONFIG_DIR>:/config
      - <CACHE_DIR>:/cache
      - <MEDIA_DIR>:/media
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128

For a second GPU, use renderD129 instead of renderD128. Start it with docker compose up -d.

⚠️ Caution (hardware not tested): we haven't run this on any Intel hardware. Codec support depends on your CPU generation, so check it with the commands below before relying on hardware transcoding. With network_mode: 'host', Jellyfin's ports are open on every host interface, so don't port-forward them to the internet without HTTPS in front.

3. Check the codecs and OpenCL:

bash
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va

These commands use the container name jellyfin. The compose example above doesn't set a container name, so either add container_name: jellyfin or use the name Compose generates.

4. Turn it on in Jellyfin: enable QSV (or VA-API) in Jellyfin's transcoding settings, then uncheck any codecs your GPU doesn't support.

Check that it's working (host side, needs root)

bash
sudo apt update && sudo apt install -y intel-gpu-tools  # Debian/Ubuntu
sudo intel_gpu_top

Play something in the web client at a lower resolution or bitrate to force a transcode. In intel_gpu_top, the Video engine shows QSV decode/encode load, and Render/3D and VideoEnhance show VPP work.

Tone mapping (HDR to SDR)

This is supported on all Intel GPUs with HEVC 10-bit decoding. You can use OpenCL (supports Dolby Vision P5 and has more tuning options) or QSV VPP (lower power, Linux only, fewer GPU models). Dolby Vision needs "Prefer OS native DXVA or VA-API hardware decoders" checked.

Note on LinuxServer.io images

The LSIO image is maintained separately. Follow its docs. Its config paths differ from the official image's.

Sources

Related