Skip to content

Releases: tirr-c/jxl-oxide

jxl-oxide v0.6.0

13 Jan 10:46
4e6e660
Compare
Choose a tag to compare

Version 0.6.0 of jxl-oxide features better color management support, and a single CLI tool instead of two (previously jxl-dec and jxl-info).

Improved color management

Color transformation routine is rewritten. Now jxl-oxide supports:

  • Requesting custom color encoding for decoded images
  • HDR to SDR tone mapping
  • Simple ICC profile detection
  • External color management system integration, to support various ICC profiles which jxl-oxide cannot handle alone (including CMYK)

jxl-oxide comes with optional Little CMS 2 integration, and can be enabled using lcms2 Cargo feature. Note that it's a C dependency.

  • CMS integration by @tirr-c in #145
  • jxl-color: Detect simple ICC profiles by @tirr-c in #148
  • jxl-color: Implement tone mapping by @tirr-c in #155
  • jxl-oxide: Include Little CMS 2 integration under a feature by @tirr-c in #160

Merged CLI tools

jxl-dec and jxl-info are merged into jxl-oxide, and those functionality can be accessed using subcommands. See the help message for detailed usage.

  • jxl-oxide-cli: Merge binaries into one by @tirr-c in #161
  • jxl-oxide-cli: Log error information instead of panicking by @tirr-c in #188
  • jxl-oxide-cli: Add --quiet, allow multiple --verbose by @tirr-c in #192

Also, starting from version 0.6.0, the version of jxl-oxide-cli will match that of jxl-oxide.

Fuzzing harness using cargo-fuzz

Numerous crash bugs are found by fuzzing harness, and all crashes found are fixed. Special thanks to @Shnatsel!

  • Add an initial fuzzing harness using cargo-fuzz by @Shnatsel in #172
  • Reorganize fuzzer, remove honggfuzz harness by @tirr-c in #182

New Contributors

Full Changelog: 0.5.2...0.6.0

jxl-oxide v0.5.2

23 Dec 08:53
849c3aa
Compare
Choose a tag to compare

Version 0.5.2 of jxl-oxide (and 0.3.1 of jxl-oxide-cli) fixes a bug in NEON SIMD routine of VarDCT renderer.

What's Changed

  • jxl-render: Reduce EPF buffer allocation by @tirr-c in #142
  • jxl-render (backport): Fix aarch64 forward DCT bug by @tirr-c in #150
  • jxl-oxide (backport): v0.5.2 by @tirr-c in #152

Full Changelog: 0.5.1...0.5.2

jxl-oxide v0.5.1

21 Nov 14:24
e6d51e4
Compare
Choose a tag to compare

Version 0.5.0 and 0.5.1 of jxl-oxide (and version 0.3.0 of jxl-oxide-cli) contains new decoding interface, a decent amount of performance boost, and various bugfixes.

Decoding interface changes

Push-based input API

Previously, the decoder got its data in pull-based way: something that implements std::io::Read is given, the decoder reads ("pulls") bytes from it, try to decode those, and repeat. Now the internal API has been rewritten to push-based, meaning that byte slices are pushed into the decoder explicitly by users. The main reason of this rewrite is to optimize some internal routines of bitstream reader, but it has some (nice) side effects:

  • It's easier to suspend decoding somewhere in a bitstream.
  • The new API can accept async byte streams easily.

jxl-oxide provides convenience methods that deal with std::io::Read types.

Thread-safe renderer

Renderer is now thread-safe! Frames can be simultaneously rendered in multiple threads as long as they are already decoded (frames are decoded when its bytes are pushed to the decoder).

Performance boost

Multithreaded rendering

The renderer itself has also introduced parallelism in various places, including multithreaded filters and group1 decoding. jxl-oxide uses Rayon for thread pool implementation. If you don't need multithreading support, rayon feature can be turned off at compile time to completely disable multithreaded rendering (it will stay thread-safe though).

More SIMD routines

  • SIMD version of edge-preserving filter is added.
  • NEON specific SIMD routines are added for aarch64 (but not armv7), both autovectorized and handwritten.

