4 ### Significant changes relative to 2.1.5:
6 1. The SIMD dispatchers in libjpeg-turbo 2.1.4 and prior stored the list of
7 supported SIMD instruction sets in a global variable, which caused an innocuous
8 race condition whereby the variable could have been initialized multiple times
9 if `jpeg_start_*compress()` was called simultaneously in multiple threads.
10 libjpeg-turbo 2.1.5 included an undocumented attempt to fix this race condition
11 by making the SIMD support variable thread-local. However, that caused another
12 issue whereby, if `jpeg_start_*compress()` was called in one thread and
13 `jpeg_read_*()` or `jpeg_write_*()` was called in a second thread, the SIMD
14 support variable was never initialized in the second thread. On x86 systems,
15 this led the second thread to incorrectly assume that AVX2 instructions were
16 always available, and when it attempted to use those instructions on older x86
17 CPUs that do not support them, an illegal instruction error occurred. The SIMD
18 dispatchers now ensure that the SIMD support variable is initialized before
19 dispatching based on its value.
25 ### Significant changes relative to 2.1.4:
27 1. Fixed issues in the build system whereby, when using the Ninja Multi-Config
28 CMake generator, a static build of libjpeg-turbo (a build in which
29 `ENABLE_SHARED` is `0`) could not be installed, a Windows installer could not
30 be built, and the Java regression tests failed.
32 2. Fixed a regression introduced by 2.0 beta1[15] that caused a buffer overrun
33 in the progressive Huffman encoder when attempting to transform a
34 specially-crafted malformed 12-bit-per-component JPEG image into a progressive
35 12-bit-per-component JPEG image using a 12-bit-per-component build of
36 libjpeg-turbo (`-DWITH_12BIT=1`.) Given that the buffer overrun was fully
37 contained within the progressive Huffman encoder structure and did not cause a
38 segfault or other user-visible errant behavior, given that the lossless
39 transformer (unlike the decompressor) is not generally exposed to arbitrary
40 data exploits, and given that 12-bit-per-component builds of libjpeg-turbo are
41 uncommon, this issue did not likely pose a security risk.
43 3. Fixed an issue whereby, when using a 12-bit-per-component build of
44 libjpeg-turbo (`-DWITH_12BIT=1`), passing samples with values greater than 4095
45 or less than 0 to `jpeg_write_scanlines()` caused a buffer overrun or underrun
46 in the RGB-to-YCbCr color converter.
48 4. Fixed a floating point exception that occurred when attempting to use the
49 jpegtran `-drop` and `-trim` options to losslessly transform a
50 specially-crafted malformed JPEG image.
52 5. Fixed an issue in `tjBufSizeYUV2()` whereby it returned a bogus result,
53 rather than throwing an error, if the `align` parameter was not a power of 2.
54 Fixed a similar issue in `tjCompressFromYUV()` whereby it generated a corrupt
55 JPEG image in certain cases, rather than throwing an error, if the `align`
56 parameter was not a power of 2.
58 6. Fixed an issue whereby `tjDecompressToYUV2()`, which is a wrapper for
59 `tjDecompressToYUVPlanes()`, used the desired YUV image dimensions rather than
60 the actual scaled image dimensions when computing the plane pointers and
61 strides to pass to `tjDecompressToYUVPlanes()`. This caused a buffer overrun
62 and subsequent segfault if the desired image dimensions exceeded the scaled
65 7. Fixed an issue whereby, when decompressing a 12-bit-per-component JPEG image
66 (`-DWITH_12BIT=1`) using an alpha-enabled output color space such as
67 `JCS_EXT_RGBA`, the alpha channel was set to 255 rather than 4095.
69 8. Fixed an issue whereby the Java version of TJBench did not accept a range of
72 9. Fixed an issue whereby, when `-progressive` was passed to TJBench, the JPEG
73 input image was not transformed into a progressive JPEG image prior to
80 ### Significant changes relative to 2.1.3:
82 1. Fixed a regression introduced in 2.1.3 that caused build failures with
85 2. The `tjDecompressHeader3()` function in the TurboJPEG C API and the
86 `TJDecompressor.setSourceImage()` method in the TurboJPEG Java API now accept
87 "abbreviated table specification" (AKA "tables-only") datastreams, which can be
88 used to prime the decompressor with quantization and Huffman tables that can be
89 used when decompressing subsequent "abbreviated image" datastreams.
91 3. libjpeg-turbo now performs run-time detection of AltiVec instructions on
92 OS X/PowerPC systems if AltiVec instructions are not enabled at compile time.
93 This allows both AltiVec-equipped (PowerPC G4 and G5) and non-AltiVec-equipped
94 (PowerPC G3) CPUs to be supported using the same build of libjpeg-turbo.
96 4. Fixed an error ("Bogus virtual array access") that occurred when attempting
97 to decompress a progressive JPEG image with a height less than or equal to one
98 iMCU (8 * the vertical sampling factor) using buffered-image mode with
99 interblock smoothing enabled. This was a regression introduced by
102 5. Fixed two issues that prevented partial image decompression from working
103 properly with buffered-image mode:
105 - Attempting to call `jpeg_crop_scanline()` after
106 `jpeg_start_decompress()` but before `jpeg_start_output()` resulted in an error
107 ("Improper call to JPEG library in state 207".)
108 - Attempting to use `jpeg_skip_scanlines()` resulted in an error ("Bogus
109 virtual array access") under certain circumstances.
115 ### Significant changes relative to 2.1.2:
117 1. Fixed a regression introduced by 2.0 beta1[7] whereby cjpeg compressed PGM
118 input files into full-color JPEG images unless the `-grayscale` option was
121 2. cjpeg now automatically compresses GIF and 8-bit BMP input files into
122 grayscale JPEG images if the input files contain only shades of gray.
124 3. The build system now enables the intrinsics implementation of the AArch64
125 (Arm 64-bit) Neon SIMD extensions by default when using GCC 12 or later.
127 4. Fixed a segfault that occurred while decompressing a 4:2:0 JPEG image using
128 the merged (non-fancy) upsampling algorithms (that is, with
129 `cinfo.do_fancy_upsampling` set to `FALSE`) along with `jpeg_crop_scanline()`.
130 Specifically, the segfault occurred if the number of bytes remaining in the
131 output buffer was less than the number of bytes required to represent one
132 uncropped scanline of the output image. For that reason, the issue could only
133 be reproduced using the libjpeg API, not using djpeg.
139 ### Significant changes relative to 2.1.1:
141 1. Fixed a regression introduced by 2.1 beta1[13] that caused the remaining
142 GAS implementations of AArch64 (Arm 64-bit) Neon SIMD functions (which are used
143 by default with GCC for performance reasons) to be placed in the `.rodata`
144 section rather than in the `.text` section. This caused the GNU linker to
145 automatically place the `.rodata` section in an executable segment, which
146 prevented libjpeg-turbo from working properly with other linkers and also
147 represented a potential security risk.
149 2. Fixed an issue whereby the `tjTransform()` function incorrectly computed the
150 MCU block size for 4:4:4 JPEG images with non-unary sampling factors and thus
151 unduly rejected some cropping regions, even though those regions aligned with
152 8x8 MCU block boundaries.
154 3. Fixed a regression introduced by 2.1 beta1[13] that caused the build system
155 to enable the Arm Neon SIMD extensions when targetting Armv6 and other legacy
156 architectures that do not support Neon instructions.
158 4. libjpeg-turbo now performs run-time detection of AltiVec instructions on
159 FreeBSD/PowerPC systems if AltiVec instructions are not enabled at compile
160 time. This allows both AltiVec-equipped and non-AltiVec-equipped CPUs to be
161 supported using the same build of libjpeg-turbo.
163 5. cjpeg now accepts a `-strict` argument similar to that of djpeg and
164 jpegtran, which causes the compressor to abort if an LZW-compressed GIF input
165 image contains incomplete or corrupt image data.
171 ### Significant changes relative to 2.1.0:
173 1. Fixed a regression introduced in 2.1.0 that caused build failures with
174 non-GCC-compatible compilers for Un*x/Arm platforms.
176 2. Fixed a regression introduced by 2.1 beta1[13] that prevented the Arm 32-bit
177 (AArch32) Neon SIMD extensions from building unless the C compiler flags
178 included `-mfloat-abi=softfp` or `-mfloat-abi=hard`.
180 3. Fixed an issue in the AArch32 Neon SIMD Huffman encoder whereby reliance on
181 undefined C compiler behavior led to crashes ("SIGBUS: illegal alignment") on
182 Android systems when running AArch32/Thumb builds of libjpeg-turbo built with
183 recent versions of Clang.
185 4. Added a command-line argument (`-copy icc`) to jpegtran that causes it to
186 copy only the ICC profile markers from the source file and discard any other
189 5. libjpeg-turbo should now build and run on CHERI-enabled architectures, which
190 use capability pointers that are larger than the size of `size_t`.
192 6. Fixed a regression (CVE-2021-37972) introduced by 2.1 beta1[5] that caused a
193 segfault in the 64-bit SSE2 Huffman encoder when attempting to losslessly
194 transform a specially-crafted malformed JPEG image.
200 ### Significant changes relative to 2.1 beta1:
202 1. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
203 decompress certain progressive JPEG images with one or more component planes of
204 width 8 or less caused a buffer overrun.
206 2. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
207 decompress a specially-crafted malformed progressive JPEG image caused the
208 block smoothing algorithm to read from uninitialized memory.
210 3. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the
211 encoders to generate incorrect results when using the Clang compiler with
214 4. Fixed a floating point exception (CVE-2021-20205) that occurred when
215 attempting to compress a specially-crafted malformed GIF image with a specified
216 image width of 0 using cjpeg.
218 5. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
219 generate a progressive JPEG image on an SSE2-capable CPU using a scan script
220 containing one or more scans with lengths divisible by 32 and non-zero
221 successive approximation low bit positions would, under certain circumstances,
222 result in an error ("Missing Huffman code table entry") and an invalid JPEG
225 6. Introduced a new flag (`TJFLAG_LIMITSCANS` in the TurboJPEG C API and
226 `TJ.FLAG_LIMIT_SCANS` in the TurboJPEG Java API) and a corresponding TJBench
227 command-line argument (`-limitscans`) that causes the TurboJPEG decompression
228 and transform functions/operations to return/throw an error if a progressive
229 JPEG image contains an unreasonably large number of scans. This allows
230 applications that use the TurboJPEG API to guard against an exploit of the
231 progressive JPEG format described in the report
232 ["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
234 7. The PPM reader now throws an error, rather than segfaulting (due to a buffer
235 overrun, CVE-2021-46822) or generating incorrect pixels, if an application
236 attempts to use the `tjLoadImage()` function to load a 16-bit binary PPM file
237 (a binary PPM file with a maximum value greater than 255) into a grayscale
238 image buffer or to load a 16-bit binary PGM file into an RGB image buffer.
240 8. Fixed an issue in the PPM reader that caused incorrect pixels to be
241 generated when using the `tjLoadImage()` function to load a 16-bit binary PPM
242 file into an extended RGB image buffer.
244 9. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by
245 one of the TurboJPEG compression or transform functions and an error
246 subsequently occurred during compression or transformation, the JPEG buffer
247 pointer passed by the application was not updated when the function returned.
253 ### Significant changes relative to 2.0.6:
255 1. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now
256 support the x32 ABI on Linux, which allows for using x86-64 instructions with
257 32-bit pointers. The x32 ABI is generally enabled by adding `-mx32` to the
261 - CMake 3.9.0 or later is required in order for the build system to
262 automatically detect an x32 build.
263 - Java does not support the x32 ABI, and thus the TurboJPEG Java API will
264 automatically be disabled with x32 builds.
266 2. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy
267 chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion,
268 and fast integer DCT/IDCT algorithms. Relative to libjpeg-turbo 2.0.x, this
271 - the compression of RGB source images into grayscale JPEG images by
273 - the decompression of 4:2:2 JPEG images by approximately 40-60% when
274 using fancy upsampling
275 - the decompression of 4:2:2 and 4:2:0 JPEG images by approximately
276 15-20% when using merged upsampling
277 - the compression of RGB source images by approximately 30-45% when using
279 - the decompression of JPEG images into RGB destination images by
280 approximately 2x when using the fast integer IDCT
282 The overall decompression speedup for RGB images is now approximately
283 2.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.)
285 3. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer
286 supported, and the libjpeg-turbo build system can no longer be used to package
287 such builds. 32-bit iOS apps cannot run in iOS 11 and later, and the App Store
288 no longer allows them.
290 4. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported,
291 and the libjpeg-turbo build system can no longer be used to package such
292 builds. 32-bit Mac applications cannot run in macOS 10.15 "Catalina" and
293 later, and the App Store no longer allows them.
295 5. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been
296 significantly optimized, resulting in a measured average overall compression
297 speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel
298 and AMD CPUs, as well as a measured average overall compression speedup of
299 0-23% on platforms that do not have a SIMD-accelerated Huffman encoding
302 6. The block smoothing algorithm that is applied by default when decompressing
303 progressive Huffman-encoded JPEG images has been improved in the following
306 - The algorithm is now more fault-tolerant. Previously, if a particular
307 scan was incomplete, then the smoothing parameters for the incomplete scan
308 would be applied to the entire output image, including the parts of the image
309 that were generated by the prior (complete) scan. Visually, this had the
310 effect of removing block smoothing from lower-frequency scans if they were
311 followed by an incomplete higher-frequency scan. libjpeg-turbo now applies
312 block smoothing parameters to each iMCU row based on which scan generated the
313 pixels in that row, rather than always using the block smoothing parameters for
314 the most recent scan.
315 - When applying block smoothing to DC scans, a Gaussian-like kernel with a
316 5x5 window is used to reduce the "blocky" appearance.
318 7. Added SIMD acceleration for progressive Huffman encoding on Arm platforms.
319 This speeds up the compression of full-color progressive JPEGs by about 30-40%
320 on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs.
322 8. Added configure-time and run-time auto-detection of Loongson MMI SIMD
323 instructions, so that the Loongson MMI SIMD extensions can be included in any
324 MIPS64 libjpeg-turbo build.
326 9. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate
327 methods by which applications can guard against the exploits of the JPEG format
328 described in the report
329 ["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
331 - Both programs now accept a `-maxscans` argument, which can be used to
332 limit the number of allowable scans in the input file.
333 - Both programs now accept a `-strict` argument, which can be used to
334 treat all warnings as fatal.
336 10. CMake package config files are now included for both the libjpeg and
337 TurboJPEG API libraries. This facilitates using libjpeg-turbo with CMake's
338 `find_package()` function. For example:
340 find_package(libjpeg-turbo CONFIG REQUIRED)
342 add_executable(libjpeg_program libjpeg_program.c)
343 target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg)
345 add_executable(libjpeg_program_static libjpeg_program.c)
346 target_link_libraries(libjpeg_program_static PUBLIC
347 libjpeg-turbo::jpeg-static)
349 add_executable(turbojpeg_program turbojpeg_program.c)
350 target_link_libraries(turbojpeg_program PUBLIC
351 libjpeg-turbo::turbojpeg)
353 add_executable(turbojpeg_program_static turbojpeg_program.c)
354 target_link_libraries(turbojpeg_program_static PUBLIC
355 libjpeg-turbo::turbojpeg-static)
357 11. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now
358 read/write both LZW-compressed and uncompressed GIF files (feature ported from
359 jpeg-6a and jpeg-9d.)
361 12. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and
362 jpeg-9d, as well as the ability to expand the image size using the `-crop`
363 option. Refer to jpegtran.1 or usage.txt for more details.
365 13. Added a complete intrinsics implementation of the Arm Neon SIMD extensions,
366 thus providing SIMD acceleration on Arm platforms for all of the algorithms
367 that are SIMD-accelerated on x86 platforms. This new implementation is
368 significantly faster in some cases than the old GAS implementation--
369 depending on the algorithms used, the type of CPU core, and the compiler. GCC,
370 as of this writing, does not provide a full or optimal set of Neon intrinsics,
371 so for performance reasons, the default when building libjpeg-turbo with GCC is
372 to continue using the GAS implementation of the following algorithms:
374 - 32-bit RGB-to-YCbCr color conversion
375 - 32-bit fast and accurate inverse DCT
376 - 64-bit RGB-to-YCbCr and YCbCr-to-RGB color conversion
377 - 64-bit accurate forward and inverse DCT
378 - 64-bit Huffman encoding
380 A new CMake variable (`NEON_INTRINSICS`) can be used to override this
383 Since the new intrinsics implementation includes SIMD acceleration
384 for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has
387 14. The Arm Neon SIMD extensions can now be built using Visual Studio.
389 15. The build system can now be used to generate a universal x86-64 + Armv8
390 libjpeg-turbo SDK package for both iOS and macOS.
396 ### Significant changes relative to 2.0.5:
398 1. Fixed "using JNI after critical get" errors that occurred on Android
399 platforms when using any of the YUV encoding/compression/decompression/decoding
400 methods in the TurboJPEG Java API.
402 2. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`:
404 - Fixed segfaults (CVE-2020-35538) or "Corrupt JPEG data: premature end of
405 data segment" errors in `jpeg_skip_scanlines()` that occurred when
406 decompressing 4:2:2 or 4:2:0 JPEG images using merged (non-fancy)
407 upsampling/color conversion (that is, when setting `cinfo.do_fancy_upsampling`
408 to `FALSE`.) 2.0.0[6] was a similar fix, but it did not cover all cases.
409 - `jpeg_skip_scanlines()` now throws an error if two-pass color
410 quantization is enabled. Two-pass color quantization never worked properly
411 with `jpeg_skip_scanlines()`, and the issues could not readily be fixed.
412 - Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when
413 skipping past the end of an image.
415 3. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW
416 toolchains targetting Arm64 (AArch64) Windows binaries.
418 4. Fixed unexpected visual artifacts that occurred when using
419 `jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC
420 scan of a progressive JPEG image.
422 5. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component
423 JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8
424 API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.)
430 ### Significant changes relative to 2.0.4:
432 1. Worked around issues in the MIPS DSPr2 SIMD extensions that caused failures
433 in the libjpeg-turbo regression tests. Specifically, the
434 `jsimd_h2v1_downsample_dspr2()` and `jsimd_h2v2_downsample_dspr2()` functions
435 in the MIPS DSPr2 SIMD extensions are now disabled until/unless they can be
436 fixed, and other functions that are incompatible with big endian MIPS CPUs are
437 disabled when building libjpeg-turbo for such CPUs.
439 2. Fixed an oversight in the `TJCompressor.compress(int)` method in the
440 TurboJPEG Java API that caused an error ("java.lang.IllegalStateException: No
441 source image is associated with this instance") when attempting to use that
442 method to compress a YUV image.
444 3. Fixed an issue (CVE-2020-13790) in the PPM reader that caused a buffer
445 overrun in cjpeg, TJBench, or the `tjLoadImage()` function if one of the values
446 in a binary PPM/PGM input file exceeded the maximum value defined in the file's
447 header and that maximum value was less than 255. libjpeg-turbo 1.5.0 already
448 included a similar fix for binary PPM/PGM files with maximum values greater
451 4. The TurboJPEG API library's global error handler, which is used in functions
452 such as `tjBufSize()` and `tjLoadImage()` that do not require a TurboJPEG
453 instance handle, is now thread-safe on platforms that support thread-local
460 ### Significant changes relative to 2.0.3:
462 1. Fixed a regression in the Windows packaging system (introduced by
463 2.0 beta1[2]) whereby, if both the 64-bit libjpeg-turbo SDK for GCC and the
464 64-bit libjpeg-turbo SDK for Visual C++ were installed on the same system, only
465 one of them could be uninstalled.
467 2. Fixed a signed integer overflow and subsequent segfault that occurred when
468 attempting to decompress images with more than 715827882 pixels using the
469 64-bit C version of TJBench.
471 3. Fixed out-of-bounds write in `tjDecompressToYUV2()` and
472 `tjDecompressToYUVPlanes()` (sometimes manifesting as a double free) that
473 occurred when attempting to decompress grayscale JPEG images that were
474 compressed with a sampling factor other than 1 (for instance, with
475 `cjpeg -grayscale -sample 2x2`).
477 4. Fixed a regression introduced by 2.0.2[5] that caused the TurboJPEG API to
478 incorrectly identify some JPEG images with unusual sampling factors as 4:4:4
479 JPEG images. This was known to cause a buffer overflow when attempting to
480 decompress some such images using `tjDecompressToYUV2()` or
481 `tjDecompressToYUVPlanes()`.
483 5. Fixed an issue (CVE-2020-17541), detected by ASan, whereby attempting to
484 losslessly transform a specially-crafted malformed JPEG image containing an
485 extremely-high-frequency coefficient block (junk image data that could never be
486 generated by a legitimate JPEG compressor) could cause the Huffman encoder's
487 local buffer to be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].) Given that
488 the buffer overrun was fully contained within the stack and did not cause a
489 segfault or other user-visible errant behavior, and given that the lossless
490 transformer (unlike the decompressor) is not generally exposed to arbitrary
491 data exploits, this issue did not likely pose a security risk.
493 6. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a
494 separate read-only data section rather than in the text section, to support
495 execute-only memory layouts.
501 ### Significant changes relative to 2.0.2:
503 1. Fixed "using JNI after critical get" errors that occurred on Android
504 platforms when passing invalid arguments to certain methods in the TurboJPEG
507 2. Fixed a regression in the SIMD feature detection code, introduced by
508 the AVX2 SIMD extensions (2.0 beta1[1]), that was known to cause an illegal
509 instruction exception, in rare cases, on CPUs that lack support for CPUID leaf
510 07H (or on which the maximum CPUID leaf has been limited by way of a BIOS
513 3. The 4:4:0 (h1v2) fancy (smooth) chroma upsampling algorithm in the
514 decompressor now uses a similar bias pattern to that of the 4:2:2 (h2v1) fancy
515 chroma upsampling algorithm, rounding up or down the upsampled result for
516 alternate pixels rather than always rounding down. This ensures that,
517 regardless of whether a 4:2:2 JPEG image is rotated or transposed prior to
518 decompression (in the frequency domain) or after decompression (in the spatial
519 domain), the final image will be similar.
521 4. Fixed an integer overflow and subsequent segfault that occurred when
522 attempting to compress or decompress images with more than 1 billion pixels
523 using the TurboJPEG API.
525 5. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
526 generate a progressive JPEG image on an SSE2-capable CPU using a scan script
527 containing one or more scans with lengths divisible by 16 would result in an
528 error ("Missing Huffman code table entry") and an invalid JPEG image.
530 6. Fixed an issue whereby `tjDecodeYUV()` and `tjDecodeYUVPlanes()` would throw
531 an error ("Invalid progressive parameters") or a warning ("Inconsistent
532 progression sequence") if passed a TurboJPEG instance that was previously used
533 to decompress a progressive JPEG image.
539 ### Significant changes relative to 2.0.1:
541 1. Fixed a regression introduced by 2.0.1[5] that prevented a runtime search
542 path (rpath) from being embedded in the libjpeg-turbo shared libraries and
543 executables for macOS and iOS. This caused a fatal error of the form
544 "dyld: Library not loaded" when attempting to use one of the executables,
545 unless `DYLD_LIBRARY_PATH` was explicitly set to the location of the
546 libjpeg-turbo shared libraries.
548 2. Fixed an integer overflow and subsequent segfault (CVE-2018-20330) that
549 occurred when attempting to load a BMP file with more than 1 billion pixels
550 using the `tjLoadImage()` function.
552 3. Fixed a buffer overrun (CVE-2018-19664) that occurred when attempting to
553 decompress a specially-crafted malformed JPEG image to a 256-color BMP using
556 4. Fixed a floating point exception that occurred when attempting to
557 decompress a specially-crafted malformed JPEG image with a specified image
558 width or height of 0 using the C version of TJBench.
560 5. The TurboJPEG API will now decompress 4:4:4 JPEG images with 2x1, 1x2, 3x1,
561 or 1x3 luminance and chrominance sampling factors. This is a non-standard way
562 of specifying 1x subsampling (normally 4:4:4 JPEGs have 1x1 luminance and
563 chrominance sampling factors), but the JPEG format and the libjpeg API both
566 6. Fixed a regression introduced by 2.0 beta1[7] that caused djpeg to generate
567 incorrect PPM images when used with the `-colors` option.
569 7. Fixed an issue whereby a static build of libjpeg-turbo (a build in which
570 `ENABLE_SHARED` is `0`) could not be installed using the Visual Studio IDE.
572 8. Fixed a severe performance issue in the Loongson MMI SIMD extensions that
573 occurred when compressing RGB images whose image rows were not 64-bit-aligned.
579 ### Significant changes relative to 2.0.0:
581 1. Fixed a regression introduced with the new CMake-based Un*x build system,
582 whereby jconfig.h could cause compiler warnings of the form
583 `"HAVE_*_H" redefined` if it was included by downstream Autotools-based
584 projects that used `AC_CHECK_HEADERS()` to check for the existence of locale.h,
585 stddef.h, or stdlib.h.
587 2. The `jsimd_quantize_float_dspr2()` and `jsimd_convsamp_float_dspr2()`
588 functions in the MIPS DSPr2 SIMD extensions are now disabled at compile time
589 if the soft float ABI is enabled. Those functions use instructions that are
590 incompatible with the soft float ABI.
592 3. Fixed a regression in the SIMD feature detection code, introduced by
593 the AVX2 SIMD extensions (2.0 beta1[1]), that caused libjpeg-turbo to crash on
594 Windows 7 if Service Pack 1 was not installed.
596 4. Fixed out-of-bounds read in cjpeg that occurred when attempting to compress
597 a specially-crafted malformed color-index (8-bit-per-sample) Targa file in
598 which some of the samples (color indices) exceeded the bounds of the Targa
601 5. Fixed an issue whereby installing a fully static build of libjpeg-turbo
602 (a build in which `CFLAGS` contains `-static` and `ENABLE_SHARED` is `0`) would
603 fail with "No valid ELF RPATH or RUNPATH entry exists in the file."
609 ### Significant changes relative to 2.0 beta1:
611 1. The TurboJPEG API can now decompress CMYK JPEG images that have subsampled M
612 and Y components (not to be confused with YCCK JPEG images, in which the C/M/Y
613 components have been transformed into luma and chroma.) Previously, an error
614 was generated ("Could not determine subsampling type for JPEG image") when such
615 an image was passed to `tjDecompressHeader3()`, `tjTransform()`,
616 `tjDecompressToYUVPlanes()`, `tjDecompressToYUV2()`, or the equivalent Java
619 2. Fixed an issue (CVE-2018-11813) whereby a specially-crafted malformed input
620 file (specifically, a file with a valid Targa header but incomplete pixel data)
621 would cause cjpeg to generate a JPEG file that was potentially thousands of
622 times larger than the input file. The Targa reader in cjpeg was not properly
623 detecting that the end of the input file had been reached prematurely, so after
624 all valid pixels had been read from the input, the reader injected dummy pixels
625 with values of 255 into the JPEG compressor until the number of pixels
626 specified in the Targa header had been compressed. The Targa reader in cjpeg
627 now behaves like the PPM reader and aborts compression if the end of the input
628 file is reached prematurely. Because this issue only affected cjpeg and not
629 the underlying library, and because it did not involve any out-of-bounds reads
630 or other exploitable behaviors, it was not believed to represent a security
633 3. Fixed an issue whereby the `tjLoadImage()` and `tjSaveImage()` functions
634 would produce a "Bogus message code" error message if the underlying bitmap and
635 PPM readers/writers threw an error that was specific to the readers/writers
636 (as opposed to a general libjpeg API error.)
638 4. Fixed an issue (CVE-2018-1152) whereby a specially-crafted malformed BMP
639 file, one in which the header specified an image width of 1073741824 pixels,
640 would trigger a floating point exception (division by zero) in the
641 `tjLoadImage()` function when attempting to load the BMP file into a
642 4-component image buffer.
644 5. Fixed an issue whereby certain combinations of calls to
645 `jpeg_skip_scanlines()` and `jpeg_read_scanlines()` could trigger an infinite
646 loop when decompressing progressive JPEG images that use vertical chroma
647 subsampling (for instance, 4:2:0 or 4:4:0.)
649 6. Fixed a segfault in `jpeg_skip_scanlines()` that occurred when decompressing
650 a 4:2:2 or 4:2:0 JPEG image using the merged (non-fancy) upsampling algorithms
651 (that is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.)
653 7. The new CMake-based build system will now disable the MIPS DSPr2 SIMD
654 extensions if it detects that the compiler does not support DSPr2 instructions.
656 8. Fixed out-of-bounds read in cjpeg (CVE-2018-14498) that occurred when
657 attempting to compress a specially-crafted malformed color-index
658 (8-bit-per-sample) BMP file in which some of the samples (color indices)
659 exceeded the bounds of the BMP file's color table.
661 9. Fixed a signed integer overflow in the progressive Huffman decoder, detected
662 by the Clang and GCC undefined behavior sanitizers, that could be triggered by
663 attempting to decompress a specially-crafted malformed JPEG image. This issue
664 did not pose a security threat, but removing the warning made it easier to
665 detect actual security issues, should they arise in the future.
671 ### Significant changes relative to 1.5.3:
673 1. Added AVX2 SIMD implementations of the colorspace conversion, chroma
674 downsampling and upsampling, integer quantization and sample conversion, and
675 accurate integer DCT/IDCT algorithms. When using the accurate integer DCT/IDCT
676 algorithms on AVX2-equipped CPUs, the compression of RGB images is
677 approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
678 64-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
679 decompression of RGB images is approximately 9-35% (avg. 17%) faster with
680 64-bit code and 7-17% (avg. 12%) faster with 32-bit code. (As tested on a
681 3 GHz Intel Core i7. Actual mileage may vary.)
683 2. Overhauled the build system to use CMake on all platforms, and removed the
684 autotools-based build system. This decision resulted from extensive
685 discussions within the libjpeg-turbo community. libjpeg-turbo traditionally
686 used CMake only for Windows builds, but there was an increasing amount of
687 demand to extend CMake support to other platforms. However, because of the
688 unique nature of our code base (the need to support different assemblers on
689 each platform, the need for Java support, etc.), providing dual build systems
690 as other OSS imaging libraries do (including libpng and libtiff) would have
691 created a maintenance burden. The use of CMake greatly simplifies some aspects
692 of our build system, owing to CMake's built-in support for various assemblers,
693 Java, and unit testing, as well as generally fewer quirks that have to be
694 worked around in order to implement our packaging system. Eliminating
695 autotools puts our project slightly at odds with the traditional practices of
696 the OSS community, since most "system libraries" tend to be built with
697 autotools, but it is believed that the benefits of this move outweigh the
698 risks. In addition to providing a unified build environment, switching to
699 CMake allows for the use of various build tools and IDEs that aren't supported
700 under autotools, including XCode, Ninja, and Eclipse. It also eliminates the
701 need to install autotools via MacPorts/Homebrew on OS X and allows
702 libjpeg-turbo to be configured without the use of a terminal/command prompt.
703 Extensive testing was conducted to ensure that all features provided by the
704 autotools-based build system are provided by the new build system.
706 3. The libjpeg API in this version of libjpeg-turbo now includes two additional
707 functions, `jpeg_read_icc_profile()` and `jpeg_write_icc_profile()`, that can
708 be used to extract ICC profile data from a JPEG file while decompressing or to
709 embed ICC profile data in a JPEG file while compressing or transforming. This
710 eliminates the need for downstream projects, such as color management libraries
711 and browsers, to include their own glueware for accomplishing this.
713 4. Improved error handling in the TurboJPEG API library:
715 - Introduced a new function (`tjGetErrorStr2()`) in the TurboJPEG C API
716 that allows compression/decompression/transform error messages to be retrieved
717 in a thread-safe manner. Retrieving error messages from global functions, such
718 as `tjInitCompress()` or `tjBufSize()`, is still thread-unsafe, but since those
719 functions will only throw errors if passed an invalid argument or if a memory
720 allocation failure occurs, thread safety is not as much of a concern.
721 - Introduced a new function (`tjGetErrorCode()`) in the TurboJPEG C API
722 and a new method (`TJException.getErrorCode()`) in the TurboJPEG Java API that
723 can be used to determine the severity of the last
724 compression/decompression/transform error. This allows applications to
725 choose whether to ignore warnings (non-fatal errors) from the underlying
726 libjpeg API or to treat them as fatal.
727 - Introduced a new flag (`TJFLAG_STOPONWARNING` in the TurboJPEG C API and
728 `TJ.FLAG_STOPONWARNING` in the TurboJPEG Java API) that causes the library to
729 immediately halt a compression/decompression/transform operation if it
730 encounters a warning from the underlying libjpeg API (the default behavior is
731 to allow the operation to complete unless a fatal error is encountered.)
733 5. Introduced a new flag in the TurboJPEG C and Java APIs (`TJFLAG_PROGRESSIVE`
734 and `TJ.FLAG_PROGRESSIVE`, respectively) that causes the library to use
735 progressive entropy coding in JPEG images generated by compression and
736 transform operations. Additionally, a new transform option
737 (`TJXOPT_PROGRESSIVE` in the C API and `TJTransform.OPT_PROGRESSIVE` in the
738 Java API) has been introduced, allowing progressive entropy coding to be
739 enabled for selected transforms in a multi-transform operation.
741 6. Introduced a new transform option in the TurboJPEG API (`TJXOPT_COPYNONE` in
742 the C API and `TJTransform.OPT_COPYNONE` in the Java API) that allows the
743 copying of markers (including EXIF and ICC profile data) to be disabled for a
744 particular transform.
746 7. Added two functions to the TurboJPEG C API (`tjLoadImage()` and
747 `tjSaveImage()`) that can be used to load/save a BMP or PPM/PGM image to/from a
748 memory buffer with a specified pixel format and layout. These functions
749 replace the project-private (and slow) bmp API, which was previously used by
750 TJBench, and they also provide a convenient way for first-time users of
751 libjpeg-turbo to quickly develop a complete JPEG compression/decompression
754 8. The TurboJPEG C API now includes a new convenience array (`tjAlphaOffset[]`)
755 that contains the alpha component index for each pixel format (or -1 if the
756 pixel format lacks an alpha component.) The TurboJPEG Java API now includes a
757 new method (`TJ.getAlphaOffset()`) that returns the same value. In addition,
758 the `tjRedOffset[]`, `tjGreenOffset[]`, and `tjBlueOffset[]` arrays-- and the
759 corresponding `TJ.getRedOffset()`, `TJ.getGreenOffset()`, and
760 `TJ.getBlueOffset()` methods-- now return -1 for `TJPF_GRAY`/`TJ.PF_GRAY`
761 rather than 0. This allows programs to easily determine whether a pixel format
762 has red, green, blue, and alpha components.
764 9. Added a new example (tjexample.c) that demonstrates the basic usage of the
765 TurboJPEG C API. This example mirrors the functionality of TJExample.java.
766 Both files are now included in the libjpeg-turbo documentation.
768 10. Fixed two signed integer overflows in the arithmetic decoder, detected by
769 the Clang undefined behavior sanitizer, that could be triggered by attempting
770 to decompress a specially-crafted malformed JPEG image. These issues did not
771 pose a security threat, but removing the warnings makes it easier to detect
772 actual security issues, should they arise in the future.
774 11. Fixed a bug in the merged 4:2:0 upsampling/dithered RGB565 color conversion
775 algorithm that caused incorrect dithering in the output image. This algorithm
776 now produces bitwise-identical results to the unmerged algorithms.
778 12. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
779 libjpeg-turbo is built with Yasm), and iOS/Arm[64] builds are now private.
780 This prevents those symbols from being exposed in applications or shared
781 libraries that link statically with libjpeg-turbo.
783 13. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
784 YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
785 chroma upsampling, integer quantization, and accurate integer DCT/IDCT
786 algorithms. When using the accurate integer DCT/IDCT, this speeds up the
787 compression of RGB images by approximately 70-100% and the decompression of RGB
788 images by approximately 2-3.5x.
790 14. Fixed a build error when building with older MinGW releases (regression
793 15. Added SIMD acceleration for progressive Huffman encoding on SSE2-capable
794 x86 and x86-64 platforms. This speeds up the compression of full-color
795 progressive JPEGs by about 85-90% on average (relative to libjpeg-turbo 1.5.x)
796 when using modern Intel and AMD CPUs.
802 ### Significant changes relative to 1.5.2:
804 1. Fixed a NullPointerException in the TurboJPEG Java wrapper that occurred
805 when using the YUVImage constructor that creates an instance backed by separate
806 image planes and allocates memory for the image planes.
808 2. Fixed an issue whereby the Java version of TJUnitTest would fail when
809 testing BufferedImage encoding/decoding on big endian systems.
811 3. Fixed a segfault in djpeg that would occur if an output format other than
812 PPM/PGM was selected along with the `-crop` option. The `-crop` option now
813 works with the GIF and Targa formats as well (unfortunately, it cannot be made
814 to work with the BMP and RLE formats due to the fact that those output engines
815 write scanlines in bottom-up order.) djpeg will now exit gracefully if an
816 output format other than PPM/PGM, GIF, or Targa is selected along with the
819 4. Fixed an issue (CVE-2017-15232) whereby `jpeg_skip_scanlines()` would
820 segfault if color quantization was enabled.
822 5. TJBench (both C and Java versions) will now display usage information if any
823 command-line argument is unrecognized. This prevents the program from silently
826 6. Fixed an access violation in tjbench.exe (Windows) that occurred when the
827 program was used to decompress an existing JPEG image.
829 7. Fixed an ArrayIndexOutOfBoundsException in the TJExample Java program that
830 occurred when attempting to decompress a JPEG image that had been compressed
831 with 4:1:1 chrominance subsampling.
833 8. Fixed an issue whereby, when using `jpeg_skip_scanlines()` to skip to the
834 end of a single-scan (non-progressive) image, subsequent calls to
835 `jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
838 9. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG
839 images that were compressed with a sampling factor other than 1 (for instance,
840 with `cjpeg -grayscale -sample 2x2`).
846 ### Significant changes relative to 1.5.1:
848 1. Fixed a regression introduced by 1.5.1[7] that prevented libjpeg-turbo from
849 building with Android NDK platforms prior to android-21 (5.0).
851 2. Fixed a regression introduced by 1.5.1[1] that prevented the MIPS DSPR2 SIMD
852 code in libjpeg-turbo from building.
854 3. Fixed a regression introduced by 1.5 beta1[11] that prevented the Java
855 version of TJBench from outputting any reference images (the `-nowrite` switch
856 was accidentally enabled by default.)
858 4. libjpeg-turbo should now build and run with full AltiVec SIMD acceleration
859 on PowerPC-based AmigaOS 4 and OpenBSD systems.
861 5. Fixed build and runtime errors on Windows that occurred when building
862 libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
863 source/destination managers. Due to an oversight, the `jpeg_skip_scanlines()`
864 and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when
865 libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
867 6. Fixed "Bogus virtual array access" error that occurred when using the
868 lossless crop feature in jpegtran or the TurboJPEG API, if libjpeg-turbo was
869 built with libjpeg v7 API/ABI emulation. This was apparently a long-standing
870 bug that has existed since the introduction of libjpeg v7/v8 API/ABI emulation
871 in libjpeg-turbo v1.1.
873 7. The lossless transform features in jpegtran and the TurboJPEG API will now
874 always attempt to adjust the EXIF image width and height tags if the image size
875 changed as a result of the transform. This behavior has always existed when
876 using libjpeg v8 API/ABI emulation. It was supposed to be available with
877 libjpeg v7 API/ABI emulation as well but did not work properly due to a bug.
878 Furthermore, there was never any good reason not to enable it with libjpeg v6b
879 API/ABI emulation, since the behavior is entirely internal. Note that
880 `-copy all` must be passed to jpegtran in order to transfer the EXIF tags from
881 the source image to the destination image.
883 8. Fixed several memory leaks in the TurboJPEG API library that could occur
884 if the library was built with certain compilers and optimization levels
885 (known to occur with GCC 4.x and clang with `-O1` and higher but not with
886 GCC 5.x or 6.x) and one of the underlying libjpeg API functions threw an error
887 after a TurboJPEG API function allocated a local buffer.
889 9. The libjpeg-turbo memory manager will now honor the `max_memory_to_use`
890 structure member in jpeg\_memory\_mgr, which can be set to the maximum amount
891 of memory (in bytes) that libjpeg-turbo should use during decompression or
892 multi-pass (including progressive) compression. This limit can also be set
893 using the `JPEGMEM` environment variable or using the `-maxmemory` switch in
894 cjpeg/djpeg/jpegtran (refer to the respective man pages for more details.)
895 This has been a documented feature of libjpeg since v5, but the
896 `malloc()`/`free()` implementation of the memory manager (jmemnobs.c) never
897 implemented the feature. Restricting libjpeg-turbo's memory usage is useful
898 for two reasons: it allows testers to more easily work around the 2 GB limit
899 in libFuzzer, and it allows developers of security-sensitive applications to
900 more easily defend against one of the progressive JPEG exploits (LJT-01-004)
902 [this report](http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
904 10. TJBench will now run each benchmark for 1 second prior to starting the
905 timer, in order to improve the consistency of the results. Furthermore, the
906 `-warmup` option is now used to specify the amount of warmup time rather than
907 the number of warmup iterations.
909 11. Fixed an error (`short jump is out of range`) that occurred when assembling
910 the 32-bit x86 SIMD extensions with NASM versions prior to 2.04. This was a
911 regression introduced by 1.5 beta1[12].
917 ### Significant changes relative to 1.5.0:
919 1. Previously, the undocumented `JSIMD_FORCE*` environment variables could be
920 used to force-enable a particular SIMD instruction set if multiple instruction
921 sets were available on a particular platform. On x86 platforms, where CPU
922 feature detection is bulletproof and multiple SIMD instruction sets are
923 available, it makes sense for those environment variables to allow forcing the
924 use of an instruction set only if that instruction set is available. However,
925 since the ARM implementations of libjpeg-turbo can only use one SIMD
926 instruction set, and since their feature detection code is less bulletproof
927 (parsing /proc/cpuinfo), it makes sense for the `JSIMD_FORCENEON` environment
928 variable to bypass the feature detection code and really force the use of NEON
929 instructions. A new environment variable (`JSIMD_FORCEDSPR2`) was introduced
930 in the MIPS implementation for the same reasons, and the existing
931 `JSIMD_FORCENONE` environment variable was extended to that implementation.
932 These environment variables provide a workaround for those attempting to test
933 ARM and MIPS builds of libjpeg-turbo in QEMU, which passes through
934 /proc/cpuinfo from the host system.
936 2. libjpeg-turbo previously assumed that AltiVec instructions were always
937 available on PowerPC platforms, which led to "illegal instruction" errors when
938 running on PowerPC chips that lack AltiVec support (such as the older 7xx/G3
939 and newer e5500 series.) libjpeg-turbo now examines /proc/cpuinfo on
940 Linux/Android systems and enables AltiVec instructions only if the CPU supports
941 them. It also now provides two environment variables, `JSIMD_FORCEALTIVEC` and
942 `JSIMD_FORCENONE`, to force-enable and force-disable AltiVec instructions in
943 environments where /proc/cpuinfo is an unreliable means of CPU feature
944 detection (such as when running in QEMU.) On OS X, libjpeg-turbo continues to
945 assume that AltiVec support is always available, which means that libjpeg-turbo
946 cannot be used with G3 Macs unless you set the environment variable
947 `JSIMD_FORCENONE` to `1`.
949 3. Fixed an issue whereby 64-bit ARM (AArch64) builds of libjpeg-turbo would
950 crash when built with recent releases of the Clang/LLVM compiler. This was
951 caused by an ABI conformance issue in some of libjpeg-turbo's 64-bit NEON SIMD
952 routines. Those routines were incorrectly using 64-bit instructions to
953 transfer a 32-bit JDIMENSION argument, whereas the ABI allows the upper
954 (unused) 32 bits of a 32-bit argument's register to be undefined. The new
955 Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
956 structure members into a single 64-bit register, and this exposed the ABI
959 4. Fancy upsampling is now supported when decompressing JPEG images that use
960 4:4:0 (h1v2) chroma subsampling. These images are generated when losslessly
961 rotating or transposing JPEG images that use 4:2:2 (h2v1) chroma subsampling.
962 The h1v2 fancy upsampling algorithm is not currently SIMD-accelerated.
964 5. If merged upsampling isn't SIMD-accelerated but YCbCr-to-RGB conversion is,
965 then libjpeg-turbo will now disable merged upsampling when decompressing YCbCr
966 JPEG images into RGB or extended RGB output images. This significantly speeds
967 up the decompression of 4:2:0 and 4:2:2 JPEGs on ARM platforms if fancy
968 upsampling is not used (for example, if the `-nosmooth` option to djpeg is
971 6. The TurboJPEG API will now decompress 4:2:2 and 4:4:0 JPEG images with
972 2x2 luminance sampling factors and 2x1 or 1x2 chrominance sampling factors.
973 This is a non-standard way of specifying 2x subsampling (normally 4:2:2 JPEGs
974 have 2x1 luminance and 1x1 chrominance sampling factors, and 4:4:0 JPEGs have
975 1x2 luminance and 1x1 chrominance sampling factors), but the JPEG format and
976 the libjpeg API both allow it.
978 7. Fixed an unsigned integer overflow in the libjpeg memory manager, detected
979 by the Clang undefined behavior sanitizer, that could be triggered by
980 attempting to decompress a specially-crafted malformed JPEG image. This issue
981 affected only 32-bit code and did not pose a security threat, but removing the
982 warning makes it easier to detect actual security issues, should they arise in
985 8. Fixed additional negative left shifts and other issues reported by the GCC
986 and Clang undefined behavior sanitizers when attempting to decompress
987 specially-crafted malformed JPEG images. None of these issues posed a security
988 threat, but removing the warnings makes it easier to detect actual security
989 issues, should they arise in the future.
991 9. Fixed an out-of-bounds array reference, introduced by 1.4.90[2] (partial
992 image decompression) and detected by the Clang undefined behavior sanitizer,
993 that could be triggered by a specially-crafted malformed JPEG image with more
994 than four components. Because the out-of-bounds reference was still within the
995 same structure, it was not known to pose a security threat, but removing the
996 warning makes it easier to detect actual security issues, should they arise in
999 10. Fixed another ABI conformance issue in the 64-bit ARM (AArch64) NEON SIMD
1000 code. Some of the routines were incorrectly reading and storing data below the
1001 stack pointer, which caused segfaults in certain applications under specific
1008 ### Significant changes relative to 1.5 beta1:
1010 1. Fixed an issue whereby a malformed motion-JPEG frame could cause the "fast
1011 path" of libjpeg-turbo's Huffman decoder to read from uninitialized memory.
1013 2. Added libjpeg-turbo version and build information to the global string table
1014 of the libjpeg and TurboJPEG API libraries. This is a common practice in other
1015 infrastructure libraries, such as OpenSSL and libpng, because it makes it easy
1016 to examine an application binary and determine which version of the library the
1017 application was linked against.
1019 3. Fixed a couple of issues in the PPM reader that would cause buffer overruns
1020 in cjpeg if one of the values in a binary PPM/PGM input file exceeded the
1021 maximum value defined in the file's header and that maximum value was greater
1022 than 255. libjpeg-turbo 1.4.2 already included a similar fix for ASCII PPM/PGM
1023 files. Note that these issues were not security bugs, since they were confined
1024 to the cjpeg program and did not affect any of the libjpeg-turbo libraries.
1026 4. Fixed an issue whereby attempting to decompress a JPEG file with a corrupt
1027 header using the `tjDecompressToYUV2()` function would cause the function to
1028 abort without returning an error and, under certain circumstances, corrupt the
1029 stack. This only occurred if `tjDecompressToYUV2()` was called prior to
1030 calling `tjDecompressHeader3()`, or if the return value from
1031 `tjDecompressHeader3()` was ignored (both cases represent incorrect usage of
1034 5. Fixed an issue in the ARM 32-bit SIMD-accelerated Huffman encoder that
1035 prevented the code from assembling properly with clang.
1037 6. The `jpeg_stdio_src()`, `jpeg_mem_src()`, `jpeg_stdio_dest()`, and
1038 `jpeg_mem_dest()` functions in the libjpeg API will now throw an error if a
1039 source/destination manager has already been assigned to the compress or
1040 decompress object by a different function or by the calling program. This
1041 prevents these functions from attempting to reuse a source/destination manager
1042 structure that was allocated elsewhere, because there is no way to ensure that
1043 it would be big enough to accommodate the new source/destination manager.
1049 ### Significant changes relative to 1.4.2:
1051 1. Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
1052 (128-bit SIMD) instructions. Although the performance of libjpeg-turbo on
1053 PowerPC was already good, due to the increased number of registers available
1054 to the compiler vs. x86, it was still possible to speed up compression by about
1055 3-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
1056 use of AltiVec instructions.
1058 2. Added two new libjpeg API functions (`jpeg_skip_scanlines()` and
1059 `jpeg_crop_scanline()`) that can be used to partially decode a JPEG image. See
1060 [libjpeg.txt](libjpeg.txt) for more details.
1062 3. The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
1063 implement the Closeable interface, so those classes can be used with a
1064 try-with-resources statement.
1066 4. The TurboJPEG Java classes now throw unchecked idiomatic exceptions
1067 (IllegalArgumentException, IllegalStateException) for unrecoverable errors
1068 caused by incorrect API usage, and those classes throw a new checked exception
1069 type (TJException) for errors that are passed through from the C library.
1071 5. Source buffers for the TurboJPEG C API functions, as well as the
1072 `jpeg_mem_src()` function in the libjpeg API, are now declared as const
1073 pointers. This facilitates passing read-only buffers to those functions and
1074 ensures the caller that the source buffer will not be modified. This should
1075 not create any backward API or ABI incompatibilities with prior libjpeg-turbo
1078 6. The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
1081 7. Fixed additional negative left shifts and other issues reported by the GCC
1082 and Clang undefined behavior sanitizers. Most of these issues affected only
1083 32-bit code, and none of them was known to pose a security threat, but removing
1084 the warnings makes it easier to detect actual security issues, should they
1085 arise in the future.
1087 8. Removed the unnecessary `.arch` directive from the ARM64 NEON SIMD code.
1088 This directive was preventing the code from assembling using the clang
1089 integrated assembler.
1091 9. Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
1092 libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
1093 distributions. This was due to the addition of a macro in jconfig.h that
1094 allows the Huffman codec to determine the word size at compile time. Since
1095 that macro differs between 32-bit and 64-bit builds, this caused a conflict
1096 between the i386 and x86_64 RPMs (any differing files, other than executables,
1097 are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
1098 Since the macro is used only internally, it has been moved into jconfigint.h.
1100 10. The x86-64 SIMD code can now be disabled at run time by setting the
1101 `JSIMD_FORCENONE` environment variable to `1` (the other SIMD implementations
1102 already had this capability.)
1104 11. Added a new command-line argument to TJBench (`-nowrite`) that prevents the
1105 benchmark from outputting any images. This removes any potential operating
1106 system overhead that might be caused by lazy writes to disk and thus improves
1107 the consistency of the performance measurements.
1109 12. Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and x86-64
1110 platforms. This speeds up the compression of full-color JPEGs by about 10-15%
1111 on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and AMD
1112 CPUs. Additionally, this works around an issue in the clang optimizer that
1113 prevents it (as of this writing) from achieving the same performance as GCC
1114 when compiling the C version of the Huffman encoder
1115 (<https://llvm.org/bugs/show_bug.cgi?id=16035>). For the purposes of
1116 benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
1117 disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
1119 13. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
1120 compression algorithms (including the accurate integer forward DCT and h2v2 &
1121 h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON
1122 implementation.) This speeds up the compression of full-color JPEGs by about
1123 75% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
1124 Cortex-A53 and Cortex-A57 cores.
1126 14. Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
1127 and 64-bit platforms.
1129 For 32-bit code, this speeds up the compression of full-color JPEGs by
1130 about 30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by
1131 about 6-7% on average on a typical Android device (Nexus 5X, Cortex-A53 and
1132 Cortex-A57), relative to libjpeg-turbo 1.4.x. Note that the larger speedup
1133 under iOS is due to the fact that iOS builds use LLVM, which does not optimize
1134 the C Huffman encoder as well as GCC does.
1136 For 64-bit code, NEON-accelerated Huffman encoding speeds up the
1137 compression of full-color JPEGs by about 40% on average on a typical iOS device
1138 (iPhone 5S, Apple A7) and by about 7-8% on average on a typical Android device
1139 (Nexus 5X, Cortex-A53 and Cortex-A57), in addition to the speedup described in
1142 For the purposes of benchmarking or regression testing, SIMD-accelerated
1143 Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment
1146 15. pkg-config (.pc) scripts are now included for both the libjpeg and
1147 TurboJPEG API libraries on Un*x systems. Note that if a project's build system
1148 relies on these scripts, then it will not be possible to build that project
1149 with libjpeg or with a prior version of libjpeg-turbo.
1151 16. Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
1152 improve performance on CPUs with in-order pipelines. This speeds up the
1153 decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
1154 processor and by about 15% on average on a Cortex-A53 core.
1156 17. Fixed an issue in the accelerated Huffman decoder that could have caused
1157 the decoder to read past the end of the input buffer when a malformed,
1158 specially-crafted JPEG image was being decompressed. In prior versions of
1159 libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
1160 if there were > 128 bytes of data in the input buffer. However, it is possible
1161 to construct a JPEG image in which a single Huffman block is over 430 bytes
1162 long, so this version of libjpeg-turbo activates the accelerated Huffman
1163 decoder only if there are > 512 bytes of data in the input buffer.
1165 18. Fixed a memory leak in tjunittest encountered when running the program
1166 with the `-yuv` option.
1172 ### Significant changes relative to 1.4.1:
1174 1. Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
1175 negative width or height was used as an input image (Windows bitmaps can have
1176 a negative height if they are stored in top-down order, but such files are
1177 rare and not supported by libjpeg-turbo.)
1179 2. Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
1180 incorrectly encode certain JPEG images when quality=100 and the fast integer
1181 forward DCT were used. This was known to cause `make test` to fail when the
1182 library was built with `-march=haswell` on x86 systems.
1184 3. Fixed an issue whereby libjpeg-turbo would crash when built with the latest
1185 & greatest development version of the Clang/LLVM compiler. This was caused by
1186 an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
1187 routines. Those routines were incorrectly using a 64-bit `mov` instruction to
1188 transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
1189 (unused) 32 bits of a 32-bit argument's register to be undefined. The new
1190 Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
1191 structure members into a single 64-bit register, and this exposed the ABI
1194 4. Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
1195 upsampling routine that caused a buffer overflow (and subsequent segfault) when
1196 decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
1197 pixels. The "plain" upsampling routines are normally only used when
1198 decompressing a non-YCbCr JPEG image, but they are also used when decompressing
1199 a JPEG image whose scaled output height is 1.
1201 5. Fixed various negative left shifts and other issues reported by the GCC and
1202 Clang undefined behavior sanitizers. None of these was known to pose a
1203 security threat, but removing the warnings makes it easier to detect actual
1204 security issues, should they arise in the future.
1210 ### Significant changes relative to 1.4.0:
1212 1. tjbench now properly handles CMYK/YCCK JPEG files. Passing an argument of
1213 `-cmyk` (instead of, for instance, `-rgb`) will cause tjbench to internally
1214 convert the source bitmap to CMYK prior to compression, to generate YCCK JPEG
1215 files, and to internally convert the decompressed CMYK pixels back to RGB after
1216 decompression (the latter is done automatically if a CMYK or YCCK JPEG is
1217 passed to tjbench as a source image.) The CMYK<->RGB conversion operation is
1218 not benchmarked. NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
1219 uses are suitable for testing only. Proper conversion between CMYK and RGB
1220 requires a color management system.
1222 2. `make test` now performs additional bitwise regression tests using tjbench,
1223 mainly for the purpose of testing compression from/decompression to a subregion
1224 of a larger image buffer.
1226 3. `make test` no longer tests the regression of the floating point DCT/IDCT
1227 by default, since the results of those tests can vary if the algorithms in
1228 question are not implemented using SIMD instructions on a particular platform.
1229 See the comments in [Makefile.am](Makefile.am) for information on how to
1230 re-enable the tests and to specify an expected result for them based on the
1231 particulars of your platform.
1233 4. The NULL color conversion routines have been significantly optimized,
1234 which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
1235 64-bit code and 0-3% when using 32-bit code, and the decompression of those
1236 images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
1238 5. Fixed an "illegal instruction" error that occurred when djpeg from a
1239 SIMD-enabled libjpeg-turbo MIPS build was executed with the `-nosmooth` option
1240 on a MIPS machine that lacked DSPr2 support. The MIPS SIMD routines for h2v1
1241 and h2v2 merged upsampling were not properly checking for the existence of
1244 6. Performance has been improved significantly on 64-bit non-Linux and
1245 non-Windows platforms (generally 10-20% faster compression and 5-10% faster
1246 decompression.) Due to an oversight, the 64-bit version of the accelerated
1247 Huffman codec was not being compiled in when libjpeg-turbo was built on
1248 platforms other than Windows or Linux. Oops.
1250 7. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
1251 builds of libjpeg-turbo to incorrectly encode a few specific test images when
1252 quality=98, an optimized Huffman table, and the accurate integer forward DCT
1255 8. The Windows (CMake) build system now supports building only static or only
1256 shared libraries. This is accomplished by adding either `-DENABLE_STATIC=0` or
1257 `-DENABLE_SHARED=0` to the CMake command line.
1259 9. TurboJPEG API functions will now return an error code if a warning is
1260 triggered in the underlying libjpeg API. For instance, if a JPEG file is
1261 corrupt, the TurboJPEG decompression functions will attempt to decompress
1262 as much of the image as possible, but those functions will now return -1 to
1263 indicate that the decompression was not entirely successful.
1265 10. Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
1266 buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
1267 in which the right-most MCU was 5 or 6 pixels wide.
1273 ### Significant changes relative to 1.4 beta1:
1275 1. Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
1276 because OS X does not provide the `le32toh()` and `htole32()` functions.)
1278 2. The non-SIMD RGB565 color conversion code did not work correctly on big
1279 endian machines. This has been fixed.
1281 3. Fixed an issue in `tjPlaneSizeYUV()` whereby it would erroneously return 1
1282 instead of -1 if `componentID` was > 0 and `subsamp` was `TJSAMP_GRAY`.
1284 3. Fixed an issue in `tjBufSizeYUV2()` whereby it would erroneously return 0
1285 instead of -1 if `width` was < 1.
1287 5. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1288 on ARM64 platforms (see 1.4 beta1[5].)
1290 6. The `close()` method in the TJCompressor and TJDecompressor Java classes is
1291 now idempotent. Previously, that method would call the native `tjDestroy()`
1292 function even if the TurboJPEG instance had already been destroyed. This
1293 caused an exception to be thrown during finalization, if the `close()` method
1294 had already been called. The exception was caught, but it was still an
1295 expensive operation.
1297 7. The TurboJPEG API previously generated an error (`Could not determine
1298 subsampling type for JPEG image`) when attempting to decompress grayscale JPEG
1299 images that were compressed with a sampling factor other than 1 (for instance,
1300 with `cjpeg -grayscale -sample 2x2`). Subsampling technically has no meaning
1301 with grayscale JPEGs, and thus the horizontal and vertical sampling factors
1302 for such images are ignored by the decompressor. However, the TurboJPEG API
1303 was being too rigid and was expecting the sampling factors to be equal to 1
1304 before it treated the image as a grayscale JPEG.
1306 8. cjpeg, djpeg, and jpegtran now accept an argument of `-version`, which will
1307 print the library version and exit.
1309 9. Referring to 1.4 beta1[15], another extremely rare circumstance was
1310 discovered under which the Huffman encoder's local buffer can be overrun
1311 when a buffered destination manager is being used and an
1312 extremely-high-frequency block (basically junk image data) is being encoded.
1313 Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
1314 to address the previous issue, the new issue caused even the larger buffer to
1315 be overrun. Further analysis reveals that, in the absolute worst case (such as
1316 setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
1317 order), the Huffman encoder can produce encoded blocks that approach double the
1318 size of the unencoded blocks. Thus, the Huffman local buffer was increased to
1319 256 bytes, which should prevent any such issue from re-occurring in the future.
1321 10. The new `tjPlaneSizeYUV()`, `tjPlaneWidth()`, and `tjPlaneHeight()`
1322 functions were not actually usable on any platform except OS X and Windows,
1323 because those functions were not included in the libturbojpeg mapfile. This
1326 11. Restored the `JPP()`, `JMETHOD()`, and `FAR` macros in the libjpeg-turbo
1327 header files. The `JPP()` and `JMETHOD()` macros were originally implemented
1328 in libjpeg as a way of supporting non-ANSI compilers that lacked support for
1329 prototype parameters. libjpeg-turbo has never supported such compilers, but
1330 some software packages still use the macros to define their own prototypes.
1331 Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
1332 have far symbols, but some software packages still use the `FAR` macro. A
1333 pretty good argument can be made that this is a bad practice on the part of the
1334 software in question, but since this affects more than one package, it's just
1335 easier to fix it here.
1337 12. Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
1338 for iOS, and included an ARMv8 architecture in all of the binaries installed by
1339 the "official" libjpeg-turbo SDK for OS X.
1345 ### Significant changes relative to 1.3.1:
1347 1. New features in the TurboJPEG API:
1349 - YUV planar images can now be generated with an arbitrary line padding
1350 (previously only 4-byte padding, which was compatible with X Video, was
1352 - The decompress-to-YUV function has been extended to support image
1354 - JPEG images can now be compressed from YUV planar source images.
1355 - YUV planar images can now be decoded into RGB or grayscale images.
1356 - 4:1:1 subsampling is now supported. This is mainly included for
1357 compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
1358 significant advantages relative to 4:2:0.
1359 - CMYK images are now supported. This feature allows CMYK source images
1360 to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to
1361 CMYK destination images. Conversion between CMYK/YCCK and RGB or YUV images is
1362 not supported. Such conversion requires a color management system and is thus
1363 out of scope for a codec library.
1364 - The handling of YUV images in the Java API has been significantly
1365 refactored and should now be much more intuitive.
1366 - The Java API now supports encoding a YUV image from an arbitrary
1367 position in a large image buffer.
1368 - All of the YUV functions now have a corresponding function that operates
1369 on separate image planes instead of a unified image buffer. This allows for
1370 compressing/decoding from or decompressing/encoding to a subregion of a larger
1371 YUV image. It also allows for handling YUV formats that swap the order of the
1374 2. Added SIMD acceleration for DSPr2-capable MIPS platforms. This speeds up
1375 the compression of full-color JPEGs by 70-80% on such platforms and
1376 decompression by 25-35%.
1378 3. If an application attempts to decompress a Huffman-coded JPEG image whose
1379 header does not contain Huffman tables, libjpeg-turbo will now insert the
1380 default Huffman tables. In order to save space, many motion JPEG video frames
1381 are encoded without the default Huffman tables, so these frames can now be
1382 successfully decompressed by libjpeg-turbo without additional work on the part
1383 of the application. An application can still override the Huffman tables, for
1384 instance to re-use tables from a previous frame of the same video.
1386 4. The Mac packaging system now uses pkgbuild and productbuild rather than
1387 PackageMaker (which is obsolete and no longer supported.) This means that
1388 OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
1389 although the packages produced can be installed on OS X 10.5 "Leopard" or
1390 later. OS X 10.4 "Tiger" is no longer supported.
1392 5. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1393 on ARM platforms rather than a lookup table. This reduces the memory footprint
1394 by 64k, which may be important for some mobile applications. Out of four
1395 Android devices that were tested, two demonstrated a small overall performance
1396 loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
1397 ARMv7 code when enabling this new feature, but the other two devices
1398 demonstrated a significant overall performance gain with both ARMv6 and ARMv7
1399 code (~10-20%) when enabling the feature. Actual mileage may vary.
1401 6. Worked around an issue with Visual C++ 2010 and later that caused incorrect
1402 pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
1403 if compiler optimization was enabled when libjpeg-turbo was built. This caused
1404 the regression tests to fail when doing a release build under Visual C++ 2010
1407 7. Improved the accuracy and performance of the non-SIMD implementation of the
1408 floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
1409 The accuracy of this implementation now matches the accuracy of the SSE/SSE2
1410 implementation. Note, however, that the floating point DCT/IDCT algorithms are
1411 mainly a legacy feature. They generally do not produce significantly better
1412 accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a
1415 8. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
1416 for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not
1417 used, then this code path is SIMD-accelerated on ARM platforms.
1419 9. Numerous obsolete features, such as support for non-ANSI compilers and
1420 support for the MS-DOS memory model, were removed from the libjpeg code,
1421 greatly improving its readability and making it easier to maintain and extend.
1423 10. Fixed a segfault that occurred when calling `output_message()` with
1424 `msg_code` set to `JMSG_COPYRIGHT`.
1426 11. Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
1427 characters to be passed on the command line, which was causing it to generate
1428 incorrect JPEG files.
1430 12. Fixed a bug in the build system that was causing the Windows version of
1431 wrjpgcom to be built using the rdjpgcom source code.
1433 13. Restored 12-bit-per-component JPEG support. A 12-bit version of
1434 libjpeg-turbo can now be built by passing an argument of `--with-12bit` to
1435 configure (Unix) or `-DWITH_12BIT=1` to cmake (Windows.) 12-bit JPEG support
1436 is included only for convenience. Enabling this feature disables all of the
1437 performance features in libjpeg-turbo, as well as arithmetic coding and the
1438 TurboJPEG API. The resulting library still contains the other libjpeg-turbo
1439 features (such as the colorspace extensions), but in general, it performs no
1440 faster than libjpeg v6b.
1442 14. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
1443 and IDCT algorithms (both are used during JPEG decompression.) For unknown
1444 reasons (probably related to clang), this code cannot currently be compiled for
1447 15. Fixed an extremely rare bug (CVE-2014-9092) that could cause the Huffman
1448 encoder's local buffer to overrun when a very high-frequency MCU is compressed
1449 using quality 100 and no subsampling, and when the JPEG output buffer is being
1450 dynamically resized by the destination manager. This issue was so rare that,
1451 even with a test program specifically designed to make the bug occur (by
1452 injecting random high-frequency YUV data into the compressor), it was
1453 reproducible only once in about every 25 million iterations.
1455 16. Fixed an oversight in the TurboJPEG C wrapper: if any of the JPEG
1456 compression functions was called repeatedly with the same
1457 automatically-allocated destination buffer, then TurboJPEG would erroneously
1458 assume that the `jpegSize` parameter was equal to the size of the buffer, when
1459 in fact that parameter was probably equal to the size of the most recently
1460 compressed JPEG image. If the size of the previous JPEG image was not as large
1461 as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
1468 ### Significant changes relative to 1.3.0:
1470 1. On Un*x systems, `make install` now installs the libjpeg-turbo libraries
1471 into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
1472 and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
1473 x86-64. You can override this by overriding either the `prefix` or `libdir`
1474 configure variables.
1476 2. The Windows installer now places a copy of the TurboJPEG DLLs in the same
1477 directory as the rest of the libjpeg-turbo binaries. This was mainly done
1478 to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
1479 When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
1480 access the c:\WINDOWS\system32 directory, which made it impossible for the
1481 TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
1483 3. Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
1484 entropy coding (by passing arguments of `-progressive -arithmetic` to cjpeg or
1485 jpegtran, for instance) would result in an error, `Requested feature was
1486 omitted at compile time`.
1488 4. Fixed a couple of issues (CVE-2013-6629 and CVE-2013-6630) whereby malformed
1489 JPEG images would cause libjpeg-turbo to use uninitialized memory during
1492 5. Fixed an error (`Buffer passed to JPEG library is too small`) that occurred
1493 when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
1494 source image, and added a unit test to check for this error.
1496 6. The Java classes should now build properly under Visual Studio 2010 and
1499 7. Fixed an issue that prevented SRPMs generated using the in-tree packaging
1500 tools from being rebuilt on certain newer Linux distributions.
1502 8. Numerous minor fixes to eliminate compilation and build/packaging system
1503 warnings, fix cosmetic issues, improve documentation clarity, and other general
1510 ### Significant changes relative to 1.3 beta1:
1512 1. `make test` now works properly on FreeBSD, and it no longer requires the
1513 md5sum executable to be present on other Un*x platforms.
1515 2. Overhauled the packaging system:
1517 - To avoid conflict with vendor-supplied libjpeg-turbo packages, the
1518 official RPMs and DEBs for libjpeg-turbo have been renamed to
1519 "libjpeg-turbo-official".
1520 - The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the
1521 official Linux and Mac packages, to avoid conflict with vendor-supplied
1522 packages and also to streamline the packaging system.
1523 - Release packages are now created with the directory structure defined
1524 by the configure variables `prefix`, `bindir`, `libdir`, etc. (Un\*x) or by the
1525 `CMAKE_INSTALL_PREFIX` variable (Windows.) The exception is that the docs are
1526 always located under the system default documentation directory on Un\*x and
1527 Mac systems, and on Windows, the TurboJPEG DLL is always located in the Windows
1529 - To avoid confusion, official libjpeg-turbo packages on Linux/Unix
1530 platforms (except for Mac) will always install the 32-bit libraries in
1531 /opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64.
1532 - Fixed an issue whereby, in some cases, the libjpeg-turbo executables on
1533 Un*x systems were not properly linking with the shared libraries installed by
1535 - Fixed an issue whereby building the "installer" target on Windows when
1536 `WITH_JAVA=1` would fail if the TurboJPEG JAR had not been previously built.
1537 - Building the "install" target on Windows now installs files into the
1538 same places that the installer does.
1540 3. Fixed a Huffman encoder bug that prevented I/O suspension from working
1547 ### Significant changes relative to 1.2.1:
1549 1. Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
1550 11/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing. Note that the IDCT will
1551 not be SIMD-accelerated when using any of these new scaling factors.
1553 2. The TurboJPEG dynamic library is now versioned. It was not strictly
1554 necessary to do so, because TurboJPEG uses versioned symbols, and if a function
1555 changes in an ABI-incompatible way, that function is renamed and a legacy
1556 function is provided to maintain backward compatibility. However, certain
1557 Linux distro maintainers have a policy against accepting any library that isn't
1560 3. Extended the TurboJPEG Java API so that it can be used to compress a JPEG
1561 image from and decompress a JPEG image to an arbitrary position in a large
1564 4. The `tjDecompressToYUV()` function now supports the `TJFLAG_FASTDCT` flag.
1566 5. The 32-bit supplementary package for amd64 Debian systems now provides
1567 symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
1568 This allows those libraries to be used on MultiArch-compatible systems (such as
1569 Ubuntu 11 and later) without setting the linker path.
1571 6. The TurboJPEG Java wrapper should now find the JNI library on Mac systems
1572 without having to pass `-Djava.library.path=/usr/lib` to java.
1574 7. TJBench has been ported to Java to provide a convenient way of validating
1575 the performance of the TurboJPEG Java API. It can be run with
1576 `java -cp turbojpeg.jar TJBench`.
1578 8. cjpeg can now be used to generate JPEG files with the RGB colorspace
1579 (feature ported from jpeg-8d.)
1581 9. The width and height in the `-crop` argument passed to jpegtran can now be
1582 suffixed with `f` to indicate that, when the upper left corner of the cropping
1583 region is automatically moved to the nearest iMCU boundary, the bottom right
1584 corner should be moved by the same amount. In other words, this feature causes
1585 jpegtran to strictly honor the specified width/height rather than the specified
1586 bottom right corner (feature ported from jpeg-8d.)
1588 10. JPEG files using the RGB colorspace can now be decompressed into grayscale
1589 images (feature ported from jpeg-8d.)
1591 11. Fixed a regression caused by 1.2.1[7] whereby the build would fail with
1592 multiple "Mismatch in operand sizes" errors when attempting to build the x86
1593 SIMD code with NASM 0.98.
1595 12. The in-memory source/destination managers (`jpeg_mem_src()` and
1596 `jpeg_mem_dest()`) are now included by default when building libjpeg-turbo with
1597 libjpeg v6b or v7 emulation, so that programs can take advantage of these
1598 functions without requiring the use of the backward-incompatible libjpeg v8
1599 ABI. The "age number" of the libjpeg-turbo library on Un*x systems has been
1600 incremented by 1 to reflect this. You can disable this feature with a
1601 configure/CMake switch in order to retain strict API/ABI compatibility with the
1602 libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.) See
1603 [README.md](README.md) for more details.
1605 13. Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
1606 libjpeg-turbo binary package for OS X, so that those libraries can be used to
1607 build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
1613 ### Significant changes relative to 1.2.0:
1615 1. Creating or decoding a JPEG file that uses the RGB colorspace should now
1616 properly work when the input or output colorspace is one of the libjpeg-turbo
1617 colorspace extensions.
1619 2. When libjpeg-turbo was built without SIMD support and merged (non-fancy)
1620 upsampling was used along with an alpha-enabled colorspace during
1621 decompression, the unused byte of the decompressed pixels was not being set to
1622 0xFF. This has been fixed. TJUnitTest has also been extended to test for the
1623 correct behavior of the colorspace extensions when merged upsampling is used.
1625 3. Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
1626 upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
1627 calling conventions.
1629 4. Fixed a regression (CVE-2012-2806) caused by 1.2.0[6] whereby decompressing
1630 corrupt JPEG images (specifically, images in which the component count was
1631 erroneously set to a large value) would cause libjpeg-turbo to segfault.
1633 5. Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
1634 processors. The `MASKMOVDQU` instruction, which was used by the libjpeg-turbo
1635 SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
1636 it is painfully slow on Bobcat processors in particular. Eliminating the use
1637 of this instruction improved performance by an order of magnitude on Bobcat
1638 processors and by a small amount (typically 5%) on AMD desktop processors.
1640 6. Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
1641 platforms. This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
1644 7. Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
1645 running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
1646 4:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
1647 upsampling would produce several incorrect columns of pixels at the right-hand
1648 side of the output image if each row in the output image was not evenly
1649 divisible by 16 bytes.
1651 8. Fixed an issue whereby attempting to build the SIMD extensions with Xcode
1652 4.3 on OS X platforms would cause NASM to return numerous errors of the form
1653 "'%define' expects a macro identifier".
1655 9. Added flags to the TurboJPEG API that allow the caller to force the use of
1656 either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
1662 ### Significant changes relative to 1.2 beta1:
1664 1. Fixed build issue with Yasm on Unix systems (the libjpeg-turbo build system
1665 was not adding the current directory to the assembler include path, so Yasm
1666 was not able to find jsimdcfg.inc.)
1668 2. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
1669 a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
1670 This was more of an annoyance than an actual bug, since it did not cause any
1671 actual run-time problems, but the issue showed up when running libjpeg-turbo in
1672 valgrind. See <http://crbug.com/72399> for more information.
1674 3. Added a compile-time macro (`LIBJPEG_TURBO_VERSION`) that can be used to
1675 check the version of libjpeg-turbo against which an application was compiled.
1677 4. Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
1678 and pixel formats (TurboJPEG API), which allow applications to specify that,
1679 when decompressing to a 4-component RGB buffer, the unused byte should be set
1680 to 0xFF so that it can be interpreted as an opaque alpha channel.
1682 5. Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
1683 because libjpeg-turbo's distributed version of jconfig.h contained an `INLINE`
1684 macro, which conflicted with a similar macro in DevIL. This macro is used only
1685 internally when building libjpeg-turbo, so it was moved into config.h.
1687 6. libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
1688 K component is assigned a component ID of 1 instead of 4. Although these files
1689 are in violation of the spec, other JPEG implementations handle them
1692 7. Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
1693 the official libjpeg-turbo binary package for OS X, so that those libraries can
1694 be used to build both OS X and iOS applications.
1700 ### Significant changes relative to 1.1.1:
1702 1. Added a Java wrapper for the TurboJPEG API. See [java/README](java/README)
1705 2. The TurboJPEG API can now be used to scale down images during
1708 3. Added SIMD routines for RGB-to-grayscale color conversion, which
1709 significantly improves the performance of grayscale JPEG compression from an
1712 4. Improved the performance of the C color conversion routines, which are used
1713 on platforms for which SIMD acceleration is not available.
1715 5. Added a function to the TurboJPEG API that performs lossless transforms.
1716 This function is implemented using the same back end as jpegtran, but it
1717 performs transcoding entirely in memory and allows multiple transforms and/or
1718 crop operations to be batched together, so the source coefficients only need to
1719 be read once. This is useful when generating image tiles from a single source
1722 6. Added tests for the new TurboJPEG scaled decompression and lossless
1723 transform features to tjbench (the TurboJPEG benchmark, formerly called
1726 7. Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
1727 was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
1728 transposed or rotated 90 degrees.
1730 8. All legacy VirtualGL code has been re-factored, and this has allowed
1731 libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
1733 9. libjpeg-turbo can now be built with Yasm.
1735 10. Added SIMD acceleration for ARM Linux and iOS platforms that support
1738 11. Refactored the TurboJPEG C API and documented it using Doxygen. The
1739 TurboJPEG 1.2 API uses pixel formats to define the size and component order of
1740 the uncompressed source/destination images, and it includes a more efficient
1741 version of `TJBUFSIZE()` that computes a worst-case JPEG size based on the
1742 level of chrominance subsampling. The refactored implementation of the
1743 TurboJPEG API now uses the libjpeg memory source and destination managers,
1744 which allows the TurboJPEG compressor to grow the JPEG buffer as necessary.
1746 12. Eliminated errors in the output of jpegtran on Windows that occurred when
1747 the application was invoked using I/O redirection
1748 (`jpegtran <input.jpg >output.jpg`.)
1750 13. The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
1751 support in libjpeg-turbo v1.1.0 introduced several new error constants in
1752 jerror.h, and these were mistakenly enabled for all emulation modes, causing
1753 the error enum in libjpeg-turbo to sometimes have different values than the
1754 same enum in libjpeg. This represents an ABI incompatibility, and it caused
1755 problems with rare applications that took specific action based on a particular
1756 error value. The fix was to include the new error constants conditionally
1757 based on whether libjpeg v7 or v8 emulation was enabled.
1759 14. Fixed an issue whereby Windows applications that used libjpeg-turbo would
1760 fail to compile if the Windows system headers were included before jpeglib.h.
1761 This issue was caused by a conflict in the definition of the INT32 type.
1763 15. Fixed 32-bit supplementary package for amd64 Debian systems, which was
1764 broken by enhancements to the packaging system in 1.1.
1766 16. When decompressing a JPEG image using an output colorspace of
1767 `JCS_EXT_RGBX`, `JCS_EXT_BGRX`, `JCS_EXT_XBGR`, or `JCS_EXT_XRGB`,
1768 libjpeg-turbo will now set the unused byte to 0xFF, which allows applications
1769 to interpret that byte as an alpha channel (0xFF = opaque).
1775 ### Significant changes relative to 1.1.0:
1777 1. Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
1780 2. libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
1781 markers found in the middle of the JPEG data stream during decompression. It
1782 will now hand off decoding of a particular block to the unaccelerated Huffman
1783 decoder if an unexpected marker is found, so that the unaccelerated Huffman
1784 decoder can generate an appropriate warning.
1786 3. Older versions of MinGW64 prefixed symbol names with underscores by
1787 default, which differed from the behavior of 64-bit Visual C++. MinGW64 1.0
1788 has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
1789 this, the libjpeg-turbo SIMD function names are no longer prefixed with an
1790 underscore when building with MinGW64. This means that, when building
1791 libjpeg-turbo with older versions of MinGW64, you will now have to add
1792 `-fno-leading-underscore` to the `CFLAGS`.
1794 4. Fixed a regression bug in the NSIS script that caused the Windows installer
1795 build to fail when using the Visual Studio IDE.
1797 5. Fixed a bug in `jpeg_read_coefficients()` whereby it would not initialize
1798 `cinfo->image_width` and `cinfo->image_height` if libjpeg v7 or v8 emulation
1799 was enabled. This specifically caused the jpegoptim program to fail if it was
1800 linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
1803 6. Eliminated excessive I/O overhead that occurred when reading BMP files in
1806 7. Eliminated errors in the output of cjpeg on Windows that occurred when the
1807 application was invoked using I/O redirection (`cjpeg <inputfile >output.jpg`.)
1813 ### Significant changes relative to 1.1 beta1:
1815 1. The algorithm used by the SIMD quantization function cannot produce correct
1816 results when the JPEG quality is >= 98 and the fast integer forward DCT is
1817 used. Thus, the non-SIMD quantization function is now used for those cases,
1818 and libjpeg-turbo should now produce identical output to libjpeg v6b in all
1821 2. Despite the above, the fast integer forward DCT still degrades somewhat for
1822 JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
1823 use the accurate integer forward DCT when generating JPEG images of quality 96
1824 or greater. This reduces compression performance by as much as 15% for these
1825 high-quality images but is necessary to ensure that the images are perceptually
1826 lossless. It also ensures that the library can avoid the performance pitfall
1829 3. Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
1831 4. Fixed visual artifacts in grayscale JPEG compression caused by a typo in
1832 the RGB-to-luminance lookup tables.
1834 5. The Windows distribution packages now include the libjpeg run-time programs
1837 6. All packages now include jpgtest.
1839 7. The TurboJPEG dynamic library now uses versioned symbols.
1841 8. Added two new TurboJPEG API functions, `tjEncodeYUV()` and
1842 `tjDecompressToYUV()`, to replace the somewhat hackish `TJ_YUV` flag.
1848 ### Significant changes relative to 1.0.1:
1850 1. Added emulation of the libjpeg v7 and v8 APIs and ABIs. See
1851 [README.md](README.md) for more details. This feature was sponsored by
1854 2. Created a new CMake-based build system for the Visual C++ and MinGW builds.
1856 3. Grayscale bitmaps can now be compressed from/decompressed to using the
1859 4. jpgtest can now be used to test decompression performance with existing
1862 5. If the default install prefix (/opt/libjpeg-turbo) is used, then
1863 `make install` now creates /opt/libjpeg-turbo/lib32 and
1864 /opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
1867 6. All symbols in the libjpeg-turbo dynamic library are now versioned, even
1868 when the library is built with libjpeg v6b emulation.
1870 7. Added arithmetic encoding and decoding support (can be disabled with
1871 configure or CMake options)
1873 8. Added a `TJ_YUV` flag to the TurboJPEG API, which causes both the compressor
1874 and decompressor to output planar YUV images.
1876 9. Added an extended version of `tjDecompressHeader()` to the TurboJPEG API,
1877 which allows the caller to determine the type of subsampling used in a JPEG
1880 10. Added further protections against invalid Huffman codes.
1886 ### Significant changes relative to 1.0.0:
1888 1. The Huffman decoder will now handle erroneous Huffman codes (for instance,
1889 from a corrupt JPEG image.) Previously, these would cause libjpeg-turbo to
1890 crash under certain circumstances.
1892 2. Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
1893 be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
1895 3. The configure script will now automatically determine whether the
1896 `INCOMPLETE_TYPES_BROKEN` macro should be defined.
1902 ### Significant changes relative to 0.0.93:
1904 1. 2983700: Further FreeBSD build tweaks (no longer necessary to specify
1905 `--host` when configuring on a 64-bit system)
1907 2. Created symlinks in the Unix/Linux packages so that the TurboJPEG
1908 include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
1909 static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
1910 64-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
1912 3. The Unix/Linux distribution packages now include the libjpeg run-time
1913 programs (cjpeg, etc.) and man pages.
1915 4. Created a 32-bit supplementary package for amd64 Debian systems, which
1916 contains just the 32-bit libjpeg-turbo libraries.
1918 5. Moved the libraries from */lib32 to */lib in the i386 Debian package.
1920 6. Include distribution package for Cygwin
1922 7. No longer necessary to specify `--without-simd` on non-x86 architectures,
1923 and unit tests now work on those architectures.
1929 ### Significant changes since 0.0.91:
1931 1. 2982659: Fixed x86-64 build on FreeBSD systems
1933 2. 2988188: Added support for Windows 64-bit systems
1939 ### Significant changes relative to 0.0.90:
1941 1. Added documentation to .deb packages
1943 2. 2968313: Fixed data corruption issues when decompressing large JPEG images
1944 and/or using buffered I/O with the libjpeg-turbo decompressor