xref: /aosp_15_r20/external/libjpeg-turbo/ChangeLog.md (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
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