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