44DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " > /dev/null && pwd) "
55cd " $DIR "
66
7+ PLATFORM=" $( uname -s) "
78FFMPEG_VERSION=" 7.1"
89ZLIB_VERSION=" da607da739fa6047df13e66a2af6b8bec7c2a498" # v1.3.2
910X264_BRANCH=" stable"
11+ LIBDRM_VERSION=" libdrm-2.4.124"
12+ LIBVA_VERSION=" 2.22.0"
1013INSTALL_DIR=" $DIR /ffmpeg/install"
1114
1215NJOBS=" $( nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || echo 2) "
@@ -48,6 +51,59 @@ make -j"$NJOBS"
4851make install
4952cd " $DIR "
5053
54+ # --- Build nv-codec-headers (Linux only, for CUDA/NVDEC) ---
55+ if [ " $PLATFORM " = " Linux" ]; then
56+ if [ ! -d " nv-codec-headers-src/.git" ]; then
57+ rm -rf nv-codec-headers-src
58+ git clone --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git nv-codec-headers-src
59+ fi
60+ make -C nv-codec-headers-src PREFIX=" $PREFIX " install
61+ fi
62+
63+ # --- Build Vulkan-Headers from source (Linux only, need >= 1.3.277 for FFmpeg 7.1) ---
64+ if [ " $PLATFORM " = " Linux" ]; then
65+ if [ ! -d " vulkan-headers-src/.git" ]; then
66+ rm -rf vulkan-headers-src
67+ git clone --depth 1 https://github.com/KhronosGroup/Vulkan-Headers.git vulkan-headers-src
68+ fi
69+ cmake -S vulkan-headers-src -B vulkan-headers-src/build -DCMAKE_INSTALL_PREFIX=" $PREFIX " > /dev/null
70+ cmake --install vulkan-headers-src/build > /dev/null
71+ fi
72+
73+ # --- Build libdrm + libva statically (Linux only, for VAAPI without runtime deps) ---
74+ if [ " $PLATFORM " = " Linux" ]; then
75+ if ! command -v meson & > /dev/null; then
76+ pip3 install --quiet meson ninja 2> /dev/null || python3 -m pip install --quiet meson ninja 2> /dev/null || true
77+ command -v meson & > /dev/null || { echo " error: meson is required (apt install meson or pip install meson)" >&2 ; exit 1; }
78+ fi
79+
80+ if [ ! -d " libdrm-src/.git" ]; then
81+ rm -rf libdrm-src
82+ git clone --depth 1 --branch " $LIBDRM_VERSION " https://gitlab.freedesktop.org/mesa/drm.git libdrm-src
83+ fi
84+ rm -rf libdrm-src/builddir
85+ meson setup libdrm-src/builddir libdrm-src \
86+ --prefix=" $PREFIX " --libdir=lib --default-library=static \
87+ -Dintel=disabled -Dradeon=disabled -Damdgpu=disabled -Dnouveau=disabled \
88+ -Dvmwgfx=disabled -Dtests=false -Dman-pages=disabled -Dcairo-tests=disabled \
89+ -Dvalgrind=disabled
90+ ninja -C libdrm-src/builddir install
91+
92+ if [ ! -d " libva-src/.git" ]; then
93+ rm -rf libva-src
94+ git clone --depth 1 --branch " $LIBVA_VERSION " https://github.com/intel/libva.git libva-src
95+ fi
96+ rm -rf libva-src/builddir
97+ # libva hardcodes shared_library(); patch to library() so --default-library=static works
98+ sed -i ' s/shared_library(/library(/g' libva-src/va/meson.build
99+ PKG_CONFIG_PATH=" $PREFIX /lib/pkgconfig${PKG_CONFIG_PATH: +: $PKG_CONFIG_PATH } " \
100+ meson setup libva-src/builddir libva-src \
101+ --prefix=" $PREFIX " --libdir=lib --default-library=static \
102+ -Ddisable_drm=false -Dwith_x11=no -Dwith_glx=no -Dwith_wayland=no \
103+ -Dwith_win32=no -Denable_docs=false
104+ ninja -C libva-src/builddir install
105+ fi
106+
51107# --- Build FFmpeg ---
52108if [ ! -d " ffmpeg-src/.git" ]; then
53109 rm -rf ffmpeg-src
@@ -57,6 +113,39 @@ git -C ffmpeg-src fetch --depth 1 origin "n${FFMPEG_VERSION}"
57113git -C ffmpeg-src checkout --force FETCH_HEAD
58114
59115cd ffmpeg-src
116+
117+ # Platform-specific hardware acceleration flags
118+ HW_FLAGS=()
119+ if [ " $PLATFORM " = " Linux" ]; then
120+ HW_FLAGS+=(
121+ # NVIDIA CUDA/NVDEC (uses dlopen at runtime)
122+ --enable-ffnvcodec --enable-cuda --enable-cuvid --enable-nvdec
123+ --enable-hwaccel=h264_nvdec,hevc_nvdec
124+ --enable-decoder=h264_cuvid,hevc_cuvid
125+
126+ # VAAPI (Intel/AMD — libva linked statically, driver loaded via dlopen at runtime)
127+ --enable-vaapi
128+ --enable-hwaccel=h264_vaapi,hevc_vaapi
129+
130+ # V4L2 Memory-to-Memory (embedded: RPi, Qualcomm, Rockchip)
131+ --enable-v4l2-m2m
132+ --enable-decoder=h264_v4l2m2m,hevc_v4l2m2m
133+ --enable-encoder=h264_v4l2m2m,hevc_v4l2m2m
134+
135+ # Vulkan video decode/encode (uses dlopen at runtime)
136+ --enable-vulkan
137+ --enable-hwaccel=h264_vulkan,hevc_vulkan
138+ --enable-encoder=h264_vulkan,hevc_vulkan
139+ )
140+ elif [ " $PLATFORM " = " Darwin" ]; then
141+ HW_FLAGS+=(
142+ # VideoToolbox (Apple Silicon / macOS)
143+ --enable-videotoolbox
144+ --enable-hwaccel=h264_videotoolbox,hevc_videotoolbox
145+ --enable-encoder=h264_videotoolbox,hevc_videotoolbox
146+ )
147+ fi
148+
60149PKG_CONFIG_PATH=" $PREFIX /lib/pkgconfig${PKG_CONFIG_PATH: +: $PKG_CONFIG_PATH } " \
61150./configure \
62151 --cc=" ${CC:- cc} " \
@@ -80,7 +169,8 @@ PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" \
80169 --enable-filter=blend,vflip,format,scale,aformat,anull,aresample,null \
81170 --enable-bsf=extract_extradata,h264_mp4toannexb,hevc_mp4toannexb \
82171 --extra-cflags=" -I$PREFIX /include" \
83- --extra-ldflags=" -L$PREFIX /lib"
172+ --extra-ldflags=" -L$PREFIX /lib" \
173+ " ${HW_FLAGS[@]} "
84174make -j" $NJOBS "
85175make install
86176cd " $DIR "
@@ -94,7 +184,11 @@ cp "$PREFIX/bin/ffmpeg" "$INSTALL_DIR/bin/"
94184cp " $PREFIX /bin/ffprobe" " $INSTALL_DIR /bin/"
95185
96186# Libraries
97- for lib in libavformat.a libavcodec.a libavutil.a libswresample.a libx264.a libz.a; do
187+ LIBS=" libavformat.a libavcodec.a libavutil.a libswresample.a libx264.a libz.a"
188+ if [ " $PLATFORM " = " Linux" ]; then
189+ LIBS=" $LIBS libva.a libva-drm.a libdrm.a"
190+ fi
191+ for lib in $LIBS ; do
98192 cp " $PREFIX /lib/$lib " " $INSTALL_DIR /lib/"
99193done
100194
0 commit comments