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