[staging-next] I fell down an AVIF hole (#395997)

Changed files
+63 -35
pkgs
by-name
development
python-modules
pillow
+42 -10
pkgs/by-name/li/libavif/package.nix
···
lib,
stdenv,
fetchFromGitHub,
+
fetchpatch,
libaom,
cmake,
pkg-config,
···
libpng,
libjpeg,
libwebp,
+
libxml2,
dav1d,
libyuv,
gdk-pixbuf,
makeWrapper,
+
gtest,
}:
let
gdkPixbufModuleDir = "${placeholder "out"}/${gdk-pixbuf.moduleDir}";
gdkPixbufModuleFile = "${placeholder "out"}/${gdk-pixbuf.binaryDir}/avif-loaders.cache";
+
+
libargparse = fetchFromGitHub {
+
owner = "kmurray";
+
repo = "libargparse";
+
rev = "ee74d1b53bd680748af14e737378de57e2a0a954";
+
hash = "sha256-8RzKNjnX+Bpr6keck5xQL1NdfqMGNLLOUfB+zz5Iac8=";
+
};
in
stdenv.mkDerivation rec {
pname = "libavif";
-
version = "1.1.1";
+
version = "1.2.1";
src = fetchFromGitHub {
owner = "AOMediaCodec";
repo = "libavif";
rev = "v${version}";
-
hash = "sha256-kop1S4A/+hP2YdgoMXP7OMVPc2eoRnHpoBrPnW6KWyM=";
+
hash = "sha256-cT8Q/VEJ+r971cbuZX92Gf6UX2kMOyZd4Cs2xMxS0Tw=";
};
+
# Adjust some tests to pass on aarch64
+
# FIXME: remove in next update
+
patches = [
+
(fetchpatch {
+
url = "https://github.com/AOMediaCodec/libavif/commit/1e9ef51f32fa23bd7a94d8c01d5205334bc9c52f.patch";
+
hash = "sha256-4V7NpuJ+YNm103RMO47TIZaApTm3S6c5RKsjLZFNwYw=";
+
})
+
+
(fetchpatch {
+
url = "https://github.com/AOMediaCodec/libavif/commit/0f1618a25c5eba41b6fec947207d0a32ae3cc6c5.patch";
+
hash = "sha256-ORNhD4QtHmBcOYSajnZn7QMfRC3MF4rgUin/Vw+2ztA=";
+
})
+
];
+
+
postPatch = ''
+
substituteInPlace contrib/gdk-pixbuf/avif.thumbnailer.in \
+
--replace-fail '@CMAKE_INSTALL_FULL_BINDIR@/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-avif"
+
+
ln -s ${libargparse} ext/libargparse
+
'';
+
# reco: encode libaom slowest but best, decode dav1d fastest
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
-
"-DAVIF_CODEC_AOM=ON" # best encoder (slow but small)
-
"-DAVIF_CODEC_DAV1D=ON" # best decoder (fast)
-
"-DAVIF_CODEC_AOM_DECODE=OFF"
+
"-DAVIF_CODEC_AOM=SYSTEM" # best encoder (slow but small)
+
"-DAVIF_CODEC_DAV1D=SYSTEM" # best decoder (fast)
"-DAVIF_BUILD_APPS=ON"
"-DAVIF_BUILD_GDK_PIXBUF=ON"
"-DAVIF_LIBSHARPYUV=SYSTEM"
+
"-DAVIF_LIBXML2=SYSTEM"
+
"-DAVIF_BUILD_TESTS=ON"
+
"-DAVIF_GTEST=SYSTEM"
];
nativeBuildInputs = [
···
buildInputs = [
gdk-pixbuf
+
gtest
zlib
libpng
libjpeg
libwebp
+
libxml2
];
propagatedBuildInputs = [
···
libyuv
];
-
postPatch = ''
-
substituteInPlace contrib/gdk-pixbuf/avif.thumbnailer.in \
-
--replace '@CMAKE_INSTALL_FULL_BINDIR@/gdk-pixbuf-thumbnailer' "$out/libexec/gdk-pixbuf-thumbnailer-avif"
-
'';
+
env.PKG_CONFIG_GDK_PIXBUF_2_0_GDK_PIXBUF_MODULEDIR = gdkPixbufModuleDir;
-
env.PKG_CONFIG_GDK_PIXBUF_2_0_GDK_PIXBUF_MODULEDIR = gdkPixbufModuleDir;
+
doCheck = true;
postInstall =
''
-11
pkgs/by-name/li/libyuv/link-library-against-libjpeg.patch
···
-
diff --git a/CMakeLists.txt b/CMakeLists.txt
-
index 636531ee..af1b0e4e 100644
-
--- a/CMakeLists.txt
-
+++ b/CMakeLists.txt
-
@@ -39,6 +39,7 @@ INCLUDE ( FindJPEG )
-
if (JPEG_FOUND)
-
include_directories( ${JPEG_INCLUDE_DIR} )
-
target_link_libraries( yuvconvert ${JPEG_LIBRARY} )
-
+ target_link_libraries( ${ly_lib_shared} ${JPEG_LIBRARY} )
-
add_definitions( -DHAVE_JPEG )
-
endif()
+19 -10
pkgs/by-name/li/libyuv/package.nix
···
fetchgit,
cmake,
libjpeg,
+
gtest,
}:
stdenv.mkDerivation {
pname = "libyuv";
-
version = "1787"; # Defined in: include/libyuv/version.h
+
version = "1908"; # Defined in: include/libyuv/version.h
src = fetchgit {
url = "https://chromium.googlesource.com/libyuv/libyuv.git";
-
rev = "eb6e7bb63738e29efd82ea3cf2a115238a89fa51"; # refs/heads/stable
-
hash = "sha256-DtRYoaAXb9ZD2OLiKbzKzH5vzuu+Lzu4eHaDgPB9hjU=";
+
rev = "b7a857659f8485ee3c6769c27a3e74b0af910746"; # upstream does not do tagged releases
+
hash = "sha256-4Irs+hlAvr6v5UKXmKHhg4IK3cTWdsFWxt1QTS0rizU=";
};
nativeBuildInputs = [
cmake
];
-
# NEON does not work on aarch64, we disable it
-
cmakeFlags = lib.optionals stdenv.hostPlatform.isAarch64 [
-
"-DCMAKE_CXX_FLAGS=-DLIBYUV_DISABLE_NEON"
+
cmakeFlags = [
+
"-DUNIT_TEST=ON"
];
-
buildInputs = [ libjpeg ];
-
-
patches = [
-
./link-library-against-libjpeg.patch
+
buildInputs = [
+
libjpeg
+
gtest
];
postPatch = ''
···
substituteInPlace $out/lib/pkgconfig/libyuv.pc \
--replace "@PREFIX@" "$out" \
--replace "@VERSION@" "$version"
+
'';
+
+
doCheck = true;
+
+
checkPhase = ''
+
runHook preCheck
+
+
./libyuv_unittest
+
+
runHook postCheck
'';
meta = with lib; {
+2 -4
pkgs/development/python-modules/pillow/default.nix
···
] ++ lib.flatten (lib.attrValues optional-dependencies);
pytestFlagsArray = [
-
# AssertionError: average pixel value difference 12.0968 > epsilon 11.5000
-
"--deselect=Tests/test_file_avif.py::TestFileAvif::test_read"
-
# AssertionError: average pixel value difference 8.0108 > epsilon 6.0200
-
"--deselect=Tests/test_file_avif.py::TestFileAvif::test_write_rgb"
+
# Checks for very precise color values on what's basically white
+
"--deselect=Tests/test_file_avif.py::TestFileAvif::test_background_from_gif"
];
disabledTests =