CLI utilities

  • jxl-info introduces new flags, --all-frames and --with-offset.

  • jxl-dec introduces new flag -j (--num-threads) which controls the number of threads in thread pool.

  • jxl-dec allows partial image files, and it will try decoding as much as possible. With some shell scripting, one can make an interesting progressive decoding animation:

    starrail-d1-e7-pdc.mp4

Other changes

New Contributors

Full Changelog: 0.4.0...0.5.1


  1. A group is a tile in JPEG XL frame that serves as a unit of decoding.

jxl-oxide v0.4.0

03 Sep 16:37
7853f90
Compare
Choose a tag to compare

Version 0.4.0 of jxl-oxide improves memory usage with updated frame renderer, and features cropped decoding.

Cropped decoding

jxl-oxide now supports rendering only part of the image. A region of interest can be specified using --crop option of jxl-dec since jxl-oxide-cli 0.2.3, or CropInfo struct in jxl-oxide. The renderer will only decode necessary parts of the bitstream.

Note that the syntax of --crop is unstable and subject to change.

Breaking changes

  • PassGroup and HfCoeff are removed. Instead, they are decoded into grids directly.
  • Frame decoding is rewritten; interface of jxl_frame::Frame has changed.
  • jxl_render and jxl_oxide methods now accept crop regions.
  • jxl_oxide::JxlRenderer is merged into jxl_oxide::JxlImage.
  • ImageMetadata::apply_orientation now accepts signed coordinates instead of unsigned ones.
  • is_delta_palette method is replaced with is_palette.

New features

  • jxl-oxide-cli: Add output_format option by @tirr-c in #59

Bugfixes

  • jxl-frame: Fix global MA tree node limit to match libjxl by @tirr-c in #66
  • jxl-oxide-cli: Apply orientation to reported image dimension by @tirr-c in #72

Docs

Full Changelog: 0.3.0...0.4.0

jxl-oxide v0.3.0

16 Jun 12:18
3909fb5
Compare
Choose a tag to compare

Version 0.3.0 of jxl-oxide contains spot color channel rendering feature, and numerous bugfixes with invalid bitstreams and non-conformant codestreams.

Breaking changes

  • jxl-frame: Trait impls for Patches has been changed.

New features

  • jxl-coding: Expose cluster information of entropy decoder by @tirr-c in bffa62d
  • Add spot colour channel rendering by @EugeneVert in #48
  • jxl-oxide: Add JxlImage::rendered_icc by @tirr-c in #49

Bugfixes

Full Changelog: 0.2.0...0.3.0

jxl-oxide v0.2.0

26 May 16:35
a27115a
Compare
Choose a tag to compare

Version 0.2.0 of jxl-oxide contains various bugfixes, and a breaking change in jxl-image and the crates depending on it.

What's Changed

Breaking change

  • jxl-image
    • Public field signature is removed from ImageHeader.
    • impl<Ctx> BundleDefault<Ctx> for ImageHeader is removed.

Bugfix

Full Changelog: 0.1.0...0.2.0

jxl-oxide v0.1.0

16 May 16:31
0.1.0
f9f4f0d
Compare
Choose a tag to compare

This is the first official release of jxl-oxide, a JPEG XL decoder written in Rust.

jxl-oxide consists of small library crates (jxl-bitstream, jxl-coding, ...), a blanket library crate jxl-oxide, and a binary crate jxl-oxide-cli. If you want to use jxl-oxide in a terminal, install it using cargo install. Cargo will install two binaries, jxl-dec and jxl-info.

cargo install jxl-oxide-cli

If you want to use it as a library, specify it in Cargo.toml:

[dependencies]
jxl-oxide = "0.1.0"

Note that you'll need a color management system to correctly display some JXL images. (jxl-dec uses lcms2 for the color management.)


Frequently used features are mostly implemented, but we need more testing. Expect bugs here and there. jxl-oxide is tested against the conformance test (not all of them though) but it doesn't catch all of the bugs. Please file an issue if you actually find one!