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