xref: /aosp_15_r20/external/libjpeg-turbo/ChangeLog.md (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
12.1.5.1
2=======
3
4### Significant changes relative to 2.1.5:
5
61. The SIMD dispatchers in libjpeg-turbo 2.1.4 and prior stored the list of
7supported SIMD instruction sets in a global variable, which caused an innocuous
8race condition whereby the variable could have been initialized multiple times
9if `jpeg_start_*compress()` was called simultaneously in multiple threads.
10libjpeg-turbo 2.1.5 included an undocumented attempt to fix this race condition
11by making the SIMD support variable thread-local.  However, that caused another
12issue 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
14support variable was never initialized in the second thread.  On x86 systems,
15this led the second thread to incorrectly assume that AVX2 instructions were
16always available, and when it attempted to use those instructions on older x86
17CPUs that do not support them, an illegal instruction error occurred.  The SIMD
18dispatchers now ensure that the SIMD support variable is initialized before
19dispatching based on its value.
20
21
222.1.5
23=====
24
25### Significant changes relative to 2.1.4:
26
271. Fixed issues in the build system whereby, when using the Ninja Multi-Config
28CMake 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
30be built, and the Java regression tests failed.
31
322. Fixed a regression introduced by 2.0 beta1[15] that caused a buffer overrun
33in the progressive Huffman encoder when attempting to transform a
34specially-crafted malformed 12-bit-per-component JPEG image into a progressive
3512-bit-per-component JPEG image using a 12-bit-per-component build of
36libjpeg-turbo (`-DWITH_12BIT=1`.)  Given that the buffer overrun was fully
37contained within the progressive Huffman encoder structure and did not cause a
38segfault or other user-visible errant behavior, given that the lossless
39transformer (unlike the decompressor) is not generally exposed to arbitrary
40data exploits, and given that 12-bit-per-component builds of libjpeg-turbo are
41uncommon, this issue did not likely pose a security risk.
42
433. Fixed an issue whereby, when using a 12-bit-per-component build of
44libjpeg-turbo (`-DWITH_12BIT=1`), passing samples with values greater than 4095
45or less than 0 to `jpeg_write_scanlines()` caused a buffer overrun or underrun
46in the RGB-to-YCbCr color converter.
47
484. Fixed a floating point exception that occurred when attempting to use the
49jpegtran `-drop` and `-trim` options to losslessly transform a
50specially-crafted malformed JPEG image.
51
525. Fixed an issue in `tjBufSizeYUV2()` whereby it returned a bogus result,
53rather than throwing an error, if the `align` parameter was not a power of 2.
54Fixed a similar issue in `tjCompressFromYUV()` whereby it generated a corrupt
55JPEG image in certain cases, rather than throwing an error, if the `align`
56parameter was not a power of 2.
57
586. Fixed an issue whereby `tjDecompressToYUV2()`, which is a wrapper for
59`tjDecompressToYUVPlanes()`, used the desired YUV image dimensions rather than
60the actual scaled image dimensions when computing the plane pointers and
61strides to pass to `tjDecompressToYUVPlanes()`.  This caused a buffer overrun
62and subsequent segfault if the desired image dimensions exceeded the scaled
63image dimensions.
64
657. 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.
68
698. Fixed an issue whereby the Java version of TJBench did not accept a range of
70quality values.
71
729. Fixed an issue whereby, when `-progressive` was passed to TJBench, the JPEG
73input image was not transformed into a progressive JPEG image prior to
74decompression.
75
76
772.1.4
78=====
79
80### Significant changes relative to 2.1.3:
81
821. Fixed a regression introduced in 2.1.3 that caused build failures with
83Visual Studio 2010.
84
852. 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
88used to prime the decompressor with quantization and Huffman tables that can be
89used when decompressing subsequent "abbreviated image" datastreams.
90
913. libjpeg-turbo now performs run-time detection of AltiVec instructions on
92OS X/PowerPC systems if AltiVec instructions are not enabled at compile time.
93This 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.
95
964. Fixed an error ("Bogus virtual array access") that occurred when attempting
97to decompress a progressive JPEG image with a height less than or equal to one
98iMCU (8 * the vertical sampling factor) using buffered-image mode with
99interblock smoothing enabled.  This was a regression introduced by
1002.1 beta1[6(b)].
101
1025. Fixed two issues that prevented partial image decompression from working
103properly with buffered-image mode:
104
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
109virtual array access") under certain circumstances.
110
111
1122.1.3
113=====
114
115### Significant changes relative to 2.1.2:
116
1171. Fixed a regression introduced by 2.0 beta1[7] whereby cjpeg compressed PGM
118input files into full-color JPEG images unless the `-grayscale` option was
119used.
120
1212. cjpeg now automatically compresses GIF and 8-bit BMP input files into
122grayscale JPEG images if the input files contain only shades of gray.
123
1243. 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.
126
1274. Fixed a segfault that occurred while decompressing a 4:2:0 JPEG image using
128the merged (non-fancy) upsampling algorithms (that is, with
129`cinfo.do_fancy_upsampling` set to `FALSE`) along with `jpeg_crop_scanline()`.
130Specifically, the segfault occurred if the number of bytes remaining in the
131output buffer was less than the number of bytes required to represent one
132uncropped scanline of the output image.  For that reason, the issue could only
133be reproduced using the libjpeg API, not using djpeg.
134
135
1362.1.2
137=====
138
139### Significant changes relative to 2.1.1:
140
1411. Fixed a regression introduced by 2.1 beta1[13] that caused the remaining
142GAS implementations of AArch64 (Arm 64-bit) Neon SIMD functions (which are used
143by default with GCC for performance reasons) to be placed in the `.rodata`
144section rather than in the `.text` section.  This caused the GNU linker to
145automatically place the `.rodata` section in an executable segment, which
146prevented libjpeg-turbo from working properly with other linkers and also
147represented a potential security risk.
148
1492. Fixed an issue whereby the `tjTransform()` function incorrectly computed the
150MCU block size for 4:4:4 JPEG images with non-unary sampling factors and thus
151unduly rejected some cropping regions, even though those regions aligned with
1528x8 MCU block boundaries.
153
1543. Fixed a regression introduced by 2.1 beta1[13] that caused the build system
155to enable the Arm Neon SIMD extensions when targetting Armv6 and other legacy
156architectures that do not support Neon instructions.
157
1584. libjpeg-turbo now performs run-time detection of AltiVec instructions on
159FreeBSD/PowerPC systems if AltiVec instructions are not enabled at compile
160time.  This allows both AltiVec-equipped and non-AltiVec-equipped CPUs to be
161supported using the same build of libjpeg-turbo.
162
1635. cjpeg now accepts a `-strict` argument similar to that of djpeg and
164jpegtran, which causes the compressor to abort if an LZW-compressed GIF input
165image contains incomplete or corrupt image data.
166
167
1682.1.1
169=====
170
171### Significant changes relative to 2.1.0:
172
1731. Fixed a regression introduced in 2.1.0 that caused build failures with
174non-GCC-compatible compilers for Un*x/Arm platforms.
175
1762. 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
178included `-mfloat-abi=softfp` or `-mfloat-abi=hard`.
179
1803. Fixed an issue in the AArch32 Neon SIMD Huffman encoder whereby reliance on
181undefined C compiler behavior led to crashes ("SIGBUS: illegal alignment") on
182Android systems when running AArch32/Thumb builds of libjpeg-turbo built with
183recent versions of Clang.
184
1854. Added a command-line argument (`-copy icc`) to jpegtran that causes it to
186copy only the ICC profile markers from the source file and discard any other
187metadata.
188
1895. libjpeg-turbo should now build and run on CHERI-enabled architectures, which
190use capability pointers that are larger than the size of `size_t`.
191
1926. Fixed a regression (CVE-2021-37972) introduced by 2.1 beta1[5] that caused a
193segfault in the 64-bit SSE2 Huffman encoder when attempting to losslessly
194transform a specially-crafted malformed JPEG image.
195
196
1972.1.0
198=====
199
200### Significant changes relative to 2.1 beta1:
201
2021. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
203decompress certain progressive JPEG images with one or more component planes of
204width 8 or less caused a buffer overrun.
205
2062. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
207decompress a specially-crafted malformed progressive JPEG image caused the
208block smoothing algorithm to read from uninitialized memory.
209
2103. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the
211encoders to generate incorrect results when using the Clang compiler with
212Visual Studio.
213
2144. Fixed a floating point exception (CVE-2021-20205) that occurred when
215attempting to compress a specially-crafted malformed GIF image with a specified
216image width of 0 using cjpeg.
217
2185. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
219generate a progressive JPEG image on an SSE2-capable CPU using a scan script
220containing one or more scans with lengths divisible by 32 and non-zero
221successive approximation low bit positions would, under certain circumstances,
222result in an error ("Missing Huffman code table entry") and an invalid JPEG
223image.
224
2256. 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
227command-line argument (`-limitscans`) that causes the TurboJPEG decompression
228and transform functions/operations to return/throw an error if a progressive
229JPEG image contains an unreasonably large number of scans.  This allows
230applications that use the TurboJPEG API to guard against an exploit of the
231progressive JPEG format described in the report
232["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
233
2347. The PPM reader now throws an error, rather than segfaulting (due to a buffer
235overrun, CVE-2021-46822) or generating incorrect pixels, if an application
236attempts 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
238image buffer or to load a 16-bit binary PGM file into an RGB image buffer.
239
2408. Fixed an issue in the PPM reader that caused incorrect pixels to be
241generated when using the `tjLoadImage()` function to load a 16-bit binary PPM
242file into an extended RGB image buffer.
243
2449. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by
245one of the TurboJPEG compression or transform functions and an error
246subsequently occurred during compression or transformation, the JPEG buffer
247pointer passed by the application was not updated when the function returned.
248
249
2502.0.90 (2.1 beta1)
251==================
252
253### Significant changes relative to 2.0.6:
254
2551. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now
256support the x32 ABI on Linux, which allows for using x86-64 instructions with
25732-bit pointers.  The x32 ABI is generally enabled by adding `-mx32` to the
258compiler flags.
259
260     Caveats:
261     - CMake 3.9.0 or later is required in order for the build system to
262automatically detect an x32 build.
263     - Java does not support the x32 ABI, and thus the TurboJPEG Java API will
264automatically be disabled with x32 builds.
265
2662. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy
267chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion,
268and fast integer DCT/IDCT algorithms.  Relative to libjpeg-turbo 2.0.x, this
269speeds up:
270
271     - the compression of RGB source images into grayscale JPEG images by
272approximately 20%
273     - the decompression of 4:2:2 JPEG images by approximately 40-60% when
274using fancy upsampling
275     - the decompression of 4:2:2 and 4:2:0 JPEG images by approximately
27615-20% when using merged upsampling
277     - the compression of RGB source images by approximately 30-45% when using
278the fast integer DCT
279     - the decompression of JPEG images into RGB destination images by
280approximately 2x when using the fast integer IDCT
281
282    The overall decompression speedup for RGB images is now approximately
2832.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.)
284
2853. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer
286supported, and the libjpeg-turbo build system can no longer be used to package
287such builds.  32-bit iOS apps cannot run in iOS 11 and later, and the App Store
288no longer allows them.
289
2904. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported,
291and the libjpeg-turbo build system can no longer be used to package such
292builds.  32-bit Mac applications cannot run in macOS 10.15 "Catalina" and
293later, and the App Store no longer allows them.
294
2955. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been
296significantly optimized, resulting in a measured average overall compression
297speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel
298and AMD CPUs, as well as a measured average overall compression speedup of
2990-23% on platforms that do not have a SIMD-accelerated Huffman encoding
300implementation.
301
3026. The block smoothing algorithm that is applied by default when decompressing
303progressive Huffman-encoded JPEG images has been improved in the following
304ways:
305
306     - The algorithm is now more fault-tolerant.  Previously, if a particular
307scan was incomplete, then the smoothing parameters for the incomplete scan
308would be applied to the entire output image, including the parts of the image
309that were generated by the prior (complete) scan.  Visually, this had the
310effect of removing block smoothing from lower-frequency scans if they were
311followed by an incomplete higher-frequency scan.  libjpeg-turbo now applies
312block smoothing parameters to each iMCU row based on which scan generated the
313pixels in that row, rather than always using the block smoothing parameters for
314the most recent scan.
315     - When applying block smoothing to DC scans, a Gaussian-like kernel with a
3165x5 window is used to reduce the "blocky" appearance.
317
3187. Added SIMD acceleration for progressive Huffman encoding on Arm platforms.
319This speeds up the compression of full-color progressive JPEGs by about 30-40%
320on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs.
321
3228. Added configure-time and run-time auto-detection of Loongson MMI SIMD
323instructions, so that the Loongson MMI SIMD extensions can be included in any
324MIPS64 libjpeg-turbo build.
325
3269. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate
327methods by which applications can guard against the exploits of the JPEG format
328described in the report
329["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
330
331     - Both programs now accept a `-maxscans` argument, which can be used to
332limit the number of allowable scans in the input file.
333     - Both programs now accept a `-strict` argument, which can be used to
334treat all warnings as fatal.
335
33610. CMake package config files are now included for both the libjpeg and
337TurboJPEG API libraries.  This facilitates using libjpeg-turbo with CMake's
338`find_package()` function.  For example:
339
340        find_package(libjpeg-turbo CONFIG REQUIRED)
341
342        add_executable(libjpeg_program libjpeg_program.c)
343        target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg)
344
345        add_executable(libjpeg_program_static libjpeg_program.c)
346        target_link_libraries(libjpeg_program_static PUBLIC
347          libjpeg-turbo::jpeg-static)
348
349        add_executable(turbojpeg_program turbojpeg_program.c)
350        target_link_libraries(turbojpeg_program PUBLIC
351          libjpeg-turbo::turbojpeg)
352
353        add_executable(turbojpeg_program_static turbojpeg_program.c)
354        target_link_libraries(turbojpeg_program_static PUBLIC
355          libjpeg-turbo::turbojpeg-static)
356
35711. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now
358read/write both LZW-compressed and uncompressed GIF files (feature ported from
359jpeg-6a and jpeg-9d.)
360
36112. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and
362jpeg-9d, as well as the ability to expand the image size using the `-crop`
363option.  Refer to jpegtran.1 or usage.txt for more details.
364
36513. Added a complete intrinsics implementation of the Arm Neon SIMD extensions,
366thus providing SIMD acceleration on Arm platforms for all of the algorithms
367that are SIMD-accelerated on x86 platforms.  This new implementation is
368significantly faster in some cases than the old GAS implementation--
369depending on the algorithms used, the type of CPU core, and the compiler.  GCC,
370as of this writing, does not provide a full or optimal set of Neon intrinsics,
371so for performance reasons, the default when building libjpeg-turbo with GCC is
372to continue using the GAS implementation of the following algorithms:
373
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
379
380    A new CMake variable (`NEON_INTRINSICS`) can be used to override this
381default.
382
383    Since the new intrinsics implementation includes SIMD acceleration
384for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has
385been reverted.
386
38714. The Arm Neon SIMD extensions can now be built using Visual Studio.
388
38915. The build system can now be used to generate a universal x86-64 + Armv8
390libjpeg-turbo SDK package for both iOS and macOS.
391
392
3932.0.6
394=====
395
396### Significant changes relative to 2.0.5:
397
3981. Fixed "using JNI after critical get" errors that occurred on Android
399platforms when using any of the YUV encoding/compression/decompression/decoding
400methods in the TurboJPEG Java API.
401
4022. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`:
403
404     - Fixed segfaults (CVE-2020-35538) or "Corrupt JPEG data: premature end of
405data segment" errors in `jpeg_skip_scanlines()` that occurred when
406decompressing 4:2:2 or 4:2:0 JPEG images using merged (non-fancy)
407upsampling/color conversion (that is, when setting `cinfo.do_fancy_upsampling`
408to `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
410quantization is enabled.  Two-pass color quantization never worked properly
411with `jpeg_skip_scanlines()`, and the issues could not readily be fixed.
412     - Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when
413skipping past the end of an image.
414
4153. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW
416toolchains targetting Arm64 (AArch64) Windows binaries.
417
4184. Fixed unexpected visual artifacts that occurred when using
419`jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC
420scan of a progressive JPEG image.
421
4225. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component
423JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8
424API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.)
425
426
4272.0.5
428=====
429
430### Significant changes relative to 2.0.4:
431
4321. Worked around issues in the MIPS DSPr2 SIMD extensions that caused failures
433in the libjpeg-turbo regression tests.  Specifically, the
434`jsimd_h2v1_downsample_dspr2()` and `jsimd_h2v2_downsample_dspr2()` functions
435in the MIPS DSPr2 SIMD extensions are now disabled until/unless they can be
436fixed, and other functions that are incompatible with big endian MIPS CPUs are
437disabled when building libjpeg-turbo for such CPUs.
438
4392. Fixed an oversight in the `TJCompressor.compress(int)` method in the
440TurboJPEG Java API that caused an error ("java.lang.IllegalStateException: No
441source image is associated with this instance") when attempting to use that
442method to compress a YUV image.
443
4443. Fixed an issue (CVE-2020-13790) in the PPM reader that caused a buffer
445overrun in cjpeg, TJBench, or the `tjLoadImage()` function if one of the values
446in a binary PPM/PGM input file exceeded the maximum value defined in the file's
447header and that maximum value was less than 255.  libjpeg-turbo 1.5.0 already
448included a similar fix for binary PPM/PGM files with maximum values greater
449than 255.
450
4514. The TurboJPEG API library's global error handler, which is used in functions
452such as `tjBufSize()` and `tjLoadImage()` that do not require a TurboJPEG
453instance handle, is now thread-safe on platforms that support thread-local
454storage.
455
456
4572.0.4
458=====
459
460### Significant changes relative to 2.0.3:
461
4621. Fixed a regression in the Windows packaging system (introduced by
4632.0 beta1[2]) whereby, if both the 64-bit libjpeg-turbo SDK for GCC and the
46464-bit libjpeg-turbo SDK for Visual C++ were installed on the same system, only
465one of them could be uninstalled.
466
4672. Fixed a signed integer overflow and subsequent segfault that occurred when
468attempting to decompress images with more than 715827882 pixels using the
46964-bit C version of TJBench.
470
4713. Fixed out-of-bounds write in `tjDecompressToYUV2()` and
472`tjDecompressToYUVPlanes()` (sometimes manifesting as a double free) that
473occurred when attempting to decompress grayscale JPEG images that were
474compressed with a sampling factor other than 1 (for instance, with
475`cjpeg -grayscale -sample 2x2`).
476
4774. Fixed a regression introduced by 2.0.2[5] that caused the TurboJPEG API to
478incorrectly identify some JPEG images with unusual sampling factors as 4:4:4
479JPEG images.  This was known to cause a buffer overflow when attempting to
480decompress some such images using `tjDecompressToYUV2()` or
481`tjDecompressToYUVPlanes()`.
482
4835. Fixed an issue (CVE-2020-17541), detected by ASan, whereby attempting to
484losslessly transform a specially-crafted malformed JPEG image containing an
485extremely-high-frequency coefficient block (junk image data that could never be
486generated by a legitimate JPEG compressor) could cause the Huffman encoder's
487local buffer to be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].)  Given that
488the buffer overrun was fully contained within the stack and did not cause a
489segfault or other user-visible errant behavior, and given that the lossless
490transformer (unlike the decompressor) is not generally exposed to arbitrary
491data exploits, this issue did not likely pose a security risk.
492
4936. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a
494separate read-only data section rather than in the text section, to support
495execute-only memory layouts.
496
497
4982.0.3
499=====
500
501### Significant changes relative to 2.0.2:
502
5031. Fixed "using JNI after critical get" errors that occurred on Android
504platforms when passing invalid arguments to certain methods in the TurboJPEG
505Java API.
506
5072. Fixed a regression in the SIMD feature detection code, introduced by
508the AVX2 SIMD extensions (2.0 beta1[1]), that was known to cause an illegal
509instruction exception, in rare cases, on CPUs that lack support for CPUID leaf
51007H (or on which the maximum CPUID leaf has been limited by way of a BIOS
511setting.)
512
5133. The 4:4:0 (h1v2) fancy (smooth) chroma upsampling algorithm in the
514decompressor now uses a similar bias pattern to that of the 4:2:2 (h2v1) fancy
515chroma upsampling algorithm, rounding up or down the upsampled result for
516alternate pixels rather than always rounding down.  This ensures that,
517regardless of whether a 4:2:2 JPEG image is rotated or transposed prior to
518decompression (in the frequency domain) or after decompression (in the spatial
519domain), the final image will be similar.
520
5214. Fixed an integer overflow and subsequent segfault that occurred when
522attempting to compress or decompress images with more than 1 billion pixels
523using the TurboJPEG API.
524
5255. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
526generate a progressive JPEG image on an SSE2-capable CPU using a scan script
527containing one or more scans with lengths divisible by 16 would result in an
528error ("Missing Huffman code table entry") and an invalid JPEG image.
529
5306. Fixed an issue whereby `tjDecodeYUV()` and `tjDecodeYUVPlanes()` would throw
531an error ("Invalid progressive parameters") or a warning ("Inconsistent
532progression sequence") if passed a TurboJPEG instance that was previously used
533to decompress a progressive JPEG image.
534
535
5362.0.2
537=====
538
539### Significant changes relative to 2.0.1:
540
5411. Fixed a regression introduced by 2.0.1[5] that prevented a runtime search
542path (rpath) from being embedded in the libjpeg-turbo shared libraries and
543executables 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,
545unless `DYLD_LIBRARY_PATH` was explicitly set to the location of the
546libjpeg-turbo shared libraries.
547
5482. Fixed an integer overflow and subsequent segfault (CVE-2018-20330) that
549occurred when attempting to load a BMP file with more than 1 billion pixels
550using the `tjLoadImage()` function.
551
5523. Fixed a buffer overrun (CVE-2018-19664) that occurred when attempting to
553decompress a specially-crafted malformed JPEG image to a 256-color BMP using
554djpeg.
555
5564. Fixed a floating point exception that occurred when attempting to
557decompress a specially-crafted malformed JPEG image with a specified image
558width or height of 0 using the C version of TJBench.
559
5605. The TurboJPEG API will now decompress 4:4:4 JPEG images with 2x1, 1x2, 3x1,
561or 1x3 luminance and chrominance sampling factors.  This is a non-standard way
562of specifying 1x subsampling (normally 4:4:4 JPEGs have 1x1 luminance and
563chrominance sampling factors), but the JPEG format and the libjpeg API both
564allow it.
565
5666. Fixed a regression introduced by 2.0 beta1[7] that caused djpeg to generate
567incorrect PPM images when used with the `-colors` option.
568
5697. 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.
571
5728. Fixed a severe performance issue in the Loongson MMI SIMD extensions that
573occurred when compressing RGB images whose image rows were not 64-bit-aligned.
574
575
5762.0.1
577=====
578
579### Significant changes relative to 2.0.0:
580
5811. Fixed a regression introduced with the new CMake-based Un*x build system,
582whereby jconfig.h could cause compiler warnings of the form
583`"HAVE_*_H" redefined` if it was included by downstream Autotools-based
584projects that used `AC_CHECK_HEADERS()` to check for the existence of locale.h,
585stddef.h, or stdlib.h.
586
5872. The `jsimd_quantize_float_dspr2()` and `jsimd_convsamp_float_dspr2()`
588functions in the MIPS DSPr2 SIMD extensions are now disabled at compile time
589if the soft float ABI is enabled.  Those functions use instructions that are
590incompatible with the soft float ABI.
591
5923. Fixed a regression in the SIMD feature detection code, introduced by
593the AVX2 SIMD extensions (2.0 beta1[1]), that caused libjpeg-turbo to crash on
594Windows 7 if Service Pack 1 was not installed.
595
5964. Fixed out-of-bounds read in cjpeg that occurred when attempting to compress
597a specially-crafted malformed color-index (8-bit-per-sample) Targa file in
598which some of the samples (color indices) exceeded the bounds of the Targa
599file's color table.
600
6015. 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
603fail with "No valid ELF RPATH or RUNPATH entry exists in the file."
604
605
6062.0.0
607=====
608
609### Significant changes relative to 2.0 beta1:
610
6111. The TurboJPEG API can now decompress CMYK JPEG images that have subsampled M
612and Y components (not to be confused with YCCK JPEG images, in which the C/M/Y
613components have been transformed into luma and chroma.)   Previously, an error
614was generated ("Could not determine subsampling type for JPEG image") when such
615an image was passed to `tjDecompressHeader3()`, `tjTransform()`,
616`tjDecompressToYUVPlanes()`, `tjDecompressToYUV2()`, or the equivalent Java
617methods.
618
6192. Fixed an issue (CVE-2018-11813) whereby a specially-crafted malformed input
620file (specifically, a file with a valid Targa header but incomplete pixel data)
621would cause cjpeg to generate a JPEG file that was potentially thousands of
622times larger than the input file.  The Targa reader in cjpeg was not properly
623detecting that the end of the input file had been reached prematurely, so after
624all valid pixels had been read from the input, the reader injected dummy pixels
625with values of 255 into the JPEG compressor until the number of pixels
626specified in the Targa header had been compressed.  The Targa reader in cjpeg
627now behaves like the PPM reader and aborts compression if the end of the input
628file is reached prematurely.  Because this issue only affected cjpeg and not
629the underlying library, and because it did not involve any out-of-bounds reads
630or other exploitable behaviors, it was not believed to represent a security
631threat.
632
6333. Fixed an issue whereby the `tjLoadImage()` and `tjSaveImage()` functions
634would produce a "Bogus message code" error message if the underlying bitmap and
635PPM readers/writers threw an error that was specific to the readers/writers
636(as opposed to a general libjpeg API error.)
637
6384. Fixed an issue (CVE-2018-1152) whereby a specially-crafted malformed BMP
639file, one in which the header specified an image width of 1073741824 pixels,
640would trigger a floating point exception (division by zero) in the
641`tjLoadImage()` function when attempting to load the BMP file into a
6424-component image buffer.
643
6445. Fixed an issue whereby certain combinations of calls to
645`jpeg_skip_scanlines()` and `jpeg_read_scanlines()` could trigger an infinite
646loop when decompressing progressive JPEG images that use vertical chroma
647subsampling (for instance, 4:2:0 or 4:4:0.)
648
6496. Fixed a segfault in `jpeg_skip_scanlines()` that occurred when decompressing
650a 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`.)
652
6537. The new CMake-based build system will now disable the MIPS DSPr2 SIMD
654extensions if it detects that the compiler does not support DSPr2 instructions.
655
6568. Fixed out-of-bounds read in cjpeg (CVE-2018-14498) that occurred when
657attempting to compress a specially-crafted malformed color-index
658(8-bit-per-sample) BMP file in which some of the samples (color indices)
659exceeded the bounds of the BMP file's color table.
660
6619. Fixed a signed integer overflow in the progressive Huffman decoder, detected
662by the Clang and GCC undefined behavior sanitizers, that could be triggered by
663attempting to decompress a specially-crafted malformed JPEG image.  This issue
664did not pose a security threat, but removing the warning made it easier to
665detect actual security issues, should they arise in the future.
666
667
6681.5.90 (2.0 beta1)
669==================
670
671### Significant changes relative to 1.5.3:
672
6731. Added AVX2 SIMD implementations of the colorspace conversion, chroma
674downsampling and upsampling, integer quantization and sample conversion, and
675accurate integer DCT/IDCT algorithms.  When using the accurate integer DCT/IDCT
676algorithms on AVX2-equipped CPUs, the compression of RGB images is
677approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
67864-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
679decompression of RGB images is approximately 9-35% (avg. 17%) faster with
68064-bit code and 7-17% (avg. 12%) faster with 32-bit code.  (As tested on a
6813 GHz Intel Core i7.  Actual mileage may vary.)
682
6832. Overhauled the build system to use CMake on all platforms, and removed the
684autotools-based build system.  This decision resulted from extensive
685discussions within the libjpeg-turbo community.  libjpeg-turbo traditionally
686used CMake only for Windows builds, but there was an increasing amount of
687demand to extend CMake support to other platforms.  However, because of the
688unique nature of our code base (the need to support different assemblers on
689each platform, the need for Java support, etc.), providing dual build systems
690as other OSS imaging libraries do (including libpng and libtiff) would have
691created a maintenance burden.  The use of CMake greatly simplifies some aspects
692of our build system, owing to CMake's built-in support for various assemblers,
693Java, and unit testing, as well as generally fewer quirks that have to be
694worked around in order to implement our packaging system.  Eliminating
695autotools puts our project slightly at odds with the traditional practices of
696the OSS community, since most "system libraries" tend to be built with
697autotools, but it is believed that the benefits of this move outweigh the
698risks.  In addition to providing a unified build environment, switching to
699CMake allows for the use of various build tools and IDEs that aren't supported
700under autotools, including XCode, Ninja, and Eclipse.  It also eliminates the
701need to install autotools via MacPorts/Homebrew on OS X and allows
702libjpeg-turbo to be configured without the use of a terminal/command prompt.
703Extensive testing was conducted to ensure that all features provided by the
704autotools-based build system are provided by the new build system.
705
7063. The libjpeg API in this version of libjpeg-turbo now includes two additional
707functions, `jpeg_read_icc_profile()` and `jpeg_write_icc_profile()`, that can
708be used to extract ICC profile data from a JPEG file while decompressing or to
709embed ICC profile data in a JPEG file while compressing or transforming.  This
710eliminates the need for downstream projects, such as color management libraries
711and browsers, to include their own glueware for accomplishing this.
712
7134. Improved error handling in the TurboJPEG API library:
714
715     - Introduced a new function (`tjGetErrorStr2()`) in the TurboJPEG C API
716that allows compression/decompression/transform error messages to be retrieved
717in a thread-safe manner.  Retrieving error messages from global functions, such
718as `tjInitCompress()` or `tjBufSize()`, is still thread-unsafe, but since those
719functions will only throw errors if passed an invalid argument or if a memory
720allocation failure occurs, thread safety is not as much of a concern.
721     - Introduced a new function (`tjGetErrorCode()`) in the TurboJPEG C API
722and a new method (`TJException.getErrorCode()`) in the TurboJPEG Java API that
723can be used to determine the severity of the last
724compression/decompression/transform error.  This allows applications to
725choose whether to ignore warnings (non-fatal errors) from the underlying
726libjpeg 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
729immediately halt a compression/decompression/transform operation if it
730encounters a warning from the underlying libjpeg API (the default behavior is
731to allow the operation to complete unless a fatal error is encountered.)
732
7335. Introduced a new flag in the TurboJPEG C and Java APIs (`TJFLAG_PROGRESSIVE`
734and `TJ.FLAG_PROGRESSIVE`, respectively) that causes the library to use
735progressive entropy coding in JPEG images generated by compression and
736transform operations.  Additionally, a new transform option
737(`TJXOPT_PROGRESSIVE` in the C API and `TJTransform.OPT_PROGRESSIVE` in the
738Java API) has been introduced, allowing progressive entropy coding to be
739enabled for selected transforms in a multi-transform operation.
740
7416. Introduced a new transform option in the TurboJPEG API (`TJXOPT_COPYNONE` in
742the C API and `TJTransform.OPT_COPYNONE` in the Java API) that allows the
743copying of markers (including EXIF and ICC profile data) to be disabled for a
744particular transform.
745
7467. 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
748memory buffer with a specified pixel format and layout.  These functions
749replace the project-private (and slow) bmp API, which was previously used by
750TJBench, and they also provide a convenient way for first-time users of
751libjpeg-turbo to quickly develop a complete JPEG compression/decompression
752program.
753
7548. The TurboJPEG C API now includes a new convenience array (`tjAlphaOffset[]`)
755that contains the alpha component index for each pixel format (or -1 if the
756pixel format lacks an alpha component.)  The TurboJPEG Java API now includes a
757new method (`TJ.getAlphaOffset()`) that returns the same value.  In addition,
758the `tjRedOffset[]`, `tjGreenOffset[]`, and `tjBlueOffset[]` arrays-- and the
759corresponding `TJ.getRedOffset()`, `TJ.getGreenOffset()`, and
760`TJ.getBlueOffset()` methods-- now return -1 for `TJPF_GRAY`/`TJ.PF_GRAY`
761rather than 0.  This allows programs to easily determine whether a pixel format
762has red, green, blue, and alpha components.
763
7649. Added a new example (tjexample.c) that demonstrates the basic usage of the
765TurboJPEG C API.  This example mirrors the functionality of TJExample.java.
766Both files are now included in the libjpeg-turbo documentation.
767
76810. Fixed two signed integer overflows in the arithmetic decoder, detected by
769the Clang undefined behavior sanitizer, that could be triggered by attempting
770to decompress a specially-crafted malformed JPEG image.  These issues did not
771pose a security threat, but removing the warnings makes it easier to detect
772actual security issues, should they arise in the future.
773
77411. Fixed a bug in the merged 4:2:0 upsampling/dithered RGB565 color conversion
775algorithm that caused incorrect dithering in the output image.  This algorithm
776now produces bitwise-identical results to the unmerged algorithms.
777
77812. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
779libjpeg-turbo is built with Yasm), and iOS/Arm[64] builds are now private.
780This prevents those symbols from being exposed in applications or shared
781libraries that link statically with libjpeg-turbo.
782
78313. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
784YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
785chroma upsampling, integer quantization, and accurate integer DCT/IDCT
786algorithms.  When using the accurate integer DCT/IDCT, this speeds up the
787compression of RGB images by approximately 70-100% and the decompression of RGB
788images by approximately 2-3.5x.
789
79014. Fixed a build error when building with older MinGW releases (regression
791caused by 1.5.1[7].)
792
79315. Added SIMD acceleration for progressive Huffman encoding on SSE2-capable
794x86 and x86-64 platforms.  This speeds up the compression of full-color
795progressive JPEGs by about 85-90% on average (relative to libjpeg-turbo 1.5.x)
796when using modern Intel and AMD CPUs.
797
798
7991.5.3
800=====
801
802### Significant changes relative to 1.5.2:
803
8041. Fixed a NullPointerException in the TurboJPEG Java wrapper that occurred
805when using the YUVImage constructor that creates an instance backed by separate
806image planes and allocates memory for the image planes.
807
8082. Fixed an issue whereby the Java version of TJUnitTest would fail when
809testing BufferedImage encoding/decoding on big endian systems.
810
8113. Fixed a segfault in djpeg that would occur if an output format other than
812PPM/PGM was selected along with the `-crop` option.  The `-crop` option now
813works with the GIF and Targa formats as well (unfortunately, it cannot be made
814to work with the BMP and RLE formats due to the fact that those output engines
815write scanlines in bottom-up order.)  djpeg will now exit gracefully if an
816output format other than PPM/PGM, GIF, or Targa is selected along with the
817`-crop` option.
818
8194. Fixed an issue (CVE-2017-15232) whereby `jpeg_skip_scanlines()` would
820segfault if color quantization was enabled.
821
8225. TJBench (both C and Java versions) will now display usage information if any
823command-line argument is unrecognized.  This prevents the program from silently
824ignoring typos.
825
8266. Fixed an access violation in tjbench.exe (Windows) that occurred when the
827program was used to decompress an existing JPEG image.
828
8297. Fixed an ArrayIndexOutOfBoundsException in the TJExample Java program that
830occurred when attempting to decompress a JPEG image that had been compressed
831with 4:1:1 chrominance subsampling.
832
8338. Fixed an issue whereby, when using `jpeg_skip_scanlines()` to skip to the
834end of a single-scan (non-progressive) image, subsequent calls to
835`jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
836`JPEG_REACHED_EOI`.
837
8389. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG
839images that were compressed with a sampling factor other than 1 (for instance,
840with `cjpeg -grayscale -sample 2x2`).
841
842
8431.5.2
844=====
845
846### Significant changes relative to 1.5.1:
847
8481. Fixed a regression introduced by 1.5.1[7] that prevented libjpeg-turbo from
849building with Android NDK platforms prior to android-21 (5.0).
850
8512. Fixed a regression introduced by 1.5.1[1] that prevented the MIPS DSPR2 SIMD
852code in libjpeg-turbo from building.
853
8543. Fixed a regression introduced by 1.5 beta1[11] that prevented the Java
855version of TJBench from outputting any reference images (the `-nowrite` switch
856was accidentally enabled by default.)
857
8584. libjpeg-turbo should now build and run with full AltiVec SIMD acceleration
859on PowerPC-based AmigaOS 4 and OpenBSD systems.
860
8615. Fixed build and runtime errors on Windows that occurred when building
862libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
863source/destination managers.  Due to an oversight, the `jpeg_skip_scanlines()`
864and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when
865libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
866
8676. Fixed "Bogus virtual array access" error that occurred when using the
868lossless crop feature in jpegtran or the TurboJPEG API, if libjpeg-turbo was
869built with libjpeg v7 API/ABI emulation.  This was apparently a long-standing
870bug that has existed since the introduction of libjpeg v7/v8 API/ABI emulation
871in libjpeg-turbo v1.1.
872
8737. The lossless transform features in jpegtran and the TurboJPEG API will now
874always attempt to adjust the EXIF image width and height tags if the image size
875changed as a result of the transform.  This behavior has always existed when
876using libjpeg v8 API/ABI emulation.  It was supposed to be available with
877libjpeg v7 API/ABI emulation as well but did not work properly due to a bug.
878Furthermore, there was never any good reason not to enable it with libjpeg v6b
879API/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
881the source image to the destination image.
882
8838. Fixed several memory leaks in the TurboJPEG API library that could occur
884if 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
886GCC 5.x or 6.x) and one of the underlying libjpeg API functions threw an error
887after a TurboJPEG API function allocated a local buffer.
888
8899. The libjpeg-turbo memory manager will now honor the `max_memory_to_use`
890structure member in jpeg\_memory\_mgr, which can be set to the maximum amount
891of memory (in bytes) that libjpeg-turbo should use during decompression or
892multi-pass (including progressive) compression.  This limit can also be set
893using the `JPEGMEM` environment variable or using the `-maxmemory` switch in
894cjpeg/djpeg/jpegtran (refer to the respective man pages for more details.)
895This has been a documented feature of libjpeg since v5, but the
896`malloc()`/`free()` implementation of the memory manager (jmemnobs.c) never
897implemented the feature.  Restricting libjpeg-turbo's memory usage is useful
898for two reasons:  it allows testers to more easily work around the 2 GB limit
899in libFuzzer, and it allows developers of security-sensitive applications to
900more easily defend against one of the progressive JPEG exploits (LJT-01-004)
901identified in
902[this report](http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
903
90410. TJBench will now run each benchmark for 1 second prior to starting the
905timer, 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
907the number of warmup iterations.
908
90911. Fixed an error (`short jump is out of range`) that occurred when assembling
910the 32-bit x86 SIMD extensions with NASM versions prior to 2.04.  This was a
911regression introduced by 1.5 beta1[12].
912
913
9141.5.1
915=====
916
917### Significant changes relative to 1.5.0:
918
9191. Previously, the undocumented `JSIMD_FORCE*` environment variables could be
920used to force-enable a particular SIMD instruction set if multiple instruction
921sets were available on a particular platform.  On x86 platforms, where CPU
922feature detection is bulletproof and multiple SIMD instruction sets are
923available, it makes sense for those environment variables to allow forcing the
924use of an instruction set only if that instruction set is available.  However,
925since the ARM implementations of libjpeg-turbo can only use one SIMD
926instruction set, and since their feature detection code is less bulletproof
927(parsing /proc/cpuinfo), it makes sense for the `JSIMD_FORCENEON` environment
928variable to bypass the feature detection code and really force the use of NEON
929instructions.  A new environment variable (`JSIMD_FORCEDSPR2`) was introduced
930in the MIPS implementation for the same reasons, and the existing
931`JSIMD_FORCENONE` environment variable was extended to that implementation.
932These environment variables provide a workaround for those attempting to test
933ARM and MIPS builds of libjpeg-turbo in QEMU, which passes through
934/proc/cpuinfo from the host system.
935
9362. libjpeg-turbo previously assumed that AltiVec instructions were always
937available on PowerPC platforms, which led to "illegal instruction" errors when
938running on PowerPC chips that lack AltiVec support (such as the older 7xx/G3
939and newer e5500 series.)  libjpeg-turbo now examines /proc/cpuinfo on
940Linux/Android systems and enables AltiVec instructions only if the CPU supports
941them.  It also now provides two environment variables, `JSIMD_FORCEALTIVEC` and
942`JSIMD_FORCENONE`, to force-enable and force-disable AltiVec instructions in
943environments where /proc/cpuinfo is an unreliable means of CPU feature
944detection (such as when running in QEMU.)  On OS X, libjpeg-turbo continues to
945assume that AltiVec support is always available, which means that libjpeg-turbo
946cannot be used with G3 Macs unless you set the environment variable
947`JSIMD_FORCENONE` to `1`.
948
9493. Fixed an issue whereby 64-bit ARM (AArch64) builds of libjpeg-turbo would
950crash when built with recent releases of the Clang/LLVM compiler.  This was
951caused by an ABI conformance issue in some of libjpeg-turbo's 64-bit NEON SIMD
952routines.  Those routines were incorrectly using 64-bit instructions to
953transfer 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
955Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
956structure members into a single 64-bit register, and this exposed the ABI
957conformance issue.
958
9594. Fancy upsampling is now supported when decompressing JPEG images that use
9604:4:0 (h1v2) chroma subsampling.  These images are generated when losslessly
961rotating or transposing JPEG images that use 4:2:2 (h2v1) chroma subsampling.
962The h1v2 fancy upsampling algorithm is not currently SIMD-accelerated.
963
9645. If merged upsampling isn't SIMD-accelerated but YCbCr-to-RGB conversion is,
965then libjpeg-turbo will now disable merged upsampling when decompressing YCbCr
966JPEG images into RGB or extended RGB output images.  This significantly speeds
967up the decompression of 4:2:0 and 4:2:2 JPEGs on ARM platforms if fancy
968upsampling is not used (for example, if the `-nosmooth` option to djpeg is
969specified.)
970
9716. The TurboJPEG API will now decompress 4:2:2 and 4:4:0 JPEG images with
9722x2 luminance sampling factors and 2x1 or 1x2 chrominance sampling factors.
973This is a non-standard way of specifying 2x subsampling (normally 4:2:2 JPEGs
974have 2x1 luminance and 1x1 chrominance sampling factors, and 4:4:0 JPEGs have
9751x2 luminance and 1x1 chrominance sampling factors), but the JPEG format and
976the libjpeg API both allow it.
977
9787. Fixed an unsigned integer overflow in the libjpeg memory manager, detected
979by the Clang undefined behavior sanitizer, that could be triggered by
980attempting to decompress a specially-crafted malformed JPEG image.  This issue
981affected only 32-bit code and did not pose a security threat, but removing the
982warning makes it easier to detect actual security issues, should they arise in
983the future.
984
9858. Fixed additional negative left shifts and other issues reported by the GCC
986and Clang undefined behavior sanitizers when attempting to decompress
987specially-crafted malformed JPEG images.  None of these issues posed a security
988threat, but removing the warnings makes it easier to detect actual security
989issues, should they arise in the future.
990
9919. Fixed an out-of-bounds array reference, introduced by 1.4.90[2] (partial
992image decompression) and detected by the Clang undefined behavior sanitizer,
993that could be triggered by a specially-crafted malformed JPEG image with more
994than four components.  Because the out-of-bounds reference was still within the
995same structure, it was not known to pose a security threat, but removing the
996warning makes it easier to detect actual security issues, should they arise in
997the future.
998
99910. Fixed another ABI conformance issue in the 64-bit ARM (AArch64) NEON SIMD
1000code.  Some of the routines were incorrectly reading and storing data below the
1001stack pointer, which caused segfaults in certain applications under specific
1002circumstances.
1003
1004
10051.5.0
1006=====
1007
1008### Significant changes relative to 1.5 beta1:
1009
10101. Fixed an issue whereby a malformed motion-JPEG frame could cause the "fast
1011path" of libjpeg-turbo's Huffman decoder to read from uninitialized memory.
1012
10132. Added libjpeg-turbo version and build information to the global string table
1014of the libjpeg and TurboJPEG API libraries.  This is a common practice in other
1015infrastructure libraries, such as OpenSSL and libpng, because it makes it easy
1016to examine an application binary and determine which version of the library the
1017application was linked against.
1018
10193. Fixed a couple of issues in the PPM reader that would cause buffer overruns
1020in cjpeg if one of the values in a binary PPM/PGM input file exceeded the
1021maximum value defined in the file's header and that maximum value was greater
1022than 255.  libjpeg-turbo 1.4.2 already included a similar fix for ASCII PPM/PGM
1023files.  Note that these issues were not security bugs, since they were confined
1024to the cjpeg program and did not affect any of the libjpeg-turbo libraries.
1025
10264. Fixed an issue whereby attempting to decompress a JPEG file with a corrupt
1027header using the `tjDecompressToYUV2()` function would cause the function to
1028abort without returning an error and, under certain circumstances, corrupt the
1029stack.  This only occurred if `tjDecompressToYUV2()` was called prior to
1030calling `tjDecompressHeader3()`, or if the return value from
1031`tjDecompressHeader3()` was ignored (both cases represent incorrect usage of
1032the TurboJPEG API.)
1033
10345. Fixed an issue in the ARM 32-bit SIMD-accelerated Huffman encoder that
1035prevented the code from assembling properly with clang.
1036
10376. 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
1039source/destination manager has already been assigned to the compress or
1040decompress object by a different function or by the calling program.  This
1041prevents these functions from attempting to reuse a source/destination manager
1042structure that was allocated elsewhere, because there is no way to ensure that
1043it would be big enough to accommodate the new source/destination manager.
1044
1045
10461.4.90 (1.5 beta1)
1047==================
1048
1049### Significant changes relative to 1.4.2:
1050
10511. Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
1052(128-bit SIMD) instructions.  Although the performance of libjpeg-turbo on
1053PowerPC was already good, due to the increased number of registers available
1054to the compiler vs. x86, it was still possible to speed up compression by about
10553-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
1056use of AltiVec instructions.
1057
10582. 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.
1061
10623. The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
1063implement the Closeable interface, so those classes can be used with a
1064try-with-resources statement.
1065
10664. The TurboJPEG Java classes now throw unchecked idiomatic exceptions
1067(IllegalArgumentException, IllegalStateException) for unrecoverable errors
1068caused by incorrect API usage, and those classes throw a new checked exception
1069type (TJException) for errors that are passed through from the C library.
1070
10715. 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
1073pointers.  This facilitates passing read-only buffers to those functions and
1074ensures the caller that the source buffer will not be modified.  This should
1075not create any backward API or ABI incompatibilities with prior libjpeg-turbo
1076releases.
1077
10786. The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
1079FPUs.
1080
10817. Fixed additional negative left shifts and other issues reported by the GCC
1082and Clang undefined behavior sanitizers.  Most of these issues affected only
108332-bit code, and none of them was known to pose a security threat, but removing
1084the warnings makes it easier to detect actual security issues, should they
1085arise in the future.
1086
10878. Removed the unnecessary `.arch` directive from the ARM64 NEON SIMD code.
1088This directive was preventing the code from assembling using the clang
1089integrated assembler.
1090
10919. Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
1092libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
1093distributions.  This was due to the addition of a macro in jconfig.h that
1094allows the Huffman codec to determine the word size at compile time.  Since
1095that macro differs between 32-bit and 64-bit builds, this caused a conflict
1096between the i386 and x86_64 RPMs (any differing files, other than executables,
1097are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
1098Since the macro is used only internally, it has been moved into jconfigint.h.
1099
110010. 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
1102already had this capability.)
1103
110411. Added a new command-line argument to TJBench (`-nowrite`) that prevents the
1105benchmark from outputting any images.  This removes any potential operating
1106system overhead that might be caused by lazy writes to disk and thus improves
1107the consistency of the performance measurements.
1108
110912. Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and x86-64
1110platforms.  This speeds up the compression of full-color JPEGs by about 10-15%
1111on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and AMD
1112CPUs.  Additionally, this works around an issue in the clang optimizer that
1113prevents it (as of this writing) from achieving the same performance as GCC
1114when compiling the C version of the Huffman encoder
1115(<https://llvm.org/bugs/show_bug.cgi?id=16035>).  For the purposes of
1116benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
1117disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
1118
111913. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
1120compression algorithms (including the accurate integer forward DCT and h2v2 &
1121h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON
1122implementation.)  This speeds up the compression of full-color JPEGs by about
112375% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
1124Cortex-A53 and Cortex-A57 cores.
1125
112614. Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
1127and 64-bit platforms.
1128
1129    For 32-bit code, this speeds up the compression of full-color JPEGs by
1130about 30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by
1131about 6-7% on average on a typical Android device (Nexus 5X, Cortex-A53 and
1132Cortex-A57), relative to libjpeg-turbo 1.4.x.  Note that the larger speedup
1133under iOS is due to the fact that iOS builds use LLVM, which does not optimize
1134the C Huffman encoder as well as GCC does.
1135
1136    For 64-bit code, NEON-accelerated Huffman encoding speeds up the
1137compression 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
1140[13] above.
1141
1142    For the purposes of benchmarking or regression testing, SIMD-accelerated
1143Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment
1144variable to `1`.
1145
114615. pkg-config (.pc) scripts are now included for both the libjpeg and
1147TurboJPEG API libraries on Un*x systems.  Note that if a project's build system
1148relies on these scripts, then it will not be possible to build that project
1149with libjpeg or with a prior version of libjpeg-turbo.
1150
115116. Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
1152improve performance on CPUs with in-order pipelines.  This speeds up the
1153decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
1154processor and by about 15% on average on a Cortex-A53 core.
1155
115617. Fixed an issue in the accelerated Huffman decoder that could have caused
1157the decoder to read past the end of the input buffer when a malformed,
1158specially-crafted JPEG image was being decompressed.  In prior versions of
1159libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
1160if there were > 128 bytes of data in the input buffer.  However, it is possible
1161to construct a JPEG image in which a single Huffman block is over 430 bytes
1162long, so this version of libjpeg-turbo activates the accelerated Huffman
1163decoder only if there are > 512 bytes of data in the input buffer.
1164
116518. Fixed a memory leak in tjunittest encountered when running the program
1166with the `-yuv` option.
1167
1168
11691.4.2
1170=====
1171
1172### Significant changes relative to 1.4.1:
1173
11741. Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
1175negative width or height was used as an input image (Windows bitmaps can have
1176a negative height if they are stored in top-down order, but such files are
1177rare and not supported by libjpeg-turbo.)
1178
11792. Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
1180incorrectly encode certain JPEG images when quality=100 and the fast integer
1181forward DCT were used.  This was known to cause `make test` to fail when the
1182library was built with `-march=haswell` on x86 systems.
1183
11843. 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
1186an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
1187routines.  Those routines were incorrectly using a 64-bit `mov` instruction to
1188transfer 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
1190Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
1191structure members into a single 64-bit register, and this exposed the ABI
1192conformance issue.
1193
11944. Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
1195upsampling routine that caused a buffer overflow (and subsequent segfault) when
1196decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
1197pixels.  The "plain" upsampling routines are normally only used when
1198decompressing a non-YCbCr JPEG image, but they are also used when decompressing
1199a JPEG image whose scaled output height is 1.
1200
12015. Fixed various negative left shifts and other issues reported by the GCC and
1202Clang undefined behavior sanitizers.  None of these was known to pose a
1203security threat, but removing the warnings makes it easier to detect actual
1204security issues, should they arise in the future.
1205
1206
12071.4.1
1208=====
1209
1210### Significant changes relative to 1.4.0:
1211
12121. tjbench now properly handles CMYK/YCCK JPEG files.  Passing an argument of
1213`-cmyk` (instead of, for instance, `-rgb`) will cause tjbench to internally
1214convert the source bitmap to CMYK prior to compression, to generate YCCK JPEG
1215files, and to internally convert the decompressed CMYK pixels back to RGB after
1216decompression (the latter is done automatically if a CMYK or YCCK JPEG is
1217passed to tjbench as a source image.)  The CMYK<->RGB conversion operation is
1218not benchmarked.  NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
1219uses are suitable for testing only.  Proper conversion between CMYK and RGB
1220requires a color management system.
1221
12222. `make test` now performs additional bitwise regression tests using tjbench,
1223mainly for the purpose of testing compression from/decompression to a subregion
1224of a larger image buffer.
1225
12263. `make test` no longer tests the regression of the floating point DCT/IDCT
1227by default, since the results of those tests can vary if the algorithms in
1228question are not implemented using SIMD instructions on a particular platform.
1229See the comments in [Makefile.am](Makefile.am) for information on how to
1230re-enable the tests and to specify an expected result for them based on the
1231particulars of your platform.
1232
12334. The NULL color conversion routines have been significantly optimized,
1234which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
123564-bit code and 0-3% when using 32-bit code, and the decompression of those
1236images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
1237
12385. Fixed an "illegal instruction" error that occurred when djpeg from a
1239SIMD-enabled libjpeg-turbo MIPS build was executed with the `-nosmooth` option
1240on a MIPS machine that lacked DSPr2 support.  The MIPS SIMD routines for h2v1
1241and h2v2 merged upsampling were not properly checking for the existence of
1242DSPr2.
1243
12446. Performance has been improved significantly on 64-bit non-Linux and
1245non-Windows platforms (generally 10-20% faster compression and 5-10% faster
1246decompression.)  Due to an oversight, the 64-bit version of the accelerated
1247Huffman codec was not being compiled in when libjpeg-turbo was built on
1248platforms other than Windows or Linux.  Oops.
1249
12507. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
1251builds of libjpeg-turbo to incorrectly encode a few specific test images when
1252quality=98, an optimized Huffman table, and the accurate integer forward DCT
1253were used.
1254
12558. The Windows (CMake) build system now supports building only static or only
1256shared libraries.  This is accomplished by adding either `-DENABLE_STATIC=0` or
1257`-DENABLE_SHARED=0` to the CMake command line.
1258
12599. TurboJPEG API functions will now return an error code if a warning is
1260triggered in the underlying libjpeg API.  For instance, if a JPEG file is
1261corrupt, the TurboJPEG decompression functions will attempt to decompress
1262as much of the image as possible, but those functions will now return -1 to
1263indicate that the decompression was not entirely successful.
1264
126510. Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
1266buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
1267in which the right-most MCU was 5 or 6 pixels wide.
1268
1269
12701.4.0
1271=====
1272
1273### Significant changes relative to 1.4 beta1:
1274
12751. Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
1276because OS X does not provide the `le32toh()` and `htole32()` functions.)
1277
12782. The non-SIMD RGB565 color conversion code did not work correctly on big
1279endian machines.  This has been fixed.
1280
12813. Fixed an issue in `tjPlaneSizeYUV()` whereby it would erroneously return 1
1282instead of -1 if `componentID` was > 0 and `subsamp` was `TJSAMP_GRAY`.
1283
12843. Fixed an issue in `tjBufSizeYUV2()` whereby it would erroneously return 0
1285instead of -1 if `width` was < 1.
1286
12875. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1288on ARM64 platforms (see 1.4 beta1[5].)
1289
12906. The `close()` method in the TJCompressor and TJDecompressor Java classes is
1291now idempotent.  Previously, that method would call the native `tjDestroy()`
1292function even if the TurboJPEG instance had already been destroyed.  This
1293caused an exception to be thrown during finalization, if the `close()` method
1294had already been called.  The exception was caught, but it was still an
1295expensive operation.
1296
12977. The TurboJPEG API previously generated an error (`Could not determine
1298subsampling type for JPEG image`) when attempting to decompress grayscale JPEG
1299images that were compressed with a sampling factor other than 1 (for instance,
1300with `cjpeg -grayscale -sample 2x2`).  Subsampling technically has no meaning
1301with grayscale JPEGs, and thus the horizontal and vertical sampling factors
1302for such images are ignored by the decompressor.  However, the TurboJPEG API
1303was being too rigid and was expecting the sampling factors to be equal to 1
1304before it treated the image as a grayscale JPEG.
1305
13068. cjpeg, djpeg, and jpegtran now accept an argument of `-version`, which will
1307print the library version and exit.
1308
13099. Referring to 1.4 beta1[15], another extremely rare circumstance was
1310discovered under which the Huffman encoder's local buffer can be overrun
1311when a buffered destination manager is being used and an
1312extremely-high-frequency block (basically junk image data) is being encoded.
1313Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
1314to address the previous issue, the new issue caused even the larger buffer to
1315be overrun.  Further analysis reveals that, in the absolute worst case (such as
1316setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
1317order), the Huffman encoder can produce encoded blocks that approach double the
1318size of the unencoded blocks.  Thus, the Huffman local buffer was increased to
1319256 bytes, which should prevent any such issue from re-occurring in the future.
1320
132110. The new `tjPlaneSizeYUV()`, `tjPlaneWidth()`, and `tjPlaneHeight()`
1322functions were not actually usable on any platform except OS X and Windows,
1323because those functions were not included in the libturbojpeg mapfile.  This
1324has been fixed.
1325
132611. Restored the `JPP()`, `JMETHOD()`, and `FAR` macros in the libjpeg-turbo
1327header files.  The `JPP()` and `JMETHOD()` macros were originally implemented
1328in libjpeg as a way of supporting non-ANSI compilers that lacked support for
1329prototype parameters.  libjpeg-turbo has never supported such compilers, but
1330some software packages still use the macros to define their own prototypes.
1331Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
1332have far symbols, but some software packages still use the `FAR` macro.  A
1333pretty good argument can be made that this is a bad practice on the part of the
1334software in question, but since this affects more than one package, it's just
1335easier to fix it here.
1336
133712. Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
1338for iOS, and included an ARMv8 architecture in all of the binaries installed by
1339the "official" libjpeg-turbo SDK for OS X.
1340
1341
13421.3.90 (1.4 beta1)
1343==================
1344
1345### Significant changes relative to 1.3.1:
1346
13471. New features in the TurboJPEG API:
1348
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
1351supported.)
1352     - The decompress-to-YUV function has been extended to support image
1353scaling.
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
1357compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
1358significant advantages relative to 4:2:0.
1359     - CMYK images are now supported.  This feature allows CMYK source images
1360to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to
1361CMYK destination images.  Conversion between CMYK/YCCK and RGB or YUV images is
1362not supported.  Such conversion requires a color management system and is thus
1363out of scope for a codec library.
1364     - The handling of YUV images in the Java API has been significantly
1365refactored and should now be much more intuitive.
1366     - The Java API now supports encoding a YUV image from an arbitrary
1367position in a large image buffer.
1368     - All of the YUV functions now have a corresponding function that operates
1369on separate image planes instead of a unified image buffer.  This allows for
1370compressing/decoding from or decompressing/encoding to a subregion of a larger
1371YUV image.  It also allows for handling YUV formats that swap the order of the
1372U and V planes.
1373
13742. Added SIMD acceleration for DSPr2-capable MIPS platforms.  This speeds up
1375the compression of full-color JPEGs by 70-80% on such platforms and
1376decompression by 25-35%.
1377
13783. If an application attempts to decompress a Huffman-coded JPEG image whose
1379header does not contain Huffman tables, libjpeg-turbo will now insert the
1380default Huffman tables.  In order to save space, many motion JPEG video frames
1381are encoded without the default Huffman tables, so these frames can now be
1382successfully decompressed by libjpeg-turbo without additional work on the part
1383of the application.  An application can still override the Huffman tables, for
1384instance to re-use tables from a previous frame of the same video.
1385
13864. The Mac packaging system now uses pkgbuild and productbuild rather than
1387PackageMaker (which is obsolete and no longer supported.)  This means that
1388OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
1389although the packages produced can be installed on OS X 10.5 "Leopard" or
1390later.  OS X 10.4 "Tiger" is no longer supported.
1391
13925. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1393on ARM platforms rather than a lookup table.  This reduces the memory footprint
1394by 64k, which may be important for some mobile applications.  Out of four
1395Android devices that were tested, two demonstrated a small overall performance
1396loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
1397ARMv7 code when enabling this new feature, but the other two devices
1398demonstrated a significant overall performance gain with both ARMv6 and ARMv7
1399code (~10-20%) when enabling the feature.  Actual mileage may vary.
1400
14016. Worked around an issue with Visual C++ 2010 and later that caused incorrect
1402pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
1403if compiler optimization was enabled when libjpeg-turbo was built.  This caused
1404the regression tests to fail when doing a release build under Visual C++ 2010
1405and later.
1406
14077. Improved the accuracy and performance of the non-SIMD implementation of the
1408floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
1409The accuracy of this implementation now matches the accuracy of the SSE/SSE2
1410implementation.  Note, however, that the floating point DCT/IDCT algorithms are
1411mainly a legacy feature.  They generally do not produce significantly better
1412accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a
1413bit slower.
1414
14158. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
1416for decompressing JPEG images into RGB565 (16-bit) pixels.  If dithering is not
1417used, then this code path is SIMD-accelerated on ARM platforms.
1418
14199. Numerous obsolete features, such as support for non-ANSI compilers and
1420support for the MS-DOS memory model, were removed from the libjpeg code,
1421greatly improving its readability and making it easier to maintain and extend.
1422
142310. Fixed a segfault that occurred when calling `output_message()` with
1424`msg_code` set to `JMSG_COPYRIGHT`.
1425
142611. Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
1427characters to be passed on the command line, which was causing it to generate
1428incorrect JPEG files.
1429
143012. Fixed a bug in the build system that was causing the Windows version of
1431wrjpgcom to be built using the rdjpgcom source code.
1432
143313. Restored 12-bit-per-component JPEG support.  A 12-bit version of
1434libjpeg-turbo can now be built by passing an argument of `--with-12bit` to
1435configure (Unix) or `-DWITH_12BIT=1` to cmake (Windows.)  12-bit JPEG support
1436is included only for convenience.  Enabling this feature disables all of the
1437performance features in libjpeg-turbo, as well as arithmetic coding and the
1438TurboJPEG API.  The resulting library still contains the other libjpeg-turbo
1439features (such as the colorspace extensions), but in general, it performs no
1440faster than libjpeg v6b.
1441
144214. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
1443and IDCT algorithms (both are used during JPEG decompression.)  For unknown
1444reasons (probably related to clang), this code cannot currently be compiled for
1445iOS.
1446
144715. Fixed an extremely rare bug (CVE-2014-9092) that could cause the Huffman
1448encoder's local buffer to overrun when a very high-frequency MCU is compressed
1449using quality 100 and no subsampling, and when the JPEG output buffer is being
1450dynamically resized by the destination manager.  This issue was so rare that,
1451even with a test program specifically designed to make the bug occur (by
1452injecting random high-frequency YUV data into the compressor), it was
1453reproducible only once in about every 25 million iterations.
1454
145516. Fixed an oversight in the TurboJPEG C wrapper:  if any of the JPEG
1456compression functions was called repeatedly with the same
1457automatically-allocated destination buffer, then TurboJPEG would erroneously
1458assume that the `jpegSize` parameter was equal to the size of the buffer, when
1459in fact that parameter was probably equal to the size of the most recently
1460compressed JPEG image.  If the size of the previous JPEG image was not as large
1461as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
1462destination buffer.
1463
1464
14651.3.1
1466=====
1467
1468### Significant changes relative to 1.3.0:
1469
14701. On Un*x systems, `make install` now installs the libjpeg-turbo libraries
1471into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
1472and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
1473x86-64.  You can override this by overriding either the `prefix` or `libdir`
1474configure variables.
1475
14762. The Windows installer now places a copy of the TurboJPEG DLLs in the same
1477directory as the rest of the libjpeg-turbo binaries.  This was mainly done
1478to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
1479When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
1480access the c:\WINDOWS\system32 directory, which made it impossible for the
1481TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
1482
14833. Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
1484entropy coding (by passing arguments of `-progressive -arithmetic` to cjpeg or
1485jpegtran, for instance) would result in an error, `Requested feature was
1486omitted at compile time`.
1487
14884. Fixed a couple of issues (CVE-2013-6629 and CVE-2013-6630) whereby malformed
1489JPEG images would cause libjpeg-turbo to use uninitialized memory during
1490decompression.
1491
14925. Fixed an error (`Buffer passed to JPEG library is too small`) that occurred
1493when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
1494source image, and added a unit test to check for this error.
1495
14966. The Java classes should now build properly under Visual Studio 2010 and
1497later.
1498
14997. Fixed an issue that prevented SRPMs generated using the in-tree packaging
1500tools from being rebuilt on certain newer Linux distributions.
1501
15028. Numerous minor fixes to eliminate compilation and build/packaging system
1503warnings, fix cosmetic issues, improve documentation clarity, and other general
1504source cleanup.
1505
1506
15071.3.0
1508=====
1509
1510### Significant changes relative to 1.3 beta1:
1511
15121. `make test` now works properly on FreeBSD, and it no longer requires the
1513md5sum executable to be present on other Un*x platforms.
1514
15152. Overhauled the packaging system:
1516
1517     - To avoid conflict with vendor-supplied libjpeg-turbo packages, the
1518official 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
1521official Linux and Mac packages, to avoid conflict with vendor-supplied
1522packages and also to streamline the packaging system.
1523     - Release packages are now created with the directory structure defined
1524by 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
1526always located under the system default documentation directory on Un\*x and
1527Mac systems, and on Windows, the TurboJPEG DLL is always located in the Windows
1528system directory.
1529     - To avoid confusion, official libjpeg-turbo packages on Linux/Unix
1530platforms (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
1533Un*x systems were not properly linking with the shared libraries installed by
1534the same package.
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
1538same places that the installer does.
1539
15403. Fixed a Huffman encoder bug that prevented I/O suspension from working
1541properly.
1542
1543
15441.2.90 (1.3 beta1)
1545==================
1546
1547### Significant changes relative to 1.2.1:
1548
15491. Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
155011/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing.  Note that the IDCT will
1551not be SIMD-accelerated when using any of these new scaling factors.
1552
15532. The TurboJPEG dynamic library is now versioned.  It was not strictly
1554necessary to do so, because TurboJPEG uses versioned symbols, and if a function
1555changes in an ABI-incompatible way, that function is renamed and a legacy
1556function is provided to maintain backward compatibility.  However, certain
1557Linux distro maintainers have a policy against accepting any library that isn't
1558versioned.
1559
15603. Extended the TurboJPEG Java API so that it can be used to compress a JPEG
1561image from and decompress a JPEG image to an arbitrary position in a large
1562image buffer.
1563
15644. The `tjDecompressToYUV()` function now supports the `TJFLAG_FASTDCT` flag.
1565
15665. The 32-bit supplementary package for amd64 Debian systems now provides
1567symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
1568This allows those libraries to be used on MultiArch-compatible systems (such as
1569Ubuntu 11 and later) without setting the linker path.
1570
15716. The TurboJPEG Java wrapper should now find the JNI library on Mac systems
1572without having to pass `-Djava.library.path=/usr/lib` to java.
1573
15747. TJBench has been ported to Java to provide a convenient way of validating
1575the performance of the TurboJPEG Java API.  It can be run with
1576`java -cp turbojpeg.jar TJBench`.
1577
15788. cjpeg can now be used to generate JPEG files with the RGB colorspace
1579(feature ported from jpeg-8d.)
1580
15819. The width and height in the `-crop` argument passed to jpegtran can now be
1582suffixed with `f` to indicate that, when the upper left corner of the cropping
1583region is automatically moved to the nearest iMCU boundary, the bottom right
1584corner should be moved by the same amount.  In other words, this feature causes
1585jpegtran to strictly honor the specified width/height rather than the specified
1586bottom right corner (feature ported from jpeg-8d.)
1587
158810. JPEG files using the RGB colorspace can now be decompressed into grayscale
1589images (feature ported from jpeg-8d.)
1590
159111. Fixed a regression caused by 1.2.1[7] whereby the build would fail with
1592multiple "Mismatch in operand sizes" errors when attempting to build the x86
1593SIMD code with NASM 0.98.
1594
159512. The in-memory source/destination managers (`jpeg_mem_src()` and
1596`jpeg_mem_dest()`) are now included by default when building libjpeg-turbo with
1597libjpeg v6b or v7 emulation, so that programs can take advantage of these
1598functions without requiring the use of the backward-incompatible libjpeg v8
1599ABI.  The "age number" of the libjpeg-turbo library on Un*x systems has been
1600incremented by 1 to reflect this.  You can disable this feature with a
1601configure/CMake switch in order to retain strict API/ABI compatibility with the
1602libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.)  See
1603[README.md](README.md) for more details.
1604
160513. Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
1606libjpeg-turbo binary package for OS X, so that those libraries can be used to
1607build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
1608
1609
16101.2.1
1611=====
1612
1613### Significant changes relative to 1.2.0:
1614
16151. Creating or decoding a JPEG file that uses the RGB colorspace should now
1616properly work when the input or output colorspace is one of the libjpeg-turbo
1617colorspace extensions.
1618
16192. When libjpeg-turbo was built without SIMD support and merged (non-fancy)
1620upsampling was used along with an alpha-enabled colorspace during
1621decompression, the unused byte of the decompressed pixels was not being set to
16220xFF.  This has been fixed.  TJUnitTest has also been extended to test for the
1623correct behavior of the colorspace extensions when merged upsampling is used.
1624
16253. Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
1626upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
1627calling conventions.
1628
16294. Fixed a regression (CVE-2012-2806) caused by 1.2.0[6] whereby decompressing
1630corrupt JPEG images (specifically, images in which the component count was
1631erroneously set to a large value) would cause libjpeg-turbo to segfault.
1632
16335. Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
1634processors.  The `MASKMOVDQU` instruction, which was used by the libjpeg-turbo
1635SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
1636it is painfully slow on Bobcat processors in particular.  Eliminating the use
1637of this instruction improved performance by an order of magnitude on Bobcat
1638processors and by a small amount (typically 5%) on AMD desktop processors.
1639
16406. Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
1641platforms.  This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
1642platforms.
1643
16447. Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
1645running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
16464:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
1647upsampling would produce several incorrect columns of pixels at the right-hand
1648side of the output image if each row in the output image was not evenly
1649divisible by 16 bytes.
1650
16518. Fixed an issue whereby attempting to build the SIMD extensions with Xcode
16524.3 on OS X platforms would cause NASM to return numerous errors of the form
1653"'%define' expects a macro identifier".
1654
16559. Added flags to the TurboJPEG API that allow the caller to force the use of
1656either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
1657
1658
16591.2.0
1660=====
1661
1662### Significant changes relative to 1.2 beta1:
1663
16641. Fixed build issue with Yasm on Unix systems (the libjpeg-turbo build system
1665was not adding the current directory to the assembler include path, so Yasm
1666was not able to find jsimdcfg.inc.)
1667
16682. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
1669a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
1670This was more of an annoyance than an actual bug, since it did not cause any
1671actual run-time problems, but the issue showed up when running libjpeg-turbo in
1672valgrind.  See <http://crbug.com/72399> for more information.
1673
16743. Added a compile-time macro (`LIBJPEG_TURBO_VERSION`) that can be used to
1675check the version of libjpeg-turbo against which an application was compiled.
1676
16774. Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
1678and pixel formats (TurboJPEG API), which allow applications to specify that,
1679when decompressing to a 4-component RGB buffer, the unused byte should be set
1680to 0xFF so that it can be interpreted as an opaque alpha channel.
1681
16825. Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
1683because libjpeg-turbo's distributed version of jconfig.h contained an `INLINE`
1684macro, which conflicted with a similar macro in DevIL.  This macro is used only
1685internally when building libjpeg-turbo, so it was moved into config.h.
1686
16876. libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
1688K component is assigned a component ID of 1 instead of 4.  Although these files
1689are in violation of the spec, other JPEG implementations handle them
1690correctly.
1691
16927. Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
1693the official libjpeg-turbo binary package for OS X, so that those libraries can
1694be used to build both OS X and iOS applications.
1695
1696
16971.1.90 (1.2 beta1)
1698==================
1699
1700### Significant changes relative to 1.1.1:
1701
17021. Added a Java wrapper for the TurboJPEG API.  See [java/README](java/README)
1703for more details.
1704
17052. The TurboJPEG API can now be used to scale down images during
1706decompression.
1707
17083. Added SIMD routines for RGB-to-grayscale color conversion, which
1709significantly improves the performance of grayscale JPEG compression from an
1710RGB source image.
1711
17124. Improved the performance of the C color conversion routines, which are used
1713on platforms for which SIMD acceleration is not available.
1714
17155. Added a function to the TurboJPEG API that performs lossless transforms.
1716This function is implemented using the same back end as jpegtran, but it
1717performs transcoding entirely in memory and allows multiple transforms and/or
1718crop operations to be batched together, so the source coefficients only need to
1719be read once.  This is useful when generating image tiles from a single source
1720JPEG.
1721
17226. Added tests for the new TurboJPEG scaled decompression and lossless
1723transform features to tjbench (the TurboJPEG benchmark, formerly called
1724"jpgtest".)
1725
17267. Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
1727was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
1728transposed or rotated 90 degrees.
1729
17308. All legacy VirtualGL code has been re-factored, and this has allowed
1731libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
1732
17339. libjpeg-turbo can now be built with Yasm.
1734
173510. Added SIMD acceleration for ARM Linux and iOS platforms that support
1736NEON instructions.
1737
173811. Refactored the TurboJPEG C API and documented it using Doxygen.  The
1739TurboJPEG 1.2 API uses pixel formats to define the size and component order of
1740the uncompressed source/destination images, and it includes a more efficient
1741version of `TJBUFSIZE()` that computes a worst-case JPEG size based on the
1742level of chrominance subsampling.  The refactored implementation of the
1743TurboJPEG API now uses the libjpeg memory source and destination managers,
1744which allows the TurboJPEG compressor to grow the JPEG buffer as necessary.
1745
174612. Eliminated errors in the output of jpegtran on Windows that occurred when
1747the application was invoked using I/O redirection
1748(`jpegtran <input.jpg >output.jpg`.)
1749
175013. The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
1751support in libjpeg-turbo v1.1.0 introduced several new error constants in
1752jerror.h, and these were mistakenly enabled for all emulation modes, causing
1753the error enum in libjpeg-turbo to sometimes have different values than the
1754same enum in libjpeg.  This represents an ABI incompatibility, and it caused
1755problems with rare applications that took specific action based on a particular
1756error value.  The fix was to include the new error constants conditionally
1757based on whether libjpeg v7 or v8 emulation was enabled.
1758
175914. Fixed an issue whereby Windows applications that used libjpeg-turbo would
1760fail to compile if the Windows system headers were included before jpeglib.h.
1761This issue was caused by a conflict in the definition of the INT32 type.
1762
176315. Fixed 32-bit supplementary package for amd64 Debian systems, which was
1764broken by enhancements to the packaging system in 1.1.
1765
176616. When decompressing a JPEG image using an output colorspace of
1767`JCS_EXT_RGBX`, `JCS_EXT_BGRX`, `JCS_EXT_XBGR`, or `JCS_EXT_XRGB`,
1768libjpeg-turbo will now set the unused byte to 0xFF, which allows applications
1769to interpret that byte as an alpha channel (0xFF = opaque).
1770
1771
17721.1.1
1773=====
1774
1775### Significant changes relative to 1.1.0:
1776
17771. Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
1778by `tjEncodeYUV()`.
1779
17802. libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
1781markers found in the middle of the JPEG data stream during decompression.  It
1782will now hand off decoding of a particular block to the unaccelerated Huffman
1783decoder if an unexpected marker is found, so that the unaccelerated Huffman
1784decoder can generate an appropriate warning.
1785
17863. Older versions of MinGW64 prefixed symbol names with underscores by
1787default, which differed from the behavior of 64-bit Visual C++.  MinGW64 1.0
1788has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
1789this, the libjpeg-turbo SIMD function names are no longer prefixed with an
1790underscore when building with MinGW64.  This means that, when building
1791libjpeg-turbo with older versions of MinGW64, you will now have to add
1792`-fno-leading-underscore` to the `CFLAGS`.
1793
17944. Fixed a regression bug in the NSIS script that caused the Windows installer
1795build to fail when using the Visual Studio IDE.
1796
17975. 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
1799was enabled.  This specifically caused the jpegoptim program to fail if it was
1800linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
1801emulation.
1802
18036. Eliminated excessive I/O overhead that occurred when reading BMP files in
1804cjpeg.
1805
18067. Eliminated errors in the output of cjpeg on Windows that occurred when the
1807application was invoked using I/O redirection (`cjpeg <inputfile >output.jpg`.)
1808
1809
18101.1.0
1811=====
1812
1813### Significant changes relative to 1.1 beta1:
1814
18151. The algorithm used by the SIMD quantization function cannot produce correct
1816results when the JPEG quality is >= 98 and the fast integer forward DCT is
1817used.  Thus, the non-SIMD quantization function is now used for those cases,
1818and libjpeg-turbo should now produce identical output to libjpeg v6b in all
1819cases.
1820
18212. Despite the above, the fast integer forward DCT still degrades somewhat for
1822JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
1823use the accurate integer forward DCT when generating JPEG images of quality 96
1824or greater.  This reduces compression performance by as much as 15% for these
1825high-quality images but is necessary to ensure that the images are perceptually
1826lossless.  It also ensures that the library can avoid the performance pitfall
1827created by [1].
1828
18293. Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
1830
18314. Fixed visual artifacts in grayscale JPEG compression caused by a typo in
1832the RGB-to-luminance lookup tables.
1833
18345. The Windows distribution packages now include the libjpeg run-time programs
1835(cjpeg, etc.)
1836
18376. All packages now include jpgtest.
1838
18397. The TurboJPEG dynamic library now uses versioned symbols.
1840
18418. Added two new TurboJPEG API functions, `tjEncodeYUV()` and
1842`tjDecompressToYUV()`, to replace the somewhat hackish `TJ_YUV` flag.
1843
1844
18451.0.90 (1.1 beta1)
1846==================
1847
1848### Significant changes relative to 1.0.1:
1849
18501. 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
1852CamTrace SAS.
1853
18542. Created a new CMake-based build system for the Visual C++ and MinGW builds.
1855
18563. Grayscale bitmaps can now be compressed from/decompressed to using the
1857TurboJPEG API.
1858
18594. jpgtest can now be used to test decompression performance with existing
1860JPEG images.
1861
18625. 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
1865packages.
1866
18676. All symbols in the libjpeg-turbo dynamic library are now versioned, even
1868when the library is built with libjpeg v6b emulation.
1869
18707. Added arithmetic encoding and decoding support (can be disabled with
1871configure or CMake options)
1872
18738. Added a `TJ_YUV` flag to the TurboJPEG API, which causes both the compressor
1874and decompressor to output planar YUV images.
1875
18769. Added an extended version of `tjDecompressHeader()` to the TurboJPEG API,
1877which allows the caller to determine the type of subsampling used in a JPEG
1878image.
1879
188010. Added further protections against invalid Huffman codes.
1881
1882
18831.0.1
1884=====
1885
1886### Significant changes relative to 1.0.0:
1887
18881. The Huffman decoder will now handle erroneous Huffman codes (for instance,
1889from a corrupt JPEG image.)  Previously, these would cause libjpeg-turbo to
1890crash under certain circumstances.
1891
18922. Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
1893be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
1894
18953. The configure script will now automatically determine whether the
1896`INCOMPLETE_TYPES_BROKEN` macro should be defined.
1897
1898
18991.0.0
1900=====
1901
1902### Significant changes relative to 0.0.93:
1903
19041. 2983700: Further FreeBSD build tweaks (no longer necessary to specify
1905`--host` when configuring on a 64-bit system)
1906
19072. Created symlinks in the Unix/Linux packages so that the TurboJPEG
1908include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
1909static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
191064-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
1911
19123. The Unix/Linux distribution packages now include the libjpeg run-time
1913programs (cjpeg, etc.) and man pages.
1914
19154. Created a 32-bit supplementary package for amd64 Debian systems, which
1916contains just the 32-bit libjpeg-turbo libraries.
1917
19185. Moved the libraries from */lib32 to */lib in the i386 Debian package.
1919
19206. Include distribution package for Cygwin
1921
19227. No longer necessary to specify `--without-simd` on non-x86 architectures,
1923and unit tests now work on those architectures.
1924
1925
19260.0.93
1927======
1928
1929### Significant changes since 0.0.91:
1930
19311. 2982659: Fixed x86-64 build on FreeBSD systems
1932
19332. 2988188: Added support for Windows 64-bit systems
1934
1935
19360.0.91
1937======
1938
1939### Significant changes relative to 0.0.90:
1940
19411. Added documentation to .deb packages
1942
19432. 2968313: Fixed data corruption issues when decompressing large JPEG images
1944and/or using buffered I/O with the libjpeg-turbo decompressor
1945
1946
19470.0.90
1948======
1949
1950Initial release
1951