Skip to content

Commit e60ccf1

Browse files
adeebshihadehclaude
andcommitted
ffmpeg: add hardware-accelerated video decoders
Enable all common HW decoder backends: - Linux: CUDA/NVDEC, VAAPI, VDPAU, V4L2 M2M, Vulkan - macOS: VideoToolbox (Apple Silicon) Builds nv-codec-headers and Vulkan-Headers from source to avoid system package version constraints. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0f28906 commit e60ccf1

File tree

3 files changed

+73
-8
lines changed

3 files changed

+73
-8
lines changed

ffmpeg/build.sh

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set -e
44
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
55
cd "$DIR"
66

7+
PLATFORM="$(uname -s)"
78
FFMPEG_VERSION="7.1"
89
ZLIB_VERSION="da607da739fa6047df13e66a2af6b8bec7c2a498" # v1.3.2
910
X264_BRANCH="stable"
@@ -48,6 +49,25 @@ make -j"$NJOBS"
4849
make install
4950
cd "$DIR"
5051

52+
# --- Build nv-codec-headers (Linux only, for CUDA/NVDEC) ---
53+
if [ "$PLATFORM" = "Linux" ]; then
54+
if [ ! -d "nv-codec-headers-src/.git" ]; then
55+
rm -rf nv-codec-headers-src
56+
git clone --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git nv-codec-headers-src
57+
fi
58+
make -C nv-codec-headers-src PREFIX="$PREFIX" install
59+
fi
60+
61+
# --- Build Vulkan-Headers from source (Linux only, need >= 1.3.277 for FFmpeg 7.1) ---
62+
if [ "$PLATFORM" = "Linux" ]; then
63+
if [ ! -d "vulkan-headers-src/.git" ]; then
64+
rm -rf vulkan-headers-src
65+
git clone --depth 1 https://github.com/KhronosGroup/Vulkan-Headers.git vulkan-headers-src
66+
fi
67+
cmake -S vulkan-headers-src -B vulkan-headers-src/build -DCMAKE_INSTALL_PREFIX="$PREFIX" >/dev/null
68+
cmake --install vulkan-headers-src/build >/dev/null
69+
fi
70+
5171
# --- Build FFmpeg ---
5272
if [ ! -d "ffmpeg-src/.git" ]; then
5373
rm -rf ffmpeg-src
@@ -57,6 +77,43 @@ git -C ffmpeg-src fetch --depth 1 origin "n${FFMPEG_VERSION}"
5777
git -C ffmpeg-src checkout --force FETCH_HEAD
5878

