diff --git a/Dockerfile.in b/Dockerfile.in index a335d0c90..ed31d6b21 100644 --- a/Dockerfile.in +++ b/Dockerfile.in @@ -10,7 +10,8 @@ ENV GCC_VER=GCC_RELEASE_VERSION ENV SOURCE_DIR=/ffmpeg ENV ARTIFACT_DIR=/dist ENV TARGET_DIR=/usr/lib/jellyfin-ffmpeg -ENV PKG_CONFIG_PATH=${TARGET_DIR}/lib/pkgconfig:$PKG_CONFIG_PATH +ENV PATH=${TARGET_DIR}/bin:${PATH} +ENV PKG_CONFIG_PATH=${TARGET_DIR}/lib/pkgconfig:${PKG_CONFIG_PATH} ENV LD_LIBRARY_PATH=${TARGET_DIR}/lib:${TARGET_DIR}/lib/mfx:${TARGET_DIR}/lib/xorg:${LD_LIBRARY_PATH} ENV LDFLAGS=-Wl,-rpath=${TARGET_DIR}/lib ENV CXXFLAGS="-I${TARGET_DIR}/include $CXXFLAGS" @@ -19,12 +20,12 @@ ENV CFLAGS="-I${TARGET_DIR}/include $CFLAGS" # Prepare Debian build environment RUN apt-get update \ - && yes | apt-get install -y apt-transport-https curl ninja-build debhelper gnupg wget devscripts mmv equivs git nasm pkg-config subversion dh-autoreconf libdrm-dev libpciaccess-dev python3-pip + && yes | apt-get install -y apt-transport-https curl ninja-build debhelper gnupg wget devscripts mmv equivs git nasm pkg-config subversion dh-autoreconf libpciaccess-dev libwayland-dev libx11-dev libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev libxcb-shm0-dev libxcb-sync-dev libxshmfence-dev libxext-dev libxfixes-dev libxcb1-dev libxrandr-dev libzstd-dev libelf-dev libudev-dev python3-pip python3-mako zip unzip tar flex bison # Install meson and cmake RUN pip3 install meson cmake -# Avoids timeouts when using git -RUN git config --global http.postbuffer 524288000 +# Avoids timeouts when using git and disable the detachedHead advice +RUN git config --global http.postbuffer 524288000 && git config --global advice.detachedHead false # Link to docker-build script RUN ln -sf ${SOURCE_DIR}/docker-build.sh /docker-build.sh diff --git a/Dockerfile.win64.in b/Dockerfile.win64.in index de08c7a9b..9c5622da2 100644 --- a/Dockerfile.win64.in +++ b/Dockerfile.win64.in @@ -32,6 +32,11 @@ RUN \ rm /usr/lib/gcc/*-w64-mingw32/*/*.dll.a && \ rm /usr/*-w64-mingw32/lib/*.dll.a +# Avoids timeouts when using git and disable the detachedHead advice +RUN \ + git config --global http.postbuffer 524288000 && \ + git config --global advice.detachedHead false + # Prepare build script and patches RUN \ mkdir -p /opt/ffmpeg /opt/ffdeps ${SOURCE_DIR} && \ diff --git a/debian/control b/debian/control index ecdb61a70..c5d0f66b0 100644 --- a/debian/control +++ b/debian/control @@ -20,7 +20,7 @@ Build-Depends: # --enable-libbluray libbluray-dev, # --enable-libdrm - libdrm-dev, + libdrm-dev [!amd64], # --enable-libfontconfig libfontconfig-dev, # --enable-libfreetype @@ -45,8 +45,6 @@ Build-Depends: libx265-dev, # --enable-libzvbi libzvbi-dev, -# --enable-vdpau - libvdpau-dev, # --enable-cuda-llvm clang [!armhf !arm64], # --enable-opencl diff --git a/debian/rules b/debian/rules index c7cc2fa1f..d96fc32ce 100755 --- a/debian/rules +++ b/debian/rules @@ -57,11 +57,13 @@ CONFIG_ARM64 := ${CONFIG_ARM_COMMON} \ --cross-prefix=/usr/bin/aarch64-linux-gnu- \ CONFIG_x86 := --arch=amd64 \ + --enable-libshaderc \ + --enable-libplacebo \ + --enable-vulkan \ --enable-opencl \ --enable-vaapi \ --enable-amf \ --enable-libmfx \ - --enable-vdpau \ --enable-ffnvcodec \ --enable-cuda \ --enable-cuda-llvm \ diff --git a/docker-build.sh b/docker-build.sh index 39c6c9696..c4a225229 100755 --- a/docker-build.sh +++ b/docker-build.sh @@ -10,7 +10,7 @@ PORTS_ADDR=http://ports.ubuntu.com/ # Prepare common extra libs for amd64, armhf and arm64 prepare_extra_common() { - # Download and install zimg for zscale filter + # ZIMG pushd ${SOURCE_DIR} git clone --depth=1 https://github.com/sekrit-twc/zimg pushd zimg @@ -32,12 +32,9 @@ prepare_extra_common() { popd popd - # Download and install dav1d + # DAV1D pushd ${SOURCE_DIR} git clone -b 1.0.0 --depth=1 https://code.videolan.org/videolan/dav1d.git - pushd dav1d - mkdir build - pushd build nasmver="$(nasm -v | cut -d ' ' -f3)" nasmminver="2.14.0" if [ "$(printf '%s\n' "$nasmminver" "$nasmver" | sort -V | head -n1)" = "$nasmminver" ]; then @@ -46,38 +43,41 @@ prepare_extra_common() { x86asm=false fi if [ "${ARCH}" = "amd64" ]; then - meson -Denable_asm=$x86asm \ - -Denable_{tools,tests,examples}=false \ - -Ddefault_library=shared \ - --prefix=${TARGET_DIR} .. - ninja - meson install - cp ${TARGET_DIR}/lib/x86_64-linux-gnu/pkgconfig/dav1d.pc /usr/lib/pkgconfig - cp ${TARGET_DIR}/lib/x86_64-linux-gnu/*dav1d* ${SOURCE_DIR}/dav1d - echo "dav1d/*dav1d* /usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + meson setup dav1d dav1d_build \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + -Ddefault_library=shared \ + -Denable_asm=$x86asm \ + -Denable_{tools,tests,examples}=false + meson configure dav1d_build + ninja -C dav1d_build install + cp ${TARGET_DIR}/lib/libdav1d.so* ${SOURCE_DIR}/dav1d + echo "dav1d/libdav1d.so* /usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install fi if [ "${ARCH}" = "armhf" ] || [ "${ARCH}" = "arm64" ]; then - meson -Denable_asm=true \ - -Denable_{tools,tests,examples}=false \ - -Ddefault_library=shared \ - --cross-file=${SOURCE_DIR}/cross-${ARCH}.meson \ - --prefix=${TARGET_DIR} .. - ninja - meson install - cp ${TARGET_DIR}/lib/pkgconfig/dav1d.pc /usr/lib/pkgconfig - cp ${TARGET_DIR}/lib/*dav1d* ${SOURCE_DIR}/dav1d - echo "dav1d/*dav1d* /usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + meson setup dav1d dav1d_build \ + --cross-file=${SOURCE_DIR}/cross-${ARCH}.meson \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + --buildtype=release \ + -Ddefault_library=shared \ + -Denable_asm=true \ + -Denable_{tools,tests,examples}=false + meson configure dav1d_build + ninja -C dav1d_build install + cp ${TARGET_DIR}/lib/libdav1d.so* ${SOURCE_DIR}/dav1d + echo "dav1d/libdav1d.so* /usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install fi popd - popd - popd - # Download and install fdk-aac-stripped + # FDK-AAC-STRIPPED pushd ${SOURCE_DIR} git clone -b stripped4 --depth=1 https://gitlab.freedesktop.org/wtaymans/fdk-aac-stripped.git pushd fdk-aac-stripped ./autogen.sh - ./configure --disable-silent-rules --disable-static --prefix=${TARGET_DIR} CFLAGS="-O3 -DNDEBUG" CXXFLAGS="-O3 -DNDEBUG" ${CROSS_OPT} + ./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" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install popd @@ -86,16 +86,16 @@ prepare_extra_common() { # Prepare extra headers, libs and drivers for x86_64-linux-gnu prepare_extra_amd64() { - # Download and install the nvidia headers + # FFNVCODEC pushd ${SOURCE_DIR} - git clone -b n11.0.10.1 --depth=1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git + git clone -b n11.0.10.1 --depth=1 https://github.com/FFmpeg/nv-codec-headers pushd nv-codec-headers make make install popd popd - # Download and setup AMD AMF headers + # AMF # https://www.ffmpeg.org/general.html#AMD-AMF_002fVCE git clone --depth=1 https://github.com/GPUOpen-LibrariesAndSDKs/AMF pushd AMF/amf/public/include @@ -103,21 +103,41 @@ prepare_extra_amd64() { mv * /usr/include/AMF popd - # Download and install libva + # LIBDRM + pushd ${SOURCE_DIR} + git clone -b libdrm-2.4.110 --depth=1 https://gitlab.freedesktop.org/mesa/drm.git + meson setup drm drm_build \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + --buildtype=release \ + -D{amdgpu,radeon,intel,udev}=true \ + -D{libkms,valgrind,freedreno,vc4,vmwgfx,nouveau,man-pages}=false + meson configure drm_build + ninja -C drm_build install + cp ${TARGET_DIR}/lib/libdrm*.so* ${SOURCE_DIR}/drm + cp ${TARGET_DIR}/share/libdrm/*.ids ${SOURCE_DIR}/drm + echo "drm/libdrm*.so* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "drm/*.ids usr/lib/jellyfin-ffmpeg/share/libdrm" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + popd + + # LIBVA pushd ${SOURCE_DIR} git clone --depth=1 https://github.com/intel/libva pushd libva sed -i 's|getenv("LIBVA_DRIVERS_PATH")|"/usr/lib/jellyfin-ffmpeg/lib/dri:/usr/lib/x86_64-linux-gnu/dri:/usr/lib/dri:/usr/local/lib/dri"|g' va/va.c sed -i 's|getenv("LIBVA_DRIVER_NAME")|getenv("LIBVA_DRIVER_NAME_JELLYFIN")|g' va/va.c ./autogen.sh - ./configure --prefix=${TARGET_DIR} + ./configure \ + --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" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install echo "intel${TARGET_DIR}/lib/libva-drm.so* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install popd popd - # Download and install libva-utils + # LIBVA-UTILS pushd ${SOURCE_DIR} git clone --depth=1 https://github.com/intel/libva-utils pushd libva-utils @@ -128,7 +148,7 @@ prepare_extra_amd64() { popd popd - # Download and install intel-vaapi-driver + # INTEL-VAAPI-DRIVER pushd ${SOURCE_DIR} git clone --depth=1 https://github.com/intel/intel-vaapi-driver pushd intel-vaapi-driver @@ -141,7 +161,7 @@ prepare_extra_amd64() { popd popd - # Download and install gmmlib + # GMMLIB pushd ${SOURCE_DIR} git clone -b intel-gmmlib-22.1.2 --depth=1 https://github.com/intel/gmmlib pushd gmmlib @@ -154,7 +174,7 @@ prepare_extra_amd64() { popd popd - # Download and install MediaSDK + # MediaSDK # Provides MSDK runtime (libmfxhw64.so.1) for 11th Gen Rocket Lake and older # Provides MFX dispatcher (libmfx.so.1) for FFmpeg pushd ${SOURCE_DIR} @@ -174,7 +194,7 @@ prepare_extra_amd64() { popd popd - # Download and install oneVPL-intel-gpu + # ONEVPL-INTEL-GPU # Provides VPL runtime (libmfx-gen.so.1.2) for 11th Gen Tiger Lake and newer # Both MSDK and VPL runtime can be loaded by MFX dispatcher (libmfx.so.1) pushd ${SOURCE_DIR} @@ -183,17 +203,18 @@ prepare_extra_amd64() { 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/libmfx-gen.so* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "intel${TARGET_DIR}/lib/libmfx-gen* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install popd popd popd - # Download and install media-driver + # 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-22.4.0 --depth=1 https://github.com/intel/media-driver pushd media-driver + sed -i 's|find_package(X11)||g' media_softlet/media_top_cmake.cmake media_driver/media_top_cmake.cmake mkdir build && pushd build cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \ -DENABLE_KERNELS=ON \ @@ -208,6 +229,140 @@ prepare_extra_amd64() { popd popd popd + + # Vulkan Headers + pushd ${SOURCE_DIR} + git clone -b v1.3.212 --depth=1 https://github.com/KhronosGroup/Vulkan-Headers + pushd Vulkan-Headers + mkdir build && pushd build + cmake \ + -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.3.212 --depth=1 https://github.com/KhronosGroup/Vulkan-Loader + pushd Vulkan-Loader + mkdir build && pushd build + cmake \ + -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,WAYLAND}_SUPPORT=ON .. + make -j$(nproc) && make install + cp ${TARGET_DIR}/lib/libvulkan.so* ${SOURCE_DIR}/Vulkan-Loader + echo "Vulkan-Loader/libvulkan.so* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + popd + popd + popd + + # SHADERC + pushd ${SOURCE_DIR} + git clone -b v2022.1 --depth=1 https://github.com/google/shaderc + pushd shaderc + ./utils/git-sync-deps + mkdir build && pushd build + cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \ + -DSHADERC_SKIP_{TESTS,EXAMPLES,COPYRIGHT_CHECK}=ON \ + -DENABLE_{GLSLANG_BINARIES,EXCEPTIONS}=ON \ + -DENABLE_CTEST=OFF \ + -DSPIRV_SKIP_EXECUTABLES=ON \ + -DSPIRV_TOOLS_BUILD_STATIC=OFF \ + -DBUILD_SHARED_LIBS=ON .. + ninja -j$(nproc) + ninja install + cp ${TARGET_DIR}/lib/{libshaderc_shared,libSPIRV,libSPIRV-Tools,libSPIRV-Tools-opt}.so* ${SOURCE_DIR}/shaderc + echo "shaderc/libshaderc_shared* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "shaderc/libSPIRV* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + popd + popd + popd + + # MESA + # Minimal libs for AMD VAAPI, AMD RADV and Intel ANV + if [[ $( lsb_release -c -s ) != "bionic" ]]; then + # llvm >= 11 + apt-get install -y llvm-11-dev + pushd ${SOURCE_DIR} + git clone -b mesa-22.0.2 --depth=1 https://gitlab.freedesktop.org/mesa/mesa.git + meson setup mesa mesa_build \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + --buildtype=release \ + --wrap-mode=nofallback \ + -Db_ndebug=true \ + -Db_lto=false \ + -Dplatforms=x11\ + -Ddri-drivers=[] \ + -Dgallium-drivers=radeonsi \ + -Dvulkan-drivers=amd,intel \ + -Dvulkan-layers=device-select,overlay \ + -Ddri3=enabled \ + -Degl=disabled \ + -Dgallium-{extra-hud,nine}=false \ + -Dgallium-{omx,vdpau,xa,xvmc,opencl}=disabled \ + -Dgallium-va=enabled \ + -Dgbm=disabled \ + -Dgles1=disabled \ + -Dgles2=disabled \ + -Dopengl=false \ + -Dglvnd=false \ + -Dglx=disabled \ + -Dlibunwind=disabled \ + -Dllvm=enabled \ + -Dlmsensors=disabled \ + -Dosmesa=false \ + -Dshared-glapi=disabled \ + -Dvalgrind=disabled \ + -Dtools=[] \ + -Dzstd=enabled \ + -Dmicrosoft-clc=disabled + meson configure mesa_build + ninja -C mesa_build install + cp ${TARGET_DIR}/lib/libvulkan_*.so ${SOURCE_DIR}/mesa + cp ${TARGET_DIR}/lib/libVkLayer_MESA*.so ${SOURCE_DIR}/mesa + cp ${TARGET_DIR}/lib/dri/radeonsi_drv_video.so ${SOURCE_DIR}/mesa + echo "mesa/lib*.so usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "mesa/radeonsi_drv_video.so usr/lib/jellyfin-ffmpeg/lib/dri" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + cp ${TARGET_DIR}/share/drirc.d/*.conf ${SOURCE_DIR}/mesa + echo "mesa/*defaults.conf usr/lib/jellyfin-ffmpeg/share/drirc.d" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + cp ${TARGET_DIR}/share/vulkan/{icd.d,explicit_layer.d,implicit_layer.d}/*.json ${SOURCE_DIR}/mesa + echo "mesa/*icd.x86_64.json usr/lib/jellyfin-ffmpeg/share/vulkan/icd.d" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "mesa/*overlay.json usr/lib/jellyfin-ffmpeg/share/vulkan/explicit_layer.d" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + echo "mesa/*device_select.json usr/lib/jellyfin-ffmpeg/share/vulkan/implicit_layer.d" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + popd + fi + + # LIBPLACEBO + pushd ${SOURCE_DIR} + git clone --depth=1 https://github.com/haasn/libplacebo + meson setup libplacebo placebo_build \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + --buildtype=release \ + --default-library=shared \ + -Dvulkan=enabled \ + -Dvulkan-link=false \ + -Dvulkan-registry=${TARGET_DIR}/share/vulkan/registry/vk.xml \ + -Dshaderc=enabled \ + -Dglslang=disabled \ + -D{demos,tests,bench,fuzz}=false + meson configure placebo_build + ninja -C placebo_build install + cp ${TARGET_DIR}/lib/libplacebo.so* ${SOURCE_DIR}/libplacebo + echo "libplacebo/libplacebo* usr/lib/jellyfin-ffmpeg/lib" >> ${SOURCE_DIR}/debian/jellyfin-ffmpeg.install + popd } # Prepare the cross-toolchain