From 4b29af49fd6658988390626e3d7e30a171237c7c Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:39:42 +1100 Subject: [PATCH] Skip building libavif on 32-bit Windows (#16) * Corrected comment * Reduced difference * Generate rotated images * Build rav1e * Skip building libavif on 32-bit * Fixed building libavif on oss-fuzz * Removed unnecessary converts --------- Co-authored-by: Andrew Murray --- .github/workflows/test-windows.yml | 2 +- .github/workflows/wheels-dependencies.sh | 53 ++++------------ Tests/images/avif/star180.png | Bin 9211 -> 0 bytes Tests/images/avif/star270.png | Bin 9395 -> 0 bytes Tests/images/avif/star90.png | Bin 9272 -> 0 bytes Tests/test_file_avif.py | 73 +++++++++++------------ 6 files changed, 48 insertions(+), 80 deletions(-) delete mode 100644 Tests/images/avif/star180.png delete mode 100644 Tests/images/avif/star270.png delete mode 100644 Tests/images/avif/star90.png diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 809e17cfe..4d689e56f 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -146,7 +146,7 @@ jobs: run: "& winbuild\\build\\build_dep_libpng.cmd" - name: Build dependencies / libavif - if: steps.build-cache.outputs.cache-hit != 'true' + if: steps.build-cache.outputs.cache-hit != 'true' && matrix.architecture == 'x64' run: "& winbuild\\build\\build_dep_libavif.cmd" # for FreeType WOFF2 font support diff --git a/.github/workflows/wheels-dependencies.sh b/.github/workflows/wheels-dependencies.sh index 39b8a1535..e238842e7 100755 --- a/.github/workflows/wheels-dependencies.sh +++ b/.github/workflows/wheels-dependencies.sh @@ -51,7 +51,6 @@ BZIP2_VERSION=1.0.8 LIBXCB_VERSION=1.17.0 BROTLI_VERSION=1.1.0 LIBAVIF_VERSION=1.1.1 -RAV1E_VERSION=0.7.1 function build_pkg_config { if [ -e pkg-config-stamp ]; then return; fi @@ -101,50 +100,22 @@ function build_harfbuzz { function build_libavif { if [ -e libavif-stamp ]; then return; fi - if [[ "$PLAT" == "aarch64" ]]; then - # Once GitHub Actions supports aarch64 without emulation, this will no longer needed as building will be faster - if [[ "$PLAT" == "aarch64" ]]; then - suffix="aarch64" - else - suffix="generic" - fi - - curl -sLo - \ - https://github.com/xiph/rav1e/releases/download/v$RAV1E_VERSION/librav1e-$RAV1E_VERSION-linux-$suffix.tar.gz \ - | tar -C $BUILD_PREFIX -zxf - - - # Force libavif to treat system rav1e as if it were local - mkdir -p /tmp/cmake/Modules - cat < /tmp/cmake/Modules/Findrav1e.cmake - add_library(rav1e::rav1e STATIC IMPORTED GLOBAL) - set_target_properties(rav1e::rav1e PROPERTIES - IMPORTED_LOCATION "$BUILD_PREFIX/lib/librav1e.a" - AVIF_LOCAL ON - INTERFACE_INCLUDE_DIRECTORIES "$BUILD_PREFIX/include/rav1e" - ) -EOF - - rav1e=SYSTEM - else - curl https://sh.rustup.rs -sSf | sh -s -- -y - . "$HOME/.cargo/env" - - if [ -z "$IS_ALPINE" ] && [ -z "$IS_MACOS" ]; then - yum install -y perl - if [[ "$MB_ML_VER" == 2014 ]]; then - yum install -y perl-IPC-Cmd - fi - fi - - rav1e=LOCAL - fi - python3 -m pip install meson ninja - if [[ "$PLAT" == "x86_64" ]]; then + if [[ "$PLAT" == "x86_64" ]] || [ -n "$SANITIZER" ]; then build_simple nasm 2.16.03 https://www.nasm.us/pub/nasm/releasebuilds/2.16.03 fi + # For rav1e + curl https://sh.rustup.rs -sSf | sh -s -- -y + . "$HOME/.cargo/env" + if [ -z "$IS_ALPINE" ] && [ -z "$SANITIZER" ] && [ -z "$IS_MACOS" ]; then + yum install -y perl + if [[ "$MB_ML_VER" == 2014 ]]; then + yum install -y perl-IPC-Cmd + fi + fi + local out_dir=$(fetch_unpack https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$LIBAVIF_VERSION.tar.gz libavif-$LIBAVIF_VERSION.tar.gz) (cd $out_dir \ && cmake \ @@ -154,7 +125,7 @@ EOF -DBUILD_SHARED_LIBS=OFF \ -DAVIF_LIBSHARPYUV=LOCAL \ -DAVIF_LIBYUV=LOCAL \ - -DAVIF_CODEC_RAV1E=$rav1e \ + -DAVIF_CODEC_RAV1E=LOCAL \ -DAVIF_CODEC_AOM=LOCAL \ -DAVIF_CODEC_DAV1D=LOCAL \ -DAVIF_CODEC_SVT=LOCAL \ diff --git a/Tests/images/avif/star180.png b/Tests/images/avif/star180.png deleted file mode 100644 index 2c5f52221156cc0e10bced86ee9e4a7b0e64584d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9211 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 diff --git a/Tests/images/avif/star90.png b/Tests/images/avif/star90.png deleted file mode 100644 index 93526260bab9d4a6247ca27d2e04f0ab949a6b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9272 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 amHz None: temp_file = str(tmp_path / "temp.avif") @@ -255,10 +255,10 @@ class TestFileAvif: def test_save_icc_profile(self) -> None: with Image.open("Tests/images/avif/icc_profile_none.avif") as im: - assert im.info.get("icc_profile") is None + assert "icc_profile" not in im.info with Image.open("Tests/images/avif/icc_profile.avif") as with_icc: - expected_icc = with_icc.info.get("icc_profile") + expected_icc = with_icc.info["icc_profile"] assert expected_icc is not None im = roundtrip(im, icc_profile=expected_icc) @@ -278,7 +278,7 @@ class TestFileAvif: def test_roundtrip_no_icc_profile(self) -> None: with Image.open("Tests/images/avif/icc_profile_none.avif") as im: - assert im.info.get("icc_profile") is None + assert "icc_profile" not in im.info im = roundtrip(im) assert "icc_profile" not in im.info @@ -470,14 +470,14 @@ class TestFileAvif: @skip_unless_avif_encoder("aom") @skip_unless_feature("avif") - @pytest.mark.parametrize("val", [{"foo": "bar"}, 1234]) + @pytest.mark.parametrize("advanced", [{"foo": "bar"}, 1234]) def test_encoder_advanced_codec_options_invalid( - self, tmp_path: Path, val: dict[str, str] | int + self, tmp_path: Path, advanced: dict[str, str] | int ) -> None: with Image.open(TEST_AVIF_FILE) as im: test_file = str(tmp_path / "temp.avif") with pytest.raises(ValueError): - im.save(test_file, codec="aom", advanced=val) + im.save(test_file, codec="aom", advanced=advanced) @skip_unless_avif_decoder("aom") @skip_unless_feature("avif") @@ -545,20 +545,20 @@ class TestFileAvif: def test_decoder_codec_available_invalid(self) -> None: assert _avif.decoder_codec_available("foo") is False - def test_p_mode_transparency(self) -> None: + def test_p_mode_transparency(self, tmp_path: Path) -> None: im = Image.new("P", size=(64, 64)) draw = ImageDraw.Draw(im) draw.rectangle(xy=[(0, 0), (32, 32)], fill=255) draw.rectangle(xy=[(32, 32), (64, 64)], fill=255) - buf_png = BytesIO() - im.save(buf_png, format="PNG", transparency=0) - im_png = Image.open(buf_png) - buf_out = BytesIO() - im_png.save(buf_out, format="AVIF", quality=100) + out_png = str(tmp_path / "temp.png") + im.save(out_png, transparency=0) + with Image.open(out_png) as im_png: + out_avif = str(tmp_path / "temp.avif") + im_png.save(out_avif, quality=100) - with Image.open(buf_out) as expected: - assert_image_similar(im_png.convert("RGBA"), expected, 0.17) + with Image.open(out_avif) as expected: + assert_image_similar(im_png.convert("RGBA"), expected, 0.17) def test_decoder_strict_flags(self) -> None: # This would fail if full avif strictFlags were enabled @@ -566,27 +566,22 @@ class TestFileAvif: assert im.size == (480, 270) @skip_unless_avif_encoder("aom") - def test_aom_optimizations(self) -> None: - im = hopper("RGB") - buf = BytesIO() - im.save(buf, format="AVIF", codec="aom", speed=1) + def test_aom_optimizations(self, tmp_path: Path) -> None: + test_file = str(tmp_path / "temp.avif") + hopper().save(test_file, codec="aom", speed=1) @skip_unless_avif_encoder("svt") - def test_svt_optimizations(self) -> None: - im = hopper("RGB") - buf = BytesIO() - im.save(buf, format="AVIF", codec="svt", speed=1) + def test_svt_optimizations(self, tmp_path: Path) -> None: + test_file = str(tmp_path / "temp.avif") + hopper().save(test_file, codec="svt", speed=1) @skip_unless_feature("avif") class TestAvifAnimation: @contextmanager def star_frames(self) -> Generator[list[ImageFile.ImageFile], None, None]: - with Image.open("Tests/images/avif/star.png") as f1: - with Image.open("Tests/images/avif/star90.png") as f2: - with Image.open("Tests/images/avif/star180.png") as f3: - with Image.open("Tests/images/avif/star270.png") as f4: - yield [f1, f2, f3, f4] + with Image.open("Tests/images/avif/star.png") as f: + yield [f, f.rotate(90), f.rotate(180), f.rotate(270)] def test_n_frames(self) -> None: """ @@ -602,10 +597,10 @@ class TestAvifAnimation: assert im.n_frames == 5 assert im.is_animated - def test_write_animation_L(self, tmp_path: Path) -> None: + def test_write_animation_P(self, tmp_path: Path) -> None: """ Convert an animated GIF to animated AVIF, then compare the frame - count, and first and last frames to ensure they're visually similar. + count, and first and second-to-last frames to ensure they're visually similar. """ with Image.open("Tests/images/avif/star.gif") as orig: @@ -616,15 +611,17 @@ class TestAvifAnimation: with Image.open(temp_file) as im: assert im.n_frames == orig.n_frames - # Compare first and second-to-last frames to the original animated GIF - assert_image_similar(im.convert("RGB"), orig.convert("RGB"), 2.25) + # Compare first frame in P mode to frame from original GIF + assert_image_similar(im, orig.convert("RGBA"), 2) + + # Compare second-to-last frame in RGBA mode to frame from original GIF orig.seek(orig.n_frames - 2) im.seek(im.n_frames - 2) - assert_image_similar(im.convert("RGB"), orig.convert("RGB"), 2.54) + assert_image_similar(im, orig, 2.54) - def test_write_animation_RGB(self, tmp_path: Path) -> None: + def test_write_animation_RGBA(self, tmp_path: Path) -> None: """ - Write an animated AVIF from RGB frames, and ensure the frames + Write an animated AVIF from RGBA frames, and ensure the frames are visually similar to the originals. """ @@ -633,11 +630,11 @@ class TestAvifAnimation: assert im.n_frames == 4 # Compare first frame to original - assert_image_similar(im, frame1.convert("RGBA"), 2.7) + assert_image_similar(im, frame1, 2.7) # Compare second frame to original im.seek(1) - assert_image_similar(im, frame2.convert("RGBA"), 4.1) + assert_image_similar(im, frame2, 4.1) with self.star_frames() as frames: frame1 = frames[0] @@ -646,7 +643,7 @@ class TestAvifAnimation: frames[0].copy().save(temp_file1, save_all=True, append_images=frames[1:]) check(temp_file1) - # Tests appending using a generator + # Test appending using a generator def imGenerator( ims: list[ImageFile.ImageFile], ) -> Generator[ImageFile.ImageFile, None, None]: