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