OLD | NEW |
| (Empty) |
1 ******************************************************************************* | |
2 ** Background | |
3 ******************************************************************************* | |
4 | |
5 libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, | |
6 NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, | |
7 and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as fast as | |
8 libjpeg, all else being equal. On other types of systems, libjpeg-turbo can | |
9 still outperform libjpeg by a significant amount, by virtue of its | |
10 highly-optimized Huffman coding routines. In many cases, the performance of | |
11 libjpeg-turbo rivals that of proprietary high-speed JPEG codecs. | |
12 | |
13 libjpeg-turbo implements both the traditional libjpeg API as well as the less | |
14 powerful but more straightforward TurboJPEG API. libjpeg-turbo also features | |
15 colorspace extensions that allow it to compress from/decompress to 32-bit and | |
16 big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java | |
17 interface. | |
18 | |
19 libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated | |
20 derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and | |
21 VirtualGL projects made numerous enhancements to the codec in 2009, and in | |
22 early 2010, libjpeg-turbo spun off into an independent project, with the goal | |
23 of making high-speed JPEG compression/decompression technology available to a | |
24 broader range of users and developers. | |
25 | |
26 | |
27 ******************************************************************************* | |
28 ** License | |
29 ******************************************************************************* | |
30 | |
31 Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by | |
32 libjpeg (see README.) The TurboJPEG wrapper (both C and Java versions) and | |
33 associated test programs bear a similar license, which is reproduced below: | |
34 | |
35 Redistribution and use in source and binary forms, with or without | |
36 modification, are permitted provided that the following conditions are met: | |
37 | |
38 - Redistributions of source code must retain the above copyright notice, | |
39 this list of conditions and the following disclaimer. | |
40 - Redistributions in binary form must reproduce the above copyright notice, | |
41 this list of conditions and the following disclaimer in the documentation | |
42 and/or other materials provided with the distribution. | |
43 - Neither the name of the libjpeg-turbo Project nor the names of its | |
44 contributors may be used to endorse or promote products derived from this | |
45 software without specific prior written permission. | |
46 | |
47 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", | |
48 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
49 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
50 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE | |
51 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
52 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
53 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
54 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
55 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
56 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
57 POSSIBILITY OF SUCH DAMAGE. | |
58 | |
59 | |
60 ******************************************************************************* | |
61 ** Using libjpeg-turbo | |
62 ******************************************************************************* | |
63 | |
64 libjpeg-turbo includes two APIs that can be used to compress and decompress | |
65 JPEG images: | |
66 | |
67 TurboJPEG API: This API provides an easy-to-use interface for compressing | |
68 and decompressing JPEG images in memory. It also provides some functionality | |
69 that would not be straightforward to achieve using the underlying libjpeg | |
70 API, such as generating planar YUV images and performing multiple | |
71 simultaneous lossless transforms on an image. The Java interface for | |
72 libjpeg-turbo is written on top of the TurboJPEG API. | |
73 | |
74 libjpeg API: This is the de facto industry-standard API for compressing and | |
75 decompressing JPEG images. It is more difficult to use than the TurboJPEG | |
76 API but also more powerful. The libjpeg API implementation in libjpeg-turbo | |
77 is both API/ABI-compatible and mathematically compatible with libjpeg v6b. | |
78 It can also optionally be configured to be API/ABI-compatible with libjpeg v7 | |
79 and v8 (see below.) | |
80 | |
81 There is no significant performance advantage to either API when both are used | |
82 to perform similar operations. | |
83 | |
84 ====================== | |
85 Installation Directory | |
86 ====================== | |
87 | |
88 This document assumes that libjpeg-turbo will be installed in the default | |
89 directory (/opt/libjpeg-turbo on Un*x and Mac systems and | |
90 c:\libjpeg-turbo[-gcc][64] on Windows systems. If your installation of | |
91 libjpeg-turbo resides in a different directory, then adjust the instructions | |
92 accordingly. | |
93 | |
94 ============================= | |
95 Replacing libjpeg at Run Time | |
96 ============================= | |
97 | |
98 Un*x | |
99 ---- | |
100 | |
101 If a Un*x application is dynamically linked with libjpeg, then you can replace | |
102 libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH. | |
103 For instance: | |
104 | |
105 [Using libjpeg] | |
106 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg | |
107 real 0m0.392s | |
108 user 0m0.074s | |
109 sys 0m0.020s | |
110 | |
111 [Using libjpeg-turbo] | |
112 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH | |
113 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg | |
114 real 0m0.109s | |
115 user 0m0.029s | |
116 sys 0m0.010s | |
117 | |
118 ({lib} = lib32 or lib64, depending on whether you wish to use the 32-bit or the | |
119 64-bit version of libjpeg-turbo.) | |
120 | |
121 System administrators can also replace the libjpeg symlinks in /usr/lib* with | |
122 links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}. | |
123 This will effectively accelerate every application that uses the libjpeg | |
124 dynamic library on the system. | |
125 | |
126 Windows | |
127 ------- | |
128 | |
129 If a Windows application is dynamically linked with libjpeg, then you can | |
130 replace libjpeg with libjpeg-turbo at run time by backing up the application's | |
131 copy of jpeg62.dll, jpeg7.dll, or jpeg8.dll (assuming the application has its | |
132 own local copy of this library) and copying the corresponding DLL from | |
133 libjpeg-turbo into the application's install directory. The official | |
134 libjpeg-turbo binary packages only provide jpeg62.dll. If the application uses | |
135 jpeg7.dll or jpeg8.dll instead, then it will be necessary to build | |
136 libjpeg-turbo from source (see "libjpeg v7 and v8 API/ABI Emulation" below.) | |
137 | |
138 The following information is specific to the official libjpeg-turbo binary | |
139 packages for Visual C++: | |
140 | |
141 -- jpeg62.dll requires the Visual C++ 2008 C run-time DLL (msvcr90.dll). | |
142 msvcr90.dll ships with more recent versions of Windows, but users of older | |
143 Windows releases can obtain it from the Visual C++ 2008 Redistributable | |
144 Package, which is available as a free download from Microsoft's web site. | |
145 | |
146 -- Features of the libjpeg API that require passing a C run-time structure, | |
147 such as a file handle, from an application to the library will probably not | |
148 work with jpeg62.dll, unless the application is also built to use the Visual | |
149 C++ 2008 C run-time DLL. In particular, this affects jpeg_stdio_dest() and | |
150 jpeg_stdio_src(). | |
151 | |
152 Mac | |
153 --- | |
154 | |
155 Mac applications typically embed their own copies of the libjpeg dylib inside | |
156 the (hidden) application bundle, so it is not possible to globally replace | |
157 libjpeg on OS X systems. Replacing the application's version of the libjpeg | |
158 dylib would generally involve copying libjpeg.*.dylib from libjpeg-turbo into | |
159 the appropriate place in the application bundle and using install_name_tool to | |
160 repoint the libjpeg-turbo dylib to its new directory. This requires an | |
161 advanced knowledge of OS X and would not survive an upgrade or a re-install of | |
162 the application. Thus, it is not recommended for most users. | |
163 | |
164 ======================================== | |
165 Using libjpeg-turbo in Your Own Programs | |
166 ======================================== | |
167 | |
168 For the most part, libjpeg-turbo should work identically to libjpeg, so in | |
169 most cases, an application can be built against libjpeg and then run against | |
170 libjpeg-turbo. On Un*x systems and Cygwin, you can build against libjpeg-turbo | |
171 instead of libjpeg by setting | |
172 | |
173 CPATH=/opt/libjpeg-turbo/include | |
174 and | |
175 LIBRARY_PATH=/opt/libjpeg-turbo/{lib} | |
176 | |
177 ({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a | |
178 64-bit application.) | |
179 | |
180 If using MinGW, then set | |
181 | |
182 CPATH=/c/libjpeg-turbo-gcc[64]/include | |
183 and | |
184 LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib | |
185 | |
186 Building against libjpeg-turbo is useful, for instance, if you want to build an | |
187 application that leverages the libjpeg-turbo colorspace extensions (see below.) | |
188 On Un*x systems, you would still need to manipulate LD_LIBRARY_PATH or create | |
189 appropriate symlinks to use libjpeg-turbo at run time. On such systems, you | |
190 can pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of | |
191 libjpeg-turbo at run time rather than libjpeg (also useful if you want to | |
192 leverage the colorspace extensions), or you can link against the libjpeg-turbo | |
193 static library. | |
194 | |
195 To force a Un*x or MinGW application to link against the static version of | |
196 libjpeg-turbo, you can use the following linker options: | |
197 | |
198 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic | |
199 | |
200 On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command | |
201 line. | |
202 | |
203 To build Visual C++ applications using libjpeg-turbo, add | |
204 c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment | |
205 variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment | |
206 variable, and then link against either jpeg.lib (to use the DLL version of | |
207 libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.) | |
208 | |
209 ===================== | |
210 Colorspace Extensions | |
211 ===================== | |
212 | |
213 libjpeg-turbo includes extensions that allow JPEG images to be compressed | |
214 directly from (and decompressed directly to) buffers that use BGR, BGRX, | |
215 RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new | |
216 colorspace constants: | |
217 | |
218 JCS_EXT_RGB /* red/green/blue */ | |
219 JCS_EXT_RGBX /* red/green/blue/x */ | |
220 JCS_EXT_BGR /* blue/green/red */ | |
221 JCS_EXT_BGRX /* blue/green/red/x */ | |
222 JCS_EXT_XBGR /* x/blue/green/red */ | |
223 JCS_EXT_XRGB /* x/red/green/blue */ | |
224 JCS_EXT_RGBA /* red/green/blue/alpha */ | |
225 JCS_EXT_BGRA /* blue/green/red/alpha */ | |
226 JCS_EXT_ABGR /* alpha/blue/green/red */ | |
227 JCS_EXT_ARGB /* alpha/red/green/blue */ | |
228 | |
229 Setting cinfo.in_color_space (compression) or cinfo.out_color_space | |
230 (decompression) to one of these values will cause libjpeg-turbo to read the | |
231 red, green, and blue values from (or write them to) the appropriate position in | |
232 the pixel when compressing from/decompressing to an RGB buffer. | |
233 | |
234 Your application can check for the existence of these extensions at compile | |
235 time with: | |
236 | |
237 #ifdef JCS_EXTENSIONS | |
238 | |
239 At run time, attempting to use these extensions with a libjpeg implementation | |
240 that does not support them will result in a "Bogus input colorspace" error. | |
241 Applications can trap this error in order to test whether run-time support is | |
242 available for the colorspace extensions. | |
243 | |
244 When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the | |
245 X byte is undefined, and in order to ensure the best performance, libjpeg-turbo | |
246 can set that byte to whatever value it wishes. If an application expects the X | |
247 byte to be used as an alpha channel, then it should specify JCS_EXT_RGBA, | |
248 JCS_EXT_BGRA, JCS_EXT_ABGR, or JCS_EXT_ARGB. When these colorspace constants | |
249 are used, the X byte is guaranteed to be 0xFF, which is interpreted as opaque. | |
250 | |
251 Your application can check for the existence of the alpha channel colorspace | |
252 extensions at compile time with: | |
253 | |
254 #ifdef JCS_ALPHA_EXTENSIONS | |
255 | |
256 jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check | |
257 for the existence of the colorspace extensions at compile time and run time. | |
258 | |
259 =================================== | |
260 libjpeg v7 and v8 API/ABI Emulation | |
261 =================================== | |
262 | |
263 With libjpeg v7 and v8, new features were added that necessitated extending the | |
264 compression and decompression structures. Unfortunately, due to the exposed | |
265 nature of those structures, extending them also necessitated breaking backward | |
266 ABI compatibility with previous libjpeg releases. Thus, programs that were | |
267 built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is | |
268 based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not | |
269 as widely used as v6b, enough programs (including a few Linux distros) made | |
270 the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs | |
271 in libjpeg-turbo. It should be noted, however, that this feature was added | |
272 primarily so that applications that had already been compiled to use libjpeg | |
273 v7+ could take advantage of accelerated baseline JPEG encoding/decoding | |
274 without recompiling. libjpeg-turbo does not claim to support all of the | |
275 libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all | |
276 cases (see below.) | |
277 | |
278 By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an | |
279 argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version | |
280 of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that programs | |
281 that are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The | |
282 following section describes which libjpeg v7+ features are supported and which | |
283 aren't. | |
284 | |
285 Support for libjpeg v7 and v8 Features: | |
286 --------------------------------------- | |
287 | |
288 Fully supported: | |
289 | |
290 -- libjpeg: IDCT scaling extensions in decompressor | |
291 libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8, | |
292 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 | |
293 and 1/2 are SIMD-accelerated.) | |
294 | |
295 -- libjpeg: arithmetic coding | |
296 | |
297 -- libjpeg: In-memory source and destination managers | |
298 See notes below. | |
299 | |
300 -- cjpeg: Separate quality settings for luminance and chrominance | |
301 Note that the libpjeg v7+ API was extended to accommodate this feature only | |
302 for convenience purposes. It has always been possible to implement this | |
303 feature with libjpeg v6b (see rdswitch.c for an example.) | |
304 | |
305 -- cjpeg: 32-bit BMP support | |
306 | |
307 -- cjpeg: -rgb option | |
308 | |
309 -- jpegtran: lossless cropping | |
310 | |
311 -- jpegtran: -perfect option | |
312 | |
313 -- jpegtran: forcing width/height when performing lossless crop | |
314 | |
315 -- rdjpgcom: -raw option | |
316 | |
317 -- rdjpgcom: locale awareness | |
318 | |
319 | |
320 Not supported: | |
321 | |
322 NOTE: As of this writing, extensive research has been conducted into the | |
323 usefulness of DCT scaling as a means of data reduction and SmartScale as a | |
324 means of quality improvement. The reader is invited to peruse the research at | |
325 http://www.libjpeg-turbo.org/About/SmartScale and draw his/her own conclusions, | |
326 but it is the general belief of our project that these features have not | |
327 demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo. | |
328 | |
329 -- libjpeg: DCT scaling in compressor | |
330 cinfo.scale_num and cinfo.scale_denom are silently ignored. | |
331 There is no technical reason why DCT scaling could not be supported when | |
332 emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see | |
333 below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and | |
334 8/9 would be available, which is of limited usefulness. | |
335 | |
336 -- libjpeg: SmartScale | |
337 cinfo.block_size is silently ignored. | |
338 SmartScale is an extension to the JPEG format that allows for DCT block | |
339 sizes other than 8x8. Providing support for this new format would be | |
340 feasible (particularly without full acceleration.) However, until/unless | |
341 the format becomes either an official industry standard or, at minimum, an | |
342 accepted solution in the community, we are hesitant to implement it, as | |
343 there is no sense of whether or how it might change in the future. It is | |
344 our belief that SmartScale has not demonstrated sufficient usefulness as a | |
345 lossless format nor as a means of quality enhancement, and thus, our primary | |
346 interest in providing this feature would be as a means of supporting | |
347 additional DCT scaling factors. | |
348 | |
349 -- libjpeg: Fancy downsampling in compressor | |
350 cinfo.do_fancy_downsampling is silently ignored. | |
351 This requires the DCT scaling feature, which is not supported. | |
352 | |
353 -- jpegtran: Scaling | |
354 This requires both the DCT scaling and SmartScale features, which are not | |
355 supported. | |
356 | |
357 -- Lossless RGB JPEG files | |
358 This requires the SmartScale feature, which is not supported. | |
359 | |
360 What About libjpeg v9? | |
361 ---------------------- | |
362 | |
363 libjpeg v9 introduced yet another field to the JPEG compression structure | |
364 (color_transform), thus making the ABI backward incompatible with that of | |
365 libjpeg v8. This new field was introduced solely for the purpose of supporting | |
366 lossless SmartScale encoding. Further, there was actually no reason to extend | |
367 the API in this manner, as the color transform could have just as easily been | |
368 activated by way of a new JPEG colorspace constant, thus preserving backward | |
369 ABI compatibility. | |
370 | |
371 Our research (see link above) has shown that lossless SmartScale does not | |
372 generally accomplish anything that can't already be accomplished better with | |
373 existing, standard lossless formats. Thus, at this time, it is our belief that | |
374 there is not sufficient technical justification for software to upgrade from | |
375 libjpeg v8 to libjpeg v9, and therefore, not sufficient technical justification | |
376 for us to emulate the libjpeg v9 ABI. | |
377 | |
378 ===================================== | |
379 In-Memory Source/Destination Managers | |
380 ===================================== | |
381 | |
382 By default, libjpeg-turbo 1.3 and later includes the jpeg_mem_src() and | |
383 jpeg_mem_dest() functions, even when not emulating the libjpeg v8 API/ABI. | |
384 Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8 | |
385 API/ABI emulation in order to use the in-memory source/destination managers, | |
386 but several projects requested that those functions be included when emulating | |
387 the libjpeg v6b API/ABI as well. This allows the use of those functions by | |
388 programs that need them without breaking ABI compatibility for programs that | |
389 don't, and it allows those functions to be provided in the "official" | |
390 libjpeg-turbo binaries. | |
391 | |
392 Those who are concerned about maintaining strict conformance with the libjpeg | |
393 v6b or v7 API can pass an argument of --without-mem-srcdst to configure or | |
394 an argument of -DWITH_MEM_SRCDST=0 to CMake prior to building libjpeg-turbo. | |
395 This will restore the pre-1.3 behavior, in which jpeg_mem_src() and | |
396 jpeg_mem_dest() are only included when emulating the libjpeg v8 API/ABI. | |
397 | |
398 On Un*x systems, including the in-memory source/destination managers changes | |
399 the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI | |
400 emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation. | |
401 | |
402 Note that, on most Un*x systems, the dynamic linker will not look for a | |
403 function in a library until that function is actually used. Thus, if a program | |
404 is built against libjpeg-turbo 1.3+ and uses jpeg_mem_src() or jpeg_mem_dest(), | |
405 that program will not fail if run against an older version of libjpeg-turbo or | |
406 against libjpeg v7- until the program actually tries to call jpeg_mem_src() or | |
407 jpeg_mem_dest(). Such is not the case on Windows. If a program is built | |
408 against the libjpeg-turbo 1.3+ DLL and uses jpeg_mem_src() or jpeg_mem_dest(), | |
409 then it must use the libjpeg-turbo 1.3+ DLL at run time. | |
410 | |
411 Both cjpeg and djpeg have been extended to allow testing the in-memory | |
412 source/destination manager functions. See their respective man pages for more | |
413 details. | |
414 | |
415 | |
416 ******************************************************************************* | |
417 ** Mathematical Compatibility | |
418 ******************************************************************************* | |
419 | |
420 For the most part, libjpeg-turbo should produce identical output to libjpeg | |
421 v6b. The one exception to this is when using the floating point DCT/IDCT, in | |
422 which case the outputs of libjpeg v6b and libjpeg-turbo are not guaranteed to | |
423 be identical (the accuracy of the floating point DCT/IDCT is constant when | |
424 using libjpeg-turbo's SIMD extensions, but otherwise, it can depend heavily on | |
425 the compiler and compiler settings.) | |
426 | |
427 While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is | |
428 still using the same algorithms as libjpeg v6b, so there are several specific | |
429 cases in which libjpeg-turbo cannot be expected to produce the same output as | |
430 libjpeg v8: | |
431 | |
432 -- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8 | |
433 implements those scaling algorithms a bit differently than libjpeg v6b does, | |
434 and libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior. | |
435 | |
436 -- When using chrominance subsampling, because libjpeg v8 implements this | |
437 with its DCT/IDCT scaling algorithms rather than with a separate | |
438 downsampling/upsampling algorithm. | |
439 | |
440 -- When using the floating point IDCT, for the reasons stated above and also | |
441 because the floating point IDCT algorithm was modified in libjpeg v8a to | |
442 improve accuracy. | |
443 | |
444 -- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or | |
445 "non-smooth") chrominance upsampling, because libjpeg v8 does not support | |
446 merged upsampling with scaling factors > 1. | |
447 | |
448 | |
449 ******************************************************************************* | |
450 ** Performance Pitfalls | |
451 ******************************************************************************* | |
452 | |
453 =============== | |
454 Restart Markers | |
455 =============== | |
456 | |
457 The optimized Huffman decoder in libjpeg-turbo does not handle restart markers | |
458 in a way that makes the rest of the libjpeg infrastructure happy, so it is | |
459 necessary to use the slow Huffman decoder when decompressing a JPEG image that | |
460 has restart markers. This can cause the decompression performance to drop by | |
461 as much as 20%, but the performance will still be much greater than that of | |
462 libjpeg. Many consumer packages, such as PhotoShop, use restart markers when | |
463 generating JPEG images, so images generated by those programs will experience | |
464 this issue. | |
465 | |
466 =============================================== | |
467 Fast Integer Forward DCT at High Quality Levels | |
468 =============================================== | |
469 | |
470 The algorithm used by the SIMD-accelerated quantization function cannot produce | |
471 correct results whenever the fast integer forward DCT is used along with a JPEG | |
472 quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization | |
473 function in those cases. This causes performance to drop by as much as 40%. | |
474 It is therefore strongly advised that you use the slow integer forward DCT | |
475 whenever encoding images with a JPEG quality of 98 or higher. | |
OLD | NEW |