Skip to content

Releases

v0.13.0

Choose a tag to compare

@eustas eustas released this 11 Nov 14:06
5a7da83

Important note: this release contains multiple security fixes, including fix for severe vulnerability in dependency; please consider updating to this version - there are no breaking API changes for most scenarios compared to versions v0.11.x, v0.12.0

Security

  • bumped brotli to v1.2.1 (#5062) to mitigate CVE-2026-111497
  • sized low-memory render pipeline ring buffers by simulating the actual stage
    schedule, fixing use-of-uninitialized-memory bugs with vertically subsampled
    stages (#5022)
  • reset JPEG reconstruction state, fixing potential use-after-free writes across
    decoder resets (#5029)
  • security and hardening fixes across the core decoder/encoder,
    JPEG reconstruction, splines, and codec plugins (EXR, APNG, PGX, PNM); this
    includes fixes for integer overflows in JPEG coefficient buffer allocations
    and spline area budgets, out-of-bounds read/write guards in chunked frame
    adapters and truncated EXR scanline streams, bounds-checked Span::subspan
    slicing, and null pointer guards (#4936, #4938, #5009, #5022, #5023,
    #5026, #5029, #5030, #5076, #5091, #5096, #5100)
  • decoder: more consistent image_out cleanup;
    reported-by: Alejandro Pacheco (@alepacheco) and Eunji Ham
  • harden patch rect calculations;
    reported-by: Robert McConnell and freezagent
  • make another decoding path aware of overflows (see #4808);
    reported-by: Robert McConnell
  • decoder: guard against using wrong out buffer;
    reported-by: Lakshit Verma
  • ensure CmsStage when converting CMYK has access to actual black channel;
    reported-by: Marinko Ružić
  • fix using wrong subsampling when reconstructing gray JPEGs;
    reported-by: synawk dsx, ptrstr and Lakshit Verma

Added

  • encoder API: added JXL_ENC_FRAME_SETTING_STRIP_ALPHA frame setting and
    --strip_alpha CLI flag to control stripping of alpha channels on
    single-frame images with a single extra channel (#4981, #4984)
  • encoder API: added JXL_ENC_FRAME_SETTING_JPEG_RECON_LFS frame setting and
    --jpeg_reconstruction_lfs CLI flag to control LF (adaptive DC) smoothing
    during lossless JPEG recompression; allows non-444 transcoded JPEGs with
    adaptive DC/LF smoothing to decode (#4932, #5031)
  • release & CI: added native Linux AArch64 static release artifacts (#5039),
    Windows ARM64 CI build and release support (#4997), and GitHub artifact
    attestation for published release assets (#4982)

Changed

  • rewrote LZ77 implementation for lossless image compression (#4928)
  • compression density & encoder improvements:
    • enabled LF smoothing by default for 4:4:4 lossless JPEG transcoding (#4932)
    • re-enabled squeezed delta palette (#4930)
    • signaled the default 39-entry block context map, saving 22-23 bytes per
      frame when using the default block context map (#5001)
    • improved histogram clustering with forced prefix codes (force_huffman) by
      accounting for merges that turn a zero-cost single-symbol histogram into a
      multi-symbol histogram (#5002)
    • modular encoder: skipped EstimateWPCost weighted-predictor mode search
      when a custom fixed tree is provided (#5003)
  • performance & memory:
    • optimized EstimateWPCost (#5093, #5120)
    • allocated allowed_counts on the heap during initialization in to reduce
      stack usage (#4918)
  • tools: jxl_from_tree now automatically uses 16-bit buffers when bit depth is
    12 or less (#4976)

Fixed

  • disabled adaptive DC smoothing during lossless JPEG reconstruction (#4931)
  • cleared all patch dictionary state, preventing patches from being blended
    using a previous frame's blend modes (#4989)
  • forgot extra channel output buffers in JxlDecoderSkipCurrentFrame() (#5026)
  • reset prog_detail on JxlDecoderReset() and rewind (#5121)
  • copied ANS lookup data from the containing entry in InitAliasDistribution
    and added compile-time size verification (#4952, #5069)
  • guarded PerformBlending against empty segments (#4992, #5068)
  • fixed Forward/Meta and Inverse squeeze transform agreement on
    hshift/vshift updates (#5116)
  • fixed luminance calculation and multiplicative factor in photon noise
    synthesis (enc_photon_noise) (#5053)
  • scaled center_x and center_y coordinates by dc_scale for LF frames when
    encoding with center-first group ordering (#4969)
  • handled legacy non-conforming Display P3 v4 ICC profiles (#4965)
  • fixed possible stream inconsistency in streaming encoding mode (#5115)
  • fixed formal data races in enc_cache.cc and modular FillSigma
    initialization (#5102, #5109)
  • validated packed frame extra-channel counts before encoding (#5075)
  • PNM/PAM decoder: rejected sample values exceeding MaxVal (#5064)
  • PNG/APNG decoder: zeroed rows left undecoded by truncated PNGs (#5083)
  • Gain Map API: avoided calling memcpy with a nullptr source (#5089)
  • NumPy encoder: properly escaped frame names per RFC 8259 in --metadata_out
    JSON output (#5088)
  • extras: derived file extensions from the final path component only in
    CodecFromPath. (#5081)
  • build & platform fixes:
    • fixed build with Highway 1.3+ (#4906)
    • dropped -lm from libjxl_cms.pc and libjxl_threads.pc pkg-config files
      on MSVC (#5061)
    • fixed MSVC intrinsics include order so _sub_overflow_i32 is visible on
      x86/x64 (#5071)
    • enabled JXL_UNUSED macro under clang-cl (#5122)
    • checked whether Qt has feature xcb before enabling xcb in tools/ CMake
      build (#5019)
    • fixed mingw32 build (#4940) and sequentialized CMake test discovery to avoid
      build races on macOS/multi-core machines (#4939)

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.12.0

Choose a tag to compare

@eustas eustas released this 01 Jul 21:16
a7a9c78

Added

  • A new buffering flag is now available in the CLI, alongside support for
    streaming input with buffered output. (#4634)
  • Introduced the new jxltran tool, which supports extracting codestreams from
    jxlp boxes and packing raw codestreams into jxlc boxes. (#4161, #4165,
    #4168, #4196)
  • Added the --reconstruct_jpeg flag to djxl to losslessly reconstruct a
    JPEG and fail if impossible (mutually exclusive with --pixels_to_jpeg and
    --jpeg_quality). (#4498)
  • Added JXL_DEC_UNSUPPORTED (kUnsupported) status code to the core API to
    better indicate when requested features or operations are not supported by
    the decoder. (#4390)
  • tools: added support for ProPhoto (#4824) and Adobe98 / AdobeRGB
    (#4199) color space names in CLI arguments (cjxl / djxl).
  • decoder API: support for out-of-order jxlp boxes (ftyp minor version 1).
    (#4741)
  • encoder API: JXL_ENC_FRAME_SETTING_OUTPUT_MODE frame setting to control how
    the codestream is written to the output. Mode 0 (default) buffers the output
    internally and produces a normally ordered, progressively decodable
    codestream. Mode 1 uses seek-based streaming (reduces peak memory for large
    images, requires a seekable output stream). Mode 2 uses out-of-order jxlp
    boxes (reduces peak memory without requiring seeking, but requires a decoder
    that supports ftyp minor version 1). (#4745)

Changed

  • Major overhaul for faster decoding and progressive lossless. (#4201, #4641,
    #4811)
    • Progressive lossless images are around 30-40% smaller and are now
      multithreaded increasing encoding performance by 2-5x.
    • Lossless images with faster decoding are now 30-80% smaller and their
      decoding speeds properly scale as the faster decoding level increases
      from 1-4.
    • Disabled global palette for progressive images, fixing glitchy progressive
      loading for indexed/low color images and restoring transparency support
      (Note: this causes a density/speed penalty for very low bit-depth images).
  • Numerous speed/memory usage improvements.
    • Improved encoding speeds by SIMDifying EstimateCost (+5% performance) and
      speeding up uint-coding trials. (#4322, #4330)
    • Accelerated modular encoding and decoding via SIMD optimizations for
      forward RCT transforms and upsampling (up to 4x faster). (#4332, #4384)
    • Massive overhaul to histogram encoding and decoding, providing significant
      performance optimizations for modular mode. (#4123, #4132, #4136, #4185)
    • Tweaked JPEG recompression logic to improve density and efficiency. (#4202)
    • Fixed performance regressions in fast lossless modes and optimized
      text-like patch detection. (#4341, #4448)
    • Refined x86 XCR0 CPU checks to prevent issues on specific hardware.
      (#4449)
    • Migrated Windows release builds to use clang-cl, which improves
      performance across the board. (#4529)
    • Improved use of SIMD in tree construction hot loop. (#4720)
    • Improved spline caching. (#4857)
    • Postponed JPEG coeffs allocation until first SOS. (#4863)
  • The default buffering level in the CLI has been changed to 2, greatly
    improving encoding performance for images under 2048x2048. Additionally,
    output is buffered by default to allow basic progressive loading. (#4635,
    #4637, #4642)
  • Better Density/Speed tradeoff for lossless effort levels. (#4236)
  • Improved visual quality of gradients by using channel-offset blue noise
    dithering instead of bayer when decoding to lower bitdepths. (#4305, #4559)
  • Lossy modular encoding quality/density improvements. (#3575)
  • local_tone_map tool: Now produces SDR output in the DisplayP3 color space
    rather than Rec2020. Also added an optional third command-line argument to
    dump the HDR image as a raw rgba1010102 file for use with the libultrahdr
    example app. (#4210)
  • Significant improvements to EXR input/output handling for cjxl. Now supports
    reading float32, multilayer, per-channel bitdepth, and writing greyscale
    EXR images. (#4312, #4460)
  • The decoder API for JxlDecoderSetImageOutBuffer and
    JxlDecoderSetPreviewOutBuffer has been clarified; their timeframes are now
    non-intersecting, preventing accidental buffer overwrites. (#4671)
  • Layered JXL files are no longer coalesced when re-encoding with cjxl, and
    can now be decoded to separate PNG/PAM files with djxl by using
    --no_coalescing. (#4299)
  • The progressive flag -p in cjxl will now encode a more progressive image.
    (#4258, #4699)
  • When lossy encoding, resampling 2 is now enabled at distance 10, and is up to
    10x faster below effort 10 by using a faster downsampling method. (#4147)
  • Faster PNG compression. (#3819)
  • decoder API: documented that at most one preview image exists in a
    codestream.
    (#4671)
  • encoder API: corrected documentation for box size header in
    JxlEncoderAddBox (0 means box extends to end of file, 1 means 64-bit size
    follows). (#4081)
  • Performance & memory: tracked memory for temporary box/codestream storage
    (#4852) and reduced allocation overhead in ValidateTree (#4851) and low
    memory rendering pipeline. (#4495, #4496)
  • Quality: improved HDR behavior at effort 8+. (#3885)
  • tools: jxlinfo rewritten in C++ with human-friendly output formatting.
    (#4300)
  • tools: image viewers now perform CMS color transforms in parallel across
    threads. (#4326)

Deprecated

  • encoder API: JXL_ENC_FRAME_SETTING_BUFFERING mode 3 is deprecated; output
    buffering should now be controlled via JXL_ENC_FRAME_SETTING_OUTPUT_MODE.
    (#4745)

Removed

  • The jpegli codebase has been removed as it is now maintained as a separate
    project at google/jpegli. (#4657)
  • Dropped GIMP plugin (libjxl-gimp-plugin). (#4875)

Fixed

  • Allows -E to be used in jpeg-transcoding again. (#4729)
  • Fixed an issue where Lossy Delta Palette encoding failed on images larger
    than 2048x2048. (#4201)
  • Fixed Delta Palette with Weighted Predictor decoding. (#4837)
  • JxlEncoderAddChunkedFrame incorrectly called JxlEncoderCloseInput
    instead of JxlEncoderCloseFrames, resulting in corrupted files when
    trying to add more boxes. (#4466)
  • Float16 values roundtrip more accurately. (#4461)
  • JXL input to cjxl no longer gets double orientation applied and also now
    keeps frame names. (#4374, #4561)
  • JxlBasicInfo.alpha_premultiplied was not correctly forwarded. (#4357)
  • CMYK JXL files would not decode to PNG correctly. (#4301)
  • Encoder would hang with specific parameters on images containing more than
    256 groups. (#4302)
  • Decoding would fail with LZ77 runs that crossed entropy-coded streams within
    the same section. (#4298)
  • Images could be corrupted when encoding effort 1 lossless. (#4027, #4291)
  • Extremely high quality lossy would not conform to Level 5 of the spec.
    (#4238)
  • Density regression with Predictor Zero since v0.11. (#4225)
  • Progressive VarDCT encoding would create non-progressive files. (#4223)
  • Extremely tall/wide images failed to encode using modular. (#3937, #4308)
  • Empty DHT markers no longer cause JPEG transcoding to fail. (#2704)
  • Fixed photon noise encoding for progressive images. (#4866)
  • Correctly handled mistakenly set "interleaved" alpha. (#4862)
  • Fixed grayscale over-read in EncodeWithSJpeg. (#4871)
  • Fixed djxl SelectFormat failure when converting grayscale images to PPM.
    (#4691)
  • Fixed segmentation fault when attempting to open non-existing input files in
    CLI tools. (#4846)
  • Fixed GIF always being decoded as RGBA. (#4849)
  • Added a warning when an unsupported GIF disposal mode is encountered. (#3918)
  • Fixed PNG color space information reading. (#4598)
  • Fixed MSVC ARM64 build and restricted _sub_overflow_i32 to x86/x64. (#4877)
  • Corrected specialized decoding path for fast lossless. (#4836)
  • Rejected duplicate out-of-order jxlp indices. (#4814)
  • Used png_bit_depth to correctly determine pixel layout. (#4854)
  • Fixed memory leak in GetContext() in jxl_cms.cc. (#4663)
  • Fixed stdin evaluation if file - exists. (#4668)
  • Fixed JXL primary color representation detection. (#4618)

Security

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.11.2

Choose a tag to compare

@eustas eustas released this 10 Feb 14:18

Fixed

  • fix tile dimension in low memory rendering pipeline (#4495 -
    CVE-2025-12474)
  • fix number of channels for gray-to-gray color transform (#4579 -
    CVE-2026-1837)
  • djxl: reject decoding JXL files if "packed" representation size overflows
    size_t (#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
    identifying this issue)

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.10.5

Choose a tag to compare

@eustas eustas released this 10 Feb 14:15

Fixed

  • fix tile dimension in low memory rendering pipeline (#4495 -
    CVE-2025-12474)
  • fix number of channels for gray-to-gray color transform (#4579 -
    CVE-2026-1837)
  • djxl: reject decoding JXL files if "packed" representation size overflows
    size_t (#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
    identifying this issue)

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.9.5

Choose a tag to compare

@eustas eustas released this 10 Feb 14:17

Fixed

  • fix tile dimension in low memory rendering pipeline (#4495 -
    CVE-2025-12474)
  • fix number of channels for gray-to-gray color transform (#4579 -
    CVE-2026-1837)
  • djxl: reject decoding JXL files if "packed" representation size overflows
    size_t (#4589 - thanks to Mateusz Jurczyk of Google Project Zero for
    identifying this issue)

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.8.5

Choose a tag to compare

@eustas eustas released this 10 Feb 14:13

Fixed

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.7.3

Choose a tag to compare

@eustas eustas released this 10 Feb 14:11

Fixed

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.7.2

Choose a tag to compare

@mo271 mo271 released this 27 Nov 20:55

Fixed

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.11.1

Choose a tag to compare

@mo271 mo271 released this 26 Nov 19:18

Fixed

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.

v0.10.4

Choose a tag to compare

@mo271 mo271 released this 26 Nov 19:23

Fixed

Note: This release is for evaluation purposes and may contain bugs, including security bugs, that may not be individually documented when fixed. See the SECURITY.md file for details. Always prefer to use the latest release.

Please provide feedback and report bugs here.