5979
cd ffmpeg-src
80+
81+
# Platform-specific hardware acceleration flags
82+
HW_FLAGS=()
83+
if [ "$PLATFORM" = "Linux" ]; then
84+
HW_FLAGS+=(
85+
# NVIDIA CUDA/NVDEC (uses dlopen at runtime, no driver needed at build time)
86+
--enable-ffnvcodec --enable-cuda --enable-cuvid --enable-nvdec
87+
--enable-hwaccel=h264_nvdec,hevc_nvdec,vp9_nvdec,av1_nvdec,mpeg2_nvdec,mpeg4_nvdec,vc1_nvdec,vp8_nvdec
88+
--enable-decoder=h264_cuvid,hevc_cuvid,vp9_cuvid,av1_cuvid,mpeg2_cuvid,mpeg4_cuvid,vc1_cuvid,vp8_cuvid
89+
90+
# VAAPI (Intel/AMD)
91+
--enable-vaapi
92+
--enable-hwaccel=h264_vaapi,hevc_vaapi,vp8_vaapi,vp9_vaapi,av1_vaapi,mpeg2_vaapi
93+
94+
# VDPAU (NVIDIA legacy)
95+
--enable-vdpau
96+
--enable-hwaccel=h264_vdpau,hevc_vdpau,mpeg2_vdpau,mpeg4_vdpau,vc1_vdpau,vp9_vdpau
97+
98+
# V4L2 Memory-to-Memory (embedded: RPi, Qualcomm, Rockchip)
99+
--enable-v4l2-m2m
100+
--enable-decoder=h264_v4l2m2m,hevc_v4l2m2m,mpeg2_v4l2m2m,mpeg4_v4l2m2m,vp8_v4l2m2m,vp9_v4l2m2m
101+
--enable-encoder=h264_v4l2m2m,hevc_v4l2m2m
102+
103+
# Vulkan video decode/encode
104+
--enable-vulkan
105+
--enable-hwaccel=h264_vulkan,hevc_vulkan,av1_vulkan
106+
--enable-encoder=h264_vulkan,hevc_vulkan
107+
)
108+
elif [ "$PLATFORM" = "Darwin" ]; then
109+
HW_FLAGS+=(
110+
# VideoToolbox (Apple Silicon / macOS)
111+
--enable-videotoolbox
112+
--enable-hwaccel=h264_videotoolbox,hevc_videotoolbox,vp9_videotoolbox,mpeg1_videotoolbox,mpeg2_videotoolbox,mpeg4_videotoolbox,prores_videotoolbox
113+
--enable-encoder=h264_videotoolbox,hevc_videotoolbox,prores_videotoolbox
114+
)
115+
fi
116+
60117
PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \
61118
./configure \
62119
--cc="${CC:-cc}" \
@@ -80,7 +137,8 @@ PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \
80137
--enable-filter=blend,vflip,format,scale,aformat,anull,aresample,null \
81138
--enable-bsf=extract_extradata,h264_mp4toannexb,hevc_mp4toannexb \
82139
--extra-cflags="-I$PREFIX/include" \
83-
--extra-ldflags="-L$PREFIX/lib"
140+
--extra-ldflags="-L$PREFIX/lib" \
141+
"${HW_FLAGS[@]}"
84142
make -j"$NJOBS"
85143
make install
86144
cd "$DIR"

setup.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ run_as_root() {
1717
if [ "$(uname)" = "Darwin" ]; then
1818
brew install nasm pkg-config ccache
1919
elif command -v dnf &>/dev/null; then
20-
dnf install -y nasm cmake gcc-c++ pkgconfig git perl-IPC-Cmd ccache
20+
dnf install -y nasm cmake gcc-c++ pkgconfig git perl-IPC-Cmd ccache \
21+
libva-devel libvdpau-devel libdrm-devel
2122
elif command -v apt-get &>/dev/null; then
2223
run_as_root apt-get update
23-
run_as_root apt-get install -y nasm cmake g++ pkg-config curl ccache
24+
run_as_root apt-get install -y nasm cmake g++ pkg-config curl ccache \
25+
libva-dev libvdpau-dev libdrm-dev
2426
fi
2527

2628
if ! command -v uv &>/dev/null; then

test_wheels_in_image.sh

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,20 @@ FROM $IMAGE
1414
RUN if command -v apk >/dev/null; then \
1515
apk add --no-cache python3 py3-pip bash; \
1616
elif command -v apt-get >/dev/null; then \
17-
apt-get update && apt-get install -y --no-install-recommends python3 python3-pip python3-venv; \
17+
apt-get update && apt-get install -y --no-install-recommends python3 python3-pip python3-venv \
18+
libva2 libvdpau1 libdrm2; \
1819
elif command -v dnf >/dev/null; then \
19-
dnf install -y python3 python3-pip; \
20+
dnf install -y python3 python3-pip \
21+
libva libvdpau libdrm; \
2022
elif command -v pacman >/dev/null; then \
21-
pacman -Sy --noconfirm python python-pip; \
23+
pacman -Sy --noconfirm python python-pip \
24+
libva libvdpau libdrm; \
2225
elif command -v zypper >/dev/null; then \
23-
zypper install -y python3 python3-pip; \
26+
zypper install -y python3 python3-pip \
27+
libva2 libvdpau1 libdrm2; \
2428
elif command -v xbps-install >/dev/null; then \
25-
xbps-install -Sy python3 python3-pip bash; \
29+
xbps-install -Sy python3 python3-pip bash \
30+
libva libvdpau libdrm; \
2631
fi
2732
DOCKERFILE
2833

0 commit comments

Comments
 (0)