diff --git a/multimedia/jellyfin-ffmpeg/Makefile b/multimedia/jellyfin-ffmpeg/Makefile index 32a40449e5f4..3f0908f87cf5 100644 --- a/multimedia/jellyfin-ffmpeg/Makefile +++ b/multimedia/jellyfin-ffmpeg/Makefile @@ -1,155 +1,161 @@ PORTNAME= jellyfin-ffmpeg PORTVERSION= 8.1.2.5 +PORTREVISION= 1 CATEGORIES= multimedia MAINTAINER= michaeljohnson@ahze.net COMMENT= FFmpeg with patches for HDR tone mapping (tonemapx/libplacebo) WWW= https://github.com/jellyfin/jellyfin-ffmpeg LICENSE= GPLv2+ LGPL21+ LICENSE_COMB= multi ONLY_FOR_ARCHS= aarch64 amd64 ONLY_FOR_ARCHS_REASON= upstream jellyfin-ffmpeg targets 64-bit; 32-bit builds non-PIC asm that lld rejects BUILD_DEPENDS= nasm:devel/nasm \ ${LOCALBASE}/include/fftw3.h:math/fftw3 \ ${LOCALBASE}/lib/libfftw3f.a:math/fftw3-float \ - ${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers + ${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers \ + ${LOCALBASE}/include/CL/cl.h:devel/opencl PATCH_DEPENDS= quilt:devel/quilt -LIB_DEPENDS= libass.so:multimedia/libass \ +LIB_DEPENDS= libOpenCL.so:devel/ocl-icd \ + libass.so:multimedia/libass \ libbluray.so:multimedia/libbluray \ libdav1d.so:multimedia/dav1d \ libfdk-aac.so:audio/fdk-aac \ libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 \ libfribidi.so:converters/fribidi \ libgmp.so:math/gmp \ libharfbuzz.so:print/harfbuzz \ libmp3lame.so:audio/lame \ libopenmpt.so:audio/libopenmpt \ libopus.so:audio/opus \ libplacebo.so:graphics/libplacebo \ libshaderc_shared.so:graphics/shaderc \ libSvtAv1Enc.so:multimedia/svt-av1 \ libtheoraenc.so:multimedia/libtheora \ libvorbis.so:audio/libvorbis \ libvpx.so:multimedia/libvpx \ libvulkan.so:graphics/vulkan-loader \ libwebp.so:graphics/webp \ libx264.so:multimedia/libx264 \ libx265.so:multimedia/x265 \ libzimg.so:graphics/sekrit-twc-zimg \ libzvbi.so:devel/libzvbi \ libgnutls.so:security/gnutls \ libxml2.so:textproc/libxml2 \ libiconv.so:converters/libiconv \ libva.so:multimedia/libva \ libva-drm.so:multimedia/libva \ libdrm.so:graphics/libdrm \ libvdpau.so:multimedia/libvdpau \ libX11.so:x11/libX11 \ libasound.so:audio/alsa-lib \ libsndio.so:audio/sndio USES= cmake:indirect compiler:c17 gmake localbase:ldflags pkgconfig tar:xz USE_GITHUB= yes GH_ACCOUNT= jellyfin GH_PROJECT= jellyfin-ffmpeg GH_TAGNAME= v${PORTVERSION:C/\.([0-9]+)$/-\1/} GH_TUPLE= acoustid:chromaprint:v1.6.0:chromaprint # Everything installs into a private subdir so nothing collides with # multimedia/ffmpeg or jellyfin-ffmpeg7; only the suffixed bin/ symlinks land # in PREFIX. --enable-rpath lets the binary load the bundled libs without # ldconfig even when base ffmpeg shares the same soname. JFFMPEG_DIR= ${PREFIX}/lib/jellyfin-ffmpeg8 post-patch: cd ${WRKSRC} && QUILT_PATCHES=debian/patches quilt push -a || \ QUILT_PATCHES=debian/patches quilt applied | ${GREP} -q 0098 + cd ${WRKSRC} && ${PATCH} -p0 --forward --quiet \ + < ${FILESDIR}/extra-patch-overlay_vulkan-framesync # Static chromaprint on fftw3f, as upstream's builder does: audio/chromaprint # links multimedia/ffmpeg for its FFT, dragging a second FFmpeg and ~30 other # ports (gcc, boost, numpy, ...) into this port's runtime. CHROMAPRINT_PREFIX= ${WRKDIR}/chromaprint-static CMAKE_INSTALL_PREFIX= ${CHROMAPRINT_PREFIX} CMAKE_ARGS+= -DCMAKE_INSTALL_LIBDIR:STRING=lib -DFFT_LIB:STRING=fftw3f CMAKE_ON= CMAKE_DISABLE_FIND_PACKAGE_FFmpeg CMAKE_POSITION_INDEPENDENT_CODE CMAKE_OFF= BUILD_SHARED_LIBS BUILD_TESTS BUILD_TOOLS pre-configure: ${SETENVI} ${WRK_ENV} ${CMAKE_BIN} ${CMAKE_ARGS} \ -S ${WRKSRC_chromaprint} -B ${WRKDIR}/chromaprint-build ${SETENVI} ${WRK_ENV} ${CMAKE_BIN} --build ${WRKDIR}/chromaprint-build \ -j ${MAKE_JOBS_NUMBER} ${SETENVI} ${WRK_ENV} ${CMAKE_BIN} --install ${WRKDIR}/chromaprint-build # configure links with plain `pkg-config --libs` (shared build), so the # static deps go in Libs:, not Libs.private: as upstream's builder does ${REINPLACE_CMD} -e 's|^Libs:.*|Libs: -L$${libdir} -lchromaprint ${LOCALBASE}/lib/libfftw3f.a -lc++ -lm|' \ ${CHROMAPRINT_PREFIX}/lib/pkgconfig/libchromaprint.pc HAS_CONFIGURE= yes CONFIGURE_LOG= ffbuild/config.log CONFIGURE_ENV+= PKG_CONFIG_PATH=${CHROMAPRINT_PREFIX}/lib/pkgconfig NOPRECIOUSMAKEVARS= yes MAKE_ENV+= V=1 CONFIGURE_ARGS= --prefix="${JFFMPEG_DIR}" \ --libdir="${JFFMPEG_DIR}/lib" \ --enable-rpath \ --target-os=freebsd \ --cc="${CC}" --cxx="${CXX}" \ --extra-version=Jellyfin \ --disable-unstable \ --disable-doc \ --disable-ffplay \ --disable-static \ --disable-libxcb \ --disable-sdl2 \ --disable-xlib \ --enable-lto=auto \ --enable-gpl \ --enable-version3 \ --enable-shared \ --enable-gmp \ --enable-gnutls \ --enable-libxml2 \ --enable-libass \ --enable-libfreetype \ --enable-libfribidi \ --enable-libfontconfig \ --enable-libharfbuzz \ --enable-libbluray \ --enable-chromaprint \ --enable-libdrm \ --enable-libfdk-aac \ --enable-libmp3lame \ --enable-libopenmpt \ --enable-libopus \ --enable-libtheora \ --enable-libvorbis \ --enable-libdav1d \ --enable-libsvtav1 \ --enable-libwebp \ --enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-libzimg \ --enable-libzvbi \ + --enable-opencl \ --enable-libplacebo \ --enable-libshaderc \ --enable-vulkan \ --enable-vaapi \ --enable-vdpau \ --disable-ffnvcodec INSTALL_TARGET= install-progs install-data install-libs post-install: # Version-suffixed symlinks in /usr/local/bin for PATH access ${LN} -sf ../lib/jellyfin-ffmpeg8/bin/ffmpeg ${STAGEDIR}${PREFIX}/bin/jellyfin-ffmpeg8 ${LN} -sf ../lib/jellyfin-ffmpeg8/bin/ffprobe ${STAGEDIR}${PREFIX}/bin/jellyfin-ffprobe8 .include diff --git a/multimedia/jellyfin-ffmpeg/files/extra-patch-overlay_vulkan-framesync b/multimedia/jellyfin-ffmpeg/files/extra-patch-overlay_vulkan-framesync new file mode 100644 index 000000000000..7d24333c7d2b --- /dev/null +++ b/multimedia/jellyfin-ffmpeg/files/extra-patch-overlay_vulkan-framesync @@ -0,0 +1,34 @@ +Expose the framesync options on overlay_vulkan. + +The filter already drives framesync internally (ff_framesync_init_dualinput, +ff_framesync_configure, ff_framesync_activate) but declares its AVClass with +AVFILTER_DEFINE_CLASS, so eof_action/shortest/repeatlast are never advertised +and framesync's option defaults are never initialised. Every other overlay_* +filter (overlay, overlay_vaapi, overlay_opencl, overlay_cuda) uses +FRAMESYNC_DEFINE_CLASS together with a .preinit callback. + +Beyond the missing functionality, Jellyfin probes overlay_vulkan for the +"Action to take when encountering EOF from secondary input" option to decide +whether the Vulkan filter chain is usable. Without it IsVulkanFullSupported() +returns false, Jellyfin falls back to a VAAPI pipeline with no HDR tone +mapping, and HDR content is transcoded to SDR untonemapped (washed out). + +--- libavfilter/vf_overlay_vulkan.c.orig ++++ libavfilter/vf_overlay_vulkan.c +@@ -231,7 +231,7 @@ + { NULL }, + }; + +-AVFILTER_DEFINE_CLASS(overlay_vulkan); ++FRAMESYNC_DEFINE_CLASS(overlay_vulkan, OverlayVulkanContext, fs); + + static const AVFilterPad overlay_vulkan_inputs[] = { + { +@@ -265,6 +265,7 @@ + .init = &overlay_vulkan_init, + .uninit = &overlay_vulkan_uninit, + .activate = &overlay_vulkan_activate, ++ .preinit = overlay_vulkan_framesync_preinit, + FILTER_INPUTS(overlay_vulkan_inputs), + FILTER_OUTPUTS(overlay_vulkan_outputs), + FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),