media/libjpeg/README-turbo.txt

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

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

mercurial