3 All notable changes to this project will be documented in this file.
5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
11 - decoder API: added `JxlDecoderGetBoxSizeContents` for getting the size of the
12 content of a box without the headers.
15 ### Changed / clarified
17 ## [0.9.2] - 2024-02-07
20 - bugs in the gdk-pixbuf plugin
23 ## [0.9.1] - 2024-01-08
26 - multiple build issues
28 ## [0.9.0] - 2023-12-22
31 - encoder API: add `JxlEncoderSetExtraChannelDistance` to adjust the quality
32 of extra channels (like alpha) separately.
33 - encoder API: new api functions for streaming encoding:
34 - `JxlEncoderSetOutputProcessor`
35 - `JxlEncoderFlushInput`
36 - `JxlEncoderOutputProcessor` struct
37 - `JxlEncoderSetOutputCallback`
38 - `JxlChunkedFrameInputSource` struct
39 - `JxlEncoderAddChunkedFrame`
40 - encoder API: new options for more fine-grained control over metadata
41 preservation when using `JxlEncoderAddJPEGFrame`:
42 - `JXL_ENC_FRAME_SETTING_JPEG_KEEP_EXIF`
43 - `JXL_ENC_FRAME_SETTING_JPEG_KEEP_XMP`
44 - `JXL_ENC_FRAME_SETTING_JPEG_KEEP_JUMBF`
45 - encoder API: new function `JxlEncoderSetUpsamplingMode` to change the upsampling
46 method, e.g. to use nearest-neighbor upsampling for pixel art
47 - decoder API: implemented `JxlDecoderSetOutputColorProfile` and
48 `JxlDecoderSetCms` to enable decoding to desired colorspace.
49 - cjxl can now be used to explicitly add/update/strip Exif/XMP/JUMBF metadata using
50 the decoder-hints syntax, e.g. `cjxl input.ppm -x exif=input.exif output.jxl`
51 - djxl can now be used to extract Exif/XMP/JUMBF metadata
52 - encoder API: new function `JxlEncoderDistanceFromQuality` for convenience to
53 calculate a `distance` given a `quality`
56 - API: the Butteraugli API (`jxl/butteraugli.h`) was removed.
57 - encoder and decoder API: all deprecated functions were removed:
58 `JxlDecoderDefaultPixelFormat`, `JxlEncoderOptionsSetLossless`,
59 `JxlEncoderOptionsSetEffort`, `JxlEncoderOptionsSetDecodingSpeed`,
60 `JxlEncoderOptionsSetDistance`, `JxlEncoderOptionsCreate`, as well as
61 the deprecated enumerator values `JXL_DEC_EXTENSIONS`, `JXL_ENC_NOT_SUPPORTED`,
62 `JXL_TYPE_BOOLEAN`, `JXL_TYPE_UINT32`, and deprecated type `JxlEncoderOptions`.
63 - decoder API: the signature of `JxlDecoderGetColorAsEncodedProfile`,
64 `JxlDecoderGetICCProfileSize`, and `JxlDecoderGetColorAsICCProfile`
65 changed: a deprecated unused argument was removed.
67 ### Changed / clarified
68 - changed the name of the cjxl flag `photon_noise` to `photon_noise_iso`
69 - fixed how large boxes are decoded (#2958)
70 - fixed encoding files with unreadable patches (#3042, #3046)
72 ## [0.8.2] - 2023-06-14
75 - Security: Fix an integer underflow bug in patch decoding (#2551- CVE-2023-35790).
77 ## [0.8.1] - 2023-02-03
80 - Allow fast-lossless for 16-bit float input (#2093)
81 - Fix bug in palette (#2120)
82 - Security: Fix OOB read in exif.h (#2101 - [CVE-2023-0645](https://www.cve.org/cverecord?id=CVE-2023-0645))
84 ## [0.8.0] - 2023-01-18
87 - decoder API: new function `JxlDecoderSetImageBitDepth` to set the bit depth
89 - decoder API proposal: add `JxlDecoderSetOutputColorProfile` and
90 `JxlDecoderSetCms` to enable decoding to desired colorspace; NB: not
92 - encoder API: new function `JxlEncoderSetFrameBitDepth` to set the bit depth
94 - encoder API: add an effort 10 option for lossless compression; using this
95 setting requires calling `JxlEncoderAllowExpertOptions`.
96 - encoder API: new `JXL_ENC_FRAME_SETTING_JPEG_COMPRESS_BOXES` enum value to
97 allow explicit control of metadata compression
100 - common API: removed `JxlIntrinsicSizeHeader`
101 - decoder API: removed deprecated `JXL_DEC_NEED_DC_OUT_BUFFER` and
102 `JXL_DEC_DC_IMAGE` events, `JxlDecoderDCOutBufferSize` and
103 `JxlDecoderSetDCOutBuffer` functions
105 ### Changed / clarified
106 - encoder API: `JxlEncoderProcessOutput` requires at least 32 bytes of output
107 space to proceed and guarantees that at least one byte will be written
109 ## [0.7] - 2022-07-21
112 - Export version information in headers.
113 - decoder API: Ability to decode the content of metadata boxes:
114 `JXL_DEC_BOX`, `JXL_DEC_BOX_NEED_MORE_OUTPUT`, `JxlDecoderSetBoxBuffer`,
115 `JxlDecoderGetBoxType`, `JxlDecoderGetBoxSizeRaw` and
116 `JxlDecoderSetDecompressBoxes`.
117 - decoder API: ability to mark the input is finished: `JxlDecoderCloseInput`.
118 - decoder API: ability to request updates on different progressive events using
119 `JxlDecoderSetProgressiveDetail`; currently supported events are
120 `kDC`, `kLastPasses` and `kPasses`.
121 - decoder API: ability to specify desired intensity target using
122 `JxlDecoderSetDesiredIntensityTarget`
123 - decoder API: new function `JxlDecoderSetCoalesced` to allow decoding
124 non-coalesced (unblended) frames, e.g. layers of a composite still image
125 or the cropped frames of a recompressed GIF/APNG.
126 - decoder API: new function `JxlDecoderSetUnpremultiplyAlpha` to set
127 preference for getting an associated alpha channel with premultiplied or
128 unpremultiplied colors.
129 - decoder API: field added to `JxlFrameHeader`: a `JxlLayerInfo` struct
130 that contains crop dimensions and offsets and blending information for
131 the non-coalesced case.
132 - decoder API: new function `JxlDecoderGetExtraChannelBlendInfo` to get
133 the blending information for extra channels in the non-coalesced case.
134 - decoder API: new function `JxlDecoderSetMultithreadedImageOutCallback`,
135 allowing output callbacks to receive more information about the number of
136 threads on which they are running.
137 - decoder API: new function `JxlDecoderSkipCurrentFrame` to skip processing
138 the current frame after a progressive detail is reached.
139 - decoder API: new function `JxlDecoderGetIntendedDownsamplingRatio` to get
140 the intended downsampling ratio of progressive steps, based on the
141 information in the frame header.
142 - decoder API: new function `JxlDecoderSetRenderSpotcolors` to allow disabling
143 rendering of spot colors.
144 - decoder/encoder API: add two fields to `JXLBasicInfo`: `intrinsic_xsize`
145 and `intrinsic_ysize` to signal the intrinsic size.
146 - encoder API: ability to add metadata boxes, added new functions
147 `JxlEncoderAddBox`, `JxlEncoderUseBoxes`, `JxlEncoderCloseBoxes` and
148 `JxlEncoderCloseFrames`.
149 - encoder API: added ability to set several encoder options / extra fields to
150 frames using `JxlEncoderSetFrameName`, `JxlEncoderFrameSettingsSetOption`,
151 `JxlEncoderFrameSettingsSetFloatOption`.
152 - encoder API: added ability to check required codestream compatibility level
153 and force specified using `JxlEncoderGetRequiredCodestreamLevel` and
154 `JxlEncoderSetCodestreamLevel`.
155 - encoder API: added ability to force emitting box-based container format
156 using `JxlEncoderUseContainer`.
157 - encoder API: added ability to store JPEG metadata for lossless reconstruction
158 using `JxlEncoderStoreJPEGMetadata`
159 - encoder API: new functions `JxlEncoderSetFrameHeader` and
160 `JxlEncoderSetExtraChannelBlendInfo` to set animation
161 and blending parameters of the frame, and `JxlEncoderInitFrameHeader` and
162 `JxlEncoderInitBlendInfo` to initialize the structs to set.
163 - encoder API: ability to encode arbitrary extra channels:
164 `JxlEncoderInitExtraChannelInfo`, `JxlEncoderSetExtraChannelInfo`,
165 `JxlEncoderSetExtraChannelName` and `JxlEncoderSetExtraChannelBuffer`.
166 - encoder API: ability to plug custom CMS implementation using
167 `JxlEncoderSetCms(JxlEncoder* enc, JxlCmsInterface cms)`
168 - encoder API: added `JxlEncoderGetError` to retrieve last encoder error.
171 - decoder API: using `JxlDecoderCloseInput` at the end of all input is required
172 when using JXL_DEC_BOX, and is now also encouraged in other cases, but not
173 required in those other cases for backwards compatibility.
174 - encoder API: `JxlEncoderCloseInput` now closes both frames and boxes input.
175 - CLI: `cjxl` and `djxl` have been reimplemented on the base of public decoder
176 and encoder API; dropped dependency on `gflags` for argument parsing.
179 - decoder API: `JXL_DEC_EXTENSIONS` event: use `JXL_DEC_BASIC_INFO`
180 - decoder / encoder API: pixel types `JXL_TYPE_BOOLEAN` and `JXL_TYPE_UINT32`:
181 consider using `JXL_TYPE_UINT8` and `JXL_TYPE_FLOAT` correspondingly.
182 - decoder API: pixel format parameter for `JxlDecoderGetColorAsEncodedProfile`
183 and `JxlDecoderGetICCProfileSize`: pass `NULL`.
184 - decoder API: `JxlDecoderDefaultPixelFormat`
185 - encoder API: `JxlEncoderOptions`: use `JxlEncoderFrameSettings` instead.
186 - encoder API: `JxlEncoderOptionsCreate`: use `JxlEncoderFrameSettingsCreate`
188 - encoder API: `JxlEncoderOptionsSetDistance`: use `JxlEncoderSetFrameDistance`
190 - encoder API: `JxlEncoderOptionsSetLossless`: use `JxlEncoderSetFrameLossless`
192 - encoder API: `JxlEncoderOptionsSetEffort`: use
193 `JxlEncoderFrameSettingsSetOption(frame_settings, JXL_ENC_FRAME_SETTING_EFFORT, effort)`
195 - encoder API: `JxlEncoderOptionsSetDecodingSpeed`: use
196 `JxlEncoderFrameSettingsSetOption(frame_settings, JXL_ENC_FRAME_SETTING_DECODING_SPEED, tier)`
198 - encoder API: deprecated `JXL_ENC_NOT_SUPPORTED`, the encoder returns
199 `JXL_ENC_ERROR` instead and there is no need to handle
200 `JXL_ENC_NOT_SUPPORTED`.
202 ## [0.6.1] - 2021-10-29
204 - Security: Fix OOB read in splines rendering (#735 -
205 [CVE-2021-22563](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22563))
206 - Security: Fix OOB copy (read/write) in out-of-order/multi-threaded decoding
207 (#708 - [CVE-2021-22564](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22564))
208 - Fix segfault in `djxl` tool with `--allow_partial_files` flag (#781).
209 - Fix border in extra channels when using upsampling (#796)
211 ## [0.6] - 2021-10-04
213 - API: New functions to decode extra channels:
214 `JxlDecoderExtraChannelBufferSize` and `JxlDecoderSetExtraChannelBuffer`.
215 - API: New function `JxlEncoderInitBasicInfo` to initialize `JxlBasicInfo`
216 (only needed when encoding). NOTE: it is now required to call this function
217 when using the encoder. Padding was added to the struct for forward
219 - API: Support for encoding oriented images.
220 - API: FLOAT16 support in the encoder API.
221 - Rewrite of the GDK pixbuf loader plugin. Added proper color management and
223 - Rewrite of GIMP plugin. Added compression parameters dialog and switched to
224 using the public C API.
225 - Debian packages for GDK pixbuf loader (`libjxl-gdk-pixbuf`) and GIMP
226 (`libjxl-gimp-plugin`) plugins.
227 - `cjxl`/`djxl` support for `stdin` and `stdout`.
230 - API: Renamed the field `alpha_associated` in `JxlExtraChannelInfo` to
231 `alpha_premultiplied`, to match the corresponding name in `JxlBasicInfo`.
232 - Improved the 2x2 downscaling method in the encoder for the optional color
233 channel resampling for low bit rates.
234 - Fixed: the combination of floating point original data, XYB color encoding,
235 and Modular mode was broken (in both encoder and decoder). It now works.
236 NOTE: this can cause the current encoder to write jxl bitstreams that do
237 not decode with the old decoder. In particular this will happen when using
238 cjxl with PFM, EXR, or floating point PSD input, and a combination of XYB
239 and modular mode is used (which caused an encoder error before), e.g.
240 using options like `-m -q 80` (lossy modular), `-d 4.5` or `--progressive_dc=1`
241 (modular DC frame), or default lossy encoding on an image where patches
242 end up being used. There is no problem when using cjxl with PNG, JPEG, GIF,
243 APNG, PPM, PGM, PGX, or integer (8-bit or 16-bit) PSD input.
244 - `libjxl` static library now bundles skcms, fixing static linking in
245 downstream projects when skcms is used.
246 - Spline rendering performance improvements.
247 - Butteraugli changes for less visual masking.
249 ## [0.5] - 2021-08-02
251 - API: New function to decode the image using a callback outputting a part of a
253 - API: 16-bit float output support.
254 - API: `JxlDecoderRewind` and `JxlDecoderSkipFrames` functions to skip more
255 efficiently to earlier animation frames.
256 - API: `JxlDecoderSetPreferredColorProfile` function to choose color profile in
257 certain circumstances.
258 - encoder: Adding `center_x` and `center_y` flags for more control of the tile
260 - New encoder speeds `lightning` (1) and `thunder` (2).
263 - Re-licensed the project under a BSD 3-Clause license. See the
264 [LICENSE](LICENSE) and [PATENTS](PATENTS) files for details.
265 - Full JPEG XL part 1 specification support: Implemented all the spec required
266 to decode files to pixels, including cases that are not used by the encoder
267 yet. Part 2 of the spec (container format) is final but not fully implemented
269 - Butteraugli metric improvements. Exact numbers are different from previous
271 - Memory reductions during decoding.
272 - Reduce the size of the jxl_dec library by removing dependencies.
273 - A few encoding speedups.
274 - Clarify the security policy.
275 - Significant encoding improvements (~5 %) and less ringing.
276 - Butteraugli metric to have some less masking.
277 - `cjxl` flag `--speed` is deprecated and replaced by the `--effort` synonym.
280 - API for returning a downsampled DC was deprecated
281 (`JxlDecoderDCOutBufferSize` and `JxlDecoderSetDCOutBuffer`) and will be
282 removed in the next release.
284 ## [0.3.7] - 2021-03-29
286 - Fix a rounding issue in 8-bit decoding.
288 ## [0.3.6] - 2021-03-25
290 - Fix a bug that could result in the generation of invalid codestreams as
291 well as failure to decode valid streams.
293 ## [0.3.5] - 2021-03-23
295 - New encode-time options for faster decoding at the cost of quality.
296 - Man pages for cjxl and djxl.
299 - Memory usage improvements.
300 - Faster decoding to 8-bit output with the C API.
301 - GIMP plugin: avoid the sRGB conversion dialog for sRGB images, do not show
302 a console window on Windows.
305 ## [0.3.4] - 2021-03-16
307 - Improved box parsing.
308 - Improved metadata handling.
309 - Performance and memory usage improvements.
311 ## [0.3.3] - 2021-03-05
313 - Performance improvements for small images.
314 - Add a (flag-protected) non-high-precision mode with better speed.
315 - Significantly speed up the PQ EOTF.
316 - Allow optional HDR tone mapping in djxl (--tone_map, --display_nits).
317 - Change the behavior of djxl -j to make it consistent with cjxl (#153).
318 - Improve image quality.
319 - Improve EXIF handling.
321 ## [0.3.2] - 2021-02-12
323 - Fix embedded ICC encoding regression
324 [#149](https://gitlab.com/wg1/jpeg-xl/-/issues/149).
326 ## [0.3.1] - 2021-02-10
328 - New experimental Butteraugli API (`jxl/butteraugli.h`).
329 - Encoder improvements to low quality settings.
330 - Bug fixes, including fuzzer-found potential security bug fixes.
331 - Fixed `-q 100` and `-d 0` not triggering lossless modes.
333 ## [0.3] - 2021-01-29
335 - Minor change to the Decoder C API to accommodate future work for other ways
337 - Future decoder C API changes will be backwards compatible.
338 - Lots of bug fixes since the previous version.
340 ## [0.2] - 2020-12-24
342 - JPEG XL bitstream format is frozen. Files encoded with 0.2 will be supported
346 - Files encoded with previous versions are not supported.
348 ## [0.1.1] - 2020-12-01
350 ## [0.1] - 2020-11-14
352 - Initial release of an encoder (`cjxl`) and decoder (`djxl`) that work
353 together as well as a benchmark tool for comparison with other codecs
355 - Note: JPEG XL format is in the final stages of standardization, minor changes
356 to the codestream format are still possible but we are not expecting any
357 changes beyond what is required by bug fixing.
358 - API: new decoder API in C, check the `examples/` directory for its example
359 usage. The C API is a work in progress and likely to change both in API and
360 ABI in future releases.