From b4e764e44cb63e9fe669d7a7af584f2c14775038 Mon Sep 17 00:00:00 2001 From: aiongg Date: Sat, 24 Oct 2026 22:04:21 +0000 Subject: [PATCH] jpeg: conformance fixtures for jpegtran's progressive and 12-bit arithmetic transcodes --- crates/jpeg/README.md | 2 ++ .../testorig-ari-progressive-restart.jpg | Bin 0 -> 5467 bytes .../corpus/decode/testorig-ari-progressive.jpg | Bin 0 -> 5154 bytes .../decode/testorig12-ari-progressive.jpg | Bin 0 -> 11357 bytes .../jpeg/fuzz/corpus/decode/testorig12-ari.jpg | Bin 0 -> 11543 bytes crates/jpeg/tests/conformance.rs | 15 +++++++++++++++ crates/jpeg/tests/data/SHA256SUMS | 4 ++++ crates/jpeg/tests/data/SOURCE.md | 17 ++++++++++++++++- .../data/testorig-ari-progressive-restart.jpg | Bin 0 -> 5467 bytes .../tests/data/testorig-ari-progressive.jpg | Bin 0 -> 5154 bytes .../tests/data/testorig12-ari-progressive.jpg | Bin 0 -> 11357 bytes crates/jpeg/tests/data/testorig12-ari.jpg | Bin 0 -> 11543 bytes 12 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive-restart.jpg create mode 100644 crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive.jpg create mode 100644 crates/jpeg/fuzz/corpus/decode/testorig12-ari-progressive.jpg create mode 100644 crates/jpeg/fuzz/corpus/decode/testorig12-ari.jpg create mode 100644 crates/jpeg/tests/data/testorig-ari-progressive-restart.jpg create mode 100644 crates/jpeg/tests/data/testorig-ari-progressive.jpg create mode 100644 crates/jpeg/tests/data/testorig12-ari-progressive.jpg create mode 100644 crates/jpeg/tests/data/testorig12-ari.jpg diff --git a/crates/jpeg/README.md b/crates/jpeg/README.md index 63afb834..f403f454 100644 --- a/crates/jpeg/README.md +++ b/crates/jpeg/README.md @@ -112,6 +112,8 @@ SOF11 (lossless) falls in that range and returns `Unsupported`. - `tests/conformance.rs`, on libjpeg-turbo's test images in `tests/data` (provenance and how the derived files were made: `tests/data/SOURCE.md`): - `testimgari.jpg` (SOF9) decodes to exactly the samples of its jpegtran Huffman transcode. + - jpegtran's arithmetic and progressive arithmetic transcodes of `testorig.jpg` (one with + restarts) and `testorig12.jpg` decode to exactly the samples of their sources. - `whitetail-ari.jpg` (SOF9 from cjpeg, a white lower part that decodes from the zeros supplied at EOI) decodes undamaged and equal to its Huffman transcode. - `testorig.jpg` matches `zune-jpeg`, and `testorig12.jpg` matches libjpeg-turbo's 12-bit diff --git a/crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive-restart.jpg b/crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive-restart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10c5081f76196a3e236c6a9065a685f05ce591ca GIT binary patch literal 5467 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 ohgbG5571~^*8l(j literal 0 HcmV?d00001 diff --git a/crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive.jpg b/crates/jpeg/fuzz/corpus/decode/testorig-ari-progressive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e814c9297796a6976d437e8304bc336ffec8da28 GIT binary patch literal 5154 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 QycnyoZFB4*@Mq)y02OSl)Bpeg literal 0 HcmV?d00001 diff --git a/crates/jpeg/fuzz/corpus/decode/testorig12-ari.jpg b/crates/jpeg/fuzz/corpus/decode/testorig12-ari.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66478ad5640414a4b83c81fa613ae72562f7e52e GIT binary patch literal 11543 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 ySH|8k2JYXmmFdJ}RqBM!K!m|?)r#{U4^)%a5Y literal 0 HcmV?d00001 diff --git a/crates/jpeg/tests/conformance.rs b/crates/jpeg/tests/conformance.rs index e9fab449..86b9dfb0 100644 --- a/crates/jpeg/tests/conformance.rs +++ b/crates/jpeg/tests/conformance.rs @@ -41,6 +41,21 @@ fn arithmetic_coded_image_matches_its_huffman_transcode() { assert!(huffman.samples == arithmetic.samples, "testimgari.jpg decodes differently from testimgari-huffman.jpg"); } +/// The arithmetic and progressive arithmetic transcodes jpegtran made of testorig.jpg and +/// testorig12.jpg hold their coefficients, so they decode to exactly the same samples. +#[test] +fn arithmetic_transcodes_match_their_huffman_sources() { + for (source, transcodes) in [ + ("testorig.jpg", &["testorig-ari-progressive.jpg", "testorig-ari-progressive-restart.jpg"]), + ("testorig12.jpg", &["testorig12-ari.jpg", "testorig12-ari-progressive.jpg"]), + ] { + let reference = decode_fixture(source); + for name in transcodes { + assert!(decode_fixture(name).samples == reference.samples, "{name} decodes differently from {source}"); + } + } +} + /// libjpeg's arithmetic encoder drops the trailing zero bytes of a scan, so the white lower /// part of whitetail-ari.jpg decodes from zeros supplied at the EOI marker. It must decode /// whole and match its Huffman transcode. diff --git a/crates/jpeg/tests/data/SHA256SUMS b/crates/jpeg/tests/data/SHA256SUMS index 2309d1b5..19c71c54 100644 --- a/crates/jpeg/tests/data/SHA256SUMS +++ b/crates/jpeg/tests/data/SHA256SUMS @@ -5,3 +5,7 @@ acc6ec555d41d15b368320edaa3b20958ee6fa97cb6e4a18d1213d5ae8bec73b testorig.jpg 62d182ed042e243544d3d753c440ada1a6992464717311fe6efd546632f44dc4 testorig12.ppm 0031b82a06300b5b5d19ef5553cc39d3fafafa4fbc474199e6cfbc7818312a87 whitetail-ari.jpg 0f6e17a44be7a005d6610e66f91fa119388dc6b8438e95cb8816b6db58f8c365 whitetail-huffman.jpg +7e7edd9d9825c2eca1e6ff6dfafeaddec39e2464fc5d6d1ce4a378a59ec3f716 testorig-ari-progressive.jpg +cb0a2c60e6a89c68ef8cf48854dc09c77c26ffb27ac62e17d343d98f1424cc77 testorig-ari-progressive-restart.jpg +c4942c4b704d20e27c4cd3e613c6ef975dd7cfe53a756e2c209fa3ad033d8b51 testorig12-ari.jpg +18df0394115d9f8751939fb9f45a0d330df2ca849e9f8b07d0af76c09b90fcdb testorig12-ari-progressive.jpg diff --git a/crates/jpeg/tests/data/SOURCE.md b/crates/jpeg/tests/data/SOURCE.md index 8e916998..bc15d764 100644 --- a/crates/jpeg/tests/data/SOURCE.md +++ b/crates/jpeg/tests/data/SOURCE.md @@ -13,12 +13,17 @@ libjpeg-turbo's tools, as described below. | `testimgari-huffman.jpg` | `testimgari.jpg` losslessly transcoded to baseline Huffman (SOF0) | | `testorig12.jpg` | 227×149 YCbCr, 12-bit extended sequential Huffman (SOF1) | | `testorig12.ppm` | libjpeg-turbo's decode of `testorig12.jpg`: 12-bit RGB, binary PPM, maxval 4095 | +| `testorig-ari-progressive.jpg` | `testorig.jpg` transcoded to progressive arithmetic (SOF10) | +| `testorig-ari-progressive-restart.jpg` | the same with a restart interval of 3 MCU rows | +| `testorig12-ari.jpg` | `testorig12.jpg` transcoded to 12-bit arithmetic (SOF9) | +| `testorig12-ari-progressive.jpg` | `testorig12.jpg` transcoded to 12-bit progressive arithmetic (SOF10) | | `whitetail-ari.jpg` | 512×512 gray, arithmetic coded (SOF9), noise in the top 16 rows, white below | | `whitetail-huffman.jpg` | `whitetail-ari.jpg` losslessly transcoded to baseline Huffman (SOF0) | `testimgari.jpg` and `testorig.jpg` share their quantization tables but not their coefficients: libjpeg-turbo decodes them to different pixels. `testimgari-huffman.jpg` holds exactly the -coefficients of `testimgari.jpg`, so the two must decode to identical samples. +coefficients of `testimgari.jpg`, so the two must decode to identical samples. The same holds +for each jpegtran transcode below and its source. ## How the derived files were made @@ -29,6 +34,16 @@ coefficients of `testimgari.jpg`, so the two must decode to identical samples. jpegtran -copy none testimgari.jpg > testimgari-huffman.jpg ``` +The arithmetic transcodes of `testorig.jpg` and `testorig12.jpg`, with jpegtran from +libjpeg-turbo 3.1.3 (Alpine 3.24, `libjpeg-turbo-utils`): + +```sh +jpegtran -copy none -arithmetic -progressive testorig.jpg > testorig-ari-progressive.jpg +jpegtran -copy none -arithmetic -progressive -restart 3 testorig.jpg > testorig-ari-progressive-restart.jpg +jpegtran -copy none -arithmetic testorig12.jpg > testorig12-ari.jpg +jpegtran -copy none -arithmetic -progressive testorig12.jpg > testorig12-ari-progressive.jpg +``` + `testorig12.ppm`, with libjpeg-turbo 3.2.0 through imagecodecs 2026.10.10 (default settings: integer IDCT `JDCT_ISLOW`, fancy upsampling), run as `uv run --with imagecodecs --with numpy python make.py testorig12.jpg testorig12.ppm`: diff --git a/crates/jpeg/tests/data/testorig-ari-progressive-restart.jpg b/crates/jpeg/tests/data/testorig-ari-progressive-restart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10c5081f76196a3e236c6a9065a685f05ce591ca GIT binary patch literal 5467 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 ohgbG5571~^*8l(j literal 0 HcmV?d00001 diff --git a/crates/jpeg/tests/data/testorig-ari-progressive.jpg b/crates/jpeg/tests/data/testorig-ari-progressive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e814c9297796a6976d437e8304bc336ffec8da28 GIT binary patch literal 5154 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 QycnyoZFB4*@Mq)y02OSl)Bpeg literal 0 HcmV?d00001 diff --git a/crates/jpeg/tests/data/testorig12-ari.jpg b/crates/jpeg/tests/data/testorig12-ari.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66478ad5640414a4b83c81fa613ae72562f7e52e GIT binary patch literal 11543 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 ySH|8k2JYXmmFdJ}RqBM!K!m|?)r#{U4^)%a5Y literal 0 HcmV?d00001