blob: 899a36819877635796ea42fb2819e23eae4b5756 [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
15open-source codec that could replace the partially closed-source TurboJPEG/IPP
16codec used by VirtualGL and TurboVNC. libjpeg-turbo generally achieves 80-120%
17of the performance of TurboJPEG/IPP. It is faster in some areas but slower in
18others.
DRC101f09a2010-02-12 22:52:37 +000019
DRC0d2d9652011-02-18 22:29:45 +000020In early 2010, libjpeg-turbo spun off into its own independent project, with
21the goal of making high-speed JPEG compression/decompression technology
DRC11a122b2012-02-07 00:14:53 +000022available to a broader range of users and developers.
DRC101f09a2010-02-12 22:52:37 +000023
24
25*******************************************************************************
DRCce1546e2010-02-13 23:06:03 +000026** License
27*******************************************************************************
28
DRC11a122b2012-02-07 00:14:53 +000029Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by
30libjpeg (see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and
DRCb5624ee2011-05-24 14:12:07 +000031associated test programs bear a similar license, which is reproduced below:
DRC1e6b5b42010-03-20 20:00:51 +000032
DRCb5624ee2011-05-24 14:12:07 +000033Redistribution and use in source and binary forms, with or without
34modification, are permitted provided that the following conditions are met:
DRC65e0cd32011-04-26 23:44:37 +000035
DRCb5624ee2011-05-24 14:12:07 +000036- 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.
44
45THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
46AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
49LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55POSSIBILITY OF SUCH DAMAGE.
DRC7c1df0a2011-02-18 02:45:24 +000056
57
58*******************************************************************************
DRC68fef832010-02-16 05:29:10 +000059** Using libjpeg-turbo
DRC101f09a2010-02-12 22:52:37 +000060*******************************************************************************
61
DRC80803ae2011-12-15 13:12:59 +000062libjpeg-turbo includes two APIs that can be used to compress and decompress
DRC9c4590e2011-07-26 09:22:16 +000063JPEG images:
64
DRC11a122b2012-02-07 00:14:53 +000065 TurboJPEG API: This API provides an easy-to-use interface for compressing
66 and decompressing JPEG images in memory. It also provides some functionality
67 that would not be straightforward to achieve using the underlying libjpeg
68 API, such as generating planar YUV images and performing multiple
69 simultaneous lossless transforms on an image. The Java interface for
70 libjpeg-turbo is written on top of the TurboJPEG API.
DRC9c4590e2011-07-26 09:22:16 +000071
DRC11a122b2012-02-07 00:14:53 +000072 libjpeg API: This is the de facto industry-standard API for compressing and
DRC2c62da32012-01-17 22:55:03 +000073 decompressing JPEG images. It is more difficult to use than the TurboJPEG
74 API but also more powerful. libjpeg-turbo is both API/ABI-compatible and
DRC9c4590e2011-07-26 09:22:16 +000075 mathematically compatible with libjpeg v6b. It can also optionally be
76 configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.)
77
78
DRC68fef832010-02-16 05:29:10 +000079=============================
80Replacing libjpeg at Run Time
81=============================
DRC101f09a2010-02-12 22:52:37 +000082
DRC68fef832010-02-16 05:29:10 +000083If a Unix application is dynamically linked with libjpeg, then you can replace
DRCab4db652011-02-18 04:55:08 +000084libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
DRC68fef832010-02-16 05:29:10 +000085For instance:
DRC101f09a2010-02-12 22:52:37 +000086
DRC68fef832010-02-16 05:29:10 +000087 [Using libjpeg]
88 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
89 real 0m0.392s
90 user 0m0.074s
91 sys 0m0.020s
DRC101f09a2010-02-12 22:52:37 +000092
DRC68fef832010-02-16 05:29:10 +000093 [Using libjpeg-turbo]
94 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
95 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
96 real 0m0.109s
97 user 0m0.029s
98 sys 0m0.010s
DRC101f09a2010-02-12 22:52:37 +000099
DRCff95aa62010-06-05 00:22:32 +0000100NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and
DRC68fef832010-02-16 05:29:10 +0000101architecture.
DRC101f09a2010-02-12 22:52:37 +0000102
DRC68fef832010-02-16 05:29:10 +0000103System administrators can also replace the libjpeg sym links in /usr/{lib} with
DRC11a122b2012-02-07 00:14:53 +0000104links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}.
105This will effectively accelerate every application that uses the libjpeg
106dynamic library on the system.
DRC101f09a2010-02-12 22:52:37 +0000107
DRCab4db652011-02-18 04:55:08 +0000108The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL
DRC11a122b2012-02-07 00:14:53 +0000109(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether it was built with
110libjpeg v6b, v7, or v8 emulation) into c:\libjpeg-turbo[64]\bin, and the PATH
DRC5559c902010-10-18 02:21:10 +0000111environment variable can be modified such that this directory is searched
112before any others that might contain a libjpeg DLL. However, if a libjpeg
113DLL exists in an application's install directory, then Windows will load this
114DLL first whenever the application is launched. Thus, if an application ships
115with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's
DRCab4db652011-02-18 04:55:08 +0000116version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the
DRC5559c902010-10-18 02:21:10 +0000117application's install directory to accelerate it.
DRC7e0b4992010-02-25 05:52:44 +0000118
DRCab4db652011-02-18 04:55:08 +0000119The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for
DRC11a122b2012-02-07 00:14:53 +0000120Visual C++ requires the Visual C++ 2008 C run-time DLL (msvcr90.dll).
DRC5559c902010-10-18 02:21:10 +0000121msvcr90.dll ships with more recent versions of Windows, but users of older
122Windows releases can obtain it from the Visual C++ 2008 Redistributable
123Package, which is available as a free download from Microsoft's web site.
DRC0248dd92010-02-25 06:21:12 +0000124
DRC11a122b2012-02-07 00:14:53 +0000125NOTE: Features of libjpeg that require passing a C run-time structure, such
DRC0248dd92010-02-25 06:21:12 +0000126as a file handle, from an application to libjpeg will probably not work with
DRCab4db652011-02-18 04:55:08 +0000127the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for
128Visual C++, unless the application is also built to use the Visual C++ 2008 C
DRC11a122b2012-02-07 00:14:53 +0000129run-time DLL. In particular, this affects jpeg_stdio_dest() and
DRCab4db652011-02-18 04:55:08 +0000130jpeg_stdio_src().
DRC101f09a2010-02-12 22:52:37 +0000131
DRC5559c902010-10-18 02:21:10 +0000132Mac applications typically embed their own copies of the libjpeg dylib inside
DRC68fef832010-02-16 05:29:10 +0000133the (hidden) application bundle, so it is not possible to globally replace
134libjpeg on OS X systems. If an application uses a shared library version of
135libjpeg, then it may be possible to replace the application's version of it.
DRC5559c902010-10-18 02:21:10 +0000136This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
137the appropriate place in the application bundle and using install_name_tool to
138repoint the dylib to the new directory. This requires an advanced knowledge of
139OS X and would not survive an upgrade or a re-install of the application.
140Thus, it is not recommended for most users.
DRC101f09a2010-02-12 22:52:37 +0000141
DRC68fef832010-02-16 05:29:10 +0000142=======================
143Replacing TurboJPEG/IPP
144=======================
DRC101f09a2010-02-12 22:52:37 +0000145
DRC68fef832010-02-16 05:29:10 +0000146libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by
DRCff95aa62010-06-05 00:22:32 +0000147VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper
DRC68fef832010-02-16 05:29:10 +0000148library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo
DRC11a122b2012-02-07 00:14:53 +0000149instead of the closed-source Intel Performance Primitives. You can replace the
DRC68fef832010-02-16 05:29:10 +0000150TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order
DRCab4db652011-02-18 04:55:08 +0000151to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec
152at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit
DRCff95aa62010-06-05 00:22:32 +0000153binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and
DRC68fef832010-02-16 05:29:10 +000015432-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install
155both the 64-bit and 32-bit versions of libjpeg-turbo.
DRC101f09a2010-02-12 22:52:37 +0000156
DRCff95aa62010-06-05 00:22:32 +0000157You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with
DRC68fef832010-02-16 05:29:10 +0000158the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically.
159libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which
DRC11a122b2012-02-07 00:14:53 +0000160are used to build VirtualGL 2.2 and TurboVNC 1.0 and later.
DRC101f09a2010-02-12 22:52:37 +0000161
DRC68fef832010-02-16 05:29:10 +0000162========================================
163Using libjpeg-turbo in Your Own Programs
164========================================
DRC101f09a2010-02-12 22:52:37 +0000165
DRC68fef832010-02-16 05:29:10 +0000166For the most part, libjpeg-turbo should work identically to libjpeg, so in
167most cases, an application can be built against libjpeg and then run against
DRC5559c902010-10-18 02:21:10 +0000168libjpeg-turbo. On Unix systems (including Cygwin), you can build against
169libjpeg-turbo instead of libjpeg by setting
DRC101f09a2010-02-12 22:52:37 +0000170
DRC68fef832010-02-16 05:29:10 +0000171 CPATH=/opt/libjpeg-turbo/include
172 and
173 LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
DRC101f09a2010-02-12 22:52:37 +0000174
DRCff95aa62010-06-05 00:22:32 +0000175({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
17664-bit application.)
DRC101f09a2010-02-12 22:52:37 +0000177
DRC0a1f68e2010-02-24 07:24:26 +0000178If using MinGW, then set
179
DRC3dc1bc22010-05-10 22:18:10 +0000180 CPATH=/c/libjpeg-turbo-gcc[64]/include
DRC0a1f68e2010-02-24 07:24:26 +0000181 and
DRC3dc1bc22010-05-10 22:18:10 +0000182 LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
DRC0a1f68e2010-02-24 07:24:26 +0000183
184Building against libjpeg-turbo is useful, for instance, if you want to build an
185application that leverages the libjpeg-turbo colorspace extensions (see below.)
DRCab4db652011-02-18 04:55:08 +0000186On Linux and Solaris systems, you would still need to manipulate
187LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run
188time. On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker
189to force the use of libjpeg-turbo at run time rather than libjpeg (also useful
190if you want to leverage the colorspace extensions), or you can link against the
DRC0a1f68e2010-02-24 07:24:26 +0000191libjpeg-turbo static library.
192
193To force a Linux, Solaris, or MinGW application to link against the static
194version of libjpeg-turbo, you can use the following linker options:
DRC101f09a2010-02-12 22:52:37 +0000195
DRC68fef832010-02-16 05:29:10 +0000196 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
DRC101f09a2010-02-12 22:52:37 +0000197
DRCff95aa62010-06-05 00:22:32 +0000198On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
DRC0a1f68e2010-02-24 07:24:26 +0000199line (this also works on Linux and Solaris.)
DRC101f09a2010-02-12 22:52:37 +0000200
DRC68fef832010-02-16 05:29:10 +0000201To build Visual C++ applications using libjpeg-turbo, add
DRCab4db652011-02-18 04:55:08 +0000202c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment
203variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment
DRC5559c902010-10-18 02:21:10 +0000204variable, and then link against either jpeg.lib (to use the DLL version of
205libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.)
DRC101f09a2010-02-12 22:52:37 +0000206
DRC68fef832010-02-16 05:29:10 +0000207=====================
208Colorspace Extensions
209=====================
DRC101f09a2010-02-12 22:52:37 +0000210
DRC80803ae2011-12-15 13:12:59 +0000211libjpeg-turbo includes extensions that allow JPEG images to be compressed
212directly from (and decompressed directly to) buffers that use BGR, BGRX,
DRC67ce3b22011-12-19 02:21:03 +0000213RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new
DRC68fef832010-02-16 05:29:10 +0000214colorspace constants:
DRC101f09a2010-02-12 22:52:37 +0000215
DRC68fef832010-02-16 05:29:10 +0000216 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 */
DRC67ce3b22011-12-19 02:21:03 +0000222 JCS_EXT_RGBA /* red/green/blue/alpha */
223 JCS_EXT_BGRA /* blue/green/red/alpha */
224 JCS_EXT_ABGR /* alpha/blue/green/red */
225 JCS_EXT_ARGB /* alpha/red/green/blue */
DRC101f09a2010-02-12 22:52:37 +0000226
DRC68fef832010-02-16 05:29:10 +0000227Setting cinfo.in_color_space (compression) or cinfo.out_color_space
228(decompression) to one of these values will cause libjpeg-turbo to read the
229red, green, and blue values from (or write them to) the appropriate position in
DRCb76c8402011-12-19 15:01:55 +0000230the pixel when compressing from/decompressing to an RGB buffer.
DRC101f09a2010-02-12 22:52:37 +0000231
DRC68fef832010-02-16 05:29:10 +0000232Your application can check for the existence of these extensions at compile
233time with:
DRC101f09a2010-02-12 22:52:37 +0000234
DRC68fef832010-02-16 05:29:10 +0000235 #ifdef JCS_EXTENSIONS
DRC101f09a2010-02-12 22:52:37 +0000236
DRC68fef832010-02-16 05:29:10 +0000237At run time, attempting to use these extensions with a version of libjpeg
238that doesn't support them will result in a "Bogus input colorspace" error.
DRC77e39642010-10-12 03:02:31 +0000239
DRC67ce3b22011-12-19 02:21:03 +0000240When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
241X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
242can set that byte to whatever value it wishes. If an application expects the X
DRCb76c8402011-12-19 15:01:55 +0000243byte to be used as an alpha channel, then it should specify JCS_EXT_RGBA,
DRC67ce3b22011-12-19 02:21:03 +0000244JCS_EXT_BGRA, JCS_EXT_ABGR, or JCS_EXT_ARGB. When these colorspace constants
245are used, the X byte is guaranteed to be 0xFF, which is interpreted as opaque.
246
247Your application can check for the existence of the alpha channel colorspace
248extensions at compile time with:
249
250 #ifdef JCS_ALPHA_EXTENSIONS
251
DRCb76c8402011-12-19 15:01:55 +0000252jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check
253for the existence of the colorspace extensions at compile time and run time.
254
DRC77e39642010-10-12 03:02:31 +0000255=================================
256libjpeg v7 and v8 API/ABI support
257=================================
258
DRC6916f872012-02-03 08:59:21 +0000259With libjpeg v7 and v8, new features were added that necessitated extending the
260compression and decompression structures. Unfortunately, due to the exposed
261nature of those structures, extending them also necessitated breaking backward
262ABI compatibility with previous libjpeg releases. Thus, programs that are
DRC77e39642010-10-12 03:02:31 +0000263built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
264based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not
265as widely used as v6b, enough programs (including a few Linux distros) have
266made the switch that it was desirable to provide support for the libjpeg v7/v8
DRC6916f872012-02-03 08:59:21 +0000267API/ABI in libjpeg-turbo. Although libjpeg-turbo can now be configured as a
268drop-in replacement for libjpeg v7 or v8, it should be noted that not all of
269the features in libjpeg v7 and v8 are supported (see below.)
DRC77e39642010-10-12 03:02:31 +0000270
DRC5559c902010-10-18 02:21:10 +0000271By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an
272argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version
DRC80803ae2011-12-15 13:12:59 +0000273of libjpeg-turbo that emulates the libjpeg v7 or v8 API/ABI, so that programs
274that are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The
DRC5559c902010-10-18 02:21:10 +0000275following section describes which libjpeg v7+ features are supported and which
276aren't.
DRC77e39642010-10-12 03:02:31 +0000277
278libjpeg v7 and v8 Features:
279---------------------------
280
281Fully supported:
282
283-- cjpeg: Separate quality settings for luminance and chrominance
284 Note that the libpjeg v7+ API was extended to accommodate this feature only
285 for convenience purposes. It has always been possible to implement this
286 feature with libjpeg v6b (see rdswitch.c for an example.)
287
288-- cjpeg: 32-bit BMP support
289
290-- jpegtran: lossless cropping
291
292-- jpegtran: -perfect option
293
294-- rdjpgcom: -raw option
295
296-- rdjpgcom: locale awareness
297
298
299Fully supported when using libjpeg v7/v8 emulation:
300
301-- libjpeg: In-memory source and destination managers
302
303
304Not supported:
305
306-- libjpeg: DCT scaling in compressor
307 cinfo.scale_num and cinfo.scale_denom are silently ignored.
DRC6916f872012-02-03 08:59:21 +0000308 There is no technical reason why DCT scaling cannot be supported, but
309 without the SmartScale extension (see below), it would only be able to
310 down-scale using ratios of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and 8/9,
311 which is of limited usefulness.
312
313-- libjpeg: SmartScale
314 cinfo.block_size is silently ignored.
315 SmartScale is an extension to the JPEG format that allows for DCT block
316 sizes other than 8x8. It would be difficult to support this feature while
317 retaining backward compatibility with libjpeg v6b.
DRC77e39642010-10-12 03:02:31 +0000318
319-- libjpeg: IDCT scaling extensions in decompressor
320 libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4,
321 and 1/8 (same as libjpeg v6b.)
322
323-- libjpeg: Fancy downsampling in compressor
324 cinfo.do_fancy_downsampling is silently ignored.
DRC6916f872012-02-03 08:59:21 +0000325 This requires the DCT scaling feature, which is not supported.
DRC77e39642010-10-12 03:02:31 +0000326
DRC77e39642010-10-12 03:02:31 +0000327-- jpegtran: Scaling
DRC6916f872012-02-03 08:59:21 +0000328 This requires both the DCT scaling and SmartScale features, which are not
329 supported.
330
331-- Lossless RGB JPEG files
332 This requires the SmartScale feature, which is not supported.
DRCab4db652011-02-18 04:55:08 +0000333
334
335*******************************************************************************
336** Performance pitfalls
337*******************************************************************************
338
339===============
340Restart Markers
341===============
342
343The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
DRC11a122b2012-02-07 00:14:53 +0000344in a way that makes the rest of the libjpeg infrastructure happy, so it is
345necessary to use the slow Huffman decoder when decompressing a JPEG image that
346has restart markers. This can cause the decompression performance to drop by
347as much as 20%, but the performance will still be much greater than that of
348libjpeg. Many consumer packages, such as PhotoShop, use restart markers when
349generating JPEG images, so images generated by those programs will experience
350this issue.
DRCab4db652011-02-18 04:55:08 +0000351
352===============================================
353Fast Integer Forward DCT at High Quality Levels
354===============================================
355
356The algorithm used by the SIMD-accelerated quantization function cannot produce
357correct results whenever the fast integer forward DCT is used along with a JPEG
358quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
359function in those cases. This causes performance to drop by as much as 40%.
360It is therefore strongly advised that you use the slow integer forward DCT
361whenever encoding images with a JPEG quality of 98 or higher.