• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
12.1.1
2=====
3
4### Significant changes relative to 2.1.0
5
61. Fixed a regression introduced in 2.1.0 that caused build failures with
7non-GCC-compatible compilers for Un*x/Arm platforms.
8
92. Fixed a regression introduced by 2.1 beta1[13] that prevented the Arm 32-bit
10(AArch32) Neon SIMD extensions from building unless the C compiler flags
11included `-mfloat-abi=softfp` or `-mfloat-abi=hard`.
12
133. Fixed an issue in the AArch32 Neon SIMD Huffman encoder whereby reliance on
14undefined C compiler behavior led to crashes ("SIGBUS: illegal alignment") on
15Android systems when running AArch32/Thumb builds of libjpeg-turbo built with
16recent versions of Clang.
17
184. Added a command-line argument (`-copy icc`) to jpegtran that causes it to
19copy only the ICC profile markers from the source file and discard any other
20metadata.
21
225. libjpeg-turbo should now build and run on CHERI-enabled architectures, which
23use capability pointers that are larger than the size of `size_t`.
24
256. Fixed a regression introduced by 2.1 beta1[5] that caused a segfault in the
2664-bit SSE2 Huffman encoder when attempting to losslessly transform a
27specially-crafted malformed JPEG image.
28
29
302.1.0
31=====
32
33### Significant changes relative to 2.1 beta1
34
351. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
36decompress certain progressive JPEG images with one or more component planes of
37width 8 or less caused a buffer overrun.
38
392. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
40decompress a specially-crafted malformed progressive JPEG image caused the
41block smoothing algorithm to read from uninitialized memory.
42
433. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the
44encoders to generate incorrect results when using the Clang compiler with
45Visual Studio.
46
474. Fixed a floating point exception (CVE-2021-20205) that occurred when
48attempting to compress a specially-crafted malformed GIF image with a specified
49image width of 0 using cjpeg.
50
515. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
52generate a progressive JPEG image on an SSE2-capable CPU using a scan script
53containing one or more scans with lengths divisible by 32 and non-zero
54successive approximation low bit positions would, under certain circumstances,
55result in an error ("Missing Huffman code table entry") and an invalid JPEG
56image.
57
586. Introduced a new flag (`TJFLAG_LIMITSCANS` in the TurboJPEG C API and
59`TJ.FLAG_LIMIT_SCANS` in the TurboJPEG Java API) and a corresponding TJBench
60command-line argument (`-limitscans`) that causes the TurboJPEG decompression
61and transform functions/operations to return/throw an error if a progressive
62JPEG image contains an unreasonably large number of scans.  This allows
63applications that use the TurboJPEG API to guard against an exploit of the
64progressive JPEG format described in the report
65["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
66
677. The PPM reader now throws an error, rather than segfaulting (due to a buffer
68overrun) or generating incorrect pixels, if an application attempts to use the
69`tjLoadImage()` function to load a 16-bit binary PPM file (a binary PPM file
70with a maximum value greater than 255) into a grayscale image buffer or to load
71a 16-bit binary PGM file into an RGB image buffer.
72
738. Fixed an issue in the PPM reader that caused incorrect pixels to be
74generated when using the `tjLoadImage()` function to load a 16-bit binary PPM
75file into an extended RGB image buffer.
76
779. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by
78one of the TurboJPEG compression or transform functions and an error
79subsequently occurred during compression or transformation, the JPEG buffer
80pointer passed by the application was not updated when the function returned.
81
82
832.0.90 (2.1 beta1)
84==================
85
86### Significant changes relative to 2.0.6:
87
881. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now
89support the x32 ABI on Linux, which allows for using x86-64 instructions with
9032-bit pointers.  The x32 ABI is generally enabled by adding `-mx32` to the
91compiler flags.
92
93     Caveats:
94     - CMake 3.9.0 or later is required in order for the build system to
95automatically detect an x32 build.
96     - Java does not support the x32 ABI, and thus the TurboJPEG Java API will
97automatically be disabled with x32 builds.
98
992. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy
100chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion,
101and fast integer DCT/IDCT algorithms.  Relative to libjpeg-turbo 2.0.x, this
102speeds up:
103
104     - the compression of RGB source images into grayscale JPEG images by
105approximately 20%
106     - the decompression of 4:2:2 JPEG images by approximately 40-60% when
107using fancy upsampling
108     - the decompression of 4:2:2 and 4:2:0 JPEG images by approximately
10915-20% when using merged upsampling
110     - the compression of RGB source images by approximately 30-45% when using
111the fast integer DCT
112     - the decompression of JPEG images into RGB destination images by
113approximately 2x when using the fast integer IDCT
114
115    The overall decompression speedup for RGB images is now approximately
1162.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.)
117
1183. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer
119supported, and the libjpeg-turbo build system can no longer be used to package
120such builds.  32-bit iOS apps cannot run in iOS 11 and later, and the App Store
121no longer allows them.
122
1234. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported,
124and the libjpeg-turbo build system can no longer be used to package such
125builds.  32-bit Mac applications cannot run in macOS 10.15 "Catalina" and
126later, and the App Store no longer allows them.
127
1285. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been
129significantly optimized, resulting in a measured average overall compression
130speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel
131and AMD CPUs, as well as a measured average overall compression speedup of
1320-23% on platforms that do not have a SIMD-accelerated Huffman encoding
133implementation.
134
1356. The block smoothing algorithm that is applied by default when decompressing
136progressive Huffman-encoded JPEG images has been improved in the following
137ways:
138
139     - The algorithm is now more fault-tolerant.  Previously, if a particular
140scan was incomplete, then the smoothing parameters for the incomplete scan
141would be applied to the entire output image, including the parts of the image
142that were generated by the prior (complete) scan.  Visually, this had the
143effect of removing block smoothing from lower-frequency scans if they were
144followed by an incomplete higher-frequency scan.  libjpeg-turbo now applies
145block smoothing parameters to each iMCU row based on which scan generated the
146pixels in that row, rather than always using the block smoothing parameters for
147the most recent scan.
148     - When applying block smoothing to DC scans, a Gaussian-like kernel with a
1495x5 window is used to reduce the "blocky" appearance.
150
1517. Added SIMD acceleration for progressive Huffman encoding on Arm platforms.
152This speeds up the compression of full-color progressive JPEGs by about 30-40%
153on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs.
154
1558. Added configure-time and run-time auto-detection of Loongson MMI SIMD
156instructions, so that the Loongson MMI SIMD extensions can be included in any
157MIPS64 libjpeg-turbo build.
158
1599. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate
160methods by which applications can guard against the exploits of the JPEG format
161described in the report
162["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
163
164     - Both programs now accept a `-maxscans` argument, which can be used to
165limit the number of allowable scans in the input file.
166     - Both programs now accept a `-strict` argument, which can be used to
167treat all warnings as fatal.
168
16910. CMake package config files are now included for both the libjpeg and
170TurboJPEG API libraries.  This facilitates using libjpeg-turbo with CMake's
171`find_package()` function.  For example:
172
173        find_package(libjpeg-turbo CONFIG REQUIRED)
174
175        add_executable(libjpeg_program libjpeg_program.c)
176        target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg)
177
178        add_executable(libjpeg_program_static libjpeg_program.c)
179        target_link_libraries(libjpeg_program_static PUBLIC
180          libjpeg-turbo::jpeg-static)
181
182        add_executable(turbojpeg_program turbojpeg_program.c)
183        target_link_libraries(turbojpeg_program PUBLIC
184          libjpeg-turbo::turbojpeg)
185
186        add_executable(turbojpeg_program_static turbojpeg_program.c)
187        target_link_libraries(turbojpeg_program_static PUBLIC
188          libjpeg-turbo::turbojpeg-static)
189
19011. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now
191read/write both LZW-compressed and uncompressed GIF files (feature ported from
192jpeg-6a and jpeg-9d.)
193
19412. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and
195jpeg-9d, as well as the ability to expand the image size using the `-crop`
196option.  Refer to jpegtran.1 or usage.txt for more details.
197
19813. Added a complete intrinsics implementation of the Arm Neon SIMD extensions,
199thus providing SIMD acceleration on Arm platforms for all of the algorithms
200that are SIMD-accelerated on x86 platforms.  This new implementation is
201significantly faster in some cases than the old GAS implementation--
202depending on the algorithms used, the type of CPU core, and the compiler.  GCC,
203as of this writing, does not provide a full or optimal set of Neon intrinsics,
204so for performance reasons, the default when building libjpeg-turbo with GCC is
205to continue using the GAS implementation of the following algorithms:
206
207     - 32-bit RGB-to-YCbCr color conversion
208     - 32-bit fast and accurate inverse DCT
209     - 64-bit RGB-to-YCbCr and YCbCr-to-RGB color conversion
210     - 64-bit accurate forward and inverse DCT
211     - 64-bit Huffman encoding
212
213    A new CMake variable (`NEON_INTRINSICS`) can be used to override this
214default.
215
216    Since the new intrinsics implementation includes SIMD acceleration
217for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has
218been reverted.
219
22014. The Arm Neon SIMD extensions can now be built using Visual Studio.
221
22215. The build system can now be used to generate a universal x86-64 + Armv8
223libjpeg-turbo SDK package for both iOS and macOS.
224
225
2262.0.6
227=====
228
229### Significant changes relative to 2.0.5:
230
2311. Fixed "using JNI after critical get" errors that occurred on Android
232platforms when using any of the YUV encoding/compression/decompression/decoding
233methods in the TurboJPEG Java API.
234
2352. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`:
236
237     - Fixed segfaults or "Corrupt JPEG data: premature end of data segment"
238errors in `jpeg_skip_scanlines()` that occurred when decompressing 4:2:2 or
2394:2:0 JPEG images using merged (non-fancy) upsampling/color conversion (that
240is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.)  2.0.0[6] was a
241similar fix, but it did not cover all cases.
242     - `jpeg_skip_scanlines()` now throws an error if two-pass color
243quantization is enabled.  Two-pass color quantization never worked properly
244with `jpeg_skip_scanlines()`, and the issues could not readily be fixed.
245     - Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when
246skipping past the end of an image.
247
2483. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW
249toolchains targetting Arm64 (AArch64) Windows binaries.
250
2514. Fixed unexpected visual artifacts that occurred when using
252`jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC
253scan of a progressive JPEG image.
254
2555. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component
256JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8
257API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.)
258
259
2602.0.5
261=====
262
263### Significant changes relative to 2.0.4:
264
2651. Worked around issues in the MIPS DSPr2 SIMD extensions that caused failures
266in the libjpeg-turbo regression tests.  Specifically, the
267`jsimd_h2v1_downsample_dspr2()` and `jsimd_h2v2_downsample_dspr2()` functions
268in the MIPS DSPr2 SIMD extensions are now disabled until/unless they can be
269fixed, and other functions that are incompatible with big endian MIPS CPUs are
270disabled when building libjpeg-turbo for such CPUs.
271
2722. Fixed an oversight in the `TJCompressor.compress(int)` method in the
273TurboJPEG Java API that caused an error ("java.lang.IllegalStateException: No
274source image is associated with this instance") when attempting to use that
275method to compress a YUV image.
276
2773. Fixed an issue (CVE-2020-13790) in the PPM reader that caused a buffer
278overrun in cjpeg, TJBench, or the `tjLoadImage()` function if one of the values
279in a binary PPM/PGM input file exceeded the maximum value defined in the file's
280header and that maximum value was less than 255.  libjpeg-turbo 1.5.0 already
281included a similar fix for binary PPM/PGM files with maximum values greater
282than 255.
283
2844. The TurboJPEG API library's global error handler, which is used in functions
285such as `tjBufSize()` and `tjLoadImage()` that do not require a TurboJPEG
286instance handle, is now thread-safe on platforms that support thread-local
287storage.
288
289
2902.0.4
291=====
292
293### Significant changes relative to 2.0.3:
294
2951. Fixed a regression in the Windows packaging system (introduced by
2962.0 beta1[2]) whereby, if both the 64-bit libjpeg-turbo SDK for GCC and the
29764-bit libjpeg-turbo SDK for Visual C++ were installed on the same system, only
298one of them could be uninstalled.
299
3002. Fixed a signed integer overflow and subsequent segfault that occurred when
301attempting to decompress images with more than 715827882 pixels using the
30264-bit C version of TJBench.
303
3043. Fixed out-of-bounds write in `tjDecompressToYUV2()` and
305`tjDecompressToYUVPlanes()` (sometimes manifesting as a double free) that
306occurred when attempting to decompress grayscale JPEG images that were
307compressed with a sampling factor other than 1 (for instance, with
308`cjpeg -grayscale -sample 2x2`).
309
3104. Fixed a regression introduced by 2.0.2[5] that caused the TurboJPEG API to
311incorrectly identify some JPEG images with unusual sampling factors as 4:4:4
312JPEG images.  This was known to cause a buffer overflow when attempting to
313decompress some such images using `tjDecompressToYUV2()` or
314`tjDecompressToYUVPlanes()`.
315
3165. Fixed an issue, detected by ASan, whereby attempting to losslessly transform
317a specially-crafted malformed JPEG image containing an extremely-high-frequency
318coefficient block (junk image data that could never be generated by a
319legitimate JPEG compressor) could cause the Huffman encoder's local buffer to
320be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].)  Given that the buffer
321overrun was fully contained within the stack and did not cause a segfault or
322other user-visible errant behavior, and given that the lossless transformer
323(unlike the decompressor) is not generally exposed to arbitrary data exploits,
324this issue did not likely pose a security risk.
325
3266. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a
327separate read-only data section rather than in the text section, to support
328execute-only memory layouts.
329
330
3312.0.3
332=====
333
334### Significant changes relative to 2.0.2:
335
3361. Fixed "using JNI after critical get" errors that occurred on Android
337platforms when passing invalid arguments to certain methods in the TurboJPEG
338Java API.
339
3402. Fixed a regression in the SIMD feature detection code, introduced by
341the AVX2 SIMD extensions (2.0 beta1[1]), that was known to cause an illegal
342instruction exception, in rare cases, on CPUs that lack support for CPUID leaf
34307H (or on which the maximum CPUID leaf has been limited by way of a BIOS
344setting.)
345
3463. The 4:4:0 (h1v2) fancy (smooth) chroma upsampling algorithm in the
347decompressor now uses a similar bias pattern to that of the 4:2:2 (h2v1) fancy
348chroma upsampling algorithm, rounding up or down the upsampled result for
349alternate pixels rather than always rounding down.  This ensures that,
350regardless of whether a 4:2:2 JPEG image is rotated or transposed prior to
351decompression (in the frequency domain) or after decompression (in the spatial
352domain), the final image will be similar.
353
3544. Fixed an integer overflow and subsequent segfault that occurred when
355attempting to compress or decompress images with more than 1 billion pixels
356using the TurboJPEG API.
357
3585. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
359generate a progressive JPEG image on an SSE2-capable CPU using a scan script
360containing one or more scans with lengths divisible by 16 would result in an
361error ("Missing Huffman code table entry") and an invalid JPEG image.
362
3636. Fixed an issue whereby `tjDecodeYUV()` and `tjDecodeYUVPlanes()` would throw
364an error ("Invalid progressive parameters") or a warning ("Inconsistent
365progression sequence") if passed a TurboJPEG instance that was previously used
366to decompress a progressive JPEG image.
367
368
3692.0.2
370=====
371
372### Significant changes relative to 2.0.1:
373
3741. Fixed a regression introduced by 2.0.1[5] that prevented a runtime search
375path (rpath) from being embedded in the libjpeg-turbo shared libraries and
376executables for macOS and iOS.  This caused a fatal error of the form
377"dyld: Library not loaded" when attempting to use one of the executables,
378unless `DYLD_LIBRARY_PATH` was explicitly set to the location of the
379libjpeg-turbo shared libraries.
380
3812. Fixed an integer overflow and subsequent segfault (CVE-2018-20330) that
382occurred when attempting to load a BMP file with more than 1 billion pixels
383using the `tjLoadImage()` function.
384
3853. Fixed a buffer overrun (CVE-2018-19664) that occurred when attempting to
386decompress a specially-crafted malformed JPEG image to a 256-color BMP using
387djpeg.
388
3894. Fixed a floating point exception that occurred when attempting to
390decompress a specially-crafted malformed JPEG image with a specified image
391width or height of 0 using the C version of TJBench.
392
3935. The TurboJPEG API will now decompress 4:4:4 JPEG images with 2x1, 1x2, 3x1,
394or 1x3 luminance and chrominance sampling factors.  This is a non-standard way
395of specifying 1x subsampling (normally 4:4:4 JPEGs have 1x1 luminance and
396chrominance sampling factors), but the JPEG format and the libjpeg API both
397allow it.
398
3996. Fixed a regression introduced by 2.0 beta1[7] that caused djpeg to generate
400incorrect PPM images when used with the `-colors` option.
401
4027. Fixed an issue whereby a static build of libjpeg-turbo (a build in which
403`ENABLE_SHARED` is `0`) could not be installed using the Visual Studio IDE.
404
4058. Fixed a severe performance issue in the Loongson MMI SIMD extensions that
406occurred when compressing RGB images whose image rows were not 64-bit-aligned.
407
408
4092.0.1
410=====
411
412### Significant changes relative to 2.0.0:
413
4141. Fixed a regression introduced with the new CMake-based Un*x build system,
415whereby jconfig.h could cause compiler warnings of the form
416`"HAVE_*_H" redefined` if it was included by downstream Autotools-based
417projects that used `AC_CHECK_HEADERS()` to check for the existence of locale.h,
418stddef.h, or stdlib.h.
419
4202. The `jsimd_quantize_float_dspr2()` and `jsimd_convsamp_float_dspr2()`
421functions in the MIPS DSPr2 SIMD extensions are now disabled at compile time
422if the soft float ABI is enabled.  Those functions use instructions that are
423incompatible with the soft float ABI.
424
4253. Fixed a regression in the SIMD feature detection code, introduced by
426the AVX2 SIMD extensions (2.0 beta1[1]), that caused libjpeg-turbo to crash on
427Windows 7 if Service Pack 1 was not installed.
428
4294. Fixed out-of-bounds read in cjpeg that occurred when attempting to compress
430a specially-crafted malformed color-index (8-bit-per-sample) Targa file in
431which some of the samples (color indices) exceeded the bounds of the Targa
432file's color table.
433
4345. Fixed an issue whereby installing a fully static build of libjpeg-turbo
435(a build in which `CFLAGS` contains `-static` and `ENABLE_SHARED` is `0`) would
436fail with "No valid ELF RPATH or RUNPATH entry exists in the file."
437
438
4392.0.0
440=====
441
442### Significant changes relative to 2.0 beta1:
443
4441. The TurboJPEG API can now decompress CMYK JPEG images that have subsampled M
445and Y components (not to be confused with YCCK JPEG images, in which the C/M/Y
446components have been transformed into luma and chroma.)   Previously, an error
447was generated ("Could not determine subsampling type for JPEG image") when such
448an image was passed to `tjDecompressHeader3()`, `tjTransform()`,
449`tjDecompressToYUVPlanes()`, `tjDecompressToYUV2()`, or the equivalent Java
450methods.
451
4522. Fixed an issue (CVE-2018-11813) whereby a specially-crafted malformed input
453file (specifically, a file with a valid Targa header but incomplete pixel data)
454would cause cjpeg to generate a JPEG file that was potentially thousands of
455times larger than the input file.  The Targa reader in cjpeg was not properly
456detecting that the end of the input file had been reached prematurely, so after
457all valid pixels had been read from the input, the reader injected dummy pixels
458with values of 255 into the JPEG compressor until the number of pixels
459specified in the Targa header had been compressed.  The Targa reader in cjpeg
460now behaves like the PPM reader and aborts compression if the end of the input
461file is reached prematurely.  Because this issue only affected cjpeg and not
462the underlying library, and because it did not involve any out-of-bounds reads
463or other exploitable behaviors, it was not believed to represent a security
464threat.
465
4663. Fixed an issue whereby the `tjLoadImage()` and `tjSaveImage()` functions
467would produce a "Bogus message code" error message if the underlying bitmap and
468PPM readers/writers threw an error that was specific to the readers/writers
469(as opposed to a general libjpeg API error.)
470
4714. Fixed an issue (CVE-2018-1152) whereby a specially-crafted malformed BMP
472file, one in which the header specified an image width of 1073741824 pixels,
473would trigger a floating point exception (division by zero) in the
474`tjLoadImage()` function when attempting to load the BMP file into a
4754-component image buffer.
476
4775. Fixed an issue whereby certain combinations of calls to
478`jpeg_skip_scanlines()` and `jpeg_read_scanlines()` could trigger an infinite
479loop when decompressing progressive JPEG images that use vertical chroma
480subsampling (for instance, 4:2:0 or 4:4:0.)
481
4826. Fixed a segfault in `jpeg_skip_scanlines()` that occurred when decompressing
483a 4:2:2 or 4:2:0 JPEG image using the merged (non-fancy) upsampling algorithms
484(that is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.)
485
4867. The new CMake-based build system will now disable the MIPS DSPr2 SIMD
487extensions if it detects that the compiler does not support DSPr2 instructions.
488
4898. Fixed out-of-bounds read in cjpeg (CVE-2018-14498) that occurred when
490attempting to compress a specially-crafted malformed color-index
491(8-bit-per-sample) BMP file in which some of the samples (color indices)
492exceeded the bounds of the BMP file's color table.
493
4949. Fixed a signed integer overflow in the progressive Huffman decoder, detected
495by the Clang and GCC undefined behavior sanitizers, that could be triggered by
496attempting to decompress a specially-crafted malformed JPEG image.  This issue
497did not pose a security threat, but removing the warning made it easier to
498detect actual security issues, should they arise in the future.
499
500
5011.5.90 (2.0 beta1)
502==================
503
504### Significant changes relative to 1.5.3:
505
5061. Added AVX2 SIMD implementations of the colorspace conversion, chroma
507downsampling and upsampling, integer quantization and sample conversion, and
508accurate integer DCT/IDCT algorithms.  When using the accurate integer DCT/IDCT
509algorithms on AVX2-equipped CPUs, the compression of RGB images is
510approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
51164-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
512decompression of RGB images is approximately 9-35% (avg. 17%) faster with
51364-bit code and 7-17% (avg. 12%) faster with 32-bit code.  (As tested on a
5143 GHz Intel Core i7.  Actual mileage may vary.)
515
5162. Overhauled the build system to use CMake on all platforms, and removed the
517autotools-based build system.  This decision resulted from extensive
518discussions within the libjpeg-turbo community.  libjpeg-turbo traditionally
519used CMake only for Windows builds, but there was an increasing amount of
520demand to extend CMake support to other platforms.  However, because of the
521unique nature of our code base (the need to support different assemblers on
522each platform, the need for Java support, etc.), providing dual build systems
523as other OSS imaging libraries do (including libpng and libtiff) would have
524created a maintenance burden.  The use of CMake greatly simplifies some aspects
525of our build system, owing to CMake's built-in support for various assemblers,
526Java, and unit testing, as well as generally fewer quirks that have to be
527worked around in order to implement our packaging system.  Eliminating
528autotools puts our project slightly at odds with the traditional practices of
529the OSS community, since most "system libraries" tend to be built with
530autotools, but it is believed that the benefits of this move outweigh the
531risks.  In addition to providing a unified build environment, switching to
532CMake allows for the use of various build tools and IDEs that aren't supported
533under autotools, including XCode, Ninja, and Eclipse.  It also eliminates the
534need to install autotools via MacPorts/Homebrew on OS X and allows
535libjpeg-turbo to be configured without the use of a terminal/command prompt.
536Extensive testing was conducted to ensure that all features provided by the
537autotools-based build system are provided by the new build system.
538
5393. The libjpeg API in this version of libjpeg-turbo now includes two additional
540functions, `jpeg_read_icc_profile()` and `jpeg_write_icc_profile()`, that can
541be used to extract ICC profile data from a JPEG file while decompressing or to
542embed ICC profile data in a JPEG file while compressing or transforming.  This
543eliminates the need for downstream projects, such as color management libraries
544and browsers, to include their own glueware for accomplishing this.
545
5464. Improved error handling in the TurboJPEG API library:
547
548     - Introduced a new function (`tjGetErrorStr2()`) in the TurboJPEG C API
549that allows compression/decompression/transform error messages to be retrieved
550in a thread-safe manner.  Retrieving error messages from global functions, such
551as `tjInitCompress()` or `tjBufSize()`, is still thread-unsafe, but since those
552functions will only throw errors if passed an invalid argument or if a memory
553allocation failure occurs, thread safety is not as much of a concern.
554     - Introduced a new function (`tjGetErrorCode()`) in the TurboJPEG C API
555and a new method (`TJException.getErrorCode()`) in the TurboJPEG Java API that
556can be used to determine the severity of the last
557compression/decompression/transform error.  This allows applications to
558choose whether to ignore warnings (non-fatal errors) from the underlying
559libjpeg API or to treat them as fatal.
560     - Introduced a new flag (`TJFLAG_STOPONWARNING` in the TurboJPEG C API and
561`TJ.FLAG_STOPONWARNING` in the TurboJPEG Java API) that causes the library to
562immediately halt a compression/decompression/transform operation if it
563encounters a warning from the underlying libjpeg API (the default behavior is
564to allow the operation to complete unless a fatal error is encountered.)
565
5665. Introduced a new flag in the TurboJPEG C and Java APIs (`TJFLAG_PROGRESSIVE`
567and `TJ.FLAG_PROGRESSIVE`, respectively) that causes the library to use
568progressive entropy coding in JPEG images generated by compression and
569transform operations.  Additionally, a new transform option
570(`TJXOPT_PROGRESSIVE` in the C API and `TJTransform.OPT_PROGRESSIVE` in the
571Java API) has been introduced, allowing progressive entropy coding to be
572enabled for selected transforms in a multi-transform operation.
573
5746. Introduced a new transform option in the TurboJPEG API (`TJXOPT_COPYNONE` in
575the C API and `TJTransform.OPT_COPYNONE` in the Java API) that allows the
576copying of markers (including EXIF and ICC profile data) to be disabled for a
577particular transform.
578
5797. Added two functions to the TurboJPEG C API (`tjLoadImage()` and
580`tjSaveImage()`) that can be used to load/save a BMP or PPM/PGM image to/from a
581memory buffer with a specified pixel format and layout.  These functions
582replace the project-private (and slow) bmp API, which was previously used by
583TJBench, and they also provide a convenient way for first-time users of
584libjpeg-turbo to quickly develop a complete JPEG compression/decompression
585program.
586
5878. The TurboJPEG C API now includes a new convenience array (`tjAlphaOffset[]`)
588that contains the alpha component index for each pixel format (or -1 if the
589pixel format lacks an alpha component.)  The TurboJPEG Java API now includes a
590new method (`TJ.getAlphaOffset()`) that returns the same value.  In addition,
591the `tjRedOffset[]`, `tjGreenOffset[]`, and `tjBlueOffset[]` arrays-- and the
592corresponding `TJ.getRedOffset()`, `TJ.getGreenOffset()`, and
593`TJ.getBlueOffset()` methods-- now return -1 for `TJPF_GRAY`/`TJ.PF_GRAY`
594rather than 0.  This allows programs to easily determine whether a pixel format
595has red, green, blue, and alpha components.
596
5979. Added a new example (tjexample.c) that demonstrates the basic usage of the
598TurboJPEG C API.  This example mirrors the functionality of TJExample.java.
599Both files are now included in the libjpeg-turbo documentation.
600
60110. Fixed two signed integer overflows in the arithmetic decoder, detected by
602the Clang undefined behavior sanitizer, that could be triggered by attempting
603to decompress a specially-crafted malformed JPEG image.  These issues did not
604pose a security threat, but removing the warnings makes it easier to detect
605actual security issues, should they arise in the future.
606
60711. Fixed a bug in the merged 4:2:0 upsampling/dithered RGB565 color conversion
608algorithm that caused incorrect dithering in the output image.  This algorithm
609now produces bitwise-identical results to the unmerged algorithms.
610
61112. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
612libjpeg-turbo is built with YASM), and iOS/Arm[64] builds are now private.
613This prevents those symbols from being exposed in applications or shared
614libraries that link statically with libjpeg-turbo.
615
61613. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
617YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
618chroma upsampling, integer quantization, and accurate integer DCT/IDCT
619algorithms.  When using the accurate integer DCT/IDCT, this speeds up the
620compression of RGB images by approximately 70-100% and the decompression of RGB
621images by approximately 2-3.5x.
622
62314. Fixed a build error when building with older MinGW releases (regression
624caused by 1.5.1[7].)
625
62615. Added SIMD acceleration for progressive Huffman encoding on SSE2-capable
627x86 and x86-64 platforms.  This speeds up the compression of full-color
628progressive JPEGs by about 85-90% on average (relative to libjpeg-turbo 1.5.x)
629when using modern Intel and AMD CPUs.
630
631
6321.5.3
633=====
634
635### Significant changes relative to 1.5.2:
636
6371. Fixed a NullPointerException in the TurboJPEG Java wrapper that occurred
638when using the YUVImage constructor that creates an instance backed by separate
639image planes and allocates memory for the image planes.
640
6412. Fixed an issue whereby the Java version of TJUnitTest would fail when
642testing BufferedImage encoding/decoding on big endian systems.
643
6443. Fixed a segfault in djpeg that would occur if an output format other than
645PPM/PGM was selected along with the `-crop` option.  The `-crop` option now
646works with the GIF and Targa formats as well (unfortunately, it cannot be made
647to work with the BMP and RLE formats due to the fact that those output engines
648write scanlines in bottom-up order.)  djpeg will now exit gracefully if an
649output format other than PPM/PGM, GIF, or Targa is selected along with the
650`-crop` option.
651
6524. Fixed an issue (CVE-2017-15232) whereby `jpeg_skip_scanlines()` would
653segfault if color quantization was enabled.
654
6555. TJBench (both C and Java versions) will now display usage information if any
656command-line argument is unrecognized.  This prevents the program from silently
657ignoring typos.
658
6596. Fixed an access violation in tjbench.exe (Windows) that occurred when the
660program was used to decompress an existing JPEG image.
661
6627. Fixed an ArrayIndexOutOfBoundsException in the TJExample Java program that
663occurred when attempting to decompress a JPEG image that had been compressed
664with 4:1:1 chrominance subsampling.
665
6668. Fixed an issue whereby, when using `jpeg_skip_scanlines()` to skip to the
667end of a single-scan (non-progressive) image, subsequent calls to
668`jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
669`JPEG_REACHED_EOI`.
670
6719. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG
672images that were compressed with a sampling factor other than 1 (for instance,
673with `cjpeg -grayscale -sample 2x2`).
674
675
6761.5.2
677=====
678
679### Significant changes relative to 1.5.1:
680
6811. Fixed a regression introduced by 1.5.1[7] that prevented libjpeg-turbo from
682building with Android NDK platforms prior to android-21 (5.0).
683
6842. Fixed a regression introduced by 1.5.1[1] that prevented the MIPS DSPR2 SIMD
685code in libjpeg-turbo from building.
686
6873. Fixed a regression introduced by 1.5 beta1[11] that prevented the Java
688version of TJBench from outputting any reference images (the `-nowrite` switch
689was accidentally enabled by default.)
690
6914. libjpeg-turbo should now build and run with full AltiVec SIMD acceleration
692on PowerPC-based AmigaOS 4 and OpenBSD systems.
693
6945. Fixed build and runtime errors on Windows that occurred when building
695libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
696source/destination managers.  Due to an oversight, the `jpeg_skip_scanlines()`
697and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when
698libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
699
7006. Fixed "Bogus virtual array access" error that occurred when using the
701lossless crop feature in jpegtran or the TurboJPEG API, if libjpeg-turbo was
702built with libjpeg v7 API/ABI emulation.  This was apparently a long-standing
703bug that has existed since the introduction of libjpeg v7/v8 API/ABI emulation
704in libjpeg-turbo v1.1.
705
7067. The lossless transform features in jpegtran and the TurboJPEG API will now
707always attempt to adjust the EXIF image width and height tags if the image size
708changed as a result of the transform.  This behavior has always existed when
709using libjpeg v8 API/ABI emulation.  It was supposed to be available with
710libjpeg v7 API/ABI emulation as well but did not work properly due to a bug.
711Furthermore, there was never any good reason not to enable it with libjpeg v6b
712API/ABI emulation, since the behavior is entirely internal.  Note that
713`-copy all` must be passed to jpegtran in order to transfer the EXIF tags from
714the source image to the destination image.
715
7168. Fixed several memory leaks in the TurboJPEG API library that could occur
717if the library was built with certain compilers and optimization levels
718(known to occur with GCC 4.x and clang with `-O1` and higher but not with
719GCC 5.x or 6.x) and one of the underlying libjpeg API functions threw an error
720after a TurboJPEG API function allocated a local buffer.
721
7229. The libjpeg-turbo memory manager will now honor the `max_memory_to_use`
723structure member in jpeg\_memory\_mgr, which can be set to the maximum amount
724of memory (in bytes) that libjpeg-turbo should use during decompression or
725multi-pass (including progressive) compression.  This limit can also be set
726using the `JPEGMEM` environment variable or using the `-maxmemory` switch in
727cjpeg/djpeg/jpegtran (refer to the respective man pages for more details.)
728This has been a documented feature of libjpeg since v5, but the
729`malloc()`/`free()` implementation of the memory manager (jmemnobs.c) never
730implemented the feature.  Restricting libjpeg-turbo's memory usage is useful
731for two reasons:  it allows testers to more easily work around the 2 GB limit
732in libFuzzer, and it allows developers of security-sensitive applications to
733more easily defend against one of the progressive JPEG exploits (LJT-01-004)
734identified in
735[this report](http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
736
73710. TJBench will now run each benchmark for 1 second prior to starting the
738timer, in order to improve the consistency of the results.  Furthermore, the
739`-warmup` option is now used to specify the amount of warmup time rather than
740the number of warmup iterations.
741
74211. Fixed an error (`short jump is out of range`) that occurred when assembling
743the 32-bit x86 SIMD extensions with NASM versions prior to 2.04.  This was a
744regression introduced by 1.5 beta1[12].
745
746
7471.5.1
748=====
749
750### Significant changes relative to 1.5.0:
751
7521. Previously, the undocumented `JSIMD_FORCE*` environment variables could be
753used to force-enable a particular SIMD instruction set if multiple instruction
754sets were available on a particular platform.  On x86 platforms, where CPU
755feature detection is bulletproof and multiple SIMD instruction sets are
756available, it makes sense for those environment variables to allow forcing the
757use of an instruction set only if that instruction set is available.  However,
758since the ARM implementations of libjpeg-turbo can only use one SIMD
759instruction set, and since their feature detection code is less bulletproof
760(parsing /proc/cpuinfo), it makes sense for the `JSIMD_FORCENEON` environment
761variable to bypass the feature detection code and really force the use of NEON
762instructions.  A new environment variable (`JSIMD_FORCEDSPR2`) was introduced
763in the MIPS implementation for the same reasons, and the existing
764`JSIMD_FORCENONE` environment variable was extended to that implementation.
765These environment variables provide a workaround for those attempting to test
766ARM and MIPS builds of libjpeg-turbo in QEMU, which passes through
767/proc/cpuinfo from the host system.
768
7692. libjpeg-turbo previously assumed that AltiVec instructions were always
770available on PowerPC platforms, which led to "illegal instruction" errors when
771running on PowerPC chips that lack AltiVec support (such as the older 7xx/G3
772and newer e5500 series.)  libjpeg-turbo now examines /proc/cpuinfo on
773Linux/Android systems and enables AltiVec instructions only if the CPU supports
774them.  It also now provides two environment variables, `JSIMD_FORCEALTIVEC` and
775`JSIMD_FORCENONE`, to force-enable and force-disable AltiVec instructions in
776environments where /proc/cpuinfo is an unreliable means of CPU feature
777detection (such as when running in QEMU.)  On OS X, libjpeg-turbo continues to
778assume that AltiVec support is always available, which means that libjpeg-turbo
779cannot be used with G3 Macs unless you set the environment variable
780`JSIMD_FORCENONE` to `1`.
781
7823. Fixed an issue whereby 64-bit ARM (AArch64) builds of libjpeg-turbo would
783crash when built with recent releases of the Clang/LLVM compiler.  This was
784caused by an ABI conformance issue in some of libjpeg-turbo's 64-bit NEON SIMD
785routines.  Those routines were incorrectly using 64-bit instructions to
786transfer a 32-bit JDIMENSION argument, whereas the ABI allows the upper
787(unused) 32 bits of a 32-bit argument's register to be undefined.  The new
788Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
789structure members into a single 64-bit register, and this exposed the ABI
790conformance issue.
791
7924. Fancy upsampling is now supported when decompressing JPEG images that use
7934:4:0 (h1v2) chroma subsampling.  These images are generated when losslessly
794rotating or transposing JPEG images that use 4:2:2 (h2v1) chroma subsampling.
795The h1v2 fancy upsampling algorithm is not currently SIMD-accelerated.
796
7975. If merged upsampling isn't SIMD-accelerated but YCbCr-to-RGB conversion is,
798then libjpeg-turbo will now disable merged upsampling when decompressing YCbCr
799JPEG images into RGB or extended RGB output images.  This significantly speeds
800up the decompression of 4:2:0 and 4:2:2 JPEGs on ARM platforms if fancy
801upsampling is not used (for example, if the `-nosmooth` option to djpeg is
802specified.)
803
8046. The TurboJPEG API will now decompress 4:2:2 and 4:4:0 JPEG images with
8052x2 luminance sampling factors and 2x1 or 1x2 chrominance sampling factors.
806This is a non-standard way of specifying 2x subsampling (normally 4:2:2 JPEGs
807have 2x1 luminance and 1x1 chrominance sampling factors, and 4:4:0 JPEGs have
8081x2 luminance and 1x1 chrominance sampling factors), but the JPEG format and
809the libjpeg API both allow it.
810
8117. Fixed an unsigned integer overflow in the libjpeg memory manager, detected
812by the Clang undefined behavior sanitizer, that could be triggered by
813attempting to decompress a specially-crafted malformed JPEG image.  This issue
814affected only 32-bit code and did not pose a security threat, but removing the
815warning makes it easier to detect actual security issues, should they arise in
816the future.
817
8188. Fixed additional negative left shifts and other issues reported by the GCC
819and Clang undefined behavior sanitizers when attempting to decompress
820specially-crafted malformed JPEG images.  None of these issues posed a security
821threat, but removing the warnings makes it easier to detect actual security
822issues, should they arise in the future.
823
8249. Fixed an out-of-bounds array reference, introduced by 1.4.90[2] (partial
825image decompression) and detected by the Clang undefined behavior sanitizer,
826that could be triggered by a specially-crafted malformed JPEG image with more
827than four components.  Because the out-of-bounds reference was still within the
828same structure, it was not known to pose a security threat, but removing the
829warning makes it easier to detect actual security issues, should they arise in
830the future.
831
83210. Fixed another ABI conformance issue in the 64-bit ARM (AArch64) NEON SIMD
833code.  Some of the routines were incorrectly reading and storing data below the
834stack pointer, which caused segfaults in certain applications under specific
835circumstances.
836
837
8381.5.0
839=====
840
841### Significant changes relative to 1.5 beta1:
842
8431. Fixed an issue whereby a malformed motion-JPEG frame could cause the "fast
844path" of libjpeg-turbo's Huffman decoder to read from uninitialized memory.
845
8462. Added libjpeg-turbo version and build information to the global string table
847of the libjpeg and TurboJPEG API libraries.  This is a common practice in other
848infrastructure libraries, such as OpenSSL and libpng, because it makes it easy
849to examine an application binary and determine which version of the library the
850application was linked against.
851
8523. Fixed a couple of issues in the PPM reader that would cause buffer overruns
853in cjpeg if one of the values in a binary PPM/PGM input file exceeded the
854maximum value defined in the file's header and that maximum value was greater
855than 255.  libjpeg-turbo 1.4.2 already included a similar fix for ASCII PPM/PGM
856files.  Note that these issues were not security bugs, since they were confined
857to the cjpeg program and did not affect any of the libjpeg-turbo libraries.
858
8594. Fixed an issue whereby attempting to decompress a JPEG file with a corrupt
860header using the `tjDecompressToYUV2()` function would cause the function to
861abort without returning an error and, under certain circumstances, corrupt the
862stack.  This only occurred if `tjDecompressToYUV2()` was called prior to
863calling `tjDecompressHeader3()`, or if the return value from
864`tjDecompressHeader3()` was ignored (both cases represent incorrect usage of
865the TurboJPEG API.)
866
8675. Fixed an issue in the ARM 32-bit SIMD-accelerated Huffman encoder that
868prevented the code from assembling properly with clang.
869
8706. The `jpeg_stdio_src()`, `jpeg_mem_src()`, `jpeg_stdio_dest()`, and
871`jpeg_mem_dest()` functions in the libjpeg API will now throw an error if a
872source/destination manager has already been assigned to the compress or
873decompress object by a different function or by the calling program.  This
874prevents these functions from attempting to reuse a source/destination manager
875structure that was allocated elsewhere, because there is no way to ensure that
876it would be big enough to accommodate the new source/destination manager.
877
878
8791.4.90 (1.5 beta1)
880==================
881
882### Significant changes relative to 1.4.2:
883
8841. Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
885(128-bit SIMD) instructions.  Although the performance of libjpeg-turbo on
886PowerPC was already good, due to the increased number of registers available
887to the compiler vs. x86, it was still possible to speed up compression by about
8883-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
889use of AltiVec instructions.
890
8912. Added two new libjpeg API functions (`jpeg_skip_scanlines()` and
892`jpeg_crop_scanline()`) that can be used to partially decode a JPEG image.  See
893[libjpeg.txt](libjpeg.txt) for more details.
894
8953. The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
896implement the Closeable interface, so those classes can be used with a
897try-with-resources statement.
898
8994. The TurboJPEG Java classes now throw unchecked idiomatic exceptions
900(IllegalArgumentException, IllegalStateException) for unrecoverable errors
901caused by incorrect API usage, and those classes throw a new checked exception
902type (TJException) for errors that are passed through from the C library.
903
9045. Source buffers for the TurboJPEG C API functions, as well as the
905`jpeg_mem_src()` function in the libjpeg API, are now declared as const
906pointers.  This facilitates passing read-only buffers to those functions and
907ensures the caller that the source buffer will not be modified.  This should
908not create any backward API or ABI incompatibilities with prior libjpeg-turbo
909releases.
910
9116. The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
912FPUs.
913
9147. Fixed additional negative left shifts and other issues reported by the GCC
915and Clang undefined behavior sanitizers.  Most of these issues affected only
91632-bit code, and none of them was known to pose a security threat, but removing
917the warnings makes it easier to detect actual security issues, should they
918arise in the future.
919
9208. Removed the unnecessary `.arch` directive from the ARM64 NEON SIMD code.
921This directive was preventing the code from assembling using the clang
922integrated assembler.
923
9249. Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
925libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
926distributions.  This was due to the addition of a macro in jconfig.h that
927allows the Huffman codec to determine the word size at compile time.  Since
928that macro differs between 32-bit and 64-bit builds, this caused a conflict
929between the i386 and x86_64 RPMs (any differing files, other than executables,
930are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
931Since the macro is used only internally, it has been moved into jconfigint.h.
932
93310. The x86-64 SIMD code can now be disabled at run time by setting the
934`JSIMD_FORCENONE` environment variable to `1` (the other SIMD implementations
935already had this capability.)
936
93711. Added a new command-line argument to TJBench (`-nowrite`) that prevents the
938benchmark from outputting any images.  This removes any potential operating
939system overhead that might be caused by lazy writes to disk and thus improves
940the consistency of the performance measurements.
941
94212. Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and x86-64
943platforms.  This speeds up the compression of full-color JPEGs by about 10-15%
944on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and AMD
945CPUs.  Additionally, this works around an issue in the clang optimizer that
946prevents it (as of this writing) from achieving the same performance as GCC
947when compiling the C version of the Huffman encoder
948(<https://llvm.org/bugs/show_bug.cgi?id=16035>).  For the purposes of
949benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
950disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
951
95213. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
953compression algorithms (including the accurate integer forward DCT and h2v2 &
954h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON
955implementation.)  This speeds up the compression of full-color JPEGs by about
95675% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
957Cortex-A53 and Cortex-A57 cores.
958
95914. Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
960and 64-bit platforms.
961
962    For 32-bit code, this speeds up the compression of full-color JPEGs by
963about 30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by
964about 6-7% on average on a typical Android device (Nexus 5X, Cortex-A53 and
965Cortex-A57), relative to libjpeg-turbo 1.4.x.  Note that the larger speedup
966under iOS is due to the fact that iOS builds use LLVM, which does not optimize
967the C Huffman encoder as well as GCC does.
968
969    For 64-bit code, NEON-accelerated Huffman encoding speeds up the
970compression of full-color JPEGs by about 40% on average on a typical iOS device
971(iPhone 5S, Apple A7) and by about 7-8% on average on a typical Android device
972(Nexus 5X, Cortex-A53 and Cortex-A57), in addition to the speedup described in
973[13] above.
974
975    For the purposes of benchmarking or regression testing, SIMD-accelerated
976Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment
977variable to `1`.
978
97915. pkg-config (.pc) scripts are now included for both the libjpeg and
980TurboJPEG API libraries on Un*x systems.  Note that if a project's build system
981relies on these scripts, then it will not be possible to build that project
982with libjpeg or with a prior version of libjpeg-turbo.
983
98416. Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
985improve performance on CPUs with in-order pipelines.  This speeds up the
986decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
987processor and by about 15% on average on a Cortex-A53 core.
988
98917. Fixed an issue in the accelerated Huffman decoder that could have caused
990the decoder to read past the end of the input buffer when a malformed,
991specially-crafted JPEG image was being decompressed.  In prior versions of
992libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
993if there were > 128 bytes of data in the input buffer.  However, it is possible
994to construct a JPEG image in which a single Huffman block is over 430 bytes
995long, so this version of libjpeg-turbo activates the accelerated Huffman
996decoder only if there are > 512 bytes of data in the input buffer.
997
99818. Fixed a memory leak in tjunittest encountered when running the program
999with the `-yuv` option.
1000
1001
10021.4.2
1003=====
1004
1005### Significant changes relative to 1.4.1:
1006
10071. Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
1008negative width or height was used as an input image (Windows bitmaps can have
1009a negative height if they are stored in top-down order, but such files are
1010rare and not supported by libjpeg-turbo.)
1011
10122. Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
1013incorrectly encode certain JPEG images when quality=100 and the fast integer
1014forward DCT were used.  This was known to cause `make test` to fail when the
1015library was built with `-march=haswell` on x86 systems.
1016
10173. Fixed an issue whereby libjpeg-turbo would crash when built with the latest
1018& greatest development version of the Clang/LLVM compiler.  This was caused by
1019an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
1020routines.  Those routines were incorrectly using a 64-bit `mov` instruction to
1021transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
1022(unused) 32 bits of a 32-bit argument's register to be undefined.  The new
1023Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
1024structure members into a single 64-bit register, and this exposed the ABI
1025conformance issue.
1026
10274. Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
1028upsampling routine that caused a buffer overflow (and subsequent segfault) when
1029decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
1030pixels.  The "plain" upsampling routines are normally only used when
1031decompressing a non-YCbCr JPEG image, but they are also used when decompressing
1032a JPEG image whose scaled output height is 1.
1033
10345. Fixed various negative left shifts and other issues reported by the GCC and
1035Clang undefined behavior sanitizers.  None of these was known to pose a
1036security threat, but removing the warnings makes it easier to detect actual
1037security issues, should they arise in the future.
1038
1039
10401.4.1
1041=====
1042
1043### Significant changes relative to 1.4.0:
1044
10451. tjbench now properly handles CMYK/YCCK JPEG files.  Passing an argument of
1046`-cmyk` (instead of, for instance, `-rgb`) will cause tjbench to internally
1047convert the source bitmap to CMYK prior to compression, to generate YCCK JPEG
1048files, and to internally convert the decompressed CMYK pixels back to RGB after
1049decompression (the latter is done automatically if a CMYK or YCCK JPEG is
1050passed to tjbench as a source image.)  The CMYK<->RGB conversion operation is
1051not benchmarked.  NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
1052uses are suitable for testing only.  Proper conversion between CMYK and RGB
1053requires a color management system.
1054
10552. `make test` now performs additional bitwise regression tests using tjbench,
1056mainly for the purpose of testing compression from/decompression to a subregion
1057of a larger image buffer.
1058
10593. `make test` no longer tests the regression of the floating point DCT/IDCT
1060by default, since the results of those tests can vary if the algorithms in
1061question are not implemented using SIMD instructions on a particular platform.
1062See the comments in [Makefile.am](Makefile.am) for information on how to
1063re-enable the tests and to specify an expected result for them based on the
1064particulars of your platform.
1065
10664. The NULL color conversion routines have been significantly optimized,
1067which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
106864-bit code and 0-3% when using 32-bit code, and the decompression of those
1069images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
1070
10715. Fixed an "illegal instruction" error that occurred when djpeg from a
1072SIMD-enabled libjpeg-turbo MIPS build was executed with the `-nosmooth` option
1073on a MIPS machine that lacked DSPr2 support.  The MIPS SIMD routines for h2v1
1074and h2v2 merged upsampling were not properly checking for the existence of
1075DSPr2.
1076
10776. Performance has been improved significantly on 64-bit non-Linux and
1078non-Windows platforms (generally 10-20% faster compression and 5-10% faster
1079decompression.)  Due to an oversight, the 64-bit version of the accelerated
1080Huffman codec was not being compiled in when libjpeg-turbo was built on
1081platforms other than Windows or Linux.  Oops.
1082
10837. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
1084builds of libjpeg-turbo to incorrectly encode a few specific test images when
1085quality=98, an optimized Huffman table, and the accurate integer forward DCT
1086were used.
1087
10888. The Windows (CMake) build system now supports building only static or only
1089shared libraries.  This is accomplished by adding either `-DENABLE_STATIC=0` or
1090`-DENABLE_SHARED=0` to the CMake command line.
1091
10929. TurboJPEG API functions will now return an error code if a warning is
1093triggered in the underlying libjpeg API.  For instance, if a JPEG file is
1094corrupt, the TurboJPEG decompression functions will attempt to decompress
1095as much of the image as possible, but those functions will now return -1 to
1096indicate that the decompression was not entirely successful.
1097
109810. Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
1099buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
1100in which the right-most MCU was 5 or 6 pixels wide.
1101
1102
11031.4.0
1104=====
1105
1106### Significant changes relative to 1.4 beta1:
1107
11081. Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
1109because OS X does not provide the `le32toh()` and `htole32()` functions.)
1110
11112. The non-SIMD RGB565 color conversion code did not work correctly on big
1112endian machines.  This has been fixed.
1113
11143. Fixed an issue in `tjPlaneSizeYUV()` whereby it would erroneously return 1
1115instead of -1 if `componentID` was > 0 and `subsamp` was `TJSAMP_GRAY`.
1116
11173. Fixed an issue in `tjBufSizeYUV2()` whereby it would erroneously return 0
1118instead of -1 if `width` was < 1.
1119
11205. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1121on ARM64 platforms (see 1.4 beta1[5].)
1122
11236. The `close()` method in the TJCompressor and TJDecompressor Java classes is
1124now idempotent.  Previously, that method would call the native `tjDestroy()`
1125function even if the TurboJPEG instance had already been destroyed.  This
1126caused an exception to be thrown during finalization, if the `close()` method
1127had already been called.  The exception was caught, but it was still an
1128expensive operation.
1129
11307. The TurboJPEG API previously generated an error (`Could not determine
1131subsampling type for JPEG image`) when attempting to decompress grayscale JPEG
1132images that were compressed with a sampling factor other than 1 (for instance,
1133with `cjpeg -grayscale -sample 2x2`).  Subsampling technically has no meaning
1134with grayscale JPEGs, and thus the horizontal and vertical sampling factors
1135for such images are ignored by the decompressor.  However, the TurboJPEG API
1136was being too rigid and was expecting the sampling factors to be equal to 1
1137before it treated the image as a grayscale JPEG.
1138
11398. cjpeg, djpeg, and jpegtran now accept an argument of `-version`, which will
1140print the library version and exit.
1141
11429. Referring to 1.4 beta1[15], another extremely rare circumstance was
1143discovered under which the Huffman encoder's local buffer can be overrun
1144when a buffered destination manager is being used and an
1145extremely-high-frequency block (basically junk image data) is being encoded.
1146Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
1147to address the previous issue, the new issue caused even the larger buffer to
1148be overrun.  Further analysis reveals that, in the absolute worst case (such as
1149setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
1150order), the Huffman encoder can produce encoded blocks that approach double the
1151size of the unencoded blocks.  Thus, the Huffman local buffer was increased to
1152256 bytes, which should prevent any such issue from re-occurring in the future.
1153
115410. The new `tjPlaneSizeYUV()`, `tjPlaneWidth()`, and `tjPlaneHeight()`
1155functions were not actually usable on any platform except OS X and Windows,
1156because those functions were not included in the libturbojpeg mapfile.  This
1157has been fixed.
1158
115911. Restored the `JPP()`, `JMETHOD()`, and `FAR` macros in the libjpeg-turbo
1160header files.  The `JPP()` and `JMETHOD()` macros were originally implemented
1161in libjpeg as a way of supporting non-ANSI compilers that lacked support for
1162prototype parameters.  libjpeg-turbo has never supported such compilers, but
1163some software packages still use the macros to define their own prototypes.
1164Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
1165have far symbols, but some software packages still use the `FAR` macro.  A
1166pretty good argument can be made that this is a bad practice on the part of the
1167software in question, but since this affects more than one package, it's just
1168easier to fix it here.
1169
117012. Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
1171for iOS, and included an ARMv8 architecture in all of the binaries installed by
1172the "official" libjpeg-turbo SDK for OS X.
1173
1174
11751.3.90 (1.4 beta1)
1176==================
1177
1178### Significant changes relative to 1.3.1:
1179
11801. New features in the TurboJPEG API:
1181
1182     - YUV planar images can now be generated with an arbitrary line padding
1183(previously only 4-byte padding, which was compatible with X Video, was
1184supported.)
1185     - The decompress-to-YUV function has been extended to support image
1186scaling.
1187     - JPEG images can now be compressed from YUV planar source images.
1188     - YUV planar images can now be decoded into RGB or grayscale images.
1189     - 4:1:1 subsampling is now supported.  This is mainly included for
1190compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
1191significant advantages relative to 4:2:0.
1192     - CMYK images are now supported.  This feature allows CMYK source images
1193to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to
1194CMYK destination images.  Conversion between CMYK/YCCK and RGB or YUV images is
1195not supported.  Such conversion requires a color management system and is thus
1196out of scope for a codec library.
1197     - The handling of YUV images in the Java API has been significantly
1198refactored and should now be much more intuitive.
1199     - The Java API now supports encoding a YUV image from an arbitrary
1200position in a large image buffer.
1201     - All of the YUV functions now have a corresponding function that operates
1202on separate image planes instead of a unified image buffer.  This allows for
1203compressing/decoding from or decompressing/encoding to a subregion of a larger
1204YUV image.  It also allows for handling YUV formats that swap the order of the
1205U and V planes.
1206
12072. Added SIMD acceleration for DSPr2-capable MIPS platforms.  This speeds up
1208the compression of full-color JPEGs by 70-80% on such platforms and
1209decompression by 25-35%.
1210
12113. If an application attempts to decompress a Huffman-coded JPEG image whose
1212header does not contain Huffman tables, libjpeg-turbo will now insert the
1213default Huffman tables.  In order to save space, many motion JPEG video frames
1214are encoded without the default Huffman tables, so these frames can now be
1215successfully decompressed by libjpeg-turbo without additional work on the part
1216of the application.  An application can still override the Huffman tables, for
1217instance to re-use tables from a previous frame of the same video.
1218
12194. The Mac packaging system now uses pkgbuild and productbuild rather than
1220PackageMaker (which is obsolete and no longer supported.)  This means that
1221OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
1222although the packages produced can be installed on OS X 10.5 "Leopard" or
1223later.  OS X 10.4 "Tiger" is no longer supported.
1224
12255. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1226on ARM platforms rather than a lookup table.  This reduces the memory footprint
1227by 64k, which may be important for some mobile applications.  Out of four
1228Android devices that were tested, two demonstrated a small overall performance
1229loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
1230ARMv7 code when enabling this new feature, but the other two devices
1231demonstrated a significant overall performance gain with both ARMv6 and ARMv7
1232code (~10-20%) when enabling the feature.  Actual mileage may vary.
1233
12346. Worked around an issue with Visual C++ 2010 and later that caused incorrect
1235pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
1236if compiler optimization was enabled when libjpeg-turbo was built.  This caused
1237the regression tests to fail when doing a release build under Visual C++ 2010
1238and later.
1239
12407. Improved the accuracy and performance of the non-SIMD implementation of the
1241floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
1242The accuracy of this implementation now matches the accuracy of the SSE/SSE2
1243implementation.  Note, however, that the floating point DCT/IDCT algorithms are
1244mainly a legacy feature.  They generally do not produce significantly better
1245accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a
1246bit slower.
1247
12488. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
1249for decompressing JPEG images into RGB565 (16-bit) pixels.  If dithering is not
1250used, then this code path is SIMD-accelerated on ARM platforms.
1251
12529. Numerous obsolete features, such as support for non-ANSI compilers and
1253support for the MS-DOS memory model, were removed from the libjpeg code,
1254greatly improving its readability and making it easier to maintain and extend.
1255
125610. Fixed a segfault that occurred when calling `output_message()` with
1257`msg_code` set to `JMSG_COPYRIGHT`.
1258
125911. Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
1260characters to be passed on the command line, which was causing it to generate
1261incorrect JPEG files.
1262
126312. Fixed a bug in the build system that was causing the Windows version of
1264wrjpgcom to be built using the rdjpgcom source code.
1265
126613. Restored 12-bit-per-component JPEG support.  A 12-bit version of
1267libjpeg-turbo can now be built by passing an argument of `--with-12bit` to
1268configure (Unix) or `-DWITH_12BIT=1` to cmake (Windows.)  12-bit JPEG support
1269is included only for convenience.  Enabling this feature disables all of the
1270performance features in libjpeg-turbo, as well as arithmetic coding and the
1271TurboJPEG API.  The resulting library still contains the other libjpeg-turbo
1272features (such as the colorspace extensions), but in general, it performs no
1273faster than libjpeg v6b.
1274
127514. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
1276and IDCT algorithms (both are used during JPEG decompression.)  For unknown
1277reasons (probably related to clang), this code cannot currently be compiled for
1278iOS.
1279
128015. Fixed an extremely rare bug (CVE-2014-9092) that could cause the Huffman
1281encoder's local buffer to overrun when a very high-frequency MCU is compressed
1282using quality 100 and no subsampling, and when the JPEG output buffer is being
1283dynamically resized by the destination manager.  This issue was so rare that,
1284even with a test program specifically designed to make the bug occur (by
1285injecting random high-frequency YUV data into the compressor), it was
1286reproducible only once in about every 25 million iterations.
1287
128816. Fixed an oversight in the TurboJPEG C wrapper:  if any of the JPEG
1289compression functions was called repeatedly with the same
1290automatically-allocated destination buffer, then TurboJPEG would erroneously
1291assume that the `jpegSize` parameter was equal to the size of the buffer, when
1292in fact that parameter was probably equal to the size of the most recently
1293compressed JPEG image.  If the size of the previous JPEG image was not as large
1294as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
1295destination buffer.
1296
1297
12981.3.1
1299=====
1300
1301### Significant changes relative to 1.3.0:
1302
13031. On Un*x systems, `make install` now installs the libjpeg-turbo libraries
1304into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
1305and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
1306x86-64.  You can override this by overriding either the `prefix` or `libdir`
1307configure variables.
1308
13092. The Windows installer now places a copy of the TurboJPEG DLLs in the same
1310directory as the rest of the libjpeg-turbo binaries.  This was mainly done
1311to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
1312When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
1313access the c:\WINDOWS\system32 directory, which made it impossible for the
1314TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
1315
13163. Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
1317entropy coding (by passing arguments of `-progressive -arithmetic` to cjpeg or
1318jpegtran, for instance) would result in an error, `Requested feature was
1319omitted at compile time`.
1320
13214. Fixed a couple of issues (CVE-2013-6629 and CVE-2013-6630) whereby malformed
1322JPEG images would cause libjpeg-turbo to use uninitialized memory during
1323decompression.
1324
13255. Fixed an error (`Buffer passed to JPEG library is too small`) that occurred
1326when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
1327source image, and added a unit test to check for this error.
1328
13296. The Java classes should now build properly under Visual Studio 2010 and
1330later.
1331
13327. Fixed an issue that prevented SRPMs generated using the in-tree packaging
1333tools from being rebuilt on certain newer Linux distributions.
1334
13358. Numerous minor fixes to eliminate compilation and build/packaging system
1336warnings, fix cosmetic issues, improve documentation clarity, and other general
1337source cleanup.
1338
1339
13401.3.0
1341=====
1342
1343### Significant changes relative to 1.3 beta1:
1344
13451. `make test` now works properly on FreeBSD, and it no longer requires the
1346md5sum executable to be present on other Un*x platforms.
1347
13482. Overhauled the packaging system:
1349
1350     - To avoid conflict with vendor-supplied libjpeg-turbo packages, the
1351official RPMs and DEBs for libjpeg-turbo have been renamed to
1352"libjpeg-turbo-official".
1353     - The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the
1354official Linux and Mac packages, to avoid conflict with vendor-supplied
1355packages and also to streamline the packaging system.
1356     - Release packages are now created with the directory structure defined
1357by the configure variables `prefix`, `bindir`, `libdir`, etc. (Un\*x) or by the
1358`CMAKE_INSTALL_PREFIX` variable (Windows.)  The exception is that the docs are
1359always located under the system default documentation directory on Un\*x and
1360Mac systems, and on Windows, the TurboJPEG DLL is always located in the Windows
1361system directory.
1362     - To avoid confusion, official libjpeg-turbo packages on Linux/Unix
1363platforms (except for Mac) will always install the 32-bit libraries in
1364/opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64.
1365     - Fixed an issue whereby, in some cases, the libjpeg-turbo executables on
1366Un*x systems were not properly linking with the shared libraries installed by
1367the same package.
1368     - Fixed an issue whereby building the "installer" target on Windows when
1369`WITH_JAVA=1` would fail if the TurboJPEG JAR had not been previously built.
1370     - Building the "install" target on Windows now installs files into the
1371same places that the installer does.
1372
13733. Fixed a Huffman encoder bug that prevented I/O suspension from working
1374properly.
1375
1376
13771.2.90 (1.3 beta1)
1378==================
1379
1380### Significant changes relative to 1.2.1:
1381
13821. Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
138311/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing.  Note that the IDCT will
1384not be SIMD-accelerated when using any of these new scaling factors.
1385
13862. The TurboJPEG dynamic library is now versioned.  It was not strictly
1387necessary to do so, because TurboJPEG uses versioned symbols, and if a function
1388changes in an ABI-incompatible way, that function is renamed and a legacy
1389function is provided to maintain backward compatibility.  However, certain
1390Linux distro maintainers have a policy against accepting any library that isn't
1391versioned.
1392
13933. Extended the TurboJPEG Java API so that it can be used to compress a JPEG
1394image from and decompress a JPEG image to an arbitrary position in a large
1395image buffer.
1396
13974. The `tjDecompressToYUV()` function now supports the `TJFLAG_FASTDCT` flag.
1398
13995. The 32-bit supplementary package for amd64 Debian systems now provides
1400symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
1401This allows those libraries to be used on MultiArch-compatible systems (such as
1402Ubuntu 11 and later) without setting the linker path.
1403
14046. The TurboJPEG Java wrapper should now find the JNI library on Mac systems
1405without having to pass `-Djava.library.path=/usr/lib` to java.
1406
14077. TJBench has been ported to Java to provide a convenient way of validating
1408the performance of the TurboJPEG Java API.  It can be run with
1409`java -cp turbojpeg.jar TJBench`.
1410
14118. cjpeg can now be used to generate JPEG files with the RGB colorspace
1412(feature ported from jpeg-8d.)
1413
14149. The width and height in the `-crop` argument passed to jpegtran can now be
1415suffixed with `f` to indicate that, when the upper left corner of the cropping
1416region is automatically moved to the nearest iMCU boundary, the bottom right
1417corner should be moved by the same amount.  In other words, this feature causes
1418jpegtran to strictly honor the specified width/height rather than the specified
1419bottom right corner (feature ported from jpeg-8d.)
1420
142110. JPEG files using the RGB colorspace can now be decompressed into grayscale
1422images (feature ported from jpeg-8d.)
1423
142411. Fixed a regression caused by 1.2.1[7] whereby the build would fail with
1425multiple "Mismatch in operand sizes" errors when attempting to build the x86
1426SIMD code with NASM 0.98.
1427
142812. The in-memory source/destination managers (`jpeg_mem_src()` and
1429`jpeg_mem_dest()`) are now included by default when building libjpeg-turbo with
1430libjpeg v6b or v7 emulation, so that programs can take advantage of these
1431functions without requiring the use of the backward-incompatible libjpeg v8
1432ABI.  The "age number" of the libjpeg-turbo library on Un*x systems has been
1433incremented by 1 to reflect this.  You can disable this feature with a
1434configure/CMake switch in order to retain strict API/ABI compatibility with the
1435libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.)  See
1436[README.md](README.md) for more details.
1437
143813. Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
1439libjpeg-turbo binary package for OS X, so that those libraries can be used to
1440build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
1441
1442
14431.2.1
1444=====
1445
1446### Significant changes relative to 1.2.0:
1447
14481. Creating or decoding a JPEG file that uses the RGB colorspace should now
1449properly work when the input or output colorspace is one of the libjpeg-turbo
1450colorspace extensions.
1451
14522. When libjpeg-turbo was built without SIMD support and merged (non-fancy)
1453upsampling was used along with an alpha-enabled colorspace during
1454decompression, the unused byte of the decompressed pixels was not being set to
14550xFF.  This has been fixed.  TJUnitTest has also been extended to test for the
1456correct behavior of the colorspace extensions when merged upsampling is used.
1457
14583. Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
1459upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
1460calling conventions.
1461
14624. Fixed a regression (CVE-2012-2806) caused by 1.2.0[6] whereby decompressing
1463corrupt JPEG images (specifically, images in which the component count was
1464erroneously set to a large value) would cause libjpeg-turbo to segfault.
1465
14665. Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
1467processors.  The `MASKMOVDQU` instruction, which was used by the libjpeg-turbo
1468SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
1469it is painfully slow on Bobcat processors in particular.  Eliminating the use
1470of this instruction improved performance by an order of magnitude on Bobcat
1471processors and by a small amount (typically 5%) on AMD desktop processors.
1472
14736. Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
1474platforms.  This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
1475platforms.
1476
14777. Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
1478running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
14794:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
1480upsampling would produce several incorrect columns of pixels at the right-hand
1481side of the output image if each row in the output image was not evenly
1482divisible by 16 bytes.
1483
14848. Fixed an issue whereby attempting to build the SIMD extensions with Xcode
14854.3 on OS X platforms would cause NASM to return numerous errors of the form
1486"'%define' expects a macro identifier".
1487
14889. Added flags to the TurboJPEG API that allow the caller to force the use of
1489either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
1490
1491
14921.2.0
1493=====
1494
1495### Significant changes relative to 1.2 beta1:
1496
14971. Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
1498was not adding the current directory to the assembler include path, so YASM
1499was not able to find jsimdcfg.inc.)
1500
15012. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
1502a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
1503This was more of an annoyance than an actual bug, since it did not cause any
1504actual run-time problems, but the issue showed up when running libjpeg-turbo in
1505valgrind.  See <http://crbug.com/72399> for more information.
1506
15073. Added a compile-time macro (`LIBJPEG_TURBO_VERSION`) that can be used to
1508check the version of libjpeg-turbo against which an application was compiled.
1509
15104. Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
1511and pixel formats (TurboJPEG API), which allow applications to specify that,
1512when decompressing to a 4-component RGB buffer, the unused byte should be set
1513to 0xFF so that it can be interpreted as an opaque alpha channel.
1514
15155. Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
1516because libjpeg-turbo's distributed version of jconfig.h contained an `INLINE`
1517macro, which conflicted with a similar macro in DevIL.  This macro is used only
1518internally when building libjpeg-turbo, so it was moved into config.h.
1519
15206. libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
1521K component is assigned a component ID of 1 instead of 4.  Although these files
1522are in violation of the spec, other JPEG implementations handle them
1523correctly.
1524
15257. Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
1526the official libjpeg-turbo binary package for OS X, so that those libraries can
1527be used to build both OS X and iOS applications.
1528
1529
15301.1.90 (1.2 beta1)
1531==================
1532
1533### Significant changes relative to 1.1.1:
1534
15351. Added a Java wrapper for the TurboJPEG API.  See [java/README](java/README)
1536for more details.
1537
15382. The TurboJPEG API can now be used to scale down images during
1539decompression.
1540
15413. Added SIMD routines for RGB-to-grayscale color conversion, which
1542significantly improves the performance of grayscale JPEG compression from an
1543RGB source image.
1544
15454. Improved the performance of the C color conversion routines, which are used
1546on platforms for which SIMD acceleration is not available.
1547
15485. Added a function to the TurboJPEG API that performs lossless transforms.
1549This function is implemented using the same back end as jpegtran, but it
1550performs transcoding entirely in memory and allows multiple transforms and/or
1551crop operations to be batched together, so the source coefficients only need to
1552be read once.  This is useful when generating image tiles from a single source
1553JPEG.
1554
15556. Added tests for the new TurboJPEG scaled decompression and lossless
1556transform features to tjbench (the TurboJPEG benchmark, formerly called
1557"jpgtest".)
1558
15597. Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
1560was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
1561transposed or rotated 90 degrees.
1562
15638. All legacy VirtualGL code has been re-factored, and this has allowed
1564libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
1565
15669. libjpeg-turbo can now be built with YASM.
1567
156810. Added SIMD acceleration for ARM Linux and iOS platforms that support
1569NEON instructions.
1570
157111. Refactored the TurboJPEG C API and documented it using Doxygen.  The
1572TurboJPEG 1.2 API uses pixel formats to define the size and component order of
1573the uncompressed source/destination images, and it includes a more efficient
1574version of `TJBUFSIZE()` that computes a worst-case JPEG size based on the
1575level of chrominance subsampling.  The refactored implementation of the
1576TurboJPEG API now uses the libjpeg memory source and destination managers,
1577which allows the TurboJPEG compressor to grow the JPEG buffer as necessary.
1578
157912. Eliminated errors in the output of jpegtran on Windows that occurred when
1580the application was invoked using I/O redirection
1581(`jpegtran <input.jpg >output.jpg`.)
1582
158313. The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
1584support in libjpeg-turbo v1.1.0 introduced several new error constants in
1585jerror.h, and these were mistakenly enabled for all emulation modes, causing
1586the error enum in libjpeg-turbo to sometimes have different values than the
1587same enum in libjpeg.  This represents an ABI incompatibility, and it caused
1588problems with rare applications that took specific action based on a particular
1589error value.  The fix was to include the new error constants conditionally
1590based on whether libjpeg v7 or v8 emulation was enabled.
1591
159214. Fixed an issue whereby Windows applications that used libjpeg-turbo would
1593fail to compile if the Windows system headers were included before jpeglib.h.
1594This issue was caused by a conflict in the definition of the INT32 type.
1595
159615. Fixed 32-bit supplementary package for amd64 Debian systems, which was
1597broken by enhancements to the packaging system in 1.1.
1598
159916. When decompressing a JPEG image using an output colorspace of
1600`JCS_EXT_RGBX`, `JCS_EXT_BGRX`, `JCS_EXT_XBGR`, or `JCS_EXT_XRGB`,
1601libjpeg-turbo will now set the unused byte to 0xFF, which allows applications
1602to interpret that byte as an alpha channel (0xFF = opaque).
1603
1604
16051.1.1
1606=====
1607
1608### Significant changes relative to 1.1.0:
1609
16101. Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
1611by `tjEncodeYUV()`.
1612
16132. libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
1614markers found in the middle of the JPEG data stream during decompression.  It
1615will now hand off decoding of a particular block to the unaccelerated Huffman
1616decoder if an unexpected marker is found, so that the unaccelerated Huffman
1617decoder can generate an appropriate warning.
1618
16193. Older versions of MinGW64 prefixed symbol names with underscores by
1620default, which differed from the behavior of 64-bit Visual C++.  MinGW64 1.0
1621has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
1622this, the libjpeg-turbo SIMD function names are no longer prefixed with an
1623underscore when building with MinGW64.  This means that, when building
1624libjpeg-turbo with older versions of MinGW64, you will now have to add
1625`-fno-leading-underscore` to the `CFLAGS`.
1626
16274. Fixed a regression bug in the NSIS script that caused the Windows installer
1628build to fail when using the Visual Studio IDE.
1629
16305. Fixed a bug in `jpeg_read_coefficients()` whereby it would not initialize
1631`cinfo->image_width` and `cinfo->image_height` if libjpeg v7 or v8 emulation
1632was enabled.  This specifically caused the jpegoptim program to fail if it was
1633linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
1634emulation.
1635
16366. Eliminated excessive I/O overhead that occurred when reading BMP files in
1637cjpeg.
1638
16397. Eliminated errors in the output of cjpeg on Windows that occurred when the
1640application was invoked using I/O redirection (`cjpeg <inputfile >output.jpg`.)
1641
1642
16431.1.0
1644=====
1645
1646### Significant changes relative to 1.1 beta1:
1647
16481. The algorithm used by the SIMD quantization function cannot produce correct
1649results when the JPEG quality is >= 98 and the fast integer forward DCT is
1650used.  Thus, the non-SIMD quantization function is now used for those cases,
1651and libjpeg-turbo should now produce identical output to libjpeg v6b in all
1652cases.
1653
16542. Despite the above, the fast integer forward DCT still degrades somewhat for
1655JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
1656use the accurate integer forward DCT when generating JPEG images of quality 96
1657or greater.  This reduces compression performance by as much as 15% for these
1658high-quality images but is necessary to ensure that the images are perceptually
1659lossless.  It also ensures that the library can avoid the performance pitfall
1660created by [1].
1661
16623. Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
1663
16644. Fixed visual artifacts in grayscale JPEG compression caused by a typo in
1665the RGB-to-luminance lookup tables.
1666
16675. The Windows distribution packages now include the libjpeg run-time programs
1668(cjpeg, etc.)
1669
16706. All packages now include jpgtest.
1671
16727. The TurboJPEG dynamic library now uses versioned symbols.
1673
16748. Added two new TurboJPEG API functions, `tjEncodeYUV()` and
1675`tjDecompressToYUV()`, to replace the somewhat hackish `TJ_YUV` flag.
1676
1677
16781.0.90 (1.1 beta1)
1679==================
1680
1681### Significant changes relative to 1.0.1:
1682
16831. Added emulation of the libjpeg v7 and v8 APIs and ABIs.  See
1684[README.md](README.md) for more details.  This feature was sponsored by
1685CamTrace SAS.
1686
16872. Created a new CMake-based build system for the Visual C++ and MinGW builds.
1688
16893. Grayscale bitmaps can now be compressed from/decompressed to using the
1690TurboJPEG API.
1691
16924. jpgtest can now be used to test decompression performance with existing
1693JPEG images.
1694
16955. If the default install prefix (/opt/libjpeg-turbo) is used, then
1696`make install` now creates /opt/libjpeg-turbo/lib32 and
1697/opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
1698packages.
1699
17006. All symbols in the libjpeg-turbo dynamic library are now versioned, even
1701when the library is built with libjpeg v6b emulation.
1702
17037. Added arithmetic encoding and decoding support (can be disabled with
1704configure or CMake options)
1705
17068. Added a `TJ_YUV` flag to the TurboJPEG API, which causes both the compressor
1707and decompressor to output planar YUV images.
1708
17099. Added an extended version of `tjDecompressHeader()` to the TurboJPEG API,
1710which allows the caller to determine the type of subsampling used in a JPEG
1711image.
1712
171310. Added further protections against invalid Huffman codes.
1714
1715
17161.0.1
1717=====
1718
1719### Significant changes relative to 1.0.0:
1720
17211. The Huffman decoder will now handle erroneous Huffman codes (for instance,
1722from a corrupt JPEG image.)  Previously, these would cause libjpeg-turbo to
1723crash under certain circumstances.
1724
17252. Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
1726be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
1727
17283. The configure script will now automatically determine whether the
1729`INCOMPLETE_TYPES_BROKEN` macro should be defined.
1730
1731
17321.0.0
1733=====
1734
1735### Significant changes relative to 0.0.93:
1736
17371. 2983700: Further FreeBSD build tweaks (no longer necessary to specify
1738`--host` when configuring on a 64-bit system)
1739
17402. Created symlinks in the Unix/Linux packages so that the TurboJPEG
1741include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
1742static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
174364-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
1744
17453. The Unix/Linux distribution packages now include the libjpeg run-time
1746programs (cjpeg, etc.) and man pages.
1747
17484. Created a 32-bit supplementary package for amd64 Debian systems, which
1749contains just the 32-bit libjpeg-turbo libraries.
1750
17515. Moved the libraries from */lib32 to */lib in the i386 Debian package.
1752
17536. Include distribution package for Cygwin
1754
17557. No longer necessary to specify `--without-simd` on non-x86 architectures,
1756and unit tests now work on those architectures.
1757
1758
17590.0.93
1760======
1761
1762### Significant changes since 0.0.91:
1763
17641. 2982659: Fixed x86-64 build on FreeBSD systems
1765
17662. 2988188: Added support for Windows 64-bit systems
1767
1768
17690.0.91
1770======
1771
1772### Significant changes relative to 0.0.90:
1773
17741. Added documentation to .deb packages
1775
17762. 2968313: Fixed data corruption issues when decompressing large JPEG images
1777and/or using buffered I/O with the libjpeg-turbo decompressor
1778
1779
17800.0.90
1781======
1782
1783Initial release
1784