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.