|
shun-iwasawa |
82a8f5 |
Background
|
|
shun-iwasawa |
82a8f5 |
==========
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate
|
|
shun-iwasawa |
82a8f5 |
baseline JPEG compression and decompression on x86, x86-64, Arm, PowerPC, and
|
|
shun-iwasawa |
82a8f5 |
MIPS systems, as well as progressive JPEG compression on x86 and x86-64
|
|
shun-iwasawa |
82a8f5 |
systems. On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg,
|
|
shun-iwasawa |
82a8f5 |
all else being equal. On other types of systems, libjpeg-turbo can still
|
|
shun-iwasawa |
82a8f5 |
outperform libjpeg by a significant amount, by virtue of its highly-optimized
|
|
shun-iwasawa |
82a8f5 |
Huffman coding routines. In many cases, the performance of libjpeg-turbo
|
|
shun-iwasawa |
82a8f5 |
rivals that of proprietary high-speed JPEG codecs.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo implements both the traditional libjpeg API as well as the less
|
|
shun-iwasawa |
82a8f5 |
powerful but more straightforward TurboJPEG API. libjpeg-turbo also features
|
|
shun-iwasawa |
82a8f5 |
colorspace extensions that allow it to compress from/decompress to 32-bit and
|
|
shun-iwasawa |
82a8f5 |
big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java
|
|
shun-iwasawa |
82a8f5 |
interface.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated
|
|
shun-iwasawa |
82a8f5 |
derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and
|
|
shun-iwasawa |
82a8f5 |
VirtualGL projects made numerous enhancements to the codec in 2009, and in
|
|
shun-iwasawa |
82a8f5 |
early 2010, libjpeg-turbo spun off into an independent project, with the goal
|
|
shun-iwasawa |
82a8f5 |
of making high-speed JPEG compression/decompression technology available to a
|
|
shun-iwasawa |
82a8f5 |
broader range of users and developers.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
License
|
|
shun-iwasawa |
82a8f5 |
=======
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo is covered by three compatible BSD-style open source licenses.
|
|
shun-iwasawa |
82a8f5 |
Refer to [LICENSE.md](LICENSE.md) for a roll-up of license terms.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Building libjpeg-turbo
|
|
shun-iwasawa |
82a8f5 |
======================
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Refer to [BUILDING.md](BUILDING.md) for complete instructions.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Using libjpeg-turbo
|
|
shun-iwasawa |
82a8f5 |
===================
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo includes two APIs that can be used to compress and decompress
|
|
shun-iwasawa |
82a8f5 |
JPEG images:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **TurboJPEG API**
|
|
shun-iwasawa |
82a8f5 |
This API provides an easy-to-use interface for compressing and decompressing
|
|
shun-iwasawa |
82a8f5 |
JPEG images in memory. It also provides some functionality that would not be
|
|
shun-iwasawa |
82a8f5 |
straightforward to achieve using the underlying libjpeg API, such as
|
|
shun-iwasawa |
82a8f5 |
generating planar YUV images and performing multiple simultaneous lossless
|
|
shun-iwasawa |
82a8f5 |
transforms on an image. The Java interface for libjpeg-turbo is written on
|
|
shun-iwasawa |
82a8f5 |
top of the TurboJPEG API. The TurboJPEG API is recommended for first-time
|
|
shun-iwasawa |
82a8f5 |
users of libjpeg-turbo. Refer to [tjexample.c](tjexample.c) and
|
|
shun-iwasawa |
82a8f5 |
[TJExample.java](java/TJExample.java) for examples of its usage and to
|
|
shun-iwasawa |
82a8f5 |
<http: documentation="" libjpeg-turbo.org=""> for API documentation.</http:>
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API**
|
|
shun-iwasawa |
82a8f5 |
This is the de facto industry-standard API for compressing and decompressing
|
|
shun-iwasawa |
82a8f5 |
JPEG images. It is more difficult to use than the TurboJPEG API but also
|
|
shun-iwasawa |
82a8f5 |
more powerful. The libjpeg API implementation in libjpeg-turbo is both
|
|
shun-iwasawa |
82a8f5 |
API/ABI-compatible and mathematically compatible with libjpeg v6b. It can
|
|
shun-iwasawa |
82a8f5 |
also optionally be configured to be API/ABI-compatible with libjpeg v7 and v8
|
|
shun-iwasawa |
82a8f5 |
(see below.) Refer to [cjpeg.c](cjpeg.c) and [djpeg.c](djpeg.c) for examples
|
|
shun-iwasawa |
82a8f5 |
of its usage and to [libjpeg.txt](libjpeg.txt) for API documentation.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
There is no significant performance advantage to either API when both are used
|
|
shun-iwasawa |
82a8f5 |
to perform similar operations.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Colorspace Extensions
|
|
shun-iwasawa |
82a8f5 |
---------------------
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo includes extensions that allow JPEG images to be compressed
|
|
shun-iwasawa |
82a8f5 |
directly from (and decompressed directly to) buffers that use BGR, BGRX,
|
|
shun-iwasawa |
82a8f5 |
RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new
|
|
shun-iwasawa |
82a8f5 |
colorspace constants:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_RGB /* red/green/blue */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_RGBX /* red/green/blue/x */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_BGR /* blue/green/red */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_BGRX /* blue/green/red/x */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_XBGR /* x/blue/green/red */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_XRGB /* x/red/green/blue */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_RGBA /* red/green/blue/alpha */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_BGRA /* blue/green/red/alpha */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_ABGR /* alpha/blue/green/red */
|
|
shun-iwasawa |
82a8f5 |
JCS_EXT_ARGB /* alpha/red/green/blue */
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Setting `cinfo.in_color_space` (compression) or `cinfo.out_color_space`
|
|
shun-iwasawa |
82a8f5 |
(decompression) to one of these values will cause libjpeg-turbo to read the
|
|
shun-iwasawa |
82a8f5 |
red, green, and blue values from (or write them to) the appropriate position in
|
|
shun-iwasawa |
82a8f5 |
the pixel when compressing from/decompressing to an RGB buffer.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Your application can check for the existence of these extensions at compile
|
|
shun-iwasawa |
82a8f5 |
time with:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
#ifdef JCS_EXTENSIONS
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
At run time, attempting to use these extensions with a libjpeg implementation
|
|
shun-iwasawa |
82a8f5 |
that does not support them will result in a "Bogus input colorspace" error.
|
|
shun-iwasawa |
82a8f5 |
Applications can trap this error in order to test whether run-time support is
|
|
shun-iwasawa |
82a8f5 |
available for the colorspace extensions.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
|
|
shun-iwasawa |
82a8f5 |
X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
|
|
shun-iwasawa |
82a8f5 |
can set that byte to whatever value it wishes. If an application expects the X
|
|
shun-iwasawa |
82a8f5 |
byte to be used as an alpha channel, then it should specify `JCS_EXT_RGBA`,
|
|
shun-iwasawa |
82a8f5 |
`JCS_EXT_BGRA`, `JCS_EXT_ABGR`, or `JCS_EXT_ARGB`. When these colorspace
|
|
shun-iwasawa |
82a8f5 |
constants are used, the X byte is guaranteed to be 0xFF, which is interpreted
|
|
shun-iwasawa |
82a8f5 |
as opaque.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Your application can check for the existence of the alpha channel colorspace
|
|
shun-iwasawa |
82a8f5 |
extensions at compile time with:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
#ifdef JCS_ALPHA_EXTENSIONS
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
[jcstest.c](jcstest.c), located in the libjpeg-turbo source tree, demonstrates
|
|
shun-iwasawa |
82a8f5 |
how to check for the existence of the colorspace extensions at compile time and
|
|
shun-iwasawa |
82a8f5 |
run time.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg v7 and v8 API/ABI Emulation
|
|
shun-iwasawa |
82a8f5 |
-----------------------------------
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
With libjpeg v7 and v8, new features were added that necessitated extending the
|
|
shun-iwasawa |
82a8f5 |
compression and decompression structures. Unfortunately, due to the exposed
|
|
shun-iwasawa |
82a8f5 |
nature of those structures, extending them also necessitated breaking backward
|
|
shun-iwasawa |
82a8f5 |
ABI compatibility with previous libjpeg releases. Thus, programs that were
|
|
shun-iwasawa |
82a8f5 |
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
|
|
shun-iwasawa |
82a8f5 |
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are not
|
|
shun-iwasawa |
82a8f5 |
as widely used as v6b, enough programs (including a few Linux distros) made
|
|
shun-iwasawa |
82a8f5 |
the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
|
|
shun-iwasawa |
82a8f5 |
in libjpeg-turbo. It should be noted, however, that this feature was added
|
|
shun-iwasawa |
82a8f5 |
primarily so that applications that had already been compiled to use libjpeg
|
|
shun-iwasawa |
82a8f5 |
v7+ could take advantage of accelerated baseline JPEG encoding/decoding
|
|
shun-iwasawa |
82a8f5 |
without recompiling. libjpeg-turbo does not claim to support all of the
|
|
shun-iwasawa |
82a8f5 |
libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all
|
|
shun-iwasawa |
82a8f5 |
cases (see below.)
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
By passing an argument of `-DWITH_JPEG7=1` or `-DWITH_JPEG8=1` to `cmake`, you
|
|
shun-iwasawa |
82a8f5 |
can build a version of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so
|
|
shun-iwasawa |
82a8f5 |
that programs that are built against libjpeg v7 or v8 can be run with
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo. The following section describes which libjpeg v7+ features are
|
|
shun-iwasawa |
82a8f5 |
supported and which aren't.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
### Support for libjpeg v7 and v8 Features
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
#### Fully supported
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: IDCT scaling extensions in decompressor**
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8,
|
|
shun-iwasawa |
82a8f5 |
1/2, 5/8, 3/4, 7/8, 9/8, 5/4, 11/8, 3/2, 13/8, 7/4, 15/8, and 2/1 (only 1/4
|
|
shun-iwasawa |
82a8f5 |
and 1/2 are SIMD-accelerated.)
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: Arithmetic coding**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: In-memory source and destination managers**
|
|
shun-iwasawa |
82a8f5 |
See notes below.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **cjpeg: Separate quality settings for luminance and chrominance**
|
|
shun-iwasawa |
82a8f5 |
Note that the libpjeg v7+ API was extended to accommodate this feature only
|
|
shun-iwasawa |
82a8f5 |
for convenience purposes. It has always been possible to implement this
|
|
shun-iwasawa |
82a8f5 |
feature with libjpeg v6b (see rdswitch.c for an example.)
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **cjpeg: 32-bit BMP support**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **cjpeg: `-rgb` option**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **jpegtran: Lossless cropping**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **jpegtran: `-perfect` option**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **jpegtran: Forcing width/height when performing lossless crop**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **rdjpgcom: `-raw` option**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **rdjpgcom: Locale awareness**
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
#### Not supported
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
NOTE: As of this writing, extensive research has been conducted into the
|
|
shun-iwasawa |
82a8f5 |
usefulness of DCT scaling as a means of data reduction and SmartScale as a
|
|
shun-iwasawa |
82a8f5 |
means of quality improvement. Readers are invited to peruse the research at
|
|
shun-iwasawa |
82a8f5 |
<http: about="" smartscale="" www.libjpeg-turbo.org=""> and draw their own conclusions,</http:>
|
|
shun-iwasawa |
82a8f5 |
but it is the general belief of our project that these features have not
|
|
shun-iwasawa |
82a8f5 |
demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: DCT scaling in compressor**
|
|
shun-iwasawa |
82a8f5 |
`cinfo.scale_num` and `cinfo.scale_denom` are silently ignored.
|
|
shun-iwasawa |
82a8f5 |
There is no technical reason why DCT scaling could not be supported when
|
|
shun-iwasawa |
82a8f5 |
emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see
|
|
shun-iwasawa |
82a8f5 |
below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and
|
|
shun-iwasawa |
82a8f5 |
8/9 would be available, which is of limited usefulness.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: SmartScale**
|
|
shun-iwasawa |
82a8f5 |
`cinfo.block_size` is silently ignored.
|
|
shun-iwasawa |
82a8f5 |
SmartScale is an extension to the JPEG format that allows for DCT block
|
|
shun-iwasawa |
82a8f5 |
sizes other than 8x8. Providing support for this new format would be
|
|
shun-iwasawa |
82a8f5 |
feasible (particularly without full acceleration.) However, until/unless
|
|
shun-iwasawa |
82a8f5 |
the format becomes either an official industry standard or, at minimum, an
|
|
shun-iwasawa |
82a8f5 |
accepted solution in the community, we are hesitant to implement it, as
|
|
shun-iwasawa |
82a8f5 |
there is no sense of whether or how it might change in the future. It is
|
|
shun-iwasawa |
82a8f5 |
our belief that SmartScale has not demonstrated sufficient usefulness as a
|
|
shun-iwasawa |
82a8f5 |
lossless format nor as a means of quality enhancement, and thus our primary
|
|
shun-iwasawa |
82a8f5 |
interest in providing this feature would be as a means of supporting
|
|
shun-iwasawa |
82a8f5 |
additional DCT scaling factors.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **libjpeg API: Fancy downsampling in compressor**
|
|
shun-iwasawa |
82a8f5 |
`cinfo.do_fancy_downsampling` is silently ignored.
|
|
shun-iwasawa |
82a8f5 |
This requires the DCT scaling feature, which is not supported.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **jpegtran: Scaling**
|
|
shun-iwasawa |
82a8f5 |
This requires both the DCT scaling and SmartScale features, which are not
|
|
shun-iwasawa |
82a8f5 |
supported.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- **Lossless RGB JPEG files**
|
|
shun-iwasawa |
82a8f5 |
This requires the SmartScale feature, which is not supported.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
### What About libjpeg v9?
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
libjpeg v9 introduced yet another field to the JPEG compression structure
|
|
shun-iwasawa |
82a8f5 |
(`color_transform`), thus making the ABI backward incompatible with that of
|
|
shun-iwasawa |
82a8f5 |
libjpeg v8. This new field was introduced solely for the purpose of supporting
|
|
shun-iwasawa |
82a8f5 |
lossless SmartScale encoding. Furthermore, there was actually no reason to
|
|
shun-iwasawa |
82a8f5 |
extend the API in this manner, as the color transform could have just as easily
|
|
shun-iwasawa |
82a8f5 |
been activated by way of a new JPEG colorspace constant, thus preserving
|
|
shun-iwasawa |
82a8f5 |
backward ABI compatibility.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Our research (see link above) has shown that lossless SmartScale does not
|
|
shun-iwasawa |
82a8f5 |
generally accomplish anything that can't already be accomplished better with
|
|
shun-iwasawa |
82a8f5 |
existing, standard lossless formats. Therefore, at this time it is our belief
|
|
shun-iwasawa |
82a8f5 |
that there is not sufficient technical justification for software projects to
|
|
shun-iwasawa |
82a8f5 |
upgrade from libjpeg v8 to libjpeg v9, and thus there is not sufficient
|
|
shun-iwasawa |
82a8f5 |
technical justification for us to emulate the libjpeg v9 ABI.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
In-Memory Source/Destination Managers
|
|
shun-iwasawa |
82a8f5 |
-------------------------------------
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
By default, libjpeg-turbo 1.3 and later includes the `jpeg_mem_src()` and
|
|
shun-iwasawa |
82a8f5 |
`jpeg_mem_dest()` functions, even when not emulating the libjpeg v8 API/ABI.
|
|
shun-iwasawa |
82a8f5 |
Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8
|
|
shun-iwasawa |
82a8f5 |
API/ABI emulation in order to use the in-memory source/destination managers,
|
|
shun-iwasawa |
82a8f5 |
but several projects requested that those functions be included when emulating
|
|
shun-iwasawa |
82a8f5 |
the libjpeg v6b API/ABI as well. This allows the use of those functions by
|
|
shun-iwasawa |
82a8f5 |
programs that need them, without breaking ABI compatibility for programs that
|
|
shun-iwasawa |
82a8f5 |
don't, and it allows those functions to be provided in the "official"
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo binaries.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Those who are concerned about maintaining strict conformance with the libjpeg
|
|
shun-iwasawa |
82a8f5 |
v6b or v7 API can pass an argument of `-DWITH_MEM_SRCDST=0` to `cmake` prior to
|
|
shun-iwasawa |
82a8f5 |
building libjpeg-turbo. This will restore the pre-1.3 behavior, in which
|
|
shun-iwasawa |
82a8f5 |
`jpeg_mem_src()` and `jpeg_mem_dest()` are only included when emulating the
|
|
shun-iwasawa |
82a8f5 |
libjpeg v8 API/ABI.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
On Un*x systems, including the in-memory source/destination managers changes
|
|
shun-iwasawa |
82a8f5 |
the dynamic library version from 62.2.0 to 62.3.0 if using libjpeg v6b API/ABI
|
|
shun-iwasawa |
82a8f5 |
emulation and from 7.2.0 to 7.3.0 if using libjpeg v7 API/ABI emulation.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Note that, on most Un*x systems, the dynamic linker will not look for a
|
|
shun-iwasawa |
82a8f5 |
function in a library until that function is actually used. Thus, if a program
|
|
shun-iwasawa |
82a8f5 |
is built against libjpeg-turbo 1.3+ and uses `jpeg_mem_src()` or
|
|
shun-iwasawa |
82a8f5 |
`jpeg_mem_dest()`, that program will not fail if run against an older version
|
|
shun-iwasawa |
82a8f5 |
of libjpeg-turbo or against libjpeg v7- until the program actually tries to
|
|
shun-iwasawa |
82a8f5 |
call `jpeg_mem_src()` or `jpeg_mem_dest()`. Such is not the case on Windows.
|
|
shun-iwasawa |
82a8f5 |
If a program is built against the libjpeg-turbo 1.3+ DLL and uses
|
|
shun-iwasawa |
82a8f5 |
`jpeg_mem_src()` or `jpeg_mem_dest()`, then it must use the libjpeg-turbo 1.3+
|
|
shun-iwasawa |
82a8f5 |
DLL at run time.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Both cjpeg and djpeg have been extended to allow testing the in-memory
|
|
shun-iwasawa |
82a8f5 |
source/destination manager functions. See their respective man pages for more
|
|
shun-iwasawa |
82a8f5 |
details.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Mathematical Compatibility
|
|
shun-iwasawa |
82a8f5 |
==========================
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
For the most part, libjpeg-turbo should produce identical output to libjpeg
|
|
shun-iwasawa |
82a8f5 |
v6b. The one exception to this is when using the floating point DCT/IDCT, in
|
|
shun-iwasawa |
82a8f5 |
which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the
|
|
shun-iwasawa |
82a8f5 |
following reasons:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so
|
|
shun-iwasawa |
82a8f5 |
slightly more accurate than the implementation in libjpeg v6b, but not by
|
|
shun-iwasawa |
82a8f5 |
any amount perceptible to human vision (generally in the range of 0.01 to
|
|
shun-iwasawa |
82a8f5 |
0.08 dB gain in PNSR.)
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- When not using the SIMD extensions, libjpeg-turbo uses the more accurate
|
|
shun-iwasawa |
82a8f5 |
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
|
|
shun-iwasawa |
82a8f5 |
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
|
|
shun-iwasawa |
82a8f5 |
however, that this algorithm basically brings the accuracy of the floating
|
|
shun-iwasawa |
82a8f5 |
point IDCT in line with the accuracy of the accurate integer IDCT. The
|
|
shun-iwasawa |
82a8f5 |
floating point DCT/IDCT algorithms are mainly a legacy feature, and they do
|
|
shun-iwasawa |
82a8f5 |
not produce significantly more accuracy than the accurate integer algorithms
|
|
shun-iwasawa |
82a8f5 |
(to put numbers on this, the typical difference in PNSR between the two
|
|
shun-iwasawa |
82a8f5 |
algorithms is less than 0.10 dB, whereas changing the quality level by 1 in
|
|
shun-iwasawa |
82a8f5 |
the upper range of the quality scale is typically more like a 1.0 dB
|
|
shun-iwasawa |
82a8f5 |
difference.)
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- If the floating point algorithms in libjpeg-turbo are not implemented using
|
|
shun-iwasawa |
82a8f5 |
SIMD instructions on a particular platform, then the accuracy of the
|
|
shun-iwasawa |
82a8f5 |
floating point DCT/IDCT can depend on the compiler settings.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood it is
|
|
shun-iwasawa |
82a8f5 |
still using the same algorithms as libjpeg v6b, so there are several specific
|
|
shun-iwasawa |
82a8f5 |
cases in which libjpeg-turbo cannot be expected to produce the same output as
|
|
shun-iwasawa |
82a8f5 |
libjpeg v8:
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
|
|
shun-iwasawa |
82a8f5 |
implements those scaling algorithms differently than libjpeg v6b does, and
|
|
shun-iwasawa |
82a8f5 |
libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- When using chrominance subsampling, because libjpeg v8 implements this
|
|
shun-iwasawa |
82a8f5 |
with its DCT/IDCT scaling algorithms rather than with a separate
|
|
shun-iwasawa |
82a8f5 |
downsampling/upsampling algorithm. In our testing, the subsampled/upsampled
|
|
shun-iwasawa |
82a8f5 |
output of libjpeg v8 is less accurate than that of libjpeg v6b for this
|
|
shun-iwasawa |
82a8f5 |
reason.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
|
|
shun-iwasawa |
82a8f5 |
"non-smooth") chrominance upsampling, because libjpeg v8 does not support
|
|
shun-iwasawa |
82a8f5 |
merged upsampling with scaling factors > 1.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Performance Pitfalls
|
|
shun-iwasawa |
82a8f5 |
====================
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Restart Markers
|
|
shun-iwasawa |
82a8f5 |
---------------
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
|
|
shun-iwasawa |
82a8f5 |
in a way that makes the rest of the libjpeg infrastructure happy, so it is
|
|
shun-iwasawa |
82a8f5 |
necessary to use the slow Huffman decoder when decompressing a JPEG image that
|
|
shun-iwasawa |
82a8f5 |
has restart markers. This can cause the decompression performance to drop by
|
|
shun-iwasawa |
82a8f5 |
as much as 20%, but the performance will still be much greater than that of
|
|
shun-iwasawa |
82a8f5 |
libjpeg. Many consumer packages, such as Photoshop, use restart markers when
|
|
shun-iwasawa |
82a8f5 |
generating JPEG images, so images generated by those programs will experience
|
|
shun-iwasawa |
82a8f5 |
this issue.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Fast Integer Forward DCT at High Quality Levels
|
|
shun-iwasawa |
82a8f5 |
-----------------------------------------------
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
The algorithm used by the SIMD-accelerated quantization function cannot produce
|
|
shun-iwasawa |
82a8f5 |
correct results whenever the fast integer forward DCT is used along with a JPEG
|
|
shun-iwasawa |
82a8f5 |
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
|
|
shun-iwasawa |
82a8f5 |
function in those cases. This causes performance to drop by as much as 40%.
|
|
shun-iwasawa |
82a8f5 |
It is therefore strongly advised that you use the accurate integer forward DCT
|
|
shun-iwasawa |
82a8f5 |
whenever encoding images with a JPEG quality of 98 or higher.
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Memory Debugger Pitfalls
|
|
shun-iwasawa |
82a8f5 |
========================
|
|
shun-iwasawa |
82a8f5 |
|
|
shun-iwasawa |
82a8f5 |
Valgrind and Memory Sanitizer (MSan) can generate false positives
|
|
shun-iwasawa |
82a8f5 |
(specifically, incorrect reports of uninitialized memory accesses) when used
|
|
shun-iwasawa |
82a8f5 |
with libjpeg-turbo's SIMD extensions. It is generally recommended that the
|
|
shun-iwasawa |
82a8f5 |
SIMD extensions be disabled, either by passing an argument of `-DWITH_SIMD=0`
|
|
shun-iwasawa |
82a8f5 |
to `cmake` when configuring the build or by setting the environment variable
|
|
shun-iwasawa |
82a8f5 |
`JSIMD_FORCENONE` to `1` at run time, when testing libjpeg-turbo with Valgrind,
|
|
shun-iwasawa |
82a8f5 |
MSan, or other memory debuggers.
|