Files
jellyfin-ffmpeg/docker-build.sh
T
2026-07-19 22:30:08 +08:00

831 lines
31 KiB
Bash
Executable File

#!/bin/bash
# Builds the DEB inside the Docker container
set -o errexit
set -o xtrace
DEBIAN_ADDR=http://deb.debian.org/debian/
UBUNTU_ARCHIVE_ADDR=http://archive.ubuntu.com/ubuntu/
UBUNTU_PORTS_ADDR=http://ports.ubuntu.com/ubuntu-ports/
# Prepare common extra libs for amd64 and arm64
prepare_extra_common() {
case ${ARCH} in
'amd64')
CROSS_PREFIX_OPT=""
CROSS_OPT=""
CMAKE_TOOLCHAIN_OPT=""
MESON_CROSS_OPT=""
;;
'arm64')
CROSS_PREFIX_OPT="aarch64-linux-gnu-"
CROSS_OPT="--host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++"
CMAKE_TOOLCHAIN_OPT="-DCMAKE_TOOLCHAIN_FILE=${SOURCE_DIR}/toolchain-${ARCH}.cmake"
MESON_CROSS_OPT="--cross-file=${SOURCE_DIR}/cross-${ARCH}.meson"
;;
esac
# ICONV
pushd ${SOURCE_DIR}
mkdir iconv
pushd iconv
iconv_ver="1.19"
iconv_link="https://mirrors.edge.kernel.org/gnu/libiconv/libiconv-${iconv_ver}.tar.gz"
wget ${iconv_link} -O iconv.tar.gz
tar xaf iconv.tar.gz
pushd libiconv-${iconv_ver}
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-static \
--enable-{shared,extra-encodings} \
--with-pic
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/iconv
echo "iconv${TARGET_DIR}/lib/libiconv.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# ZLIB
pushd ${SOURCE_DIR}
git clone -b v1.3.2 --depth=1 https://github.com/madler/zlib.git
pushd zlib
CROSS_PREFIX=${CROSS_PREFIX_OPT} ./configure \
--prefix=${TARGET_DIR} \
--shared
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/zlib
echo "zlib${TARGET_DIR}/lib/libz.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# LIBXML2
pushd ${SOURCE_DIR}
libxml2_ver="v2.15.3"
git clone -b ${libxml2_ver} --depth=1 https://github.com/GNOME/libxml2.git
pushd libxml2
./autogen.sh \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-{static,maintainer-mode} \
--enable-shared \
--without-python
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/libxml2
echo "libxml2${TARGET_DIR}/lib/libxml2.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# FRIBIDI
pushd ${SOURCE_DIR}
git clone -b v1.0.16 --depth=1 https://github.com/fribidi/fribidi.git
meson setup fribidi fribidi_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-D{bin,docs,tests}=false
meson configure fribidi_build
ninja -j$(nproc) -C fribidi_build install
cp -a ${TARGET_DIR}/lib/libfribidi.so* ${SOURCE_DIR}/fribidi
echo "fribidi/libfribidi.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
# FREETYPE
pushd ${SOURCE_DIR}
git clone -b VER-2-14-3 --depth=1 https://github.com/freetype/freetype.git
pushd freetype
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--enable-shared \
--disable-static
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/freetype
echo "freetype${TARGET_DIR}/lib/libfreetype.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# FONTCONFIG
pushd ${SOURCE_DIR}
git clone -b 2.17.1 --depth=1 https://chromium.googlesource.com/external/fontconfig
meson setup fontconfig fontconfig_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=lib \
--buildtype=release \
--wrap-mode=nofallback \
--default-library=shared \
-Diconv=enabled \
-Dxml-backend=libxml2 \
-D{cache-build,doc,tests,tools}=disabled
meson configure fontconfig_build
ninja -j$(nproc) -C fontconfig_build install
cp -a ${TARGET_DIR}/lib/libfontconfig.so* ${SOURCE_DIR}/fontconfig
echo "fontconfig/libfontconfig.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
# HARFBUZZ
pushd ${SOURCE_DIR}
git clone -b 14.2.1 --depth=1 https://github.com/harfbuzz/harfbuzz.git
meson setup harfbuzz harfbuzz_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-Dfreetype=enabled \
-D{gpu,glib,gobject,cairo,chafa,icu}=disabled \
-D{tests,introspection,docs,utilities}=disabled
meson configure harfbuzz_build
ninja -j$(nproc) -C harfbuzz_build install
cp -a ${TARGET_DIR}/lib/libharfbuzz.so* ${SOURCE_DIR}/harfbuzz
echo "harfbuzz/libharfbuzz.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
# UNIBREAK
pushd ${SOURCE_DIR}
git clone -b libunibreak_7_0 --depth=1 https://github.com/adah1972/libunibreak.git
pushd libunibreak
./bootstrap
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--enable-shared \
--disable-static \
--with-pic
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/libunibreak
echo "libunibreak${TARGET_DIR}/lib/libunibreak.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# LIBASS
pushd ${SOURCE_DIR}
git clone -b 0.17.5 --depth=1 https://github.com/libass/libass.git
pushd libass
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-static \
--enable-{shared,libunibreak} \
--with-pic
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/libass
echo "libass${TARGET_DIR}/lib/libass.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# OGG
pushd ${SOURCE_DIR}
git clone -b v1.3.6 --depth=1 https://github.com/xiph/ogg.git
pushd ogg
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-static \
--enable-shared \
--with-pic
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/ogg
echo "ogg${TARGET_DIR}/lib/libogg.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# THEORA
pushd ${SOURCE_DIR}
git clone -b v1.2.0 --depth=1 https://github.com/xiph/theora.git
pushd theora
# autotools: relax autoconf requirement to 2.69
wget -q -O - https://github.com/xiph/theora/commit/3ae2669.patch | git apply
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-{static,examples,extra-programs,oggtest,vorbistest,spec,doc} \
--enable-shared \
--with-pic
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/theora
echo "theora${TARGET_DIR}/lib/libtheora{enc,dec}.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# FFTW3
pushd ${SOURCE_DIR}
mkdir fftw3
pushd fftw3
fftw3_ver="3.3.11"
fftw3_link="https://fftw.org/fftw-${fftw3_ver}.tar.gz"
wget ${fftw3_link} -O fftw3.tar.gz
tar xaf fftw3.tar.gz
pushd fftw-${fftw3_ver}
if [ "${ARCH}" = "amd64" ]; then
fftw3_optimizations="--enable-sse2 --enable-avx --enable-avx-128-fma --enable-avx2 --enable-avx512"
else
fftw3_optimizations="--enable-neon"
fi
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--disable-{static,doc} \
--enable-{shared,single,threads,fortran} \
$fftw3_optimizations \
--with-our-malloc \
--with-combined-threads \
--with-incoming-stack-boundary=2
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/fftw3
echo "fftw3${TARGET_DIR}/lib/libfftw3f.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# CHROMAPRINT
pushd ${SOURCE_DIR}
git clone -b v1.6.0 --depth=1 https://github.com/acoustid/chromaprint.git
pushd chromaprint
echo "Libs.private: -lfftw3f -lstdc++" >> libchromaprint.pc.cmake
echo "Cflags.private: -DCHROMAPRINT_NODLL" >> libchromaprint.pc.cmake
mkdir build
pushd build
cmake \
${CMAKE_TOOLCHAIN_OPT} \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_{TOOLS,TESTS}=OFF \
-DFFT_LIB=fftw3f \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/chromaprint
echo "chromaprint${TARGET_DIR}/lib/libchromaprint.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# ZIMG
pushd ${SOURCE_DIR}
git clone -b release-3.0.6 --recursive --depth=1 https://github.com/sekrit-twc/zimg.git
pushd zimg
./autogen.sh
./configure --prefix=${TARGET_DIR} ${CROSS_OPT}
make -j $(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/zimg
echo "zimg${TARGET_DIR}/lib/libzimg.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# DAV1D
pushd ${SOURCE_DIR}
git clone -b 1.5.3 --depth=1 https://code.videolan.org/videolan/dav1d.git
meson setup dav1d dav1d_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
-Ddefault_library=shared \
-Denable_asm=true \
-Denable_{tools,tests,examples}=false
meson configure dav1d_build
ninja -j$(nproc) -C dav1d_build install
cp -a ${TARGET_DIR}/lib/libdav1d.so* ${SOURCE_DIR}/dav1d
echo "dav1d/libdav1d.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
# SVT-AV1
pushd ${SOURCE_DIR}
git clone -b v4.1.0 --depth=1 https://gitlab.com/AOMediaCodec/SVT-AV1.git
pushd SVT-AV1
mkdir build
pushd build
cmake \
${CMAKE_TOOLCHAIN_OPT} \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_{TESTING,APPS,DEC}=OFF \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/SVT-AV1
echo "SVT-AV1${TARGET_DIR}/lib/libSvtAv1Enc.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# FDK-AAC-STRIPPED
pushd ${SOURCE_DIR}
mkdir fdk-aac-stripped
pushd fdk-aac-stripped
fdk_aac_ver="stripped5"
fdk_aac_link="https://gitlab.freedesktop.org/wtaymans/fdk-aac-stripped/-/archive/${fdk_aac_ver}/fdk-aac-stripped-${fdk_aac_ver}.tar.gz"
wget ${fdk_aac_link} -O fdk-aac-stripped.tar.gz
tar xaf fdk-aac-stripped.tar.gz
pushd fdk-aac-stripped-${fdk_aac_ver}
./autogen.sh
./configure \
--disable-{static,silent-rules} \
--prefix=${TARGET_DIR} CFLAGS="-O3 -DNDEBUG" CXXFLAGS="-O3 -DNDEBUG" ${CROSS_OPT}
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/fdk-aac-stripped
echo "fdk-aac-stripped${TARGET_DIR}/lib/libfdk-aac.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# FFNVCODEC
pushd ${SOURCE_DIR}
git clone -b n12.0.16.1 --depth=1 https://github.com/FFmpeg/nv-codec-headers.git
pushd nv-codec-headers
make PREFIX=${TARGET_DIR} install
popd
popd
# Install crossbuild dependencies
apt-get install -y lib{udev,pciaccess,zstd,elf,expat1}-dev:${ARCH}
# LIBDRM
pushd ${SOURCE_DIR}
mkdir libdrm
pushd libdrm
libdrm_ver="libdrm-2.4.131"
libdrm_link="https://gitlab.freedesktop.org/mesa/libdrm/-/archive/${libdrm_ver}/libdrm-${libdrm_ver}.tar.gz"
wget ${libdrm_link} -O libdrm.tar.gz
tar xaf libdrm.tar.gz
meson setup libdrm-${libdrm_ver} drm_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
-D{udev,tests,install-test-programs}=false \
-D{amdgpu,radeon,intel}=enabled \
-D{etnaviv,valgrind,freedreno,vc4,vmwgfx,nouveau,man-pages}=disabled
meson configure drm_build
ninja -j$(nproc) -C drm_build install
cp -a ${TARGET_DIR}/lib/libdrm*.so* ${SOURCE_DIR}/libdrm
cp ${TARGET_DIR}/share/libdrm/*.ids ${SOURCE_DIR}/libdrm
echo "libdrm/libdrm*.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
echo "libdrm/*.ids usr/lib/jellyfin-ffmpeg/share/libdrm" >> ${DPKG_INSTALL_LIST}
popd
popd
# LIBVA
pushd ${SOURCE_DIR}
git clone -b 2.24.1 --depth=1 https://github.com/intel/libva.git
pushd libva
if [ "${ARCH}" = "arm64" ]; then
libva_drv_arch_path="/usr/lib/aarch64-linux-gnu/dri"
else
libva_drv_arch_path="/usr/lib/x86_64-linux-gnu/dri"
fi
sed -i "s#secure_getenv(\"LIBVA_DRIVERS_PATH\")#\"/usr/lib/jellyfin-ffmpeg/lib/dri:${libva_drv_arch_path}:/usr/lib/dri:/usr/local/lib/dri\"#g" va/va.c
sed -i "s#secure_getenv(\"LIBVA_DRIVER_NAME\")#secure_getenv(\"LIBVA_DRIVER_NAME_JELLYFIN\")#g" va/va.c
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR} \
--enable-drm \
--disable-{glx,x11,wayland,docs}
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/lib/libva.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
echo "intel${TARGET_DIR}/lib/libva-drm.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
# LIBVA-UTILS
pushd ${SOURCE_DIR}
git clone -b 2.24.0 --depth=1 https://github.com/intel/libva-utils.git
pushd libva-utils
./autogen.sh
./configure \
${CROSS_OPT} \
--prefix=${TARGET_DIR}
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/bin/vainfo usr/lib/jellyfin-ffmpeg" >> ${DPKG_INSTALL_LIST}
popd
popd
# Vulkan Headers
pushd ${SOURCE_DIR}
git clone -b v1.4.355 --depth=1 https://github.com/KhronosGroup/Vulkan-Headers.git
pushd Vulkan-Headers
mkdir build && pushd build
cmake \
${CMAKE_TOOLCHAIN_OPT} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} ..
make -j$(nproc) && make install
popd
popd
popd
# Vulkan ICD Loader
pushd ${SOURCE_DIR}
git clone -b v1.4.355 --depth=1 https://github.com/KhronosGroup/Vulkan-Loader.git
pushd Vulkan-Loader
sed -i 's/memset(disable_struct, 0, sizeof.*);/& disable_struct->disable_all_implicit = 1;/' loader/loader_environment.c
mkdir build && pushd build
cmake \
${CMAKE_TOOLCHAIN_OPT} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DVULKAN_HEADERS_INSTALL_DIR="${TARGET_DIR}" \
-DCMAKE_INSTALL_SYSCONFDIR=${TARGET_DIR}/share \
-DCMAKE_INSTALL_DATADIR=${TARGET_DIR}/share \
-DCMAKE_INSTALL_LIBDIR=lib \
-DBUILD_TESTS=OFF \
-DBUILD_WSI_{XCB,XLIB,XLIB_XRANDR,WAYLAND}_SUPPORT=OFF ..
make -j$(nproc) && make install
cp -a ${TARGET_DIR}/lib/libvulkan.so* ${SOURCE_DIR}/Vulkan-Loader
echo "Vulkan-Loader/libvulkan.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# SHADERC
shaderc_ver="v2026.2"
pushd ${SOURCE_DIR}
git clone -b ${shaderc_ver} --depth=1 https://github.com/google/shaderc.git
pushd shaderc
./utils/git-sync-deps
shaderc_conf=$(echo -GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DSHADERC_SKIP_{TESTS,EXAMPLES,COPYRIGHT_CHECK}=ON \
-DENABLE_EXCEPTIONS=ON \
-DSPIRV_SKIP_EXECUTABLES=ON \
-DSPIRV_TOOLS_BUILD_STATIC=ON \
-DBUILD_SHARED_LIBS=OFF)
# Build native glslangValidator for crossbuild
if [ "${ARCH}" != "amd64" ]; then
mkdir glslang_build && pushd glslang_build
cmake $shaderc_conf \
-DENABLE_GLSLANG_BINARIES=ON ..
ninja -j$(nproc) third_party/glslang/StandAlone/glslang
cp third_party/glslang/StandAlone/glslangValidator ${TARGET_DIR}/bin
popd
fi
# Build target shaderc
mkdir shaderc_build && pushd shaderc_build
cmake $shaderc_conf \
${CMAKE_TOOLCHAIN_OPT} \
-DENABLE_GLSLANG_BINARIES=$([ "${ARCH}" = "amd64" ] && echo "ON" || echo "OFF") \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} ..
ninja -j$(nproc)
ninja install
cp -a ${TARGET_DIR}/lib/libshaderc_shared.so* ${SOURCE_DIR}/shaderc
echo "shaderc/libshaderc_shared* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# MESA
# Minimal libs for AMD VAAPI, AMD RADV and Intel ANV
if [[ ${LLVM_VER} -ge 15 ]]; then
if [[ "${ARCH}" = "amd64" && ${LLVMSPIRVLIB_VER} -ge 15 && ${LLVMSPIRVLIB_VER} -le 21 ]]; then
# Intel ANV requires llvmspirvlib >= 15 (and <= 21 in mesa 26.0)
mesa_vk_drv="amd,intel"
mesa_llvm_clc="enabled"
apt-get install -y {llvm-,libllvmspirvlib-,libclc-,libclang-,libclang-cpp}${LLVMSPIRVLIB_VER}-dev
else
mesa_vk_drv="amd"
mesa_llvm_clc="disabled"
fi
pushd ${SOURCE_DIR}
mkdir mesa
pushd mesa
mesa_ver="mesa-26.0.8"
mesa_link="https://gitlab.freedesktop.org/mesa/mesa/-/archive/${mesa_ver}/mesa-${mesa_ver}.tar.gz"
wget ${mesa_link} -O mesa.tar.gz
tar xaf mesa.tar.gz
# Enable VAAPI VPP alpha blending support
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41090.patch | \
patch -p1 -d mesa-${mesa_ver}
# Fix misc CSC issues in VAAPI VPP
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42181.patch | \
patch -p1 -d mesa-${mesa_ver}
# Fix setting VPE rotation with horizontal flip enabled
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42408.patch | \
sed 's#/mm/#/#g' | patch -p1 -d mesa-${mesa_ver}
# Fix setting chroma swizzle mode in VK Video on GFX9
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42763.patch | \
patch -p1 -d mesa-${mesa_ver}
meson setup mesa-${mesa_ver} mesa_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
--wrap-mode=nofallback \
-Db_ndebug=true \
-Db_lto=false \
-Dplatforms=[] \
-Dgallium-drivers=radeonsi \
-Dvulkan-drivers=${mesa_vk_drv} \
-Dvulkan-layers=[] \
-Dvulkan-manifest-per-architecture=true \
-Degl=disabled \
-Dgallium-{extra-hud,rusticl}=false \
-Dgallium-mediafoundation=disabled \
-Dgallium-va=enabled \
-Dvideo-codecs=all \
-Dgbm=disabled \
-Dgles1=disabled \
-Dgles2=disabled \
-Dopengl=false \
-Dglvnd=disabled \
-Dglx=disabled \
-Dlibunwind=disabled \
-Dllvm=${mesa_llvm_clc} \
-Damd-use-llvm=false \
-Dlmsensors=disabled \
-Dvalgrind=disabled \
-Dtools=[] \
-Dzstd=enabled \
-Dmicrosoft-clc=disabled \
-Dintel-elk=false
meson configure mesa_build
ninja -j$(nproc) -C mesa_build install
cp -a ${TARGET_DIR}/lib/libvulkan_*.so ${SOURCE_DIR}/mesa
# radeonsi_drv_video.so -> libgallium_drv_video.so is soft link
cp ${TARGET_DIR}/lib/dri/radeonsi_drv_video.so ${SOURCE_DIR}/mesa
echo "mesa/lib*.so usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
echo "mesa/radeonsi_drv_video.so usr/lib/jellyfin-ffmpeg/lib/dri" >> ${DPKG_INSTALL_LIST}
cp ${TARGET_DIR}/share/drirc.d/*.conf ${SOURCE_DIR}/mesa
echo "mesa/*defaults.conf usr/lib/jellyfin-ffmpeg/share/drirc.d" >> ${DPKG_INSTALL_LIST}
cp ${TARGET_DIR}/share/vulkan/icd.d/*.json ${SOURCE_DIR}/mesa
echo "mesa/*icd.*.json usr/lib/jellyfin-ffmpeg/share/vulkan/icd.d" >> ${DPKG_INSTALL_LIST}
popd
popd
fi
# LIBPLACEBO
pushd ${SOURCE_DIR}
git clone -b v7.360.1 --recursive --depth=1 https://github.com/haasn/libplacebo.git
# Fix bit shift when importing P01x non-multiplane image
git -C libplacebo apply ${SOURCE_DIR}/builder/patches/libplacebo/*.patch
sed -i 's/env: python_env,//g' libplacebo/src/vulkan/meson.build
meson setup libplacebo placebo_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-Dvulkan=enabled \
-Dvk-proc-addr=enabled \
-Dvulkan-registry=${TARGET_DIR}/share/vulkan/registry/vk.xml \
-Dshaderc=enabled \
-Dglslang=disabled \
-D{demos,tests,bench,fuzz}=false
meson configure placebo_build
ninja -j$(nproc) -C placebo_build install
cp -a ${TARGET_DIR}/lib/libplacebo.so* ${SOURCE_DIR}/libplacebo
echo "libplacebo/libplacebo* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
}
# Prepare extra headers, libs and drivers for x86_64-linux-gnu
prepare_extra_amd64() {
# AMF
# https://www.ffmpeg.org/general.html#AMD-AMF_002fVCE
pushd ${SOURCE_DIR}
mkdir amf-headers
pushd amf-headers
amf_ver="1.5.2"
amf_link="https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v${amf_ver}/AMF-headers-v${amf_ver}.tar.gz"
wget ${amf_link} -O amf.tar.gz
tar xaf amf.tar.gz
pushd amf-headers-v${amf_ver}/AMF
mkdir -p /usr/include/AMF
mv * /usr/include/AMF
popd
popd
popd
# INTEL-VAAPI-DRIVER
pushd ${SOURCE_DIR}
git clone --depth=1 https://github.com/intel/intel-vaapi-driver.git
pushd intel-vaapi-driver
./autogen.sh
./configure LIBVA_DRIVERS_PATH=${TARGET_DIR}/lib/dri
make -j$(nproc) && make install
mkdir -p ${SOURCE_DIR}/intel/dri
cp -a ${TARGET_DIR}/lib/dri/i965*.so ${SOURCE_DIR}/intel/dri
echo "intel/dri/i965*.so usr/lib/jellyfin-ffmpeg/lib/dri" >> ${DPKG_INSTALL_LIST}
popd
popd
# GMMLIB
pushd ${SOURCE_DIR}
git clone -b intel-gmmlib-22.10.0 --depth=1 https://github.com/intel/gmmlib.git
pushd gmmlib
mkdir build && pushd build
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} ..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/lib/libigdgmm.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# MediaSDK (RT only)
# Provides MSDK runtime (libmfxhw64.so.1) for 11th Gen Rocket Lake and older
pushd ${SOURCE_DIR}
git clone -b intel-mediasdk-23.2.2 --depth=1 https://github.com/Intel-Media-SDK/MediaSDK.git
pushd MediaSDK
# Fix build in gcc 13
wget -q -O - https://github.com/Intel-Media-SDK/MediaSDK/commit/8fb9f5f.patch | git apply
# Fix ADI issue with VPL patch
wget -q -O - https://github.com/intel/vpl-gpu-rt/commit/e025c82.patch | git apply
# Fix missing entries in PicStruct validation with VPL patch
wget -q -O - https://github.com/intel/vpl-gpu-rt/commit/c7eb030.patch | git apply
sed -i 's|MFX_PLUGINS_CONF_DIR "/plugins.cfg"|"/usr/lib/jellyfin-ffmpeg/lib/mfx/plugins.cfg"|g' api/mfx_dispatch/linux/mfxloader.cpp
mkdir build && pushd build
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DBUILD_RUNTIME=ON \
-DBUILD_{SAMPLES,TUTORIALS,OPENCL}=OFF \
-DBUILD_TUTORIALS=OFF \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/lib/libmfxhw64.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# LIBVPL (dispatcher + header)
# Provides VPL header and dispatcher (libvpl.so.2) for FFmpeg
# Both MSDK and VPL runtime can be loaded by VPL dispatcher
pushd ${SOURCE_DIR}
git clone -b v2.17.0 --depth=1 https://github.com/intel/libvpl.git
pushd libvpl
sed -i 's|ParseEnvSearchPaths(ONEVPL_PRIORITY_PATH_VAR, searchDirList)|searchDirList.push_back("/usr/lib/jellyfin-ffmpeg/lib")|g' libvpl/src/mfx_dispatcher_vpl_loader.cpp
mkdir build && pushd build
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_INSTALL_BINDIR=${TARGET_DIR}/bin \
-DCMAKE_INSTALL_LIBDIR=${TARGET_DIR}/lib \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DINSTALL_{DEV,LIB}=ON \
-DINSTALL_EXAMPLES=OFF \
-DBUILD_{TESTS,EXAMPLES,EXPERIMENTAL}=OFF \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "Libs.private: -lstdc++" >> ${TARGET_DIR}/lib/pkgconfig/vpl.pc
echo "intel${TARGET_DIR}/lib/libvpl.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# VPL-GPU-RT (RT only)
# Provides VPL runtime (libmfx-gen.so.1.2) for 11th Gen Tiger Lake and newer
pushd ${SOURCE_DIR}
git clone -b intel-onevpl-26.2.4 --depth=1 https://github.com/intel/vpl-gpu-rt.git
pushd vpl-gpu-rt
# Fix missing entries in PicStruct validation
wget -q -O - https://github.com/intel/vpl-gpu-rt/commit/c7eb030.patch | git apply
mkdir build && pushd build
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_INSTALL_LIBDIR=${TARGET_DIR}/lib \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_RUNTIME=ON \
-DBUILD_{TESTS,TOOLS}=OFF \
-DMFX_ENABLE_{KERNELS,ENCTOOLS,AENC}=ON \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/lib/libmfx-gen* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# MEDIA-DRIVER
# Full Feature Build: ENABLE_KERNELS=ON(Default) ENABLE_NONFREE_KERNELS=ON(Default)
# Free Kernel Build: ENABLE_KERNELS=ON ENABLE_NONFREE_KERNELS=OFF
pushd ${SOURCE_DIR}
git clone -b intel-media-26.2.4 --depth=1 https://github.com/intel/media-driver.git
pushd media-driver
# Enable VC1 decode on DG2 (note that MTL+ is not supported)
wget -q -O - https://github.com/intel/media-driver/commit/e47702f.patch | git apply
# Fix iHD crashes when used with Xe KMD on small BAR systems
wget -q -O - https://github.com/intel/media-driver/commit/6fd4037.patch | git apply
mkdir build && pushd build
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_C_FLAGS="${CFLAGS} -Wno-error=array-bounds" \
-DCMAKE_CXX_FLAGS="${CXXFLAGS} -Wno-error=array-bounds" \
-DENABLE_KERNELS=ON \
-DENABLE_NONFREE_KERNELS=ON \
LIBVA_DRIVERS_PATH=${TARGET_DIR}/lib/dri \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
echo "intel${TARGET_DIR}/lib/libigfxcmrt.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
mkdir -p ${SOURCE_DIR}/intel/dri
cp -a ${TARGET_DIR}/lib/dri/iHD*.so ${SOURCE_DIR}/intel/dri
echo "intel/dri/iHD*.so usr/lib/jellyfin-ffmpeg/lib/dri" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
}
# Prepare extra headers, libs and drivers for {arm,aarch64}-linux-gnu*
prepare_extra_arm() {
# RKMPP
pushd ${SOURCE_DIR}
git clone -b jellyfin-mpp-next --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkmpp
pushd rkmpp
mkdir rkmpp_build
pushd rkmpp_build
cmake \
${CMAKE_TOOLCHAIN_OPT} \
-DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TEST=OFF \
..
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/rkmpp
echo "rkmpp${TARGET_DIR}/lib/librockchip_mpp.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
popd
popd
# RKRGA
pushd ${SOURCE_DIR}
git clone -b jellyfin-rga-next --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkrga
meson setup rkrga rkrga_build \
${MESON_CROSS_OPT} \
--prefix=${TARGET_DIR} \
--libdir=lib \
--buildtype=release \
--default-library=shared \
-Dcpp_args=-fpermissive \
-Dlibdrm=false \
-Dlibrga_demo=false
meson configure rkrga_build
ninja -j$(nproc) -C rkrga_build install
cp -a ${TARGET_DIR}/lib/librga.so* ${SOURCE_DIR}/rkrga
echo "rkrga/librga.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST}
popd
}
# Prepare the cross-toolchain
prepare_crossbuild_env_arm64() {
# Prepare the Ubuntu-specific cross-build requirements
if [[ $( lsb_release -i -s ) == "Debian" ]]; then
CODENAME="$( lsb_release -c -s )"
echo "deb [arch=amd64] ${DEBIAN_ADDR} ${CODENAME}-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb [arch=arm64] ${DEBIAN_ADDR} ${CODENAME}-backports main restricted universe multiverse" >> /etc/apt/sources.list
fi
if [[ $( lsb_release -i -s ) == "Ubuntu" ]]; then
CODENAME="$( lsb_release -c -s )"
# Remove the default sources
rm -f /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources
# Add arch-specific list files
cat <<EOF > /etc/apt/sources.list.d/amd64.list
deb [arch=amd64] ${UBUNTU_ARCHIVE_ADDR} ${CODENAME} main restricted universe multiverse
deb [arch=amd64] ${UBUNTU_ARCHIVE_ADDR} ${CODENAME}-updates main restricted universe multiverse
deb [arch=amd64] ${UBUNTU_ARCHIVE_ADDR} ${CODENAME}-backports main restricted universe multiverse
deb [arch=amd64] ${UBUNTU_ARCHIVE_ADDR} ${CODENAME}-security main restricted universe multiverse
EOF
cat <<EOF > /etc/apt/sources.list.d/arm64.list
deb [arch=arm64] ${UBUNTU_PORTS_ADDR} ${CODENAME} main restricted universe multiverse
deb [arch=arm64] ${UBUNTU_PORTS_ADDR} ${CODENAME}-updates main restricted universe multiverse
deb [arch=arm64] ${UBUNTU_PORTS_ADDR} ${CODENAME}-backports main restricted universe multiverse
deb [arch=arm64] ${UBUNTU_PORTS_ADDR} ${CODENAME}-security main restricted universe multiverse
EOF
fi
# Add arm64 architecture
dpkg --add-architecture arm64
apt-get update && apt-get dist-upgrade -y
# Install dependencies
ln -fs /usr/share/zoneinfo/America/Toronto /etc/localtime
yes | apt-get install -y -o Dpkg::Options::="--force-overwrite" -o APT::Immediate-Configure=0 gcc-${GCC_VER}-source gcc-${GCC_VER}-aarch64-linux-gnu g++-${GCC_VER}-aarch64-linux-gnu libstdc++6-arm64-cross binutils-aarch64-linux-gnu bison flex libtool gdb sharutils netbase libmpc-dev libmpfr-dev systemtap-sdt-dev autogen expect chrpath zip libc6-dev:arm64 linux-libc-dev:arm64 libgcc1:arm64 libstdc++6:arm64
# Create symlinks for versioned toolchains
for tool in {gcc,g++,gcc-ar,gcc-ranlib,gcc-nm}; do
ln -sf "/usr/bin/aarch64-linux-gnu-$tool-${GCC_VER}" "/usr/bin/aarch64-linux-gnu-$tool"
done
# Update pkgconfig search path
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/lib/aarch64-linux-gnu/pkgconfig
}
# Set the architecture-specific options
case ${ARCH} in
'amd64')
prepare_extra_common
prepare_extra_amd64
CONFIG_SITE=""
DEP_ARCH_OPT=""
BUILD_ARCH_OPT=""
;;
'arm64')
prepare_crossbuild_env_arm64
prepare_extra_common
prepare_extra_arm
CONFIG_SITE="/etc/dpkg-cross/cross-config.${ARCH}"
DEP_ARCH_OPT="--host-arch arm64"
BUILD_ARCH_OPT="-aarm64"
;;
esac
# Move to source directory
pushd ${SOURCE_DIR}
# Install dependencies and build the deb
yes | mk-build-deps -i ${DEP_ARCH_OPT}
dpkg-buildpackage -b -rfakeroot -us -uc ${BUILD_ARCH_OPT}
popd
# Move the artifacts out
mkdir -p ${ARTIFACT_DIR}/deb
mv /jellyfin-ffmpeg{,8}_* ${ARTIFACT_DIR}/deb/
chown -Rc $(stat -c %u:%g ${ARTIFACT_DIR}) ${ARTIFACT_DIR}