diff --git a/Cargo.lock b/Cargo.lock index 903ba81..b295fe2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -163,9 +163,9 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" [[package]] name = "byteorder" @@ -613,9 +613,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "image" -version = "0.25.2" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", @@ -629,9 +629,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" dependencies = [ "byteorder-lite", "quick-error", @@ -683,6 +683,165 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jxl-bitstream" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c84490d13b6303b007b63b6ffea9fa82ff5a4c33b0b2dc673e6f4556f11a2a1" +dependencies = [ + "tracing", +] + +[[package]] +name = "jxl-coding" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7ffdab0c48e989f23a8bd6113d88bd243ae45c7871e90cfdcb6997eacbfb2" +dependencies = [ + "jxl-bitstream", + "tracing", +] + +[[package]] +name = "jxl-color" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4806c94be9e37c82e571684ad673af0a2e4049a74942c407034da6a087c4de7b" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-oxide-common", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-frame" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b5014aa075774dc44ef861d6ae5ca362980b64498ed2f464c25c660646a4c" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-image", + "jxl-modular", + "jxl-oxide-common", + "jxl-threadpool", + "jxl-vardct", + "tracing", +] + +[[package]] +name = "jxl-grid" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a28ba2734da33624db4b426b44750a7b1238e6cba65d27b7d84bf3cba7f507" +dependencies = [ + "tracing", +] + +[[package]] +name = "jxl-image" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de3283303bb66b1742538f1a6947313596242598d6ddf325f301c2fbf01abd3" +dependencies = [ + "jxl-bitstream", + "jxl-color", + "jxl-grid", + "jxl-oxide-common", + "tracing", +] + +[[package]] +name = "jxl-modular" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6e144e58dc051182702ef4f3c78357c23e7df0164f60f69e0f267a8b59bd42" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-oxide-common", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-oxide" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ad97ec13689c37000bb64c5df1cfed7c43b12491ff0d6626ae08cd521b83ad0" +dependencies = [ + "bytemuck", + "image", + "jxl-bitstream", + "jxl-color", + "jxl-frame", + "jxl-grid", + "jxl-image", + "jxl-oxide-common", + "jxl-render", + "jxl-threadpool", + "tracing", +] + +[[package]] +name = "jxl-oxide-common" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4efb65a6ef812eae1083e5d2d1a4358bd74cf7e08d112f6e939a40003a6a9920" +dependencies = [ + "jxl-bitstream", +] + +[[package]] +name = "jxl-render" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c13278d0ba6b522d7b0957bf9aa14b9f975b229ec582c2eec3fe89978ee93" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-color", + "jxl-frame", + "jxl-grid", + "jxl-image", + "jxl-modular", + "jxl-oxide-common", + "jxl-threadpool", + "jxl-vardct", + "tracing", +] + +[[package]] +name = "jxl-threadpool" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2860c68899a3c6266044fc26c6a0041e9f27145f58cc69b6eedc1b77f5ee13" +dependencies = [ + "rayon", + "rayon-core", + "tracing", +] + +[[package]] +name = "jxl-vardct" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "737b4a65897907c644329c8a54e042cefdec2989e482698eea150d463e475fe5" +dependencies = [ + "jxl-bitstream", + "jxl-coding", + "jxl-grid", + "jxl-modular", + "jxl-oxide-common", + "jxl-threadpool", + "tracing", +] + [[package]] name = "lab" version = "0.11.0" @@ -939,6 +1098,12 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + [[package]] name = "pkg-config" version = "0.3.30" @@ -1246,6 +1411,7 @@ dependencies = [ "crossterm", "image", "indicatif", + "jxl-oxide", "num-traits", "plotters", "ssimulacra2", @@ -1301,6 +1467,25 @@ dependencies = [ "syn", ] +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + [[package]] name = "ttf-parser" version = "0.20.0" diff --git a/Cargo.toml b/Cargo.toml index 9175af8..e9e0dd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ av-metrics-decoders = { version = "0.3.1", features = [ clap = { version = "4.0.18", features = ["derive"] } crossterm = "0.27.0" indicatif = "0.17.1" +jxl-oxide = { version = "0.10.1", features = ["image"] } num-traits = { version = "0.2.15", optional = true } ssimulacra2 = { version = "0.5.0", default-features = false } statrs = { version = "0.17.0", optional = true } diff --git a/src/main.rs b/src/main.rs index 69ed81a..c21e1fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -153,8 +153,29 @@ fn main() { fn compare_images(source: &Path, distorted: &Path) { // For now just assumes the input is sRGB. Trying to keep this as simple as possible for now. - let source = image::open(source).expect("Failed to open source file"); - let distorted = image::open(distorted).expect("Failed to open distorted file"); + let source = if let Ok(image) = image::open(source) { + image + } else if let Ok(decoder) = jxl_oxide::integration::JxlDecoder::new( + std::fs::File::open(source) + .ok().expect("could not open source file"), + ) { + image::DynamicImage::from_decoder(decoder) + .ok().expect("failed to decode source jxl") + } else { + panic!("Failed to open the source file") + }; + + let distorted = if let Ok(image) = image::open(distorted) { + image + } else if let Ok(decoder) = jxl_oxide::integration::JxlDecoder::new( + std::fs::File::open(distorted) + .ok().expect("could not open distorted file"), + ) { + image::DynamicImage::from_decoder(decoder) + .ok().expect("failed to decode distorted jxl") + } else { + panic!("Failed to open the distorted file") + }; let source_data = source .to_rgb32f()