• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
12.1.0
2=====
3
4### Significant changes relative to 2.1 beta1
5
61. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
7decompress certain progressive JPEG images with one or more component planes of
8width 8 or less caused a buffer overrun.
9
102. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
11decompress a specially-crafted malformed progressive JPEG image caused the
12block smoothing algorithm to read from uninitialized memory.
13
143. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the
15encoders to generate incorrect results when using the Clang compiler with
16Visual Studio.
17
184. Fixed a floating point exception (CVE-2021-20205) that occurred when
19attempting to compress a specially-crafted malformed GIF image with a specified
20image width of 0 using cjpeg.
21
225. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
23generate a progressive JPEG image on an SSE2-capable CPU using a scan script
24containing one or more scans with lengths divisible by 32 and non-zero
25successive approximation low bit positions would, under certain circumstances,
26result in an error ("Missing Huffman code table entry") and an invalid JPEG
27image.
28
296. Introduced a new flag (`TJFLAG_LIMITSCANS` in the TurboJPEG C API and
30`TJ.FLAG_LIMIT_SCANS` in the TurboJPEG Java API) and a corresponding TJBench
31command-line argument (`-limitscans`) that causes the TurboJPEG decompression
32and transform functions/operations to return/throw an error if a progressive
33JPEG image contains an unreasonably large number of scans.  This allows
34applications that use the TurboJPEG API to guard against an exploit of the
35progressive JPEG format described in the report
36["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
37
387. The PPM reader now throws an error, rather than segfaulting (due to a buffer
39overrun) or generating incorrect pixels, if an application attempts to use the
40`tjLoadImage()` function to load a 16-bit binary PPM file (a binary PPM file
41with a maximum value greater than 255) into a grayscale image buffer or to load
42a 16-bit binary PGM file into an RGB image buffer.
43
448. Fixed an issue in the PPM reader that caused incorrect pixels to be
45generated when using the `tjLoadImage()` function to load a 16-bit binary PPM
46file into an extended RGB image buffer.
47
489. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by
49one of the TurboJPEG compression or transform functions and an error
50subsequently occurred during compression or transformation, the JPEG buffer
51pointer passed by the application was not updated when the function returned.
52
53
542.0.90 (2.1 beta1)
55==================
56
57### Significant changes relative to 2.0.6:
58
591. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now
60support the x32 ABI on Linux, which allows for using x86-64 instructions with
6132-bit pointers.  The x32 ABI is generally enabled by adding `-mx32` to the
62compiler flags.
63
64     Caveats:
65     - CMake 3.9.0 or later is required in order for the build system to
66automatically detect an x32 build.
67     - Java does not support the x32 ABI, and thus the TurboJPEG Java API will
68automatically be disabled with x32 builds.
69
702. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy
71chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion,
72and fast integer DCT/IDCT algorithms.  Relative to libjpeg-turbo 2.0.x, this
73speeds up:
74
75     - the compression of RGB source images into grayscale JPEG images by
76approximately 20%
77     - the decompression of 4:2:2 JPEG images by approximately 40-60% when
78using fancy upsampling
79     - the decompression of 4:2:2 and 4:2:0 JPEG images by approximately
8015-20% when using merged upsampling
81     - the compression of RGB source images by approximately 30-45% when using
82the fast integer DCT
83     - the decompression of JPEG images into RGB destination images by
84approximately 2x when using the fast integer IDCT
85
86    The overall decompression speedup for RGB images is now approximately
872.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.)
88
893. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer
90supported, and the libjpeg-turbo build system can no longer be used to package
91such builds.  32-bit iOS apps cannot run in iOS 11 and later, and the App Store
92no longer allows them.
93
944. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported,
95and the libjpeg-turbo build system can no longer be used to package such
96builds.  32-bit Mac applications cannot run in macOS 10.15 "Catalina" and
97later, and the App Store no longer allows them.
98
995. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been
100significantly optimized, resulting in a measured average overall compression
101speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel
102and AMD CPUs, as well as a measured average overall compression speedup of
1030-23% on platforms that do not have a SIMD-accelerated Huffman encoding
104implementation.
105
1066. The block smoothing algorithm that is applied by default when decompressing
107progressive Huffman-encoded JPEG images has been improved in the following
108ways:
109
110     - The algorithm is now more fault-tolerant.  Previously, if a particular
111scan was incomplete, then the smoothing parameters for the incomplete scan
112would be applied to the entire output image, including the parts of the image
113that were generated by the prior (complete) scan.  Visually, this had the
114effect of removing block smoothing from lower-frequency scans if they were
115followed by an incomplete higher-frequency scan.  libjpeg-turbo now applies
116block smoothing parameters to each iMCU row based on which scan generated the
117pixels in that row, rather than always using the block smoothing parameters for
118the most recent scan.
119     - When applying block smoothing to DC scans, a Gaussian-like kernel with a
1205x5 window is used to reduce the "blocky" appearance.
121
1227. Added SIMD acceleration for progressive Huffman encoding on Arm platforms.
123This speeds up the compression of full-color progressive JPEGs by about 30-40%
124on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs.
125
1268. Added configure-time and run-time auto-detection of Loongson MMI SIMD
127instructions, so that the Loongson MMI SIMD extensions can be included in any
128MIPS64 libjpeg-turbo build.
129
1309. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate
131methods by which applications can guard against the exploits of the JPEG format
132described in the report
133["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
134
135     - Both programs now accept a `-maxscans` argument, which can be used to
136limit the number of allowable scans in the input file.
137     - Both programs now accept a `-strict` argument, which can be used to
138treat all warnings as fatal.
139
14010. CMake package config files are now included for both the libjpeg and
141TurboJPEG API libraries.  This facilitates using libjpeg-turbo with CMake's
142`find_package()` function.  For example:
143
144        find_package(libjpeg-turbo CONFIG REQUIRED)
145
146        add_executable(libjpeg_program libjpeg_program.c)
147        target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg)
148
149        add_executable(libjpeg_program_static libjpeg_program.c)
150        target_link_libraries(libjpeg_program_static PUBLIC
151          libjpeg-turbo::jpeg-static)
152
153        add_executable(turbojpeg_program turbojpeg_program.c)
154        target_link_libraries(turbojpeg_program PUBLIC
155          libjpeg-turbo::turbojpeg)
156
157        add_executable(turbojpeg_program_static turbojpeg_program.c)
158        target_link_libraries(turbojpeg_program_static PUBLIC
159          libjpeg-turbo::turbojpeg-static)
160
16111. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now
162read/write both LZW-compressed and uncompressed GIF files (feature ported from
163jpeg-6a and jpeg-9d.)
164
16512. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and
166jpeg-9d, as well as the ability to expand the image size using the `-crop`
167option.  Refer to jpegtran.1 or usage.txt for more details.
168
16913. Added a complete intrinsics implementation of the Arm Neon SIMD extensions,
170thus providing SIMD acceleration on Arm platforms for all of the algorithms
171that are SIMD-accelerated on x86 platforms.  This new implementation is
172significantly faster in some cases than the old GAS implementation--
173depending on the algorithms used, the type of CPU core, and the compiler.  GCC,
174as of this writing, does not provide a full or optimal set of Neon intrinsics,
175so for performance reasons, the default when building libjpeg-turbo with GCC is
176to continue using the GAS implementation of the following algorithms:
177
178     - 32-bit RGB-to-YCbCr color conversion
179     - 32-bit fast and accurate inverse DCT
180     - 64-bit RGB-to-YCbCr and YCbCr-to-RGB color conversion
181     - 64-bit accurate forward and inverse DCT
182     - 64-bit Huffman encoding
183
184    A new CMake variable (`NEON_INTRINSICS`) can be used to override this
185default.
186
187    Since the new intrinsics implementation includes SIMD acceleration
188for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has
189been reverted.
190
19114. The Arm Neon SIMD extensions can now be built using Visual Studio.
192
19315. The build system can now be used to generate a universal x86-64 + Armv8
194libjpeg-turbo SDK package for both iOS and macOS.
195
196
1972.0.6
198=====
199
200### Significant changes relative to 2.0.5:
201
2021. Fixed "using JNI after critical get" errors that occurred on Android
203platforms when using any of the YUV encoding/compression/decompression/decoding
204methods in the TurboJPEG Java API.
205
2062. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`:
207
208     - Fixed segfaults or "Corrupt JPEG data: premature end of data segment"
209errors in `jpeg_skip_scanlines()` that occurred when decompressing 4:2:2 or
2104:2:0 JPEG images using merged (non-fancy) upsampling/color conversion (that
211is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.)  2.0.0[6] was a
212similar fix, but it did not cover all cases.
213     - `jpeg_skip_scanlines()` now throws an error if two-pass color
214quantization is enabled.  Two-pass color quantization never worked properly
215with `jpeg_skip_scanlines()`, and the issues could not readily be fixed.
216     - Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when
217skipping past the end of an image.
218
2193. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW
220toolchains targetting Arm64 (AArch64) Windows binaries.
221
2224. Fixed unexpected visual artifacts that occurred when using
223`jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC
224scan of a progressive JPEG image.
225
2265. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component
227JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8
228API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.)
229
230
2312.0.5
232=====
233
234### Significant changes relative to 2.0.4:
235
2361. Worked around issues in the MIPS DSPr2 SIMD extensions that caused failures
237in the libjpeg-turbo regression tests.  Specifically, the
238`jsimd_h2v1_downsample_dspr2()` and `jsimd_h2v2_downsample_dspr2()` functions
239in the MIPS DSPr2 SIMD extensions are now disabled until/unless they can be
240fixed, and other functions that are incompatible with big endian MIPS CPUs are
241disabled when building libjpeg-turbo for such CPUs.
242
2432. Fixed an oversight in the `TJCompressor.compress(int)` method in the
244TurboJPEG Java API that caused an error ("java.lang.IllegalStateException: No
245source image is associated with this instance") when attempting to use that
246method to compress a YUV image.
247
2483. Fixed an issue (CVE-2020-13790) in the PPM reader that caused a buffer
249overrun in cjpeg, TJBench, or the `tjLoadImage()` function if one of the values
250in a binary PPM/PGM input file exceeded the maximum value defined in the file's
251header and that maximum value was less than 255.  libjpeg-turbo 1.5.0 already
252included a similar fix for binary PPM/PGM files with maximum values greater
253than 255.
254
2554. The TurboJPEG API library's global error handler, which is used in functions
256such as `tjBufSize()` and `tjLoadImage()` that do not require a TurboJPEG
257instance handle, is now thread-safe on platforms that support thread-local
258storage.
259
260
2612.0.4
262=====
263
264### Significant changes relative to 2.0.3:
265
2661. Fixed a regression in the Windows packaging system (introduced by
2672.0 beta1[2]) whereby, if both the 64-bit libjpeg-turbo SDK for GCC and the
26864-bit libjpeg-turbo SDK for Visual C++ were installed on the same system, only
269one of them could be uninstalled.
270
2712. Fixed a signed integer overflow and subsequent segfault that occurred when
272attempting to decompress images with more than 715827882 pixels using the
27364-bit C version of TJBench.
274
2753. Fixed out-of-bounds write in `tjDecompressToYUV2()` and
276`tjDecompressToYUVPlanes()` (sometimes manifesting as a double free) that
277occurred when attempting to decompress grayscale JPEG images that were
278compressed with a sampling factor other than 1 (for instance, with
279`cjpeg -grayscale -sample 2x2`).
280
2814. Fixed a regression introduced by 2.0.2[5] that caused the TurboJPEG API to
282incorrectly identify some JPEG images with unusual sampling factors as 4:4:4
283JPEG images.  This was known to cause a buffer overflow when attempting to
284decompress some such images using `tjDecompressToYUV2()` or
285`tjDecompressToYUVPlanes()`.
286
2875. Fixed an issue, detected by ASan, whereby attempting to losslessly transform
288a specially-crafted malformed JPEG image containing an extremely-high-frequency
289coefficient block (junk image data that could never be generated by a
290legitimate JPEG compressor) could cause the Huffman encoder's local buffer to
291be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].)  Given that the buffer
292overrun was fully contained within the stack and did not cause a segfault or
293other user-visible errant behavior, and given that the lossless transformer
294(unlike the decompressor) is not generally exposed to arbitrary data exploits,
295this issue did not likely pose a security risk.
296
2976. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a
298separate read-only data section rather than in the text section, to support
299execute-only memory layouts.
300
301
3022.0.3
303=====
304
305### Significant changes relative to 2.0.2:
306
3071. Fixed "using JNI after critical get" errors that occurred on Android
308platforms when passing invalid arguments to certain methods in the TurboJPEG
309Java API.
310
3112. Fixed a regression in the SIMD feature detection code, introduced by
312the AVX2 SIMD extensions (2.0 beta1[1]), that was known to cause an illegal
313instruction exception, in rare cases, on CPUs that lack support for CPUID leaf
31407H (or on which the maximum CPUID leaf has been limited by way of a BIOS
315setting.)
316
3173. The 4:4:0 (h1v2) fancy (smooth) chroma upsampling algorithm in the
318decompressor now uses a similar bias pattern to that of the 4:2:2 (h2v1) fancy
319chroma upsampling algorithm, rounding up or down the upsampled result for
320alternate pixels rather than always rounding down.  This ensures that,
321regardless of whether a 4:2:2 JPEG image is rotated or transposed prior to
322decompression (in the frequency domain) or after decompression (in the spatial
323domain), the final image will be similar.
324
3254. Fixed an integer overflow and subsequent segfault that occurred when
326attempting to compress or decompress images with more than 1 billion pixels
327using the TurboJPEG API.
328
3295. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
330generate a progressive JPEG image on an SSE2-capable CPU using a scan script
331containing one or more scans with lengths divisible by 16 would result in an
332error ("Missing Huffman code table entry") and an invalid JPEG image.
333
3346. Fixed an issue whereby `tjDecodeYUV()` and `tjDecodeYUVPlanes()` would throw
335an error ("Invalid progressive parameters") or a warning ("Inconsistent
336progression sequence") if passed a TurboJPEG instance that was previously used
337to decompress a progressive JPEG image.
338
339
3402.0.2
341=====
342
343### Significant changes relative to 2.0.1:
344
3451. Fixed a regression introduced by 2.0.1[5] that prevented a runtime search
346path (rpath) from being embedded in the libjpeg-turbo shared libraries and
347executables for macOS and iOS.  This caused a fatal error of the form
348"dyld: Library not loaded" when attempting to use one of the executables,
349unless `DYLD_LIBRARY_PATH` was explicitly set to the location of the
350libjpeg-turbo shared libraries.
351
3522. Fixed an integer overflow and subsequent segfault (CVE-2018-20330) that
353occurred when attempting to load a BMP file with more than 1 billion pixels
354using the `tjLoadImage()` function.
355
3563. Fixed a buffer overrun (CVE-2018-19664) that occurred when attempting to
357decompress a specially-crafted malformed JPEG image to a 256-color BMP using
358djpeg.
359
3604. Fixed a floating point exception that occurred when attempting to
361decompress a specially-crafted malformed JPEG image with a specified image
362width or height of 0 using the C version of TJBench.
363
3645. The TurboJPEG API will now decompress 4:4:4 JPEG images with 2x1, 1x2, 3x1,
365or 1x3 luminance and chrominance sampling factors.  This is a non-standard way
366of specifying 1x subsampling (normally 4:4:4 JPEGs have 1x1 luminance and
367chrominance sampling factors), but the JPEG format and the libjpeg API both
368allow it.
369
3706. Fixed a regression introduced by 2.0 beta1[7] that caused djpeg to generate
371incorrect PPM images when used with the `-colors` option.
372
3737. Fixed an issue whereby a static build of libjpeg-turbo (a build in which
374`ENABLE_SHARED` is `0`) could not be installed using the Visual Studio IDE.
375
3768. Fixed a severe performance issue in the Loongson MMI SIMD extensions that
377occurred when compressing RGB images whose image rows were not 64-bit-aligned.
378
379
3802.0.1
381=====
382
383### Significant changes relative to 2.0.0:
384
3851. Fixed a regression introduced with the new CMake-based Un*x build system,
386whereby jconfig.h could cause compiler warnings of the form
387`"HAVE_*_H" redefined` if it was included by downstream Autotools-based
388projects that used `AC_CHECK_HEADERS()` to check for the existence of locale.h,
389stddef.h, or stdlib.h.
390
3912. The `jsimd_quantize_float_dspr2()` and `jsimd_convsamp_float_dspr2()`
392functions in the MIPS DSPr2 SIMD extensions are now disabled at compile time
393if the soft float ABI is enabled.  Those functions use instructions that are
394incompatible with the soft float ABI.
395
3963. Fixed a regression in the SIMD feature detection code, introduced by
397the AVX2 SIMD extensions (2.0 beta1[1]), that caused libjpeg-turbo to crash on
398Windows 7 if Service Pack 1 was not installed.
399
4004. Fixed out-of-bounds read in cjpeg that occurred when attempting to compress
401a specially-crafted malformed color-index (8-bit-per-sample) Targa file in
402which some of the samples (color indices) exceeded the bounds of the Targa
403file's color table.
404
4055. Fixed an issue whereby installing a fully static build of libjpeg-turbo
406(a build in which `CFLAGS` contains `-static` and `ENABLE_SHARED` is `0`) would
407fail with "No valid ELF RPATH or RUNPATH entry exists in the file."
408
409
4102.0.0
411=====
412
413### Significant changes relative to 2.0 beta1:
414
4151. The TurboJPEG API can now decompress CMYK JPEG images that have subsampled M
416and Y components (not to be confused with YCCK JPEG images, in which the C/M/Y
417components have been transformed into luma and chroma.)   Previously, an error
418was generated ("Could not determine subsampling type for JPEG image") when such
419an image was passed to `tjDecompressHeader3()`, `tjTransform()`,
420`tjDecompressToYUVPlanes()`, `tjDecompressToYUV2()`, or the equivalent Java
421methods.
422
4232. Fixed an issue (CVE-2018-11813) whereby a specially-crafted malformed input
424file (specifically, a file with a valid Targa header but incomplete pixel data)
425would cause cjpeg to generate a JPEG file that was potentially thousands of
426times larger than the input file.  The Targa reader in cjpeg was not properly
427detecting that the end of the input file had been reached prematurely, so after
428all valid pixels had been read from the input, the reader injected dummy pixels
429with values of 255 into the JPEG compressor until the number of pixels
430specified in the Targa header had been compressed.  The Targa reader in cjpeg
431now behaves like the PPM reader and aborts compression if the end of the input
432file is reached prematurely.  Because this issue only affected cjpeg and not
433the underlying library, and because it did not involve any out-of-bounds reads
434or other exploitable behaviors, it was not believed to represent a security
435threat.
436
4373. Fixed an issue whereby the `tjLoadImage()` and `tjSaveImage()` functions
438would produce a "Bogus message code" error message if the underlying bitmap and
439PPM readers/writers threw an error that was specific to the readers/writers
440(as opposed to a general libjpeg API error.)
441
4424. Fixed an issue (CVE-2018-1152) whereby a specially-crafted malformed BMP
443file, one in which the header specified an image width of 1073741824 pixels,
444would trigger a floating point exception (division by zero) in the
445`tjLoadImage()` function when attempting to load the BMP file into a
4464-component image buffer.
447
4485. Fixed an issue whereby certain combinations of calls to
449`jpeg_skip_scanlines()` and `jpeg_read_scanlines()` could trigger an infinite
450loop when decompressing progressive JPEG images that use vertical chroma
451subsampling (for instance, 4:2:0 or 4:4:0.)
452
4536. Fixed a segfault in `jpeg_skip_scanlines()` that occurred when decompressing
454a 4:2:2 or 4:2:0 JPEG image using the merged (non-fancy) upsampling algorithms
455(that is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.)
456
4577. The new CMake-based build system will now disable the MIPS DSPr2 SIMD
458extensions if it detects that the compiler does not support DSPr2 instructions.
459
4608. Fixed out-of-bounds read in cjpeg (CVE-2018-14498) that occurred when
461attempting to compress a specially-crafted malformed color-index
462(8-bit-per-sample) BMP file in which some of the samples (color indices)
463exceeded the bounds of the BMP file's color table.
464
4659. Fixed a signed integer overflow in the progressive Huffman decoder, detected
466by the Clang and GCC undefined behavior sanitizers, that could be triggered by
467attempting to decompress a specially-crafted malformed JPEG image.  This issue
468did not pose a security threat, but removing the warning made it easier to
469detect actual security issues, should they arise in the future.
470
471
4721.5.90 (2.0 beta1)
473==================
474
475### Significant changes relative to 1.5.3:
476
4771. Added AVX2 SIMD implementations of the colorspace conversion, chroma
478downsampling and upsampling, integer quantization and sample conversion, and
479accurate integer DCT/IDCT algorithms.  When using the accurate integer DCT/IDCT
480algorithms on AVX2-equipped CPUs, the compression of RGB images is
481approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
48264-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
483decompression of RGB images is approximately 9-35% (avg. 17%) faster with
48464-bit code and 7-17% (avg. 12%) faster with 32-bit code.  (As tested on a
4853 GHz Intel Core i7.  Actual mileage may vary.)
486
4872. Overhauled the build system to use CMake on all platforms, and removed the
488autotools-based build system.  This decision resulted from extensive
489discussions within the libjpeg-turbo community.  libjpeg-turbo traditionally
490used CMake only for Windows builds, but there was an increasing amount of
491demand to extend CMake support to other platforms.  However, because of the
492unique nature of our code base (the need to support different assemblers on
493each platform, the need for Java support, etc.), providing dual build systems
494as other OSS imaging libraries do (including libpng and libtiff) would have
495created a maintenance burden.  The use of CMake greatly simplifies some aspects
496of our build system, owing to CMake's built-in support for various assemblers,
497Java, and unit testing, as well as generally fewer quirks that have to be
498worked around in order to implement our packaging system.  Eliminating
499autotools puts our project slightly at odds with the traditional practices of
500the OSS community, since most "system libraries" tend to be built with
501autotools, but it is believed that the benefits of this move outweigh the
502risks.  In addition to providing a unified build environment, switching to
503CMake allows for the use of various build tools and IDEs that aren't supported
504under autotools, including XCode, Ninja, and Eclipse.  It also eliminates the
505need to install autotools via MacPorts/Homebrew on OS X and allows
506libjpeg-turbo to be configured without the use of a terminal/command prompt.
507Extensive testing was conducted to ensure that all features provided by the
508autotools-based build system are provided by the new build system.
509
5103. The libjpeg API in this version of libjpeg-turbo now includes two additional
511functions, `jpeg_read_icc_profile()` and `jpeg_write_icc_profile()`, that can
512be used to extract ICC profile data from a JPEG file while decompressing or to
513embed ICC profile data in a JPEG file while compressing or transforming.  This
514eliminates the need for downstream projects, such as color management libraries
515and browsers, to include their own glueware for accomplishing this.
516
5174. Improved error handling in the TurboJPEG API library:
518
519     - Introduced a new function (`tjGetErrorStr2()`) in the TurboJPEG C API
520that allows compression/decompression/transform error messages to be retrieved
521in a thread-safe manner.  Retrieving error messages from global functions, such
522as `tjInitCompress()` or `tjBufSize()`, is still thread-unsafe, but since those
523functions will only throw errors if passed an invalid argument or if a memory
524allocation failure occurs, thread safety is not as much of a concern.
525     - Introduced a new function (`tjGetErrorCode()`) in the TurboJPEG C API
526and a new method (`TJException.getErrorCode()`) in the TurboJPEG Java API that
527can be used to determine the severity of the last
528compression/decompression/transform error.  This allows applications to
529choose whether to ignore warnings (non-fatal errors) from the underlying
530libjpeg API or to treat them as fatal.
531     - Introduced a new flag (`TJFLAG_STOPONWARNING` in the TurboJPEG C API and
532`TJ.FLAG_STOPONWARNING` in the TurboJPEG Java API) that causes the library to
533immediately halt a compression/decompression/transform operation if it
534encounters a warning from the underlying libjpeg API (the default behavior is
535to allow the operation to complete unless a fatal error is encountered.)
536
5375. Introduced a new flag in the TurboJPEG C and Java APIs (`TJFLAG_PROGRESSIVE`
538and `TJ.FLAG_PROGRESSIVE`, respectively) that causes the library to use
539progressive entropy coding in JPEG images generated by compression and
540transform operations.  Additionally, a new transform option
541(`TJXOPT_PROGRESSIVE` in the C API and `TJTransform.OPT_PROGRESSIVE` in the
542Java API) has been introduced, allowing progressive entropy coding to be
543enabled for selected transforms in a multi-transform operation.
544
5456. Introduced a new transform option in the TurboJPEG API (`TJXOPT_COPYNONE` in
546the C API and `TJTransform.OPT_COPYNONE` in the Java API) that allows the
547copying of markers (including EXIF and ICC profile data) to be disabled for a
548particular transform.
549
5507. Added two functions to the TurboJPEG C API (`tjLoadImage()` and
551`tjSaveImage()`) that can be used to load/save a BMP or PPM/PGM image to/from a
552memory buffer with a specified pixel format and layout.  These functions
553replace the project-private (and slow) bmp API, which was previously used by
554TJBench, and they also provide a convenient way for first-time users of
555libjpeg-turbo to quickly develop a complete JPEG compression/decompression
556program.
557
5588. The TurboJPEG C API now includes a new convenience array (`tjAlphaOffset[]`)
559that contains the alpha component index for each pixel format (or -1 if the
560pixel format lacks an alpha component.)  The TurboJPEG Java API now includes a
561new method (`TJ.getAlphaOffset()`) that returns the same value.  In addition,
562the `tjRedOffset[]`, `tjGreenOffset[]`, and `tjBlueOffset[]` arrays-- and the
563corresponding `TJ.getRedOffset()`, `TJ.getGreenOffset()`, and
564`TJ.getBlueOffset()` methods-- now return -1 for `TJPF_GRAY`/`TJ.PF_GRAY`
565rather than 0.  This allows programs to easily determine whether a pixel format
566has red, green, blue, and alpha components.
567
5689. Added a new example (tjexample.c) that demonstrates the basic usage of the
569TurboJPEG C API.  This example mirrors the functionality of TJExample.java.
570Both files are now included in the libjpeg-turbo documentation.
571
57210. Fixed two signed integer overflows in the arithmetic decoder, detected by
573the Clang undefined behavior sanitizer, that could be triggered by attempting
574to decompress a specially-crafted malformed JPEG image.  These issues did not
575pose a security threat, but removing the warnings makes it easier to detect
576actual security issues, should they arise in the future.
577
57811. Fixed a bug in the merged 4:2:0 upsampling/dithered RGB565 color conversion
579algorithm that caused incorrect dithering in the output image.  This algorithm
580now produces bitwise-identical results to the unmerged algorithms.
581
58212. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
583libjpeg-turbo is built with YASM), and iOS/Arm[64] builds are now private.
584This prevents those symbols from being exposed in applications or shared
585libraries that link statically with libjpeg-turbo.
586
58713. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
588YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
589chroma upsampling, integer quantization, and accurate integer DCT/IDCT
590algorithms.  When using the accurate integer DCT/IDCT, this speeds up the
591compression of RGB images by approximately 70-100% and the decompression of RGB
592images by approximately 2-3.5x.
593
59414. Fixed a build error when building with older MinGW releases (regression
595caused by 1.5.1[7].)
596
59715. Added SIMD acceleration for progressive Huffman encoding on SSE2-capable
598x86 and x86-64 platforms.  This speeds up the compression of full-color
599progressive JPEGs by about 85-90% on average (relative to libjpeg-turbo 1.5.x)
600when using modern Intel and AMD CPUs.
601
602
6031.5.3
604=====
605
606### Significant changes relative to 1.5.2:
607
6081. Fixed a NullPointerException in the TurboJPEG Java wrapper that occurred
609when using the YUVImage constructor that creates an instance backed by separate
610image planes and allocates memory for the image planes.
611
6122. Fixed an issue whereby the Java version of TJUnitTest would fail when
613testing BufferedImage encoding/decoding on big endian systems.
614
6153. Fixed a segfault in djpeg that would occur if an output format other than
616PPM/PGM was selected along with the `-crop` option.  The `-crop` option now
617works with the GIF and Targa formats as well (unfortunately, it cannot be made
618to work with the BMP and RLE formats due to the fact that those output engines
619write scanlines in bottom-up order.)  djpeg will now exit gracefully if an
620output format other than PPM/PGM, GIF, or Targa is selected along with the
621`-crop` option.
622
6234. Fixed an issue (CVE-2017-15232) whereby `jpeg_skip_scanlines()` would
624segfault if color quantization was enabled.
625
6265. TJBench (both C and Java versions) will now display usage information if any
627command-line argument is unrecognized.  This prevents the program from silently
628ignoring typos.
629
6306. Fixed an access violation in tjbench.exe (Windows) that occurred when the
631program was used to decompress an existing JPEG image.
632
6337. Fixed an ArrayIndexOutOfBoundsException in the TJExample Java program that
634occurred when attempting to decompress a JPEG image that had been compressed
635with 4:1:1 chrominance subsampling.
636
6378. Fixed an issue whereby, when using `jpeg_skip_scanlines()` to skip to the
638end of a single-scan (non-progressive) image, subsequent calls to
639`jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
640`JPEG_REACHED_EOI`.
641
6429. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG
643images that were compressed with a sampling factor other than 1 (for instance,
644with `cjpeg -grayscale -sample 2x2`).
645
646
6471.5.2
648=====
649
650### Significant changes relative to 1.5.1:
651
6521. Fixed a regression introduced by 1.5.1[7] that prevented libjpeg-turbo from
653building with Android NDK platforms prior to android-21 (5.0).
654
6552. Fixed a regression introduced by 1.5.1[1] that prevented the MIPS DSPR2 SIMD
656code in libjpeg-turbo from building.
657
6583. Fixed a regression introduced by 1.5 beta1[11] that prevented the Java
659version of TJBench from outputting any reference images (the `-nowrite` switch
660was accidentally enabled by default.)
661
6624. libjpeg-turbo should now build and run with full AltiVec SIMD acceleration
663on PowerPC-based AmigaOS 4 and OpenBSD systems.
664
6655. Fixed build and runtime errors on Windows that occurred when building
666libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
667source/destination managers.  Due to an oversight, the `jpeg_skip_scanlines()`
668and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when
669libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
670
6716. Fixed "Bogus virtual array access" error that occurred when using the
672lossless crop feature in jpegtran or the TurboJPEG API, if libjpeg-turbo was
673built with libjpeg v7 API/ABI emulation.  This was apparently a long-standing
674bug that has existed since the introduction of libjpeg v7/v8 API/ABI emulation
675in libjpeg-turbo v1.1.
676
6777. The lossless transform features in jpegtran and the TurboJPEG API will now
678always attempt to adjust the EXIF image width and height tags if the image size
679changed as a result of the transform.  This behavior has always existed when
680using libjpeg v8 API/ABI emulation.  It was supposed to be available with
681libjpeg v7 API/ABI emulation as well but did not work properly due to a bug.
682Furthermore, there was never any good reason not to enable it with libjpeg v6b
683API/ABI emulation, since the behavior is entirely internal.  Note that
684`-copy all` must be passed to jpegtran in order to transfer the EXIF tags from
685the source image to the destination image.
686
6878. Fixed several memory leaks in the TurboJPEG API library that could occur
688if the library was built with certain compilers and optimization levels
689(known to occur with GCC 4.x and clang with `-O1` and higher but not with
690GCC 5.x or 6.x) and one of the underlying libjpeg API functions threw an error
691after a TurboJPEG API function allocated a local buffer.
692
6939. The libjpeg-turbo memory manager will now honor the `max_memory_to_use`
694structure member in jpeg\_memory\_mgr, which can be set to the maximum amount
695of memory (in bytes) that libjpeg-turbo should use during decompression or
696multi-pass (including progressive) compression.  This limit can also be set
697using the `JPEGMEM` environment variable or using the `-maxmemory` switch in
698cjpeg/djpeg/jpegtran (refer to the respective man pages for more details.)
699This has been a documented feature of libjpeg since v5, but the
700`malloc()`/`free()` implementation of the memory manager (jmemnobs.c) never
701implemented the feature.  Restricting libjpeg-turbo's memory usage is useful
702for two reasons:  it allows testers to more easily work around the 2 GB limit
703in libFuzzer, and it allows developers of security-sensitive applications to
704more easily defend against one of the progressive JPEG exploits (LJT-01-004)
705identified in
706[this report](http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
707
70810. TJBench will now run each benchmark for 1 second prior to starting the
709timer, in order to improve the consistency of the results.  Furthermore, the
710`-warmup` option is now used to specify the amount of warmup time rather than
711the number of warmup iterations.
712
71311. Fixed an error (`short jump is out of range`) that occurred when assembling
714the 32-bit x86 SIMD extensions with NASM versions prior to 2.04.  This was a
715regression introduced by 1.5 beta1[12].
716
717
7181.5.1
719=====
720
721### Significant changes relative to 1.5.0:
722
7231. Previously, the undocumented `JSIMD_FORCE*` environment variables could be
724used to force-enable a particular SIMD instruction set if multiple instruction
725sets were available on a particular platform.  On x86 platforms, where CPU
726feature detection is bulletproof and multiple SIMD instruction sets are
727available, it makes sense for those environment variables to allow forcing the
728use of an instruction set only if that instruction set is available.  However,
729since the ARM implementations of libjpeg-turbo can only use one SIMD
730instruction set, and since their feature detection code is less bulletproof
731(parsing /proc/cpuinfo), it makes sense for the `JSIMD_FORCENEON` environment
732variable to bypass the feature detection code and really force the use of NEON
733instructions.  A new environment variable (`JSIMD_FORCEDSPR2`) was introduced
734in the MIPS implementation for the same reasons, and the existing
735`JSIMD_FORCENONE` environment variable was extended to that implementation.
736These environment variables provide a workaround for those attempting to test
737ARM and MIPS builds of libjpeg-turbo in QEMU, which passes through
738/proc/cpuinfo from the host system.
739
7402. libjpeg-turbo previously assumed that AltiVec instructions were always
741available on PowerPC platforms, which led to "illegal instruction" errors when
742running on PowerPC chips that lack AltiVec support (such as the older 7xx/G3
743and newer e5500 series.)  libjpeg-turbo now examines /proc/cpuinfo on
744Linux/Android systems and enables AltiVec instructions only if the CPU supports
745them.  It also now provides two environment variables, `JSIMD_FORCEALTIVEC` and
746`JSIMD_FORCENONE`, to force-enable and force-disable AltiVec instructions in
747environments where /proc/cpuinfo is an unreliable means of CPU feature
748detection (such as when running in QEMU.)  On OS X, libjpeg-turbo continues to
749assume that AltiVec support is always available, which means that libjpeg-turbo
750cannot be used with G3 Macs unless you set the environment variable
751`JSIMD_FORCENONE` to `1`.
752
7533. Fixed an issue whereby 64-bit ARM (AArch64) builds of libjpeg-turbo would
754crash when built with recent releases of the Clang/LLVM compiler.  This was
755caused by an ABI conformance issue in some of libjpeg-turbo's 64-bit NEON SIMD
756routines.  Those routines were incorrectly using 64-bit instructions to
757transfer a 32-bit JDIMENSION argument, whereas the ABI allows the upper
758(unused) 32 bits of a 32-bit argument's register to be undefined.  The new
759Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
760structure members into a single 64-bit register, and this exposed the ABI
761conformance issue.
762
7634. Fancy upsampling is now supported when decompressing JPEG images that use
7644:4:0 (h1v2) chroma subsampling.  These images are generated when losslessly
765rotating or transposing JPEG images that use 4:2:2 (h2v1) chroma subsampling.
766The h1v2 fancy upsampling algorithm is not currently SIMD-accelerated.
767
7685. If merged upsampling isn't SIMD-accelerated but YCbCr-to-RGB conversion is,
769then libjpeg-turbo will now disable merged upsampling when decompressing YCbCr
770JPEG images into RGB or extended RGB output images.  This significantly speeds
771up the decompression of 4:2:0 and 4:2:2 JPEGs on ARM platforms if fancy
772upsampling is not used (for example, if the `-nosmooth` option to djpeg is
773specified.)
774
7756. The TurboJPEG API will now decompress 4:2:2 and 4:4:0 JPEG images with
7762x2 luminance sampling factors and 2x1 or 1x2 chrominance sampling factors.
777This is a non-standard way of specifying 2x subsampling (normally 4:2:2 JPEGs
778have 2x1 luminance and 1x1 chrominance sampling factors, and 4:4:0 JPEGs have
7791x2 luminance and 1x1 chrominance sampling factors), but the JPEG format and
780the libjpeg API both allow it.
781
7827. Fixed an unsigned integer overflow in the libjpeg memory manager, detected
783by the Clang undefined behavior sanitizer, that could be triggered by
784attempting to decompress a specially-crafted malformed JPEG image.  This issue
785affected only 32-bit code and did not pose a security threat, but removing the
786warning makes it easier to detect actual security issues, should they arise in
787the future.
788
7898. Fixed additional negative left shifts and other issues reported by the GCC
790and Clang undefined behavior sanitizers when attempting to decompress
791specially-crafted malformed JPEG images.  None of these issues posed a security
792threat, but removing the warnings makes it easier to detect actual security
793issues, should they arise in the future.
794
7959. Fixed an out-of-bounds array reference, introduced by 1.4.90[2] (partial
796image decompression) and detected by the Clang undefined behavior sanitizer,
797that could be triggered by a specially-crafted malformed JPEG image with more
798than four components.  Because the out-of-bounds reference was still within the
799same structure, it was not known to pose a security threat, but removing the
800warning makes it easier to detect actual security issues, should they arise in
801the future.
802
80310. Fixed another ABI conformance issue in the 64-bit ARM (AArch64) NEON SIMD
804code.  Some of the routines were incorrectly reading and storing data below the
805stack pointer, which caused segfaults in certain applications under specific
806circumstances.
807
808
8091.5.0
810=====
811
812### Significant changes relative to 1.5 beta1:
813
8141. Fixed an issue whereby a malformed motion-JPEG frame could cause the "fast
815path" of libjpeg-turbo's Huffman decoder to read from uninitialized memory.
816
8172. Added libjpeg-turbo version and build information to the global string table
818of the libjpeg and TurboJPEG API libraries.  This is a common practice in other
819infrastructure libraries, such as OpenSSL and libpng, because it makes it easy
820to examine an application binary and determine which version of the library the
821application was linked against.
822
8233. Fixed a couple of issues in the PPM reader that would cause buffer overruns
824in cjpeg if one of the values in a binary PPM/PGM input file exceeded the
825maximum value defined in the file's header and that maximum value was greater
826than 255.  libjpeg-turbo 1.4.2 already included a similar fix for ASCII PPM/PGM
827files.  Note that these issues were not security bugs, since they were confined
828to the cjpeg program and did not affect any of the libjpeg-turbo libraries.
829
8304. Fixed an issue whereby attempting to decompress a JPEG file with a corrupt
831header using the `tjDecompressToYUV2()` function would cause the function to
832abort without returning an error and, under certain circumstances, corrupt the
833stack.  This only occurred if `tjDecompressToYUV2()` was called prior to
834calling `tjDecompressHeader3()`, or if the return value from
835`tjDecompressHeader3()` was ignored (both cases represent incorrect usage of
836the TurboJPEG API.)
837
8385. Fixed an issue in the ARM 32-bit SIMD-accelerated Huffman encoder that
839prevented the code from assembling properly with clang.
840
8416. The `jpeg_stdio_src()`, `jpeg_mem_src()`, `jpeg_stdio_dest()`, and
842`jpeg_mem_dest()` functions in the libjpeg API will now throw an error if a
843source/destination manager has already been assigned to the compress or
844decompress object by a different function or by the calling program.  This
845prevents these functions from attempting to reuse a source/destination manager
846structure that was allocated elsewhere, because there is no way to ensure that
847it would be big enough to accommodate the new source/destination manager.
848
849
8501.4.90 (1.5 beta1)
851==================
852
853### Significant changes relative to 1.4.2:
854
8551. Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
856(128-bit SIMD) instructions.  Although the performance of libjpeg-turbo on
857PowerPC was already good, due to the increased number of registers available
858to the compiler vs. x86, it was still possible to speed up compression by about
8593-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
860use of AltiVec instructions.
861
8622. Added two new libjpeg API functions (`jpeg_skip_scanlines()` and
863`jpeg_crop_scanline()`) that can be used to partially decode a JPEG image.  See
864[libjpeg.txt](libjpeg.txt) for more details.
865
8663. The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
867implement the Closeable interface, so those classes can be used with a
868try-with-resources statement.
869
8704. The TurboJPEG Java classes now throw unchecked idiomatic exceptions
871(IllegalArgumentException, IllegalStateException) for unrecoverable errors
872caused by incorrect API usage, and those classes throw a new checked exception
873type (TJException) for errors that are passed through from the C library.
874
8755. Source buffers for the TurboJPEG C API functions, as well as the
876`jpeg_mem_src()` function in the libjpeg API, are now declared as const
877pointers.  This facilitates passing read-only buffers to those functions and
878ensures the caller that the source buffer will not be modified.  This should
879not create any backward API or ABI incompatibilities with prior libjpeg-turbo
880releases.
881
8826. The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
883FPUs.
884
8857. Fixed additional negative left shifts and other issues reported by the GCC
886and Clang undefined behavior sanitizers.  Most of these issues affected only
88732-bit code, and none of them was known to pose a security threat, but removing
888the warnings makes it easier to detect actual security issues, should they
889arise in the future.
890
8918. Removed the unnecessary `.arch` directive from the ARM64 NEON SIMD code.
892This directive was preventing the code from assembling using the clang
893integrated assembler.
894
8959. Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
896libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
897distributions.  This was due to the addition of a macro in jconfig.h that
898allows the Huffman codec to determine the word size at compile time.  Since
899that macro differs between 32-bit and 64-bit builds, this caused a conflict
900between the i386 and x86_64 RPMs (any differing files, other than executables,
901are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
902Since the macro is used only internally, it has been moved into jconfigint.h.
903
90410. The x86-64 SIMD code can now be disabled at run time by setting the
905`JSIMD_FORCENONE` environment variable to `1` (the other SIMD implementations
906already had this capability.)
907
90811. Added a new command-line argument to TJBench (`-nowrite`) that prevents the
909benchmark from outputting any images.  This removes any potential operating
910system overhead that might be caused by lazy writes to disk and thus improves
911the consistency of the performance measurements.
912
91312. Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and x86-64
914platforms.  This speeds up the compression of full-color JPEGs by about 10-15%
915on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and AMD
916CPUs.  Additionally, this works around an issue in the clang optimizer that
917prevents it (as of this writing) from achieving the same performance as GCC
918when compiling the C version of the Huffman encoder
919(<https://llvm.org/bugs/show_bug.cgi?id=16035>).  For the purposes of
920benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
921disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
922
92313. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
924compression algorithms (including the accurate integer forward DCT and h2v2 &
925h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON
926implementation.)  This speeds up the compression of full-color JPEGs by about
92775% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
928Cortex-A53 and Cortex-A57 cores.
929
93014. Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
931and 64-bit platforms.
932
933    For 32-bit code, this speeds up the compression of full-color JPEGs by
934about 30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by
935about 6-7% on average on a typical Android device (Nexus 5X, Cortex-A53 and
936Cortex-A57), relative to libjpeg-turbo 1.4.x.  Note that the larger speedup
937under iOS is due to the fact that iOS builds use LLVM, which does not optimize
938the C Huffman encoder as well as GCC does.
939
940    For 64-bit code, NEON-accelerated Huffman encoding speeds up the
941compression of full-color JPEGs by about 40% on average on a typical iOS device
942(iPhone 5S, Apple A7) and by about 7-8% on average on a typical Android device
943(Nexus 5X, Cortex-A53 and Cortex-A57), in addition to the speedup described in
944[13] above.
945
946    For the purposes of benchmarking or regression testing, SIMD-accelerated
947Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment
948variable to `1`.
949
95015. pkg-config (.pc) scripts are now included for both the libjpeg and
951TurboJPEG API libraries on Un*x systems.  Note that if a project's build system
952relies on these scripts, then it will not be possible to build that project
953with libjpeg or with a prior version of libjpeg-turbo.
954
95516. Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
956improve performance on CPUs with in-order pipelines.  This speeds up the
957decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
958processor and by about 15% on average on a Cortex-A53 core.
959
96017. Fixed an issue in the accelerated Huffman decoder that could have caused
961the decoder to read past the end of the input buffer when a malformed,
962specially-crafted JPEG image was being decompressed.  In prior versions of
963libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
964if there were > 128 bytes of data in the input buffer.  However, it is possible
965to construct a JPEG image in which a single Huffman block is over 430 bytes
966long, so this version of libjpeg-turbo activates the accelerated Huffman
967decoder only if there are > 512 bytes of data in the input buffer.
968
96918. Fixed a memory leak in tjunittest encountered when running the program
970with the `-yuv` option.
971
972
9731.4.2
974=====
975
976### Significant changes relative to 1.4.1:
977
9781. Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
979negative width or height was used as an input image (Windows bitmaps can have
980a negative height if they are stored in top-down order, but such files are
981rare and not supported by libjpeg-turbo.)
982
9832. Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
984incorrectly encode certain JPEG images when quality=100 and the fast integer
985forward DCT were used.  This was known to cause `make test` to fail when the
986library was built with `-march=haswell` on x86 systems.
987
9883. Fixed an issue whereby libjpeg-turbo would crash when built with the latest
989& greatest development version of the Clang/LLVM compiler.  This was caused by
990an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
991routines.  Those routines were incorrectly using a 64-bit `mov` instruction to
992transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
993(unused) 32 bits of a 32-bit argument's register to be undefined.  The new
994Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
995structure members into a single 64-bit register, and this exposed the ABI
996conformance issue.
997
9984. Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
999upsampling routine that caused a buffer overflow (and subsequent segfault) when
1000decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
1001pixels.  The "plain" upsampling routines are normally only used when
1002decompressing a non-YCbCr JPEG image, but they are also used when decompressing
1003a JPEG image whose scaled output height is 1.
1004
10055. Fixed various negative left shifts and other issues reported by the GCC and
1006Clang undefined behavior sanitizers.  None of these was known to pose a
1007security threat, but removing the warnings makes it easier to detect actual
1008security issues, should they arise in the future.
1009
1010
10111.4.1
1012=====
1013
1014### Significant changes relative to 1.4.0:
1015
10161. tjbench now properly handles CMYK/YCCK JPEG files.  Passing an argument of
1017`-cmyk` (instead of, for instance, `-rgb`) will cause tjbench to internally
1018convert the source bitmap to CMYK prior to compression, to generate YCCK JPEG
1019files, and to internally convert the decompressed CMYK pixels back to RGB after
1020decompression (the latter is done automatically if a CMYK or YCCK JPEG is
1021passed to tjbench as a source image.)  The CMYK<->RGB conversion operation is
1022not benchmarked.  NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
1023uses are suitable for testing only.  Proper conversion between CMYK and RGB
1024requires a color management system.
1025
10262. `make test` now performs additional bitwise regression tests using tjbench,
1027mainly for the purpose of testing compression from/decompression to a subregion
1028of a larger image buffer.
1029
10303. `make test` no longer tests the regression of the floating point DCT/IDCT
1031by default, since the results of those tests can vary if the algorithms in
1032question are not implemented using SIMD instructions on a particular platform.
1033See the comments in [Makefile.am](Makefile.am) for information on how to
1034re-enable the tests and to specify an expected result for them based on the
1035particulars of your platform.
1036
10374. The NULL color conversion routines have been significantly optimized,
1038which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
103964-bit code and 0-3% when using 32-bit code, and the decompression of those
1040images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
1041
10425. Fixed an "illegal instruction" error that occurred when djpeg from a
1043SIMD-enabled libjpeg-turbo MIPS build was executed with the `-nosmooth` option
1044on a MIPS machine that lacked DSPr2 support.  The MIPS SIMD routines for h2v1
1045and h2v2 merged upsampling were not properly checking for the existence of
1046DSPr2.
1047
10486. Performance has been improved significantly on 64-bit non-Linux and
1049non-Windows platforms (generally 10-20% faster compression and 5-10% faster
1050decompression.)  Due to an oversight, the 64-bit version of the accelerated
1051Huffman codec was not being compiled in when libjpeg-turbo was built on
1052platforms other than Windows or Linux.  Oops.
1053
10547. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
1055builds of libjpeg-turbo to incorrectly encode a few specific test images when
1056quality=98, an optimized Huffman table, and the accurate integer forward DCT
1057were used.
1058
10598. The Windows (CMake) build system now supports building only static or only
1060shared libraries.  This is accomplished by adding either `-DENABLE_STATIC=0` or
1061`-DENABLE_SHARED=0` to the CMake command line.
1062
10639. TurboJPEG API functions will now return an error code if a warning is
1064triggered in the underlying libjpeg API.  For instance, if a JPEG file is
1065corrupt, the TurboJPEG decompression functions will attempt to decompress
1066as much of the image as possible, but those functions will now return -1 to
1067indicate that the decompression was not entirely successful.
1068
106910. Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
1070buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
1071in which the right-most MCU was 5 or 6 pixels wide.
1072
1073
10741.4.0
1075=====
1076
1077### Significant changes relative to 1.4 beta1:
1078
10791. Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
1080because OS X does not provide the `le32toh()` and `htole32()` functions.)
1081
10822. The non-SIMD RGB565 color conversion code did not work correctly on big
1083endian machines.  This has been fixed.
1084
10853. Fixed an issue in `tjPlaneSizeYUV()` whereby it would erroneously return 1
1086instead of -1 if `componentID` was > 0 and `subsamp` was `TJSAMP_GRAY`.
1087
10883. Fixed an issue in `tjBufSizeYUV2()` whereby it would erroneously return 0
1089instead of -1 if `width` was < 1.
1090
10915. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1092on ARM64 platforms (see 1.4 beta1[5].)
1093
10946. The `close()` method in the TJCompressor and TJDecompressor Java classes is
1095now idempotent.  Previously, that method would call the native `tjDestroy()`
1096function even if the TurboJPEG instance had already been destroyed.  This
1097caused an exception to be thrown during finalization, if the `close()` method
1098had already been called.  The exception was caught, but it was still an
1099expensive operation.
1100
11017. The TurboJPEG API previously generated an error (`Could not determine
1102subsampling type for JPEG image`) when attempting to decompress grayscale JPEG
1103images that were compressed with a sampling factor other than 1 (for instance,
1104with `cjpeg -grayscale -sample 2x2`).  Subsampling technically has no meaning
1105with grayscale JPEGs, and thus the horizontal and vertical sampling factors
1106for such images are ignored by the decompressor.  However, the TurboJPEG API
1107was being too rigid and was expecting the sampling factors to be equal to 1
1108before it treated the image as a grayscale JPEG.
1109
11108. cjpeg, djpeg, and jpegtran now accept an argument of `-version`, which will
1111print the library version and exit.
1112
11139. Referring to 1.4 beta1[15], another extremely rare circumstance was
1114discovered under which the Huffman encoder's local buffer can be overrun
1115when a buffered destination manager is being used and an
1116extremely-high-frequency block (basically junk image data) is being encoded.
1117Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
1118to address the previous issue, the new issue caused even the larger buffer to
1119be overrun.  Further analysis reveals that, in the absolute worst case (such as
1120setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
1121order), the Huffman encoder can produce encoded blocks that approach double the
1122size of the unencoded blocks.  Thus, the Huffman local buffer was increased to
1123256 bytes, which should prevent any such issue from re-occurring in the future.
1124
112510. The new `tjPlaneSizeYUV()`, `tjPlaneWidth()`, and `tjPlaneHeight()`
1126functions were not actually usable on any platform except OS X and Windows,
1127because those functions were not included in the libturbojpeg mapfile.  This
1128has been fixed.
1129
113011. Restored the `JPP()`, `JMETHOD()`, and `FAR` macros in the libjpeg-turbo
1131header files.  The `JPP()` and `JMETHOD()` macros were originally implemented
1132in libjpeg as a way of supporting non-ANSI compilers that lacked support for
1133prototype parameters.  libjpeg-turbo has never supported such compilers, but
1134some software packages still use the macros to define their own prototypes.
1135Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
1136have far symbols, but some software packages still use the `FAR` macro.  A
1137pretty good argument can be made that this is a bad practice on the part of the
1138software in question, but since this affects more than one package, it's just
1139easier to fix it here.
1140
114112. Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
1142for iOS, and included an ARMv8 architecture in all of the binaries installed by
1143the "official" libjpeg-turbo SDK for OS X.
1144
1145
11461.3.90 (1.4 beta1)
1147==================
1148
1149### Significant changes relative to 1.3.1:
1150
11511. New features in the TurboJPEG API:
1152
1153     - YUV planar images can now be generated with an arbitrary line padding
1154(previously only 4-byte padding, which was compatible with X Video, was
1155supported.)
1156     - The decompress-to-YUV function has been extended to support image
1157scaling.
1158     - JPEG images can now be compressed from YUV planar source images.
1159     - YUV planar images can now be decoded into RGB or grayscale images.
1160     - 4:1:1 subsampling is now supported.  This is mainly included for
1161compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
1162significant advantages relative to 4:2:0.
1163     - CMYK images are now supported.  This feature allows CMYK source images
1164to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to
1165CMYK destination images.  Conversion between CMYK/YCCK and RGB or YUV images is
1166not supported.  Such conversion requires a color management system and is thus
1167out of scope for a codec library.
1168     - The handling of YUV images in the Java API has been significantly
1169refactored and should now be much more intuitive.
1170     - The Java API now supports encoding a YUV image from an arbitrary
1171position in a large image buffer.
1172     - All of the YUV functions now have a corresponding function that operates
1173on separate image planes instead of a unified image buffer.  This allows for
1174compressing/decoding from or decompressing/encoding to a subregion of a larger
1175YUV image.  It also allows for handling YUV formats that swap the order of the
1176U and V planes.
1177
11782. Added SIMD acceleration for DSPr2-capable MIPS platforms.  This speeds up
1179the compression of full-color JPEGs by 70-80% on such platforms and
1180decompression by 25-35%.
1181
11823. If an application attempts to decompress a Huffman-coded JPEG image whose
1183header does not contain Huffman tables, libjpeg-turbo will now insert the
1184default Huffman tables.  In order to save space, many motion JPEG video frames
1185are encoded without the default Huffman tables, so these frames can now be
1186successfully decompressed by libjpeg-turbo without additional work on the part
1187of the application.  An application can still override the Huffman tables, for
1188instance to re-use tables from a previous frame of the same video.
1189
11904. The Mac packaging system now uses pkgbuild and productbuild rather than
1191PackageMaker (which is obsolete and no longer supported.)  This means that
1192OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
1193although the packages produced can be installed on OS X 10.5 "Leopard" or
1194later.  OS X 10.4 "Tiger" is no longer supported.
1195
11965. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
1197on ARM platforms rather than a lookup table.  This reduces the memory footprint
1198by 64k, which may be important for some mobile applications.  Out of four
1199Android devices that were tested, two demonstrated a small overall performance
1200loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
1201ARMv7 code when enabling this new feature, but the other two devices
1202demonstrated a significant overall performance gain with both ARMv6 and ARMv7
1203code (~10-20%) when enabling the feature.  Actual mileage may vary.
1204
12056. Worked around an issue with Visual C++ 2010 and later that caused incorrect
1206pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
1207if compiler optimization was enabled when libjpeg-turbo was built.  This caused
1208the regression tests to fail when doing a release build under Visual C++ 2010
1209and later.
1210
12117. Improved the accuracy and performance of the non-SIMD implementation of the
1212floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
1213The accuracy of this implementation now matches the accuracy of the SSE/SSE2
1214implementation.  Note, however, that the floating point DCT/IDCT algorithms are
1215mainly a legacy feature.  They generally do not produce significantly better
1216accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a
1217bit slower.
1218
12198. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
1220for decompressing JPEG images into RGB565 (16-bit) pixels.  If dithering is not
1221used, then this code path is SIMD-accelerated on ARM platforms.
1222
12239. Numerous obsolete features, such as support for non-ANSI compilers and
1224support for the MS-DOS memory model, were removed from the libjpeg code,
1225greatly improving its readability and making it easier to maintain and extend.
1226
122710. Fixed a segfault that occurred when calling `output_message()` with
1228`msg_code` set to `JMSG_COPYRIGHT`.
1229
123011. Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
1231characters to be passed on the command line, which was causing it to generate
1232incorrect JPEG files.
1233
123412. Fixed a bug in the build system that was causing the Windows version of
1235wrjpgcom to be built using the rdjpgcom source code.
1236
123713. Restored 12-bit-per-component JPEG support.  A 12-bit version of
1238libjpeg-turbo can now be built by passing an argument of `--with-12bit` to
1239configure (Unix) or `-DWITH_12BIT=1` to cmake (Windows.)  12-bit JPEG support
1240is included only for convenience.  Enabling this feature disables all of the
1241performance features in libjpeg-turbo, as well as arithmetic coding and the
1242TurboJPEG API.  The resulting library still contains the other libjpeg-turbo
1243features (such as the colorspace extensions), but in general, it performs no
1244faster than libjpeg v6b.
1245
124614. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
1247and IDCT algorithms (both are used during JPEG decompression.)  For unknown
1248reasons (probably related to clang), this code cannot currently be compiled for
1249iOS.
1250
125115. Fixed an extremely rare bug (CVE-2014-9092) that could cause the Huffman
1252encoder's local buffer to overrun when a very high-frequency MCU is compressed
1253using quality 100 and no subsampling, and when the JPEG output buffer is being
1254dynamically resized by the destination manager.  This issue was so rare that,
1255even with a test program specifically designed to make the bug occur (by
1256injecting random high-frequency YUV data into the compressor), it was
1257reproducible only once in about every 25 million iterations.
1258
125916. Fixed an oversight in the TurboJPEG C wrapper:  if any of the JPEG
1260compression functions was called repeatedly with the same
1261automatically-allocated destination buffer, then TurboJPEG would erroneously
1262assume that the `jpegSize` parameter was equal to the size of the buffer, when
1263in fact that parameter was probably equal to the size of the most recently
1264compressed JPEG image.  If the size of the previous JPEG image was not as large
1265as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
1266destination buffer.
1267
1268
12691.3.1
1270=====
1271
1272### Significant changes relative to 1.3.0:
1273
12741. On Un*x systems, `make install` now installs the libjpeg-turbo libraries
1275into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
1276and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
1277x86-64.  You can override this by overriding either the `prefix` or `libdir`
1278configure variables.
1279
12802. The Windows installer now places a copy of the TurboJPEG DLLs in the same
1281directory as the rest of the libjpeg-turbo binaries.  This was mainly done
1282to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
1283When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
1284access the c:\WINDOWS\system32 directory, which made it impossible for the
1285TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
1286
12873. Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
1288entropy coding (by passing arguments of `-progressive -arithmetic` to cjpeg or
1289jpegtran, for instance) would result in an error, `Requested feature was
1290omitted at compile time`.
1291
12924. Fixed a couple of issues (CVE-2013-6629 and CVE-2013-6630) whereby malformed
1293JPEG images would cause libjpeg-turbo to use uninitialized memory during
1294decompression.
1295
12965. Fixed an error (`Buffer passed to JPEG library is too small`) that occurred
1297when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
1298source image, and added a unit test to check for this error.
1299
13006. The Java classes should now build properly under Visual Studio 2010 and
1301later.
1302
13037. Fixed an issue that prevented SRPMs generated using the in-tree packaging
1304tools from being rebuilt on certain newer Linux distributions.
1305
13068. Numerous minor fixes to eliminate compilation and build/packaging system
1307warnings, fix cosmetic issues, improve documentation clarity, and other general
1308source cleanup.
1309
1310
13111.3.0
1312=====
1313
1314### Significant changes relative to 1.3 beta1:
1315
13161. `make test` now works properly on FreeBSD, and it no longer requires the
1317md5sum executable to be present on other Un*x platforms.
1318
13192. Overhauled the packaging system:
1320
1321     - To avoid conflict with vendor-supplied libjpeg-turbo packages, the
1322official RPMs and DEBs for libjpeg-turbo have been renamed to
1323"libjpeg-turbo-official".
1324     - The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the
1325official Linux and Mac packages, to avoid conflict with vendor-supplied
1326packages and also to streamline the packaging system.
1327     - Release packages are now created with the directory structure defined
1328by the configure variables `prefix`, `bindir`, `libdir`, etc. (Un\*x) or by the
1329`CMAKE_INSTALL_PREFIX` variable (Windows.)  The exception is that the docs are
1330always located under the system default documentation directory on Un\*x and
1331Mac systems, and on Windows, the TurboJPEG DLL is always located in the Windows
1332system directory.
1333     - To avoid confusion, official libjpeg-turbo packages on Linux/Unix
1334platforms (except for Mac) will always install the 32-bit libraries in
1335/opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64.
1336     - Fixed an issue whereby, in some cases, the libjpeg-turbo executables on
1337Un*x systems were not properly linking with the shared libraries installed by
1338the same package.
1339     - Fixed an issue whereby building the "installer" target on Windows when
1340`WITH_JAVA=1` would fail if the TurboJPEG JAR had not been previously built.
1341     - Building the "install" target on Windows now installs files into the
1342same places that the installer does.
1343
13443. Fixed a Huffman encoder bug that prevented I/O suspension from working
1345properly.
1346
1347
13481.2.90 (1.3 beta1)
1349==================
1350
1351### Significant changes relative to 1.2.1:
1352
13531. Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
135411/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing.  Note that the IDCT will
1355not be SIMD-accelerated when using any of these new scaling factors.
1356
13572. The TurboJPEG dynamic library is now versioned.  It was not strictly
1358necessary to do so, because TurboJPEG uses versioned symbols, and if a function
1359changes in an ABI-incompatible way, that function is renamed and a legacy
1360function is provided to maintain backward compatibility.  However, certain
1361Linux distro maintainers have a policy against accepting any library that isn't
1362versioned.
1363
13643. Extended the TurboJPEG Java API so that it can be used to compress a JPEG
1365image from and decompress a JPEG image to an arbitrary position in a large
1366image buffer.
1367
13684. The `tjDecompressToYUV()` function now supports the `TJFLAG_FASTDCT` flag.
1369
13705. The 32-bit supplementary package for amd64 Debian systems now provides
1371symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
1372This allows those libraries to be used on MultiArch-compatible systems (such as
1373Ubuntu 11 and later) without setting the linker path.
1374
13756. The TurboJPEG Java wrapper should now find the JNI library on Mac systems
1376without having to pass `-Djava.library.path=/usr/lib` to java.
1377
13787. TJBench has been ported to Java to provide a convenient way of validating
1379the performance of the TurboJPEG Java API.  It can be run with
1380`java -cp turbojpeg.jar TJBench`.
1381
13828. cjpeg can now be used to generate JPEG files with the RGB colorspace
1383(feature ported from jpeg-8d.)
1384
13859. The width and height in the `-crop` argument passed to jpegtran can now be
1386suffixed with `f` to indicate that, when the upper left corner of the cropping
1387region is automatically moved to the nearest iMCU boundary, the bottom right
1388corner should be moved by the same amount.  In other words, this feature causes
1389jpegtran to strictly honor the specified width/height rather than the specified
1390bottom right corner (feature ported from jpeg-8d.)
1391
139210. JPEG files using the RGB colorspace can now be decompressed into grayscale
1393images (feature ported from jpeg-8d.)
1394
139511. Fixed a regression caused by 1.2.1[7] whereby the build would fail with
1396multiple "Mismatch in operand sizes" errors when attempting to build the x86
1397SIMD code with NASM 0.98.
1398
139912. The in-memory source/destination managers (`jpeg_mem_src()` and
1400`jpeg_mem_dest()`) are now included by default when building libjpeg-turbo with
1401libjpeg v6b or v7 emulation, so that programs can take advantage of these
1402functions without requiring the use of the backward-incompatible libjpeg v8
1403ABI.  The "age number" of the libjpeg-turbo library on Un*x systems has been
1404incremented by 1 to reflect this.  You can disable this feature with a
1405configure/CMake switch in order to retain strict API/ABI compatibility with the
1406libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.)  See
1407[README.md](README.md) for more details.
1408
140913. Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
1410libjpeg-turbo binary package for OS X, so that those libraries can be used to
1411build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
1412
1413
14141.2.1
1415=====
1416
1417### Significant changes relative to 1.2.0:
1418
14191. Creating or decoding a JPEG file that uses the RGB colorspace should now
1420properly work when the input or output colorspace is one of the libjpeg-turbo
1421colorspace extensions.
1422
14232. When libjpeg-turbo was built without SIMD support and merged (non-fancy)
1424upsampling was used along with an alpha-enabled colorspace during
1425decompression, the unused byte of the decompressed pixels was not being set to
14260xFF.  This has been fixed.  TJUnitTest has also been extended to test for the
1427correct behavior of the colorspace extensions when merged upsampling is used.
1428
14293. Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
1430upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
1431calling conventions.
1432
14334. Fixed a regression (CVE-2012-2806) caused by 1.2.0[6] whereby decompressing
1434corrupt JPEG images (specifically, images in which the component count was
1435erroneously set to a large value) would cause libjpeg-turbo to segfault.
1436
14375. Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
1438processors.  The `MASKMOVDQU` instruction, which was used by the libjpeg-turbo
1439SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
1440it is painfully slow on Bobcat processors in particular.  Eliminating the use
1441of this instruction improved performance by an order of magnitude on Bobcat
1442processors and by a small amount (typically 5%) on AMD desktop processors.
1443
14446. Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
1445platforms.  This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
1446platforms.
1447
14487. Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
1449running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
14504:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
1451upsampling would produce several incorrect columns of pixels at the right-hand
1452side of the output image if each row in the output image was not evenly
1453divisible by 16 bytes.
1454
14558. Fixed an issue whereby attempting to build the SIMD extensions with Xcode
14564.3 on OS X platforms would cause NASM to return numerous errors of the form
1457"'%define' expects a macro identifier".
1458
14599. Added flags to the TurboJPEG API that allow the caller to force the use of
1460either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
1461
1462
14631.2.0
1464=====
1465
1466### Significant changes relative to 1.2 beta1:
1467
14681. Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
1469was not adding the current directory to the assembler include path, so YASM
1470was not able to find jsimdcfg.inc.)
1471
14722. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
1473a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
1474This was more of an annoyance than an actual bug, since it did not cause any
1475actual run-time problems, but the issue showed up when running libjpeg-turbo in
1476valgrind.  See <http://crbug.com/72399> for more information.
1477
14783. Added a compile-time macro (`LIBJPEG_TURBO_VERSION`) that can be used to
1479check the version of libjpeg-turbo against which an application was compiled.
1480
14814. Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
1482and pixel formats (TurboJPEG API), which allow applications to specify that,
1483when decompressing to a 4-component RGB buffer, the unused byte should be set
1484to 0xFF so that it can be interpreted as an opaque alpha channel.
1485
14865. Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
1487because libjpeg-turbo's distributed version of jconfig.h contained an `INLINE`
1488macro, which conflicted with a similar macro in DevIL.  This macro is used only
1489internally when building libjpeg-turbo, so it was moved into config.h.
1490
14916. libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
1492K component is assigned a component ID of 1 instead of 4.  Although these files
1493are in violation of the spec, other JPEG implementations handle them
1494correctly.
1495
14967. Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
1497the official libjpeg-turbo binary package for OS X, so that those libraries can
1498be used to build both OS X and iOS applications.
1499
1500
15011.1.90 (1.2 beta1)
1502==================
1503
1504### Significant changes relative to 1.1.1:
1505
15061. Added a Java wrapper for the TurboJPEG API.  See [java/README](java/README)
1507for more details.
1508
15092. The TurboJPEG API can now be used to scale down images during
1510decompression.
1511
15123. Added SIMD routines for RGB-to-grayscale color conversion, which
1513significantly improves the performance of grayscale JPEG compression from an
1514RGB source image.
1515
15164. Improved the performance of the C color conversion routines, which are used
1517on platforms for which SIMD acceleration is not available.
1518
15195. Added a function to the TurboJPEG API that performs lossless transforms.
1520This function is implemented using the same back end as jpegtran, but it
1521performs transcoding entirely in memory and allows multiple transforms and/or
1522crop operations to be batched together, so the source coefficients only need to
1523be read once.  This is useful when generating image tiles from a single source
1524JPEG.
1525
15266. Added tests for the new TurboJPEG scaled decompression and lossless
1527transform features to tjbench (the TurboJPEG benchmark, formerly called
1528"jpgtest".)
1529
15307. Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
1531was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
1532transposed or rotated 90 degrees.
1533
15348. All legacy VirtualGL code has been re-factored, and this has allowed
1535libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
1536
15379. libjpeg-turbo can now be built with YASM.
1538
153910. Added SIMD acceleration for ARM Linux and iOS platforms that support
1540NEON instructions.
1541
154211. Refactored the TurboJPEG C API and documented it using Doxygen.  The
1543TurboJPEG 1.2 API uses pixel formats to define the size and component order of
1544the uncompressed source/destination images, and it includes a more efficient
1545version of `TJBUFSIZE()` that computes a worst-case JPEG size based on the
1546level of chrominance subsampling.  The refactored implementation of the
1547TurboJPEG API now uses the libjpeg memory source and destination managers,
1548which allows the TurboJPEG compressor to grow the JPEG buffer as necessary.
1549
155012. Eliminated errors in the output of jpegtran on Windows that occurred when
1551the application was invoked using I/O redirection
1552(`jpegtran <input.jpg >output.jpg`.)
1553
155413. The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
1555support in libjpeg-turbo v1.1.0 introduced several new error constants in
1556jerror.h, and these were mistakenly enabled for all emulation modes, causing
1557the error enum in libjpeg-turbo to sometimes have different values than the
1558same enum in libjpeg.  This represents an ABI incompatibility, and it caused
1559problems with rare applications that took specific action based on a particular
1560error value.  The fix was to include the new error constants conditionally
1561based on whether libjpeg v7 or v8 emulation was enabled.
1562
156314. Fixed an issue whereby Windows applications that used libjpeg-turbo would
1564fail to compile if the Windows system headers were included before jpeglib.h.
1565This issue was caused by a conflict in the definition of the INT32 type.
1566
156715. Fixed 32-bit supplementary package for amd64 Debian systems, which was
1568broken by enhancements to the packaging system in 1.1.
1569
157016. When decompressing a JPEG image using an output colorspace of
1571`JCS_EXT_RGBX`, `JCS_EXT_BGRX`, `JCS_EXT_XBGR`, or `JCS_EXT_XRGB`,
1572libjpeg-turbo will now set the unused byte to 0xFF, which allows applications
1573to interpret that byte as an alpha channel (0xFF = opaque).
1574
1575
15761.1.1
1577=====
1578
1579### Significant changes relative to 1.1.0:
1580
15811. Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
1582by `tjEncodeYUV()`.
1583
15842. libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
1585markers found in the middle of the JPEG data stream during decompression.  It
1586will now hand off decoding of a particular block to the unaccelerated Huffman
1587decoder if an unexpected marker is found, so that the unaccelerated Huffman
1588decoder can generate an appropriate warning.
1589
15903. Older versions of MinGW64 prefixed symbol names with underscores by
1591default, which differed from the behavior of 64-bit Visual C++.  MinGW64 1.0
1592has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
1593this, the libjpeg-turbo SIMD function names are no longer prefixed with an
1594underscore when building with MinGW64.  This means that, when building
1595libjpeg-turbo with older versions of MinGW64, you will now have to add
1596`-fno-leading-underscore` to the `CFLAGS`.
1597
15984. Fixed a regression bug in the NSIS script that caused the Windows installer
1599build to fail when using the Visual Studio IDE.
1600
16015. Fixed a bug in `jpeg_read_coefficients()` whereby it would not initialize
1602`cinfo->image_width` and `cinfo->image_height` if libjpeg v7 or v8 emulation
1603was enabled.  This specifically caused the jpegoptim program to fail if it was
1604linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
1605emulation.
1606
16076. Eliminated excessive I/O overhead that occurred when reading BMP files in
1608cjpeg.
1609
16107. Eliminated errors in the output of cjpeg on Windows that occurred when the
1611application was invoked using I/O redirection (`cjpeg <inputfile >output.jpg`.)
1612
1613
16141.1.0
1615=====
1616
1617### Significant changes relative to 1.1 beta1:
1618
16191. The algorithm used by the SIMD quantization function cannot produce correct
1620results when the JPEG quality is >= 98 and the fast integer forward DCT is
1621used.  Thus, the non-SIMD quantization function is now used for those cases,
1622and libjpeg-turbo should now produce identical output to libjpeg v6b in all
1623cases.
1624
16252. Despite the above, the fast integer forward DCT still degrades somewhat for
1626JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
1627use the accurate integer forward DCT when generating JPEG images of quality 96
1628or greater.  This reduces compression performance by as much as 15% for these
1629high-quality images but is necessary to ensure that the images are perceptually
1630lossless.  It also ensures that the library can avoid the performance pitfall
1631created by [1].
1632
16333. Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
1634
16354. Fixed visual artifacts in grayscale JPEG compression caused by a typo in
1636the RGB-to-luminance lookup tables.
1637
16385. The Windows distribution packages now include the libjpeg run-time programs
1639(cjpeg, etc.)
1640
16416. All packages now include jpgtest.
1642
16437. The TurboJPEG dynamic library now uses versioned symbols.
1644
16458. Added two new TurboJPEG API functions, `tjEncodeYUV()` and
1646`tjDecompressToYUV()`, to replace the somewhat hackish `TJ_YUV` flag.
1647
1648
16491.0.90 (1.1 beta1)
1650==================
1651
1652### Significant changes relative to 1.0.1:
1653
16541. Added emulation of the libjpeg v7 and v8 APIs and ABIs.  See
1655[README.md](README.md) for more details.  This feature was sponsored by
1656CamTrace SAS.
1657
16582. Created a new CMake-based build system for the Visual C++ and MinGW builds.
1659
16603. Grayscale bitmaps can now be compressed from/decompressed to using the
1661TurboJPEG API.
1662
16634. jpgtest can now be used to test decompression performance with existing
1664JPEG images.
1665
16665. If the default install prefix (/opt/libjpeg-turbo) is used, then
1667`make install` now creates /opt/libjpeg-turbo/lib32 and
1668/opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
1669packages.
1670
16716. All symbols in the libjpeg-turbo dynamic library are now versioned, even
1672when the library is built with libjpeg v6b emulation.
1673
16747. Added arithmetic encoding and decoding support (can be disabled with
1675configure or CMake options)
1676
16778. Added a `TJ_YUV` flag to the TurboJPEG API, which causes both the compressor
1678and decompressor to output planar YUV images.
1679
16809. Added an extended version of `tjDecompressHeader()` to the TurboJPEG API,
1681which allows the caller to determine the type of subsampling used in a JPEG
1682image.
1683
168410. Added further protections against invalid Huffman codes.
1685
1686
16871.0.1
1688=====
1689
1690### Significant changes relative to 1.0.0:
1691
16921. The Huffman decoder will now handle erroneous Huffman codes (for instance,
1693from a corrupt JPEG image.)  Previously, these would cause libjpeg-turbo to
1694crash under certain circumstances.
1695
16962. Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
1697be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
1698
16993. The configure script will now automatically determine whether the
1700`INCOMPLETE_TYPES_BROKEN` macro should be defined.
1701
1702
17031.0.0
1704=====
1705
1706### Significant changes relative to 0.0.93:
1707
17081. 2983700: Further FreeBSD build tweaks (no longer necessary to specify
1709`--host` when configuring on a 64-bit system)
1710
17112. Created symlinks in the Unix/Linux packages so that the TurboJPEG
1712include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
1713static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
171464-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
1715
17163. The Unix/Linux distribution packages now include the libjpeg run-time
1717programs (cjpeg, etc.) and man pages.
1718
17194. Created a 32-bit supplementary package for amd64 Debian systems, which
1720contains just the 32-bit libjpeg-turbo libraries.
1721
17225. Moved the libraries from */lib32 to */lib in the i386 Debian package.
1723
17246. Include distribution package for Cygwin
1725
17267. No longer necessary to specify `--without-simd` on non-x86 architectures,
1727and unit tests now work on those architectures.
1728
1729
17300.0.93
1731======
1732
1733### Significant changes since 0.0.91:
1734
17351. 2982659: Fixed x86-64 build on FreeBSD systems
1736
17372. 2988188: Added support for Windows 64-bit systems
1738
1739
17400.0.91
1741======
1742
1743### Significant changes relative to 0.0.90:
1744
17451. Added documentation to .deb packages
1746
17472. 2968313: Fixed data corruption issues when decompressing large JPEG images
1748and/or using buffered I/O with the libjpeg-turbo decompressor
1749
1750
17510.0.90
1752======
1753
1754Initial release
1755