Releases: tirr-c/jxl-oxide
jxl-oxide v0.6.0
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
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
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
- Optimize for special modular images by @tirr-c in #82
- jxl-color: Fast color transforms by @tirr-c in #93
- Rewrite bitstream reader, enable partial decoding by @tirr-c in #96
- Fuzzing via honggfuzz by @Nereuxofficial in #101
- Rewrite Modular buffer management by @tirr-c in #108
- Add license symlinks to individual crates by @kalev in #111
New Contributors
- @Nereuxofficial made their first contribution in #101
- @kalev made their first contribution in #111
Full Changelog: 0.4.0...0.5.1
-
A group is a tile in JPEG XL frame that serves as a unit of decoding. ↩
jxl-oxide v0.4.0
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
andHfCoeff
are removed. Instead, they are decoded into grids directly.- Frame decoding is rewritten; interface of
jxl_frame::Frame
has changed. jxl_render
andjxl_oxide
methods now accept crop regions.jxl_oxide::JxlRenderer
is merged intojxl_oxide::JxlImage
.ImageMetadata::apply_orientation
now accepts signed coordinates instead of unsigned ones.is_delta_palette
method is replaced withis_palette
.
New features
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
- Add badges to README.md by @EugeneVert in #52
- Collect code coverage by @tirr-c in #56
- jxl-oxide: Add note to
embedded_icc
by @tirr-c in #75 - jxl-oxide-cli: Add more docs to commandline arguments by @tirr-c in #76
Full Changelog: 0.3.0...0.4.0
jxl-oxide v0.3.0
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 forPatches
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
- jxl-coding: Fix ANS unused zeroing by @EugeneVert in #29
- jxl-coding: IntegerConfig validation by @EugeneVert in #30
- Add more decode tests by @tirr-c in #33
- jxl-frame: EC upsampling check by @EugeneVert in #34
- jxl-render: Fix framebuffer size rounding for chroma subsampled images by @tirr-c in #36
- jxl-frame:
blending_info.alpha_channel
range check by @EugeneVert in #37 - jxl-frame: Check cropped frames size by @EugeneVert in #38
- jxl-color: Fix panics during ICC stream decoding by @tirr-c in #39
- jxl-vardct: Validate BlockInfo by @tirr-c in #40
- jxl-frame: Check gabor weights by @EugeneVert in #42
- jxl-image: BitDepth check by @EugeneVert in #41
- jxl-image: Tone-mapping check by @EugeneVert in #44
- jxl-frame: TOC entry count limit by @EugeneVert in #45
- jxl-frame: EPF sigma for modular check by @EugeneVert in #43
- jxl-color: Limit ICC encoded profile size by @EugeneVert in #46
- Add various limits for Level 10 by @tirr-c in #50
Full Changelog: 0.2.0...0.3.0
jxl-oxide v0.2.0
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 fromImageHeader
. impl<Ctx> BundleDefault<Ctx> for ImageHeader
is removed.
- Public field
Bugfix
jxl-oxide-cli
: Fix float rounding for VarDCT by @EugeneVert in #23jxl-color
: Fixlinear_to_srgb
panic by @EugeneVert in #27jxl-render
: Fix adaptive LF smoothing panicking with small images in a6fcba7- Fix various panics with invalid bitstreams in 6551065, 0a219b9, c517827
Full Changelog: 0.1.0...0.2.0
jxl-oxide v0.1.0
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!