| 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 |