From 86be6b56caf1e4266214f463daa507476b4afd10 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Fri, 27 May 2022 03:36:12 +0800 Subject: [PATCH] Enable chromaprint in ffmpeg --- Dockerfile.in | 2 +- debian/rules | 2 + docker-build-win64.sh | 45 +++++++++++++++ docker-build.sh | 130 ++++++++++++++++++++++++++++-------------- toolchain-arm64.cmake | 13 +++++ toolchain-armhf.cmake | 13 +++++ 6 files changed, 162 insertions(+), 43 deletions(-) create mode 100644 toolchain-arm64.cmake create mode 100644 toolchain-armhf.cmake diff --git a/Dockerfile.in b/Dockerfile.in index aabc3051a..7c2df436a 100644 --- a/Dockerfile.in +++ b/Dockerfile.in @@ -14,7 +14,7 @@ ENV DPKG_INSTALL_LIST=${SOURCE_DIR}/debian/jellyfin-ffmpeg5.install 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 LDFLAGS="-Wl,-rpath=${TARGET_DIR}/lib -L${TARGET_DIR}/lib" ENV CXXFLAGS="-I${TARGET_DIR}/include $CXXFLAGS" ENV CPPFLAGS="-I${TARGET_DIR}/include $CPPFLAGS" ENV CFLAGS="-I${TARGET_DIR}/include $CFLAGS" diff --git a/debian/rules b/debian/rules index 8c13a9a43..5ad88c5a4 100755 --- a/debian/rules +++ b/debian/rules @@ -12,6 +12,7 @@ PACKAGEVERSION := "$(ORIG_VERSION)-$(VERSION_SUFFIX)" CONFIG := --prefix=${TARGET_DIR} \ --target-os=linux \ + --extra-libs='-lfftw3' \ --extra-version=Jellyfin \ --disable-doc \ --disable-ffplay \ @@ -26,6 +27,7 @@ CONFIG := --prefix=${TARGET_DIR} \ --enable-static \ --enable-gmp \ --enable-gnutls \ + --enable-chromaprint \ --enable-libdrm \ --enable-libass \ --enable-libfreetype \ diff --git a/docker-build-win64.sh b/docker-build-win64.sh index c4b582678..5238bcae6 100755 --- a/docker-build-win64.sh +++ b/docker-build-win64.sh @@ -121,6 +121,48 @@ make install popd popd +# FFTW3 +mkdir fftw3 +pushd fftw3 +fftw3_ver="3.3.10" +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} +./configure \ + --prefix=${FF_DEPS_PREFIX} \ + --host=${FF_TOOLCHAIN} \ + --disable-{shared,doc} \ + --enable-{static,threads,fortran} \ + --enable-{sse2,avx,avx-128-fma,avx2,avx512} \ + --with-our-malloc \ + --with-combined-threads \ + --with-incoming-stack-boundary=2 +make -j$(nproc) +make install +popd +popd + +# CHROMAPRINT +git clone --depth=1 https://github.com/acoustid/chromaprint.git +pushd chromaprint +mkdir build +pushd build +cmake \ + -DCMAKE_TOOLCHAIN_FILE=${FF_CMAKE_TOOLCHAIN} \ + -DCMAKE_INSTALL_PREFIX=${FF_DEPS_PREFIX} \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_{TOOLS,TESTS}=OFF \ + -DFFT_LIB=fftw3 \ + .. +make -j$(nproc) +make install +FF_EXTRA_LIBS="-lfftw3 -lstdc++${FF_EXTRA_LIBS}" +FF_EXTRA_CFLAGS="-DCHROMAPRINT_NODLL${FF_EXTRA_CFLAGS}" +popd +popd + # LZMA mkdir xz pushd xz @@ -508,6 +550,8 @@ fi ./configure \ --prefix=${FF_PREFIX} \ ${FF_TARGET_FLAGS} \ + --extra-libs="${FF_EXTRA_LIBS}" \ + --extra-cflags="${FF_EXTRA_CFLAGS}" \ --extra-version=Jellyfin \ --disable-ffplay \ --disable-debug \ @@ -526,6 +570,7 @@ fi --enable-zlib \ --enable-lzma \ --enable-gmp \ + --enable-chromaprint \ --enable-libfreetype \ --enable-libfribidi \ --enable-libfontconfig \ diff --git a/docker-build.sh b/docker-build.sh index a6383dd9f..eb5a085e9 100755 --- a/docker-build.sh +++ b/docker-build.sh @@ -10,21 +10,77 @@ PORTS_ADDR=http://ports.ubuntu.com/ # Prepare common extra libs for amd64, armhf and arm64 prepare_extra_common() { + case ${ARCH} in + 'amd64') + CROSS_OPT="" + CMAKE_TOOLCHAIN_OPT="" + MESON_CROSS_OPT="" + ;; + 'armhf') + CROSS_OPT="--host=armv7-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++" + CMAKE_TOOLCHAIN_OPT="-DCMAKE_TOOLCHAIN_FILE=${SOURCE_DIR}/toolchain-${ARCH}.cmake" + MESON_CROSS_OPT="--cross-file=${SOURCE_DIR}/cross-${ARCH}.meson" + ;; + 'arm64') + 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 + + # FFTW3 + pushd ${SOURCE_DIR} + mkdir fftw3 + pushd fftw3 + fftw3_ver="3.3.10" + 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="" + fi + ./configure \ + ${CROSS_OPT} \ + --prefix=${TARGET_DIR} \ + --disable-{static,doc} \ + --enable-{shared,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/libfftw3.so* usr/lib/jellyfin-ffmpeg/lib" >> ${DPKG_INSTALL_LIST} + popd + popd + popd + + # CHROMAPRINT + pushd ${SOURCE_DIR} + git clone --depth=1 https://github.com/acoustid/chromaprint.git + pushd chromaprint + 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=fftw3 \ + .. + 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 --depth=1 https://github.com/sekrit-twc/zimg pushd zimg - case ${ARCH} in - 'amd64') - CROSS_OPT="" - ;; - 'armhf') - CROSS_OPT="--host=armv7-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++" - ;; - 'arm64') - CROSS_OPT="--host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++" - ;; - esac ./autogen.sh ./configure --prefix=${TARGET_DIR} ${CROSS_OPT} make -j $(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/zimg @@ -35,39 +91,29 @@ prepare_extra_common() { # DAV1D pushd ${SOURCE_DIR} git clone -b 1.0.0 --depth=1 https://code.videolan.org/videolan/dav1d.git - nasmver="$(nasm -v | cut -d ' ' -f3)" - nasmminver="2.14.0" - if [ "$(printf '%s\n' "$nasmminver" "$nasmver" | sort -V | head -n1)" = "$nasmminver" ]; then - x86asm=true - else - x86asm=false - fi if [ "${ARCH}" = "amd64" ]; then - 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" >> ${DPKG_INSTALL_LIST} - fi - if [ "${ARCH}" = "armhf" ] || [ "${ARCH}" = "arm64" ]; then - 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" >> ${DPKG_INSTALL_LIST} + nasmver="$(nasm -v | cut -d ' ' -f3)" + nasmminver="2.14.0" + if [ "$(printf '%s\n' "$nasmminver" "$nasmver" | sort -V | head -n1)" = "$nasmminver" ]; then + dav1d_asm=true + else + dav1d_asm=false + fi + else + dav1d_asm=true fi + meson setup dav1d dav1d_build \ + ${MESON_CROSS_OPT} \ + --prefix=${TARGET_DIR} \ + --libdir=lib \ + --buildtype=release \ + -Ddefault_library=shared \ + -Denable_asm=$dav1d_asm \ + -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" >> ${DPKG_INSTALL_LIST} popd # FDK-AAC-STRIPPED diff --git a/toolchain-arm64.cmake b/toolchain-arm64.cmake new file mode 100644 index 000000000..884774045 --- /dev/null +++ b/toolchain-arm64.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) +set(CMAKE_RANLIB aarch64-linux-gnu-ranlib) +set(CMAKE_AR aarch64-linux-gnu-ar) + +set(CMAKE_FIND_ROOT_PATH /usr/bin /usr/lib/jellyfin-ffmpeg /usr/aarch64-linux-gnu) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/toolchain-armhf.cmake b/toolchain-armhf.cmake new file mode 100644 index 000000000..dce53e360 --- /dev/null +++ b/toolchain-armhf.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR armv7) + +set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) +set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) +set(CMAKE_RANLIB arm-linux-gnueabihf-ranlib) +set(CMAKE_AR arm-linux-gnueabihf-ar) + +set(CMAKE_FIND_ROOT_PATH /usr/bin /usr/lib/jellyfin-ffmpeg /usr/arm-linux-gnueabihf) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)