1
*******************************************************************************
3
*******************************************************************************
5
libjpeg-turbo is a derivative of libjpeg which uses SIMD instructions (MMX,
6
SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86
7
and x86-64 systems. On such systems, libjpeg-turbo is generally 2-4x as fast
8
as the unmodified version of libjpeg, all else being equal.
10
libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but
11
the TigerVNC and VirtualGL projects made numerous enhancements to the codec in
12
2009, including improved support for Mac OS X, 64-bit support, support for
13
32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman
14
encoding/decoding, and various bug fixes. The goal was to produce a fully open
15
source codec that could replace the partially closed source TurboJPEG/IPP codec
16
used by VirtualGL and TurboVNC. libjpeg-turbo generally performs in the range
17
of 80-120% of TurboJPEG/IPP. It is faster in some areas but slower in others.
19
In early 2010, libjpeg-turbo spun off into its own independent project, with
20
the goal of making high-speed JPEG compression/decompression technology
21
available to a broader range of users and developers. The libjpeg-turbo shared
22
libraries can be used as drop-in replacements for libjpeg on most systems.
25
*******************************************************************************
27
*******************************************************************************
29
libjpeg-turbo is licensed under a non-restrictive, BSD-style license
30
(see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and
31
associated test programs bear a similar license, which is reproduced below:
33
Redistribution and use in source and binary forms, with or without
34
modification, are permitted provided that the following conditions are met:
36
- Redistributions of source code must retain the above copyright notice,
37
this list of conditions and the following disclaimer.
38
- Redistributions in binary form must reproduce the above copyright notice,
39
this list of conditions and the following disclaimer in the documentation
40
and/or other materials provided with the distribution.
41
- Neither the name of the libjpeg-turbo Project nor the names of its
42
contributors may be used to endorse or promote products derived from this
43
software without specific prior written permission.
45
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
46
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
49
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
POSSIBILITY OF SUCH DAMAGE.
58
*******************************************************************************
59
** Using libjpeg-turbo
60
*******************************************************************************
62
libjpeg-turbo includes two APIs which can be used to compress and decompress
65
TurboJPEG/OSS: This API wraps libjpeg-turbo and provides an easy-to-use
66
interface for compressing and decompressing JPEG images in memory. It also
67
provides some features that would not be straightforward to implement using
68
the underlying libjpeg API, such as generating planar YUV images and
69
performing multiple simultaneous lossless transforms on an image. The Java
70
interface for libjpeg-turbo is written on top of TurboJPEG/OSS.
72
libjpeg API: This is the industry standard API for compressing and
73
decompressing JPEG images. It is more difficult to use than TurboJPEG/OSS
74
but also more powerful. libjpeg-turbo is both API/ABI-compatible and
75
mathematically compatible with libjpeg v6b. It can also optionally be
76
configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.)
79
=============================
80
Replacing libjpeg at Run Time
81
=============================
83
If a Unix application is dynamically linked with libjpeg, then you can replace
84
libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
88
> time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
94
> export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
95
> time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
100
NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and
103
System administrators can also replace the libjpeg sym links in /usr/{lib} with
104
links to the libjpeg dynamic library located in /opt/libjpeg-turbo/{lib}. This
105
will effectively accelerate every dynamically linked libjpeg application on the
108
The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL
109
(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether libjpeg v6b, v7, or
110
v8 emulation is enabled) into c:\libjpeg-turbo[64]\bin, and the PATH
111
environment variable can be modified such that this directory is searched
112
before any others that might contain a libjpeg DLL. However, if a libjpeg
113
DLL exists in an application's install directory, then Windows will load this
114
DLL first whenever the application is launched. Thus, if an application ships
115
with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's
116
version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the
117
application's install directory to accelerate it.
119
The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for
120
Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll).
121
msvcr90.dll ships with more recent versions of Windows, but users of older
122
Windows releases can obtain it from the Visual C++ 2008 Redistributable
123
Package, which is available as a free download from Microsoft's web site.
125
NOTE: Features of libjpeg which require passing a C run time structure, such
126
as a file handle, from an application to libjpeg will probably not work with
127
the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for
128
Visual C++, unless the application is also built to use the Visual C++ 2008 C
129
run time DLL. In particular, this affects jpeg_stdio_dest() and
132
Mac applications typically embed their own copies of the libjpeg dylib inside
133
the (hidden) application bundle, so it is not possible to globally replace
134
libjpeg on OS X systems. If an application uses a shared library version of
135
libjpeg, then it may be possible to replace the application's version of it.
136
This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
137
the appropriate place in the application bundle and using install_name_tool to
138
repoint the dylib to the new directory. This requires an advanced knowledge of
139
OS X and would not survive an upgrade or a re-install of the application.
140
Thus, it is not recommended for most users.
142
=======================
143
Replacing TurboJPEG/IPP
144
=======================
146
libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by
147
VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper
148
library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo
149
instead of the closed source Intel Performance Primitives. You can replace the
150
TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order
151
to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec
152
at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit
153
binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and
154
32-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install
155
both the 64-bit and 32-bit versions of libjpeg-turbo.
157
You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with
158
the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically.
159
libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which
160
are used to build TurboVNC 1.0 and later.
162
========================================
163
Using libjpeg-turbo in Your Own Programs
164
========================================
166
For the most part, libjpeg-turbo should work identically to libjpeg, so in
167
most cases, an application can be built against libjpeg and then run against
168
libjpeg-turbo. On Unix systems (including Cygwin), you can build against
169
libjpeg-turbo instead of libjpeg by setting
171
CPATH=/opt/libjpeg-turbo/include
173
LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
175
({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
178
If using MinGW, then set
180
CPATH=/c/libjpeg-turbo-gcc[64]/include
182
LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
184
Building against libjpeg-turbo is useful, for instance, if you want to build an
185
application that leverages the libjpeg-turbo colorspace extensions (see below.)
186
On Linux and Solaris systems, you would still need to manipulate
187
LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run
188
time. On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker
189
to force the use of libjpeg-turbo at run time rather than libjpeg (also useful
190
if you want to leverage the colorspace extensions), or you can link against the
191
libjpeg-turbo static library.
193
To force a Linux, Solaris, or MinGW application to link against the static
194
version of libjpeg-turbo, you can use the following linker options:
196
-Wl,-Bstatic -ljpeg -Wl,-Bdynamic
198
On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
199
line (this also works on Linux and Solaris.)
201
To build Visual C++ applications using libjpeg-turbo, add
202
c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment
203
variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment
204
variable, and then link against either jpeg.lib (to use the DLL version of
205
libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.)
207
=====================
208
Colorspace Extensions
209
=====================
211
libjpeg-turbo includes extensions which allow JPEG images to be compressed
212
directly from (and decompressed directly to) buffers which use BGR, BGRX,
213
RGBX, XBGR, and XRGB pixel ordering. This is implemented with six new
214
colorspace constants:
216
JCS_EXT_RGB /* red/green/blue */
217
JCS_EXT_RGBX /* red/green/blue/x */
218
JCS_EXT_BGR /* blue/green/red */
219
JCS_EXT_BGRX /* blue/green/red/x */
220
JCS_EXT_XBGR /* x/blue/green/red */
221
JCS_EXT_XRGB /* x/red/green/blue */
223
Setting cinfo.in_color_space (compression) or cinfo.out_color_space
224
(decompression) to one of these values will cause libjpeg-turbo to read the
225
red, green, and blue values from (or write them to) the appropriate position in
226
the pixel when YUV conversion is performed.
228
Your application can check for the existence of these extensions at compile
231
#ifdef JCS_EXTENSIONS
233
At run time, attempting to use these extensions with a version of libjpeg
234
that doesn't support them will result in a "Bogus input colorspace" error.
236
=================================
237
libjpeg v7 and v8 API/ABI support
238
=================================
240
libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the
241
compression and decompression structures were extended in a backward-
242
incompatible manner to accommodate these features. Thus, programs which are
243
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
244
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not
245
as widely used as v6b, enough programs (including a few Linux distros) have
246
made the switch that it was desirable to provide support for the libjpeg v7/v8
247
API/ABI in libjpeg-turbo.
249
Some of the libjpeg v7 and v8 features -- DCT scaling, to name one -- involve
250
deep modifications to the code which cannot be accommodated by libjpeg-turbo
251
without either breaking compatibility with libjpeg v6b or producing an
252
unsupportable mess. In order to fully support libjpeg v8 with all of its
253
features, we would have to essentially port the SIMD extensions to the libjpeg
254
v8 code base and maintain two separate code trees. We are hesitant to do this
255
until/unless the newer libjpeg code bases garner more community support and
256
involvement and until/unless we have some notion of whether future libjpeg
257
releases will also be backward-incompatible.
259
By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an
260
argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version
261
of libjpeg-turbo which emulates the libjpeg v7 or v8 API/ABI, so that programs
262
which are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The
263
following section describes which libjpeg v7+ features are supported and which
266
libjpeg v7 and v8 Features:
267
---------------------------
271
-- cjpeg: Separate quality settings for luminance and chrominance
272
Note that the libpjeg v7+ API was extended to accommodate this feature only
273
for convenience purposes. It has always been possible to implement this
274
feature with libjpeg v6b (see rdswitch.c for an example.)
276
-- cjpeg: 32-bit BMP support
278
-- jpegtran: lossless cropping
280
-- jpegtran: -perfect option
282
-- rdjpgcom: -raw option
284
-- rdjpgcom: locale awareness
287
Fully supported when using libjpeg v7/v8 emulation:
289
-- libjpeg: In-memory source and destination managers
294
-- libjpeg: DCT scaling in compressor
295
cinfo.scale_num and cinfo.scale_denom are silently ignored.
297
-- libjpeg: IDCT scaling extensions in decompressor
298
libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4,
299
and 1/8 (same as libjpeg v6b.)
301
-- libjpeg: Fancy downsampling in compressor
302
cinfo.do_fancy_downsampling is silently ignored.
305
Seems to depend on the DCT scaling feature, which isn't supported.
308
*******************************************************************************
309
** Performance pitfalls
310
*******************************************************************************
316
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
317
in a way that makes libjpeg happy, so it is necessary to use the slow Huffman
318
decoder when decompressing a JPEG image that has restart markers. This can
319
cause the decompression performance to drop by as much as 20%, but the
320
performance will still be much much greater than that of libjpeg v6b. Many
321
consumer packages, such as PhotoShop, use restart markers when generating JPEG
322
images, so images generated by those programs will experience this issue.
324
===============================================
325
Fast Integer Forward DCT at High Quality Levels
326
===============================================
328
The algorithm used by the SIMD-accelerated quantization function cannot produce
329
correct results whenever the fast integer forward DCT is used along with a JPEG
330
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
331
function in those cases. This causes performance to drop by as much as 40%.
332
It is therefore strongly advised that you use the slow integer forward DCT
333
whenever encoding images with a JPEG quality of 98 or higher.