Releases: libjpeg-turbo/libjpeg-turbo
3.1.0
Assets
- libjpeg-turbo-3.1.0.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Packaging Changes
- The RPM packages now contain SHA-256 header and payload digests. This fixes an issue whereby the RPM signatures could not be verified on Red Hat Enterprise Linux with FIPS mode enabled. The RPM packages now require GLIBC 2.17 or later.
Support
Code Quality: Stable
Current Support Category: Active
Release Sponsors
This release was made possible via funding from MathWorks.
Release Notes
Significant changes relative to 3.1 beta1:
-
Fixed an issue in the TurboJPEG API whereby, when generating a lossless JPEG image with more than 8 bits per sample, specifying a point transform value greater than 7 resulted in an error ("Parameter value out of range") unless
TJPARAM_PRECISION
/TJ.PARAM_PRECISION
was specified beforeTJPARAM_LOSSLESSPT
/TJ.PARAM_LOSSLESSPT
. -
Fixed a regression introduced by 1.4 beta1[3] that prevented
jpeg_set_defaults()
from resetting the Huffman tables to default (baseline) values if Huffman table optimization or progressive mode was previously enabled in the same libjpeg instance. -
Fixed an issue whereby lossless JPEG compression could not be disabled if it was previously enabled in a libjpeg or TurboJPEG instance.
jpeg_set_defaults()
now disables lossless JPEG compression in a libjpeg instance, and settingTJPARAM_LOSSLESS
/TJ.PARAM_LOSSLESS
to0
now disables lossless JPEG compression in a TurboJPEG instance.
3.0.90 (3.1 beta1)
Assets
- libjpeg-turbo-3.0.90.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Packaging Changes
- The RPM packages now contain SHA-256 header and payload digests. This fixes an issue whereby the RPM signatures could not be verified on Red Hat Enterprise Linux with FIPS mode enabled. The RPM packages now require GLIBC 2.17 or later.
Support
Code Quality: Beta
Current Support Category: EOL
Release Sponsors
This release was made possible via funding from MathWorks.
Release Notes
Significant changes relative to 3.0.4:
-
The libjpeg-turbo source tree has been reorganized to make it easier to find the README files, license information, and build instructions. The documentation for the libjpeg API library and associated programs has been moved into the doc/ subdirectory, all C source code and headers have been moved into a new src/ subdirectory, and test scripts have been moved into a new test/ subdirectory.
-
cjpeg no longer allows GIF input files to be converted into 12-bit-per-sample JPEG files. That was never a useful feature, since GIF images have at most 256 colors referenced from a palette of 8-bit-per-component RGB values.
-
Added support for lossless JPEG images with 2 to 15 bits per sample to the libjpeg and TurboJPEG APIs. When creating or decompressing a lossless JPEG image and when loading or saving a PBMPLUS image, functions/methods specific to 8-bit samples now handle 8-bit samples with 2 to 8 bits of data precision (specified using the
data_precision
field injpeg_compress_struct
orjpeg_decompress_struct
or usingTJPARAM_PRECISION
/TJ.PARAM_PRECISION
), functions/methods specific to 12-bit samples now handle 12-bit samples with 9 to 12 bits of data precision, and functions/methods specific to 16-bit samples now handle 16-bit samples with 13 to 16 bits of data precision. Refer to libjpeg.txt, usage.txt, and the TurboJPEG API documentation for more details. -
All deprecated constants and methods in the TurboJPEG Java API have been removed.
-
TJBench command-line arguments are now more consistent with those of cjpeg, djpeg, and jpegtran. More specifically:
-copynone
has been replaced with-copy none
.-fastdct
has been replaced with-dct fast
.-fastupsample
has been replaced with-nosmooth
.-hflip
and-vflip
have been replaced with-flip {horizontal|vertical}
.-limitscans
has been replaced with-maxscans
, which allows the scan limit to be specified.-rgb
,-bgr
,-rgbx
,-bgrx
,-xbgr
,-xrgb
, and-cmyk
have been replaced with-pixelformat {rgb|bgr|rgbx|bgrx|xbgr|xrgb|cmyk}
.-rot90
,-rot180
, and-rot270
have been replaced with-rotate {90|180|270}
.-stoponwarning
has been replaced with-strict
.- British spellings for
gray
(grey
) andoptimize
(optimise
) are now allowed.
The old command-line arguments are deprecated and will be removed in a future release. TJBench command-line arguments can now be abbreviated as well. (Where possible, the abbreviations are the same as those supported by cjpeg, djpeg, and jpegtran.)
-
Added a new TJBench option (
-pixelformat gray
) that can be used to test the performance of compressing/decompressing a grayscale JPEG image from/to a packed-pixel grayscale image. -
Fixed an issue whereby, if
TJPARAM_NOREALLOC
was set, TurboJPEG compression and lossless transformation functions ignored the JPEG buffer size(s) passed to them and assumed that the JPEG buffer(s) had been allocated to a worst-case size returned bytj3JPEGBufSize()
. This behavior was never documented, although the documentation was unclear regarding whether the JPEG buffer size should be specified if a JPEG buffer is pre-allocated to a worst-case size. -
The TurboJPEG C and Java APIs have been improved in the following ways:
- New image I/O methods (
TJCompressor.loadSourceImage()
andTJDecompressor.saveImage()
) have been added to the Java API. These methods work similarly to thetj3LoadImage*()
andtj3SaveImage*()
functions in the C API. - The TurboJPEG lossless transformation function and methods now add restart markers to all destination images if
TJPARAM_RESTARTBLOCKS
/TJ.PARAM_RESTARTBLOCKS
orTJPARAM_RESTARTROWS
/TJ.PARAM_RESTARTROWS
is set. - New functions/methods (
tj3SetICCProfile()
/TJCompressor.setICCProfile()
/TJTransformer.setICCProfile()
andtj3GetICCProfile()
/TJDecompressor.getICCProfile()
) can be used to embed and retrieve ICC profiles. - A new parameter (
TJPARAM_SAVEMARKERS
/TJ.PARAM_SAVEMARKERS
) can be used to specify the types of markers that will be copied from the source image to the destination image during lossless transformation ifTJXOPT_COPYNONE
/TJTransform.OPT_COPYNONE
is not specified. - A new convenience function/method (
tj3TransformBufSize()
/TJTransformer.bufSize()
) can be used to compute the worst-case destination buffer size for a given lossless transform, taking into account cropping, transposition of the width and height, grayscale conversion, and the embedded or extracted ICC profile.
- New image I/O methods (
-
TJExample has been replaced with three programs (TJComp, TJDecomp, and TJTran) that demonstrate how to approximate the functionality of cjpeg, djpeg, and jpegtran using the TurboJPEG C and Java APIs.
3.0.4
Assets
- libjpeg-turbo-3.0.4.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Stable
Current Support Category: Maintenance
Release Notes
Significant changes relative to 3.0.3:
-
Fixed an issue whereby the CPU usage of the default marker processor in the decompressor grew exponentially with the number of markers. This caused an unreasonable slow-down in
jpeg_read_header()
if an application calledjpeg_save_markers()
to save markers of a particular type and then attempted to decompress a JPEG image containing an excessive number of markers of that type. -
Hardened the default marker processor in the decompressor to guard against an issue (exposed by 3.0 beta2[6]) whereby attempting to decompress a specially-crafted malformed JPEG image (specifically an image with a complete 12-bit-per-sample Start Of Frame segment followed by an incomplete 8-bit-per-sample Start Of Frame segment) using buffered-image mode and input prefetching caused a segfault if the
fill_input_buffer()
method in the calling application's custom source manager incorrectly returnedFALSE
in response to a prematurely-terminated JPEG data stream. -
Fixed an issue in cjpeg whereby, when generating a 12-bit-per-sample or 16-bit-per-sample lossless JPEG image, specifying a point transform value greater than 7 resulted in an error ("Invalid progressive/lossless parameters") unless the
-precision
option was specified before the-lossless
option. -
Fixed a regression introduced by 3.0.3[3] that made it impossible for calling applications to generate 12-bit-per-sample arithmetic-coded lossy JPEG images using the TurboJPEG API.
-
Fixed an error ("Destination buffer is not large enough") that occurred when attempting to generate a full-color lossless JPEG image using the TurboJPEG Java API's
byte[] TJCompressor.compress()
method if the value ofTJ.PARAM_SUBSAMP
was notTJ.SAMP_444
. -
Fixed a segfault in djpeg that occurred if a negative width was specified with the
-crop
option. Since the cropping region width was read into an unsigned 32-bit integer, a negative width was interpreted as a very large value. With certain negative width and positive left boundary values, the bounds checks in djpeg andjpeg_crop_scanline()
overflowed and did not detect the out-of-bounds width, which caused a buffer overrun in the upsampling or color conversion routine. Both bounds checks now use 64-bit integers to guard against overflow, and djpeg now checks for negative numbers when it parses the crop specification from the command line. -
Fixed an issue whereby the TurboJPEG lossless transformation function and methods checked the specified cropping region against the source image dimensions and level of chrominance subsampling rather than the destination image dimensions and level of chrominance subsampling, which caused some cropping regions to be unduly rejected when performing 90-degree rotation, 270-degree rotation, transposition, transverse transposition, or grayscale conversion.
-
Fixed a regression, introduced by 3.0 beta2[4], that prevented the
tjTransform()
backward compatibility function from copying extra markers from the source image to the destination image. -
Fixed an issue whereby the TurboJPEG lossless transformation function and methods did not honor
TJXOPT_COPYNONE
/TJTransform.OPT_COPYNONE
unless it was specified for all lossless transforms.
3.0.3
Assets
- libjpeg-turbo-3.0.3.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Stable
Current Support Category: Maintenance
Release Notes
Significant changes relative to 3.0.2:
-
Fixed an issue in the build system, introduced in 3.0.2, that caused all libjpeg-turbo components to depend on the Visual C++ run-time DLL when built with Visual C++ and CMake 3.15 or later, regardless of value of the
WITH_CRT_DLL
CMake variable. -
The x86-64 SIMD extensions now include support for Intel Control-flow Enforcement Technology (CET), which is enabled automatically if CET is enabled in the C compiler.
-
Fixed a regression introduced by 3.0 beta2[6] that made it impossible for calling applications to supply custom Huffman tables when generating 12-bit-per-component lossy JPEG images using the libjpeg API.
-
Fixed a segfault that occurred when attempting to use the jpegtran
-drop
option with a specially-crafted malformed input image or drop image (specifically an image in which all of the scans contain fewer components than the number of components specified in the Start Of Frame segment.)
3.0.2
Assets
- libjpeg-turbo-3.0.2.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Packaging Changes
- New copies of libjpeg-turbo-3.0.2-vc.exe and libjpeg-turbo-3.0.2-vc64.exe were uploaded on 2024-01-25 to work around a build system issue that caused all Windows libjpeg-turbo components to depend on the Visual C++ run-time DLL.
Support
Code Quality: Stable
Current Support Category: Maintenance
Release Notes
Significant changes relative to 3.0.1:
-
Fixed a signed integer overflow in the
tj3CompressFromYUV8()
,tj3DecodeYUV8()
,tj3DecompressToYUV8()
, andtj3EncodeYUV8()
functions, detected by the Clang and GCC undefined behavior sanitizers, that could be triggered by setting thealign
parameter to an unreasonably large value. This issue did not pose a security threat, but removing the warning made it easier to detect actual security issues, should they arise in the future. -
Introduced a new parameter (
TJPARAM_MAXMEMORY
in the TurboJPEG C API andTJ.PARAM_MAXMEMORY
in the TurboJPEG Java API) and a corresponding TJBench option (-maxmemory
) for specifying the maximum amount of memory (in megabytes) that will be allocated for intermediate buffers, which are used with progressive JPEG compression and decompression, Huffman table optimization, lossless JPEG compression, and lossless transformation. The new parameter and option serve the same purpose as themax_memory_to_use
field in thejpeg_memory_mgr
struct in the libjpeg API, theJPEGMEM
environment variable, and the cjpeg/djpeg/jpegtran-maxmemory
option. -
Introduced a new parameter (
TJPARAM_MAXPIXELS
in the TurboJPEG C API andTJ.PARAM_MAXPIXELS
in the TurboJPEG Java API) and a corresponding TJBench option (-maxpixels
) for specifying the maximum number of pixels that the decompression, lossless transformation, and packed-pixel image loading functions/methods will process. -
Fixed an error ("Unsupported color conversion request") that occurred when attempting to decompress a 3-component lossless JPEG image without an Adobe APP14 marker. The decompressor now assumes that a 3-component lossless JPEG image without an Adobe APP14 marker uses the RGB colorspace if its component IDs are 1, 2, and 3.
3.0.1
Assets
- libjpeg-turbo-3.0.1.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Stable
Current Support Category: Maintenance
Release Notes
Significant changes relative to 3.0.0:
-
The x86-64 SIMD functions now use a standard stack frame, prologue, and epilogue so that debuggers and profilers can reliably capture backtraces from within the functions.
-
Fixed two minor issues in the interblock smoothing algorithm that caused mathematical (but not necessarily perceptible) edge block errors when decompressing progressive JPEG images exactly two DCT blocks in width or that use vertical chrominance subsampling.
-
Fixed a regression introduced by 3.0 beta2[6] that, in rare cases, caused the C Huffman encoder (which is not used by default on x86 and Arm CPUs) to generate incorrect results if the Neon SIMD extensions were explicitly disabled at build time (by setting the
WITH_SIMD
CMake variable to0
) in an AArch64 build of libjpeg-turbo.
3.0.0
Assets
- libjpeg-turbo-3.0.0.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Stable
Current Support Category: Maintenance
Release Sponsors
This release was made possible via funding from MathWorks.
Release Notes
Significant changes relative to 3.0 beta2:
-
The TurboJPEG API now supports 4:4:1 (transposed 4:1:1) chrominance subsampling, which allows losslessly transposed or rotated 4:1:1 JPEG images to be losslessly cropped, partially decompressed, or decompressed to planar YUV images.
-
Fixed various segfaults and buffer overruns (CVE-2023-2804) that occurred when attempting to decompress various specially-crafted malformed 12-bit-per-component and 16-bit-per-component lossless JPEG images using color quantization or merged chroma upsampling/color conversion. The underlying cause of these issues was that the color quantization and merged chroma upsampling/color conversion algorithms were not designed with lossless decompression in mind. Since libjpeg-turbo explicitly does not support color conversion when compressing or decompressing lossless JPEG images, merged chroma upsampling/color conversion never should have been enabled for such images. Color quantization is a legacy feature that serves little or no purpose with lossless JPEG images, so it is also now disabled when decompressing such images. (As a result, djpeg can no longer decompress a lossless JPEG image into a GIF image.)
-
Fixed an oversight in 1.4 beta1[8] that caused various segfaults and buffer overruns when attempting to decompress various specially-crafted malformed 12-bit-per-component JPEG images using djpeg with both color quantization and RGB565 color conversion enabled.
-
Fixed an issue whereby
jpeg_crop_scanline()
sometimes miscalculated the downsampled width for components with 4x2 or 2x4 subsampling factors if decompression scaling was enabled. This caused the components to be upsampled incompletely, which caused the color converter to read from uninitialized memory. With 12-bit data precision, this caused a buffer overrun or underrun and subsequent segfault if the sample value read from uninitialized memory was outside of the valid sample range. -
Fixed a long-standing issue whereby the
tj3Transform()
function, when used with theTJXOP_TRANSPOSE
,TJXOP_TRANSVERSE
,TJXOP_ROT90
, orTJXOP_ROT270
transform operation and without automatic JPEG destination buffer (re)allocation or lossless cropping, computed the worst-case transformed JPEG image size based on the source image dimensions rather than the transformed image dimensions. If a calling program allocated the JPEG destination buffer based on the transformed image dimensions, as the API documentation instructs, and attempted to transform a specially-crafted 4:2:2, 4:4:0, 4:1:1, or 4:4:1 JPEG source image containing a large amount of metadata, the issue causedtj3Transform()
to overflow the JPEG destination buffer rather than fail gracefully. The issue could be worked around by settingTJXOPT_COPYNONE
. Note that, irrespective of this issue,tj3Transform()
cannot reliably transform JPEG source images that contain a large amount of metadata unless automatic JPEG destination buffer (re)allocation is used orTJXOPT_COPYNONE
is set. -
Fixed a regression introduced by 3.0 beta2[6] that prevented the djpeg
-map
option from working when decompressing 12-bit-per-component lossy JPEG images. -
Fixed an issue that caused the C Huffman encoder (which is not used by default on x86 and Arm CPUs) to read from uninitialized memory when attempting to transform a specially-crafted malformed arithmetic-coded JPEG source image into a baseline Huffman-coded JPEG destination image.
2.1.91 (3.0 beta2)
Assets
- libjpeg-turbo-2.1.91.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Beta
Current Support Category: EOL
Release Sponsors
This release was made possible via funding from MathWorks.
Release Notes
Significant changes relative to 3.0 beta1:
- The SIMD dispatchers in libjpeg-turbo 2.1.4 and prior stored the list of supported SIMD instruction sets in a global variable, which caused an innocuous race condition whereby the variable could have been initialized multiple times if
jpeg_start_*compress()
was called simultaneously in multiple threads. libjpeg-turbo 3.0 beta1 included an undocumented attempt to fix this race condition by making the SIMD support variable thread-local. However, that caused another issue whereby, ifjpeg_start_*compress()
was called in one thread andjpeg_read_*()
orjpeg_write_*()
was called in a second thread, the SIMD support variable was never initialized in the second thread. On x86 systems, this led the second thread to incorrectly assume that AVX2 instructions were always available, and when it attempted to use those instructions on older x86 CPUs that do not support them, an illegal instruction error occurred. The SIMD dispatchers now ensure that the SIMD support variable is initialized before dispatching based on its value.
Significant changes relative to 2.1.5:
-
Significantly sped up the computation of optimal Huffman tables. This speeds up the compression of tiny images by as much as 2x and provides a noticeable speedup for images as large as 256x256 when using optimal Huffman tables.
-
All deprecated fields, constructors, and methods in the TurboJPEG Java API have been removed.
-
Arithmetic entropy coding is now supported with 12-bit-per-component JPEG images.
-
Overhauled the TurboJPEG API to address long-standing limitations and to make the API more extensible and intuitive:
- All C function names are now prefixed with
tj3
, and all version suffixes have been removed from the function names. Future API overhauls will increment the prefix totj4
, etc., thus retaining backward API/ABI compatibility without versioning each individual function. - Stateless boolean flags have been replaced with stateful integer API parameters, the values of which persist between function calls. New functions/methods (
tj3Set()
/TJCompressor.set()
/TJDecompressor.set()
andtj3Get()
/TJCompressor.get()
/TJDecompressor.get()
) can be used to set and query the value of a particular API parameter. - The JPEG quality and subsampling are now implemented using API parameters rather than stateless function arguments (C) or dedicated set/get methods (Java.)
tj3DecompressHeader()
now stores all relevant information about the JPEG image, including the width, height, subsampling type, entropy coding algorithm, etc., in API parameters rather than returning that information through pointer arguments.TJFLAG_LIMITSCANS
/TJ.FLAG_LIMITSCANS
has been reimplemented as an API parameter (TJPARAM_SCANLIMIT
/TJ.PARAM_SCANLIMIT
) that allows the number of scans to be specified.- Huffman table optimization can now be specified, using a new API parameter (
TJPARAM_OPTIMIZE
/TJ.PARAM_OPTIMIZE
), a new transform option (TJXOPT_OPTIMIZE
/TJTransform.OPT_OPTIMIZE
), and a new TJBench option (-optimize
.) - Arithmetic entropy coding can now be specified or queried, using a new API parameter (
TJPARAM_ARITHMETIC
/TJ.PARAM_ARITHMETIC
), a new transform option (TJXOPT_ARITHMETIC
/TJTransform.OPT_ARITHMETIC
), and a new TJBench option (-arithmetic
.) - The restart marker interval can now be specified, using new API parameters (
TJPARAM_RESTARTROWS
/TJ.PARAM_RESTARTROWS
andTJPARAM_RESTARTBLOCKS
/TJ.PARAM_RESTARTBLOCKS
) and a new TJBench option (-restart
.) - Pixel density can now be specified or queried, using new API parameters (
TJPARAM_XDENSITY
/TJ.PARAM_XDENSITY
,TJPARAM_YDENSITY
/TJ.PARAM_YDENSITY
, andTJPARAM_DENSITYUNITS
/TJ.PARAM_DENSITYUNITS
.) - The accurate DCT/IDCT algorithms are now the default for both compression and decompression, since the "fast" algorithms are considered to be a legacy feature. (The "fast" algorithms do not pass the ISO compliance tests, and those algorithms are not any faster than the accurate algorithms on modern x86 CPUs.)
- All C initialization functions have been combined into a single function (
tj3Init()
) that accepts an integer argument specifying the subsystems to initialize. - All C functions now use the
const
keyword for pointer arguments that point to unmodified buffers (and for both dimensions of pointer arguments that point to sets of unmodified buffers.) - All C functions now use
size_t
rather thanunsigned long
to represent buffer sizes, for compatibility withmalloc()
and to avoid disparities in the size ofunsigned long
between LP64 (Un*x) and LLP64 (Windows) operating systems. - All C buffer size functions now return 0 if an error occurs, rather than trying to awkwardly return -1 in an unsigned data type (which could easily be misinterpreted as a very large value.)
- Decompression scaling is now enabled explicitly, using a new function/method (
tj3SetScalingFactor()
/TJDecompressor.setScalingFactor()
), rather than implicitly using awkward "desired width"/"desired height" arguments. - Partial image decompression has been implemented, using a new function/method (
tj3SetCroppingRegion()
/TJDecompressor.setCroppingRegion()
) and a new TJBench option (-crop
.) - The JPEG colorspace can now be specified explicitly when compressing, using a new API parameter (
TJPARAM_COLORSPACE
/TJ.PARAM_COLORSPACE
.) This allows JPEG images with the RGB and CMYK colorspaces to be created. - TJBench no longer generates error/difference images, since identical functionality is already available in ImageMagick.
- JPEG images with unknown subsampling configurations can now be fully decompressed into packed-pixel images or losslessly transformed (with the exception of lossless cropping.) They cannot currently be partially decompressed or decompressed into planar YUV images.
tj3Destroy()
now silently accepts a NULL handle.tj3Alloc()
andtj3Free()
now return/accept void pointers, asmalloc()
andfree()
do.- The C image I/O functions now accept a TurboJPEG instance handle, which is used to transmit/receive API parameter values and to receive error information.
- All C function names are now prefixed with
-
Added support for 8-bit-per-component, 12-bit-per-component, and 16-bit-per-component lossless JPEG images. A new libjpeg API function (
jpeg_enable_lossless()
), TurboJPEG API parameters (TJPARAM_LOSSLESS
/TJ.PARAM_LOSSLESS
,TJPARAM_LOSSLESSPSV
/TJ.PARAM_LOSSLESSPSV
, andTJPARAM_LOSSLESSPT
/TJ.PARAM_LOSSLESSPT
), and a cjpeg/TJBench option (-lossless
) can be used to create a lossless JPEG image. (Decompression of lossless JPEG images is handled automatically.) Refer to libjpeg.txt, usage.txt, and the TurboJPEG API documentation for more details. -
Added support for 12-bit-per-component (lossy and lossless) and 16-bit-per-component (lossless) JPEG images to the libjpeg and TurboJPEG APIs:
- The existing
data_precision
field injpeg_compress_struct
andjpeg_decompress_struct
has been repurposed to enable the creation of 12-bit-per-component and 16-bit-per-component JPEG images or to detect whether a 12-bit-per-component or 16-bit-per-component JPEG image is being decompressed. - New 12-bit-per-component and 16-bit-per-component versions of
jpeg_write_scanlines()
andjpeg_read_scanlines()
, as well as new 12-bit-per-component versions ofjpeg_write_raw_data()
,jpeg_skip_scanlines()
,jpeg_crop_scanline()
, andjpeg_read_raw_data()
, provide interfaces for compressing from/decompressing to 12-bit-per-component and 16-bit-per-component packed-pixel and planar YUV image buffers. - New 12-bit-per-component and 16-bit-per-component compression, decompression, and image I/O functions/methods have been added to the TurboJPEG API, and a new API parameter (
TJPARAM_PRECISION
/TJ.PARAM_PRECISION
) can be used to query the data precision of a JPEG image. (YUV functions are currently limited to 8-bit data precision but can be expanded to accommodate 12-bit data precision in the future, if such is deemed beneficial.) - A new cjpeg and TJBench command-line argument (
-precision
) can be used to create a 12-bit-per-component or 16-bit-per-component JPEG image. (Decompression and transformation of 12-bit-per-component and 16-bit-per-component JPEG images is handled automatically.)
Refer to libjpeg.txt, usage.txt, and the TurboJPEG API documentation for more details.
- The existing
2.1.5.1
Assets
- libjpeg-turbo-2.1.5.1.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Support
Code Quality: Stable
Current Support Category: Extended
Release Notes
Significant changes relative to 2.1.5:
- The SIMD dispatchers in libjpeg-turbo 2.1.4 and prior stored the list of supported SIMD instruction sets in a global variable, which caused an innocuous race condition whereby the variable could have been initialized multiple times if
jpeg_start_*compress()
was called simultaneously in multiple threads. libjpeg-turbo 2.1.5 included an undocumented attempt to fix this race condition by making the SIMD support variable thread-local. However, that caused another issue whereby, ifjpeg_start_*compress()
was called in one thread andjpeg_read_*()
orjpeg_write_*()
was called in a second thread, the SIMD support variable was never initialized in the second thread. On x86 systems, this led the second thread to incorrectly assume that AVX2 instructions were always available, and when it attempted to use those instructions on older x86 CPUs that do not support them, an illegal instruction error occurred. The SIMD dispatchers now ensure that the SIMD support variable is initialized before dispatching based on its value.
Significant changes relative to 2.1.4:
-
Fixed issues in the build system whereby, when using the Ninja Multi-Config CMake generator, a static build of libjpeg-turbo (a build in which
ENABLE_SHARED
is0
) could not be installed, a Windows installer could not be built, and the Java regression tests failed. -
Fixed a regression introduced by 2.0 beta1[15] that caused a buffer overrun in the progressive Huffman encoder when attempting to transform a specially-crafted malformed 12-bit-per-component JPEG image into a progressive 12-bit-per-component JPEG image using a 12-bit-per-component build of libjpeg-turbo (
-DWITH_12BIT=1
.) Given that the buffer overrun was fully contained within the progressive Huffman encoder structure and did not cause a segfault or other user-visible errant behavior, given that the lossless transformer (unlike the decompressor) is not generally exposed to arbitrary data exploits, and given that 12-bit-per-component builds of libjpeg-turbo are uncommon, this issue did not likely pose a security risk. -
Fixed an issue whereby, when using a 12-bit-per-component build of libjpeg-turbo (
-DWITH_12BIT=1
), passing samples with values greater than 4095 or less than 0 tojpeg_write_scanlines()
caused a buffer overrun or underrun in the RGB-to-YCbCr color converter. -
Fixed a floating point exception that occurred when attempting to use the jpegtran
-drop
and-trim
options to losslessly transform a specially-crafted malformed JPEG image. -
Fixed an issue in
tjBufSizeYUV2()
whereby it returned a bogus result, rather than throwing an error, if thealign
parameter was not a power of 2. Fixed a similar issue intjCompressFromYUV()
whereby it generated a corrupt JPEG image in certain cases, rather than throwing an error, if thealign
parameter was not a power of 2. -
Fixed an issue whereby
tjDecompressToYUV2()
, which is a wrapper fortjDecompressToYUVPlanes()
, used the desired YUV image dimensions rather than the actual scaled image dimensions when computing the plane pointers and strides to pass totjDecompressToYUVPlanes()
. This caused a buffer overrun and subsequent segfault if the desired image dimensions exceeded the scaled image dimensions. -
Fixed an issue whereby, when decompressing a 12-bit-per-component JPEG image (
-DWITH_12BIT=1
) using an alpha-enabled output color space such asJCS_EXT_RGBA
, the alpha channel was set to 255 rather than 4095. -
Fixed an issue whereby the Java version of TJBench did not accept a range of quality values.
-
Fixed an issue whereby, when
-progressive
was passed to TJBench, the JPEG input image was not transformed into a progressive JPEG image prior to decompression.
2.1.90 (3.0 beta1)
Assets
- libjpeg-turbo-2.1.90.tar.gz is the official source tarball for this release. The automatically generated "Source code" assets are not supported.
- Refer to https://libjpeg-turbo.org/Downloads/DigitalSignatures for information regarding the methods used to sign the files in this release and instructions for verifying the signatures.
- Refer to https://libjpeg-turbo.org/Documentation/OfficialBinaries for information regarding the compatibility of the binary packages in this release.
Packaging Changes
- The RPM packages now contain SHA-256 header and payload digests. This fixes an issue whereby the RPM signatures could not be verified on Red Hat Enterprise Linux with FIPS mode enabled. The RPM packages now require GLIBC 2.17 or later.
Support
Code Quality: Beta
Current Support Category: EOL
Release Sponsors
This release was made possible via funding from MathWorks.
Release Notes
Significant changes relative to 2.1.5:
-
Significantly sped up the computation of optimal Huffman tables. This speeds up the compression of tiny images by as much as 2x and provides a noticeable speedup for images as large as 256x256 when using optimal Huffman tables.
-
All deprecated fields, constructors, and methods in the TurboJPEG Java API have been removed.
-
Arithmetic entropy coding is now supported with 12-bit-per-component JPEG images.
-
Overhauled the TurboJPEG API to address long-standing limitations and to make the API more extensible and intuitive:
- All C function names are now prefixed with
tj3
, and all version suffixes have been removed from the function names. Future API overhauls will increment the prefix totj4
, etc., thus retaining backward API/ABI compatibility without versioning each individual function. - Stateless boolean flags have been replaced with stateful integer API parameters, the values of which persist between function calls. New functions/methods (
tj3Set()
/TJCompressor.set()
/TJDecompressor.set()
andtj3Get()
/TJCompressor.get()
/TJDecompressor.get()
) can be used to set and query the value of a particular API parameter. - The JPEG quality and subsampling are now implemented using API parameters rather than stateless function arguments (C) or dedicated set/get methods (Java.)
tj3DecompressHeader()
now stores all relevant information about the JPEG image, including the width, height, subsampling type, entropy coding algorithm, etc., in API parameters rather than returning that information through pointer arguments.TJFLAG_LIMITSCANS
/TJ.FLAG_LIMITSCANS
has been reimplemented as an API parameter (TJPARAM_SCANLIMIT
/TJ.PARAM_SCANLIMIT
) that allows the number of scans to be specified.- Huffman table optimization can now be specified, using a new API parameter (
TJPARAM_OPTIMIZE
/TJ.PARAM_OPTIMIZE
), a new transform option (TJXOPT_OPTIMIZE
/TJTransform.OPT_OPTIMIZE
), and a new TJBench option (-optimize
.) - Arithmetic entropy coding can now be specified or queried, using a new API parameter (
TJPARAM_ARITHMETIC
/TJ.PARAM_ARITHMETIC
), a new transform option (TJXOPT_ARITHMETIC
/TJTransform.OPT_ARITHMETIC
), and a new TJBench option (-arithmetic
.) - The restart marker interval can now be specified, using new API parameters (
TJPARAM_RESTARTROWS
/TJ.PARAM_RESTARTROWS
andTJPARAM_RESTARTBLOCKS
/TJ.PARAM_RESTARTBLOCKS
) and a new TJBench option (-restart
.) - Pixel density can now be specified or queried, using new API parameters (
TJPARAM_XDENSITY
/TJ.PARAM_XDENSITY
,TJPARAM_YDENSITY
/TJ.PARAM_YDENSITY
, andTJPARAM_DENSITYUNITS
/TJ.PARAM_DENSITYUNITS
.) - The accurate DCT/IDCT algorithms are now the default for both compression and decompression, since the "fast" algorithms are considered to be a legacy feature. (The "fast" algorithms do not pass the ISO compliance tests, and those algorithms are not any faster than the accurate algorithms on modern x86 CPUs.)
- All C initialization functions have been combined into a single function (
tj3Init()
) that accepts an integer argument specifying the subsystems to initialize. - All C functions now use the
const
keyword for pointer arguments that point to unmodified buffers (and for both dimensions of pointer arguments that point to sets of unmodified buffers.) - All C functions now use
size_t
rather thanunsigned long
to represent buffer sizes, for compatibility withmalloc()
and to avoid disparities in the size ofunsigned long
between LP64 (Un*x) and LLP64 (Windows) operating systems. - All C buffer size functions now return 0 if an error occurs, rather than trying to awkwardly return -1 in an unsigned data type (which could easily be misinterpreted as a very large value.)
- Decompression scaling is now enabled explicitly, using a new function/method (
tj3SetScalingFactor()
/TJDecompressor.setScalingFactor()
), rather than implicitly using awkward "desired width"/"desired height" arguments. - Partial image decompression has been implemented, using a new function/method (
tj3SetCroppingRegion()
/TJDecompressor.setCroppingRegion()
) and a new TJBench option (-crop
.) - The JPEG colorspace can now be specified explicitly when compressing, using a new API parameter (
TJPARAM_COLORSPACE
/TJ.PARAM_COLORSPACE
.) This allows JPEG images with the RGB and CMYK colorspaces to be created. - TJBench no longer generates error/difference images, since identical functionality is already available in ImageMagick.
- JPEG images with unknown subsampling configurations can now be fully decompressed into packed-pixel images or losslessly transformed (with the exception of lossless cropping.) They cannot currently be partially decompressed or decompressed into planar YUV images.
tj3Destroy()
now silently accepts a NULL handle.tj3Alloc()
andtj3Free()
now return/accept void pointers, asmalloc()
andfree()
do.- The C image I/O functions now accept a TurboJPEG instance handle, which is used to transmit/receive API parameter values and to receive error information.
- All C function names are now prefixed with
-
Added support for 8-bit-per-component, 12-bit-per-component, and 16-bit-per-component lossless JPEG images. A new libjpeg API function (
jpeg_enable_lossless()
), TurboJPEG API parameters (TJPARAM_LOSSLESS
/TJ.PARAM_LOSSLESS
,TJPARAM_LOSSLESSPSV
/TJ.PARAM_LOSSLESSPSV
, andTJPARAM_LOSSLESSPT
/TJ.PARAM_LOSSLESSPT
), and a cjpeg/TJBench option (-lossless
) can be used to create a lossless JPEG image. (Decompression of lossless JPEG images is handled automatically.) Refer to libjpeg.txt, usage.txt, and the TurboJPEG API documentation for more details. -
Added support for 12-bit-per-component (lossy and lossless) and 16-bit-per-component (lossless) JPEG images to the libjpeg and TurboJPEG APIs:
- The existing
data_precision
field injpeg_compress_struct
andjpeg_decompress_struct
has been repurposed to enable the creation of 12-bit-per-component and 16-bit-per-component JPEG images or to detect whether a 12-bit-per-component or 16-bit-per-component JPEG image is being decompressed. - New 12-bit-per-component and 16-bit-per-component versions of
jpeg_write_scanlines()
andjpeg_read_scanlines()
, as well as new 12-bit-per-component versions ofjpeg_write_raw_data()
,jpeg_skip_scanlines()
,jpeg_crop_scanline()
, andjpeg_read_raw_data()
, provide interfaces for compressing from/decompressing to 12-bit-per-component and 16-bit-per-component packed-pixel and planar YUV image buffers. - New 12-bit-per-component and 16-bit-per-component compression, decompression, and image I/O functions/methods have been added to the TurboJPEG API, and a new API parameter (
TJPARAM_PRECISION
/TJ.PARAM_PRECISION
) can be used to query the data precision of a JPEG image. (YUV functions are currently limited to 8-bit data precision but can be expanded to accommodate 12-bit data precision in the future, if such is deemed beneficial.) - A new cjpeg and TJBench command-line argument (
-precision
) can be used to create a 12-bit-per-component or 16-bit-per-component JPEG image. (Decompression and transformation of 12-bit-per-component and 16-bit-per-component JPEG images is handled automatically.)
Refer to libjpeg.txt, usage.txt, and the TurboJPEG API documentation for more details.
- The existing