blob: 90424eef5b99e50bfa1bbb91fc1cbd50caca23d6 [file] [log] [blame]
DRC101f09a2010-02-12 22:52:37 +00001*******************************************************************************
2** Background
3*******************************************************************************
4
DRC80803ae2011-12-15 13:12:59 +00005libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX,
DRC11a122b2012-02-07 00:14:53 +00006SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86,
7x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as
8fast as the unmodified version of libjpeg, all else being equal.
DRC101f09a2010-02-12 22:52:37 +00009
10libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but
DRC0d2d9652011-02-18 22:29:45 +000011the TigerVNC and VirtualGL projects made numerous enhancements to the codec in
122009, including improved support for Mac OS X, 64-bit support, support for
DRC11a122b2012-02-07 00:14:53 +00001332-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman
14encoding/decoding, and various bug fixes. The goal was to produce a fully
DRCd5e964c2013-01-10 11:47:39 +000015open-source codec whose performance rivaled that of popular closed-source
16codecs available at the time.
DRC101f09a2010-02-12 22:52:37 +000017
DRC0d2d9652011-02-18 22:29:45 +000018In early 2010, libjpeg-turbo spun off into its own independent project, with
19the goal of making high-speed JPEG compression/decompression technology
DRC11a122b2012-02-07 00:14:53 +000020available to a broader range of users and developers.
DRC101f09a2010-02-12 22:52:37 +000021
22
23*******************************************************************************
DRCce1546e2010-02-13 23:06:03 +000024** License
25*******************************************************************************
26
DRC11a122b2012-02-07 00:14:53 +000027Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by
28libjpeg (see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and
DRCb5624ee2011-05-24 14:12:07 +000029associated test programs bear a similar license, which is reproduced below:
DRC1e6b5b42010-03-20 20:00:51 +000030
DRCb5624ee2011-05-24 14:12:07 +000031Redistribution and use in source and binary forms, with or without
32modification, are permitted provided that the following conditions are met:
DRC65e0cd32011-04-26 23:44:37 +000033
DRCb5624ee2011-05-24 14:12:07 +000034- Redistributions of source code must retain the above copyright notice,
35 this list of conditions and the following disclaimer.
36- Redistributions in binary form must reproduce the above copyright notice,
37 this list of conditions and the following disclaimer in the documentation
38 and/or other materials provided with the distribution.
39- Neither the name of the libjpeg-turbo Project nor the names of its
40 contributors may be used to endorse or promote products derived from this
41 software without specific prior written permission.
42
43THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
44AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
47LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
48CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
49SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
51CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
52ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
53POSSIBILITY OF SUCH DAMAGE.
DRC7c1df0a2011-02-18 02:45:24 +000054
55
56*******************************************************************************
DRC68fef832010-02-16 05:29:10 +000057** Using libjpeg-turbo
DRC101f09a2010-02-12 22:52:37 +000058*******************************************************************************
59
DRC80803ae2011-12-15 13:12:59 +000060libjpeg-turbo includes two APIs that can be used to compress and decompress
DRC9c4590e2011-07-26 09:22:16 +000061JPEG images:
62
DRC11a122b2012-02-07 00:14:53 +000063 TurboJPEG API: This API provides an easy-to-use interface for compressing
64 and decompressing JPEG images in memory. It also provides some functionality
65 that would not be straightforward to achieve using the underlying libjpeg
66 API, such as generating planar YUV images and performing multiple
67 simultaneous lossless transforms on an image. The Java interface for
68 libjpeg-turbo is written on top of the TurboJPEG API.
DRC9c4590e2011-07-26 09:22:16 +000069
DRC11a122b2012-02-07 00:14:53 +000070 libjpeg API: This is the de facto industry-standard API for compressing and
DRC2c62da32012-01-17 22:55:03 +000071 decompressing JPEG images. It is more difficult to use than the TurboJPEG
72 API but also more powerful. libjpeg-turbo is both API/ABI-compatible and
DRC9c4590e2011-07-26 09:22:16 +000073 mathematically compatible with libjpeg v6b. It can also optionally be
74 configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.)
75
DRCd5e964c2013-01-10 11:47:39 +000076======================
77Installation Directory
78======================
79
80This document assumes that libjpeg-turbo will be installed in the default
81directory (/opt/libjpeg-turbo on Un*x and Mac systems and
82c:\libjpeg-turbo[-gcc][64] on Windows systems. If your installation of
83libjpeg-turbo resides in a different directory, then adjust the instructions
84accordingly.
DRC9c4590e2011-07-26 09:22:16 +000085
DRC68fef832010-02-16 05:29:10 +000086=============================
87Replacing libjpeg at Run Time
88=============================
DRC101f09a2010-02-12 22:52:37 +000089
DRCd5e964c2013-01-10 11:47:39 +000090Un*x
91----
92
93If a Un*x application is dynamically linked with libjpeg, then you can replace
DRCab4db652011-02-18 04:55:08 +000094libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
DRC68fef832010-02-16 05:29:10 +000095For instance:
DRC101f09a2010-02-12 22:52:37 +000096
DRC68fef832010-02-16 05:29:10 +000097 [Using libjpeg]
98 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
99 real 0m0.392s
100 user 0m0.074s
101 sys 0m0.020s
DRC101f09a2010-02-12 22:52:37 +0000102
DRC68fef832010-02-16 05:29:10 +0000103 [Using libjpeg-turbo]
104 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
105 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
106 real 0m0.109s
107 user 0m0.029s
108 sys 0m0.010s
DRC101f09a2010-02-12 22:52:37 +0000109
DRCd5e964c2013-01-10 11:47:39 +0000110({lib} = lib32 or lib64, depending on whether you wish to use the 32-bit or the
11164-bit version of libjpeg-turbo.)
DRC101f09a2010-02-12 22:52:37 +0000112
DRCd5e964c2013-01-10 11:47:39 +0000113System administrators can also replace the libjpeg symlinks in /usr/lib* with
DRC11a122b2012-02-07 00:14:53 +0000114links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}.
115This will effectively accelerate every application that uses the libjpeg
116dynamic library on the system.
DRC101f09a2010-02-12 22:52:37 +0000117
DRCd5e964c2013-01-10 11:47:39 +0000118Windows
119-------
DRC7e0b4992010-02-25 05:52:44 +0000120
DRCd5e964c2013-01-10 11:47:39 +0000121If a Windows application is dynamically linked with libjpeg, then you can
122replace libjpeg with libjpeg-turbo at run time by backing up the application's
123copy of jpeg62.dll, jpeg7.dll, or jpeg8.dll (assuming the application has its
124own local copy of this library) and copying the corresponding DLL from
125libjpeg-turbo into the application's install directory. The official
DRCdad4d2e2013-01-11 11:07:37 +0000126libjpeg-turbo binary packages only provide jpeg62.dll. If the application uses
DRCd5e964c2013-01-10 11:47:39 +0000127jpeg7.dll or jpeg8.dll instead, then it will be necessary to build
DRCdad4d2e2013-01-11 11:07:37 +0000128libjpeg-turbo from source (see "libjpeg v7 and v8 API/ABI Emulation" below.)
DRCd5e964c2013-01-10 11:47:39 +0000129
DRCdad4d2e2013-01-11 11:07:37 +0000130The following information is specific to the official libjpeg-turbo binary
131packages for Visual C++:
DRCd5e964c2013-01-10 11:47:39 +0000132
133-- jpeg62.dll requires the Visual C++ 2008 C run-time DLL (msvcr90.dll).
DRC5559c902010-10-18 02:21:10 +0000134msvcr90.dll ships with more recent versions of Windows, but users of older
135Windows releases can obtain it from the Visual C++ 2008 Redistributable
136Package, which is available as a free download from Microsoft's web site.
DRC0248dd92010-02-25 06:21:12 +0000137
DRCd5e964c2013-01-10 11:47:39 +0000138-- Features of the libjpeg API that require passing a C run-time structure,
139such as a file handle, from an application to the library will probably not
140work with jpeg62.dll, unless the application is also built to use the Visual
141C++ 2008 C run-time DLL. In particular, this affects jpeg_stdio_dest() and
DRCab4db652011-02-18 04:55:08 +0000142jpeg_stdio_src().
DRC101f09a2010-02-12 22:52:37 +0000143
DRCd5e964c2013-01-10 11:47:39 +0000144Mac
145---
146
DRC5559c902010-10-18 02:21:10 +0000147Mac applications typically embed their own copies of the libjpeg dylib inside
DRC68fef832010-02-16 05:29:10 +0000148the (hidden) application bundle, so it is not possible to globally replace
DRCd5e964c2013-01-10 11:47:39 +0000149libjpeg on OS X systems. Replacing the application's version of the libjpeg
150dylib would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
DRC5559c902010-10-18 02:21:10 +0000151the appropriate place in the application bundle and using install_name_tool to
DRCd5e964c2013-01-10 11:47:39 +0000152repoint the libjpeg-turbo dylib to its new directory. This requires an
153advanced knowledge of OS X and would not survive an upgrade or a re-install of
154the application. Thus, it is not recommended for most users.
DRC101f09a2010-02-12 22:52:37 +0000155
DRC68fef832010-02-16 05:29:10 +0000156========================================
157Using libjpeg-turbo in Your Own Programs
158========================================
DRC101f09a2010-02-12 22:52:37 +0000159
DRC68fef832010-02-16 05:29:10 +0000160For the most part, libjpeg-turbo should work identically to libjpeg, so in
161most cases, an application can be built against libjpeg and then run against
DRCdad4d2e2013-01-11 11:07:37 +0000162libjpeg-turbo. On Un*x systems and Cygwin, you can build against libjpeg-turbo
163instead of libjpeg by setting
DRC101f09a2010-02-12 22:52:37 +0000164
DRC68fef832010-02-16 05:29:10 +0000165 CPATH=/opt/libjpeg-turbo/include
166 and
167 LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
DRC101f09a2010-02-12 22:52:37 +0000168
DRCff95aa62010-06-05 00:22:32 +0000169({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
17064-bit application.)
DRC101f09a2010-02-12 22:52:37 +0000171
DRC0a1f68e2010-02-24 07:24:26 +0000172If using MinGW, then set
173
DRC3dc1bc22010-05-10 22:18:10 +0000174 CPATH=/c/libjpeg-turbo-gcc[64]/include
DRC0a1f68e2010-02-24 07:24:26 +0000175 and
DRC3dc1bc22010-05-10 22:18:10 +0000176 LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
DRC0a1f68e2010-02-24 07:24:26 +0000177
178Building against libjpeg-turbo is useful, for instance, if you want to build an
179application that leverages the libjpeg-turbo colorspace extensions (see below.)
DRCdad4d2e2013-01-11 11:07:37 +0000180On Un*x systems, you would still need to manipulate LD_LIBRARY_PATH or create
181appropriate symlinks to use libjpeg-turbo at run time. On such systems, you
182can pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of
183libjpeg-turbo at run time rather than libjpeg (also useful if you want to
184leverage the colorspace extensions), or you can link against the libjpeg-turbo
185static library.
DRC0a1f68e2010-02-24 07:24:26 +0000186
DRCdad4d2e2013-01-11 11:07:37 +0000187To force a Un*x or MinGW application to link against the static version of
188libjpeg-turbo, you can use the following linker options:
DRC101f09a2010-02-12 22:52:37 +0000189
DRC68fef832010-02-16 05:29:10 +0000190 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
DRC101f09a2010-02-12 22:52:37 +0000191
DRCff95aa62010-06-05 00:22:32 +0000192On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
DRCd5e964c2013-01-10 11:47:39 +0000193line.
DRC101f09a2010-02-12 22:52:37 +0000194
DRC68fef832010-02-16 05:29:10 +0000195To build Visual C++ applications using libjpeg-turbo, add
DRCab4db652011-02-18 04:55:08 +0000196c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment
197variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment
DRC5559c902010-10-18 02:21:10 +0000198variable, and then link against either jpeg.lib (to use the DLL version of
199libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.)
DRC101f09a2010-02-12 22:52:37 +0000200
DRC68fef832010-02-16 05:29:10 +0000201=====================
202Colorspace Extensions
203=====================
DRC101f09a2010-02-12 22:52:37 +0000204
DRC80803ae2011-12-15 13:12:59 +0000205libjpeg-turbo includes extensions that allow JPEG images to be compressed
206directly from (and decompressed directly to) buffers that use BGR, BGRX,
DRC67ce3b22011-12-19 02:21:03 +0000207RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new
DRC68fef832010-02-16 05:29:10 +0000208colorspace constants:
DRC101f09a2010-02-12 22:52:37 +0000209
DRC68fef832010-02-16 05:29:10 +0000210 JCS_EXT_RGB /* red/green/blue */
211 JCS_EXT_RGBX /* red/green/blue/x */
212 JCS_EXT_BGR /* blue/green/red */
213 JCS_EXT_BGRX /* blue/green/red/x */
214 JCS_EXT_XBGR /* x/blue/green/red */
215 JCS_EXT_XRGB /* x/red/green/blue */
DRC67ce3b22011-12-19 02:21:03 +0000216 JCS_EXT_RGBA /* red/green/blue/alpha */
217 JCS_EXT_BGRA /* blue/green/red/alpha */
218 JCS_EXT_ABGR /* alpha/blue/green/red */
219 JCS_EXT_ARGB /* alpha/red/green/blue */
DRC101f09a2010-02-12 22:52:37 +0000220
DRC68fef832010-02-16 05:29:10 +0000221Setting cinfo.in_color_space (compression) or cinfo.out_color_space
222(decompression) to one of these values will cause libjpeg-turbo to read the
223red, green, and blue values from (or write them to) the appropriate position in
DRCb76c8402011-12-19 15:01:55 +0000224the pixel when compressing from/decompressing to an RGB buffer.
DRC101f09a2010-02-12 22:52:37 +0000225
DRC68fef832010-02-16 05:29:10 +0000226Your application can check for the existence of these extensions at compile
227time with:
DRC101f09a2010-02-12 22:52:37 +0000228
DRC68fef832010-02-16 05:29:10 +0000229 #ifdef JCS_EXTENSIONS
DRC101f09a2010-02-12 22:52:37 +0000230
DRCd5e964c2013-01-10 11:47:39 +0000231At run time, attempting to use these extensions with a libjpeg implementation
232that does not support them will result in a "Bogus input colorspace" error.
233Applications can trap this error in order to test whether run-time support is
234available for the colorspace extensions.
DRC77e39642010-10-12 03:02:31 +0000235
DRC67ce3b22011-12-19 02:21:03 +0000236When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
237X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
238can set that byte to whatever value it wishes. If an application expects the X
DRCb76c8402011-12-19 15:01:55 +0000239byte to be used as an alpha channel, then it should specify JCS_EXT_RGBA,
DRC67ce3b22011-12-19 02:21:03 +0000240JCS_EXT_BGRA, JCS_EXT_ABGR, or JCS_EXT_ARGB. When these colorspace constants
241are used, the X byte is guaranteed to be 0xFF, which is interpreted as opaque.
242
243Your application can check for the existence of the alpha channel colorspace
244extensions at compile time with:
245
246 #ifdef JCS_ALPHA_EXTENSIONS
247
DRCb76c8402011-12-19 15:01:55 +0000248jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check
249for the existence of the colorspace extensions at compile time and run time.
250
DRCd5e964c2013-01-10 11:47:39 +0000251===================================
252libjpeg v7 and v8 API/ABI Emulation
253===================================
DRC77e39642010-10-12 03:02:31 +0000254
DRCbdbcd142012-02-03 08:55:36 +0000255With libjpeg v7 and v8, new features were added that necessitated extending the
256compression and decompression structures. Unfortunately, due to the exposed
DRC58156992013-01-13 11:05:25 +0000257nature of those structures, extending them also necessitated breaking backward
258ABI compatibility with previous libjpeg releases. Thus, programs that were
259built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
260based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not
261as widely used as v6b, enough programs (including a few Linux distros) made
DRCeff4f952013-01-18 06:02:10 +0000262the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
DRC58156992013-01-13 11:05:25 +0000263in libjpeg-turbo. It should be noted, however, that this feature was added
DRCd5e964c2013-01-10 11:47:39 +0000264primarily so that applications that had already been compiled to use libjpeg
265v7+ could take advantage of accelerated baseline JPEG encoding/decoding
266without recompiling. libjpeg-turbo does not claim to support all of the
267libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all
268cases (see below.)
DRC77e39642010-10-12 03:02:31 +0000269
DRC5559c902010-10-18 02:21:10 +0000270By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an
271argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version
DRCeff4f952013-01-18 06:02:10 +0000272of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that programs
DRC80803ae2011-12-15 13:12:59 +0000273that are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The
DRC5559c902010-10-18 02:21:10 +0000274following section describes which libjpeg v7+ features are supported and which
275aren't.
DRC77e39642010-10-12 03:02:31 +0000276
DRCd5e964c2013-01-10 11:47:39 +0000277Support for libjpeg v7 and v8 Features:
278---------------------------------------
DRC77e39642010-10-12 03:02:31 +0000279
280Fully supported:
281
DRCbdbcd142012-02-03 08:55:36 +0000282-- libjpeg: IDCT scaling extensions in decompressor
283 libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8,
284 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
285 and 1/2 are SIMD-accelerated.)
286
DRCac514382013-01-01 11:39:04 +0000287-- libjpeg: arithmetic coding
288
289-- cjpeg: Separate quality settings for luminance and chrominance
290 Note that the libpjeg v7+ API was extended to accommodate this feature only
291 for convenience purposes. It has always been possible to implement this
292 feature with libjpeg v6b (see rdswitch.c for an example.)
293
DRC77e39642010-10-12 03:02:31 +0000294-- cjpeg: 32-bit BMP support
295
DRCac514382013-01-01 11:39:04 +0000296-- cjpeg: -rgb option
297
DRC77e39642010-10-12 03:02:31 +0000298-- jpegtran: lossless cropping
299
300-- jpegtran: -perfect option
301
DRCac514382013-01-01 11:39:04 +0000302-- jpegtran: forcing width/height when performing lossless crop
303
DRC77e39642010-10-12 03:02:31 +0000304-- rdjpgcom: -raw option
305
306-- rdjpgcom: locale awareness
307
308
309Fully supported when using libjpeg v7/v8 emulation:
310
311-- libjpeg: In-memory source and destination managers
312
DRC28701312013-01-01 11:41:44 +0000313
DRC77e39642010-10-12 03:02:31 +0000314Not supported:
315
316-- libjpeg: DCT scaling in compressor
317 cinfo.scale_num and cinfo.scale_denom are silently ignored.
DRCbdbcd142012-02-03 08:55:36 +0000318 There is no technical reason why DCT scaling cannot be supported, but
319 without the SmartScale extension (see below), it would only be able to
320 down-scale using ratios of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and 8/9,
321 which is of limited usefulness.
322
323-- libjpeg: SmartScale
324 cinfo.block_size is silently ignored.
325 SmartScale is an extension to the JPEG format that allows for DCT block
DRCdad4d2e2013-01-11 11:07:37 +0000326 sizes other than 8x8. Providing support for this new format is feasible
327 (particularly without full acceleration), but until/unless the format
328 becomes either an official industry standard or, at minimum, an accepted
329 solution in the community, we are hesitant to implement it.
DRC77e39642010-10-12 03:02:31 +0000330
DRC77e39642010-10-12 03:02:31 +0000331-- libjpeg: Fancy downsampling in compressor
332 cinfo.do_fancy_downsampling is silently ignored.
DRCbdbcd142012-02-03 08:55:36 +0000333 This requires the DCT scaling feature, which is not supported.
DRC77e39642010-10-12 03:02:31 +0000334
DRC77e39642010-10-12 03:02:31 +0000335-- jpegtran: Scaling
DRCbdbcd142012-02-03 08:55:36 +0000336 This requires both the DCT scaling and SmartScale features, which are not
337 supported.
338
339-- Lossless RGB JPEG files
340 This requires the SmartScale feature, which is not supported.
DRCab4db652011-02-18 04:55:08 +0000341
342
343*******************************************************************************
DRCd5e964c2013-01-10 11:47:39 +0000344** Mathematical Compatibility
345*******************************************************************************
346
347For the most part, libjpeg-turbo should produce identical output to libjpeg
348v6b. The one exception to this is when using the floating point DCT/IDCT, in
349which case the outputs of libjpeg v6b and libjpeg-turbo are not guaranteed to
350be identical (the accuracy of the floating point DCT/IDCT is constant when
351using libjpeg-turbo's SIMD extensions, but otherwise, it can depend heavily on
352the compiler and compiler settings.)
353
354While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is
355still using the same algorithms as libjpeg v6b, so there are several specific
356cases in which libjpeg-turbo cannot be expected to produce the same output as
357libjpeg v8:
358
359-- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
360 implements those scaling algorithms a bit differently than libjpeg v6b does,
361 and libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
362
363-- When using chrominance subsampling, because libjpeg v8 implements this
364 with its DCT/IDCT scaling algorithms rather than with a separate
365 downsampling/upsampling algorithm.
366
367-- When using the floating point IDCT, for the reasons stated above and also
368 because the floating point IDCT algorithm was modified in libjpeg v8a to
369 improve accuracy.
370
371-- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
372 "non-smooth") chrominance upsampling, because libjpeg v8 does not support
373 merged upsampling with scaling factors > 1.
374
375
376*******************************************************************************
377** Performance Pitfalls
DRCab4db652011-02-18 04:55:08 +0000378*******************************************************************************
379
380===============
381Restart Markers
382===============
383
384The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
DRC11a122b2012-02-07 00:14:53 +0000385in a way that makes the rest of the libjpeg infrastructure happy, so it is
386necessary to use the slow Huffman decoder when decompressing a JPEG image that
387has restart markers. This can cause the decompression performance to drop by
388as much as 20%, but the performance will still be much greater than that of
389libjpeg. Many consumer packages, such as PhotoShop, use restart markers when
390generating JPEG images, so images generated by those programs will experience
391this issue.
DRCab4db652011-02-18 04:55:08 +0000392
393===============================================
394Fast Integer Forward DCT at High Quality Levels
395===============================================
396
397The algorithm used by the SIMD-accelerated quantization function cannot produce
398correct results whenever the fast integer forward DCT is used along with a JPEG
399quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
400function in those cases. This causes performance to drop by as much as 40%.
401It is therefore strongly advised that you use the slow integer forward DCT
402whenever encoding images with a JPEG quality of 98 or higher.