media/libjpeg/README-turbo.txt

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libjpeg/README-turbo.txt	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,475 @@
     1.4 +*******************************************************************************
     1.5 +**     Background
     1.6 +*******************************************************************************
     1.7 +
     1.8 +libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2,
     1.9 +NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64,
    1.10 +and ARM systems.  On such systems, libjpeg-turbo is generally 2-4x as fast as
    1.11 +libjpeg, all else being equal.  On other types of systems, libjpeg-turbo can
    1.12 +still outperform libjpeg by a significant amount, by virtue of its
    1.13 +highly-optimized Huffman coding routines.  In many cases, the performance of
    1.14 +libjpeg-turbo rivals that of proprietary high-speed JPEG codecs.
    1.15 +
    1.16 +libjpeg-turbo implements both the traditional libjpeg API as well as the less
    1.17 +powerful but more straightforward TurboJPEG API.  libjpeg-turbo also features
    1.18 +colorspace extensions that allow it to compress from/decompress to 32-bit and
    1.19 +big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java
    1.20 +interface.
    1.21 +
    1.22 +libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated
    1.23 +derivative of libjpeg v6b developed by Miyasaka Masaru.  The TigerVNC and
    1.24 +VirtualGL projects made numerous enhancements to the codec in 2009, and in
    1.25 +early 2010, libjpeg-turbo spun off into an independent project, with the goal
    1.26 +of making high-speed JPEG compression/decompression technology available to a
    1.27 +broader range of users and developers.
    1.28 +
    1.29 +
    1.30 +*******************************************************************************
    1.31 +**     License
    1.32 +*******************************************************************************
    1.33 +
    1.34 +Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by
    1.35 +libjpeg (see README.)  The TurboJPEG wrapper (both C and Java versions) and
    1.36 +associated test programs bear a similar license, which is reproduced below:
    1.37 +
    1.38 +Redistribution and use in source and binary forms, with or without
    1.39 +modification, are permitted provided that the following conditions are met:
    1.40 +
    1.41 +- Redistributions of source code must retain the above copyright notice,
    1.42 +  this list of conditions and the following disclaimer.
    1.43 +- Redistributions in binary form must reproduce the above copyright notice,
    1.44 +  this list of conditions and the following disclaimer in the documentation
    1.45 +  and/or other materials provided with the distribution.
    1.46 +- Neither the name of the libjpeg-turbo Project nor the names of its
    1.47 +  contributors may be used to endorse or promote products derived from this
    1.48 +  software without specific prior written permission.
    1.49 +
    1.50 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
    1.51 +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    1.52 +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    1.53 +ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
    1.54 +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    1.55 +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    1.56 +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    1.57 +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    1.58 +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    1.59 +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    1.60 +POSSIBILITY OF SUCH DAMAGE.
    1.61 +
    1.62 +
    1.63 +*******************************************************************************
    1.64 +**     Using libjpeg-turbo
    1.65 +*******************************************************************************
    1.66 +
    1.67 +libjpeg-turbo includes two APIs that can be used to compress and decompress
    1.68 +JPEG images:
    1.69 +
    1.70 +  TurboJPEG API:  This API provides an easy-to-use interface for compressing
    1.71 +  and decompressing JPEG images in memory.  It also provides some functionality
    1.72 +  that would not be straightforward to achieve using the underlying libjpeg
    1.73 +  API, such as generating planar YUV images and performing multiple
    1.74 +  simultaneous lossless transforms on an image.  The Java interface for
    1.75 +  libjpeg-turbo is written on top of the TurboJPEG API.
    1.76 +
    1.77 +  libjpeg API:  This is the de facto industry-standard API for compressing and
    1.78 +  decompressing JPEG images.  It is more difficult to use than the TurboJPEG
    1.79 +  API but also more powerful.  The libjpeg API implementation in libjpeg-turbo
    1.80 +  is both API/ABI-compatible and mathematically compatible with libjpeg v6b.
    1.81 +  It can also optionally be configured to be API/ABI-compatible with libjpeg v7
    1.82 +  and v8 (see below.)
    1.83 +
    1.84 +There is no significant performance advantage to either API when both are used
    1.85 +to perform similar operations.
    1.86 +
    1.87 +======================
    1.88 +Installation Directory
    1.89 +======================
    1.90 +
    1.91 +This document assumes that libjpeg-turbo will be installed in the default
    1.92 +directory (/opt/libjpeg-turbo on Un*x and Mac systems and
    1.93 +c:\libjpeg-turbo[-gcc][64] on Windows systems.  If your installation of
    1.94 +libjpeg-turbo resides in a different directory, then adjust the instructions
    1.95 +accordingly.
    1.96 +
    1.97 +=============================
    1.98 +Replacing libjpeg at Run Time
    1.99 +=============================
   1.100 +
   1.101 +Un*x
   1.102 +----
   1.103 +
   1.104 +If a Un*x application is dynamically linked with libjpeg, then you can replace
   1.105 +libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
   1.106 +For instance:
   1.107 +
   1.108 +  [Using libjpeg]
   1.109 +  > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
   1.110 +  real  0m0.392s
   1.111 +  user  0m0.074s
   1.112 +  sys   0m0.020s
   1.113 +
   1.114 +  [Using libjpeg-turbo]
   1.115 +  > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
   1.116 +  > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
   1.117 +  real  0m0.109s
   1.118 +  user  0m0.029s
   1.119 +  sys   0m0.010s
   1.120 +
   1.121 +({lib} = lib32 or lib64, depending on whether you wish to use the 32-bit or the
   1.122 +64-bit version of libjpeg-turbo.)
   1.123 +
   1.124 +System administrators can also replace the libjpeg symlinks in /usr/lib* with
   1.125 +links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}.
   1.126 +This will effectively accelerate every application that uses the libjpeg
   1.127 +dynamic library on the system.
   1.128 +
   1.129 +Windows
   1.130 +-------
   1.131 +
   1.132 +If a Windows application is dynamically linked with libjpeg, then you can
   1.133 +replace libjpeg with libjpeg-turbo at run time by backing up the application's
   1.134 +copy of jpeg62.dll, jpeg7.dll, or jpeg8.dll (assuming the application has its
   1.135 +own local copy of this library) and copying the corresponding DLL from
   1.136 +libjpeg-turbo into the application's install directory.  The official
   1.137 +libjpeg-turbo binary packages only provide jpeg62.dll.  If the application uses
   1.138 +jpeg7.dll or jpeg8.dll instead, then it will be necessary to build
   1.139 +libjpeg-turbo from source (see "libjpeg v7 and v8 API/ABI Emulation" below.)
   1.140 +
   1.141 +The following information is specific to the official libjpeg-turbo binary
   1.142 +packages for Visual C++:
   1.143 +
   1.144 +-- jpeg62.dll requires the Visual C++ 2008 C run-time DLL (msvcr90.dll).
   1.145 +msvcr90.dll ships with more recent versions of Windows, but users of older
   1.146 +Windows releases can obtain it from the Visual C++ 2008 Redistributable
   1.147 +Package, which is available as a free download from Microsoft's web site.
   1.148 +
   1.149 +-- Features of the libjpeg API that require passing a C run-time structure,
   1.150 +such as a file handle, from an application to the library will probably not
   1.151 +work with jpeg62.dll, unless the application is also built to use the Visual
   1.152 +C++ 2008 C run-time DLL.  In particular, this affects jpeg_stdio_dest() and
   1.153 +jpeg_stdio_src().
   1.154 +
   1.155 +Mac
   1.156 +---
   1.157 +
   1.158 +Mac applications typically embed their own copies of the libjpeg dylib inside
   1.159 +the (hidden) application bundle, so it is not possible to globally replace
   1.160 +libjpeg on OS X systems.  Replacing the application's version of the libjpeg
   1.161 +dylib would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
   1.162 +the appropriate place in the application bundle and using install_name_tool to
   1.163 +repoint the libjpeg-turbo dylib to its new directory.  This requires an
   1.164 +advanced knowledge of OS X and would not survive an upgrade or a re-install of
   1.165 +the application.  Thus, it is not recommended for most users.
   1.166 +
   1.167 +========================================
   1.168 +Using libjpeg-turbo in Your Own Programs
   1.169 +========================================
   1.170 +
   1.171 +For the most part, libjpeg-turbo should work identically to libjpeg, so in
   1.172 +most cases, an application can be built against libjpeg and then run against
   1.173 +libjpeg-turbo.  On Un*x systems and Cygwin, you can build against libjpeg-turbo
   1.174 +instead of libjpeg by setting
   1.175 +
   1.176 +  CPATH=/opt/libjpeg-turbo/include
   1.177 +  and
   1.178 +  LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
   1.179 +
   1.180 +({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
   1.181 +64-bit application.)
   1.182 +
   1.183 +If using MinGW, then set
   1.184 +
   1.185 +  CPATH=/c/libjpeg-turbo-gcc[64]/include
   1.186 +  and
   1.187 +  LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
   1.188 +
   1.189 +Building against libjpeg-turbo is useful, for instance, if you want to build an
   1.190 +application that leverages the libjpeg-turbo colorspace extensions (see below.)
   1.191 +On Un*x systems, you would still need to manipulate LD_LIBRARY_PATH or create
   1.192 +appropriate symlinks to use libjpeg-turbo at run time.  On such systems, you
   1.193 +can pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of
   1.194 +libjpeg-turbo at run time rather than libjpeg (also useful if you want to
   1.195 +leverage the colorspace extensions), or you can link against the libjpeg-turbo
   1.196 +static library.
   1.197 +
   1.198 +To force a Un*x or MinGW application to link against the static version of
   1.199 +libjpeg-turbo, you can use the following linker options:
   1.200 +
   1.201 +  -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
   1.202 +
   1.203 +On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
   1.204 +line.
   1.205 +
   1.206 +To build Visual C++ applications using libjpeg-turbo, add
   1.207 +c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment
   1.208 +variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment
   1.209 +variable, and then link against either jpeg.lib (to use the DLL version of
   1.210 +libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.)
   1.211 +
   1.212 +=====================
   1.213 +Colorspace Extensions
   1.214 +=====================
   1.215 +
   1.216 +libjpeg-turbo includes extensions that allow JPEG images to be compressed
   1.217 +directly from (and decompressed directly to) buffers that use BGR, BGRX,
   1.218 +RGBX, XBGR, and XRGB pixel ordering.  This is implemented with ten new
   1.219 +colorspace constants:
   1.220 +
   1.221 +  JCS_EXT_RGB   /* red/green/blue */
   1.222 +  JCS_EXT_RGBX  /* red/green/blue/x */
   1.223 +  JCS_EXT_BGR   /* blue/green/red */
   1.224 +  JCS_EXT_BGRX  /* blue/green/red/x */
   1.225 +  JCS_EXT_XBGR  /* x/blue/green/red */
   1.226 +  JCS_EXT_XRGB  /* x/red/green/blue */
   1.227 +  JCS_EXT_RGBA  /* red/green/blue/alpha */
   1.228 +  JCS_EXT_BGRA  /* blue/green/red/alpha */
   1.229 +  JCS_EXT_ABGR  /* alpha/blue/green/red */
   1.230 +  JCS_EXT_ARGB  /* alpha/red/green/blue */
   1.231 +
   1.232 +Setting cinfo.in_color_space (compression) or cinfo.out_color_space
   1.233 +(decompression) to one of these values will cause libjpeg-turbo to read the
   1.234 +red, green, and blue values from (or write them to) the appropriate position in
   1.235 +the pixel when compressing from/decompressing to an RGB buffer.
   1.236 +
   1.237 +Your application can check for the existence of these extensions at compile
   1.238 +time with:
   1.239 +
   1.240 +  #ifdef JCS_EXTENSIONS
   1.241 +
   1.242 +At run time, attempting to use these extensions with a libjpeg implementation
   1.243 +that does not support them will result in a "Bogus input colorspace" error.
   1.244 +Applications can trap this error in order to test whether run-time support is
   1.245 +available for the colorspace extensions.
   1.246 +
   1.247 +When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
   1.248 +X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
   1.249 +can set that byte to whatever value it wishes.  If an application expects the X
   1.250 +byte to be used as an alpha channel, then it should specify JCS_EXT_RGBA,
   1.251 +JCS_EXT_BGRA, JCS_EXT_ABGR, or JCS_EXT_ARGB.  When these colorspace constants
   1.252 +are used, the X byte is guaranteed to be 0xFF, which is interpreted as opaque.
   1.253 +
   1.254 +Your application can check for the existence of the alpha channel colorspace
   1.255 +extensions at compile time with:
   1.256 +
   1.257 +  #ifdef JCS_ALPHA_EXTENSIONS
   1.258 +
   1.259 +jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check
   1.260 +for the existence of the colorspace extensions at compile time and run time.
   1.261 +
   1.262 +===================================
   1.263 +libjpeg v7 and v8 API/ABI Emulation
   1.264 +===================================
   1.265 +
   1.266 +With libjpeg v7 and v8, new features were added that necessitated extending the
   1.267 +compression and decompression structures.  Unfortunately, due to the exposed
   1.268 +nature of those structures, extending them also necessitated breaking backward
   1.269 +ABI compatibility with previous libjpeg releases.  Thus, programs that were
   1.270 +built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
   1.271 +based on the libjpeg v6b code base.  Although libjpeg v7 and v8 are still not
   1.272 +as widely used as v6b, enough programs (including a few Linux distros) made
   1.273 +the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
   1.274 +in libjpeg-turbo.  It should be noted, however, that this feature was added
   1.275 +primarily so that applications that had already been compiled to use libjpeg
   1.276 +v7+ could take advantage of accelerated baseline JPEG encoding/decoding
   1.277 +without recompiling.  libjpeg-turbo does not claim to support all of the
   1.278 +libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all
   1.279 +cases (see below.)
   1.280 +
   1.281 +By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an
   1.282 +argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version
   1.283 +of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that programs
   1.284 +that are built against libjpeg v7 or v8 can be run with libjpeg-turbo.  The
   1.285 +following section describes which libjpeg v7+ features are supported and which
   1.286 +aren't.
   1.287 +
   1.288 +Support for libjpeg v7 and v8 Features:
   1.289 +---------------------------------------
   1.290 +
   1.291 +Fully supported:
   1.292 +
   1.293 +-- libjpeg: IDCT scaling extensions in decompressor
   1.294 +   libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8,
   1.295 +   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
   1.296 +   and 1/2 are SIMD-accelerated.)
   1.297 +
   1.298 +-- libjpeg: arithmetic coding
   1.299 +
   1.300 +-- libjpeg: In-memory source and destination managers
   1.301 +   See notes below.
   1.302 +
   1.303 +-- cjpeg: Separate quality settings for luminance and chrominance
   1.304 +   Note that the libpjeg v7+ API was extended to accommodate this feature only
   1.305 +   for convenience purposes.  It has always been possible to implement this
   1.306 +   feature with libjpeg v6b (see rdswitch.c for an example.)
   1.307 +
   1.308 +-- cjpeg: 32-bit BMP support
   1.309 +
   1.310 +-- cjpeg: -rgb option
   1.311 +
   1.312 +-- jpegtran: lossless cropping
   1.313 +
   1.314 +-- jpegtran: -perfect option
   1.315 +
   1.316 +-- jpegtran: forcing width/height when performing lossless crop
   1.317 +
   1.318 +-- rdjpgcom: -raw option
   1.319 +
   1.320 +-- rdjpgcom: locale awareness
   1.321 +
   1.322 +
   1.323 +Not supported:
   1.324 +
   1.325 +NOTE:  As of this writing, extensive research has been conducted into the
   1.326 +usefulness of DCT scaling as a means of data reduction and SmartScale as a
   1.327 +means of quality improvement.  The reader is invited to peruse the research at
   1.328 +http://www.libjpeg-turbo.org/About/SmartScale and draw his/her own conclusions,
   1.329 +but it is the general belief of our project that these features have not
   1.330 +demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
   1.331 +
   1.332 +-- libjpeg: DCT scaling in compressor
   1.333 +   cinfo.scale_num and cinfo.scale_denom are silently ignored.
   1.334 +   There is no technical reason why DCT scaling could not be supported when
   1.335 +   emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see
   1.336 +   below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and
   1.337 +   8/9 would be available, which is of limited usefulness.
   1.338 +
   1.339 +-- libjpeg: SmartScale
   1.340 +   cinfo.block_size is silently ignored.
   1.341 +   SmartScale is an extension to the JPEG format that allows for DCT block
   1.342 +   sizes other than 8x8.  Providing support for this new format would be
   1.343 +   feasible (particularly without full acceleration.)  However, until/unless
   1.344 +   the format becomes either an official industry standard or, at minimum, an
   1.345 +   accepted solution in the community, we are hesitant to implement it, as
   1.346 +   there is no sense of whether or how it might change in the future.  It is
   1.347 +   our belief that SmartScale has not demonstrated sufficient usefulness as a
   1.348 +   lossless format nor as a means of quality enhancement, and thus, our primary
   1.349 +   interest in providing this feature would be as a means of supporting
   1.350 +   additional DCT scaling factors.
   1.351 +
   1.352 +-- libjpeg: Fancy downsampling in compressor
   1.353 +   cinfo.do_fancy_downsampling is silently ignored.
   1.354 +   This requires the DCT scaling feature, which is not supported.
   1.355 +
   1.356 +-- jpegtran: Scaling
   1.357 +   This requires both the DCT scaling and SmartScale features, which are not
   1.358 +   supported.
   1.359 +
   1.360 +-- Lossless RGB JPEG files
   1.361 +   This requires the SmartScale feature, which is not supported.
   1.362 +
   1.363 +What About libjpeg v9?
   1.364 +----------------------
   1.365 +
   1.366 +libjpeg v9 introduced yet another field to the JPEG compression structure
   1.367 +(color_transform), thus making the ABI backward incompatible with that of
   1.368 +libjpeg v8.  This new field was introduced solely for the purpose of supporting
   1.369 +lossless SmartScale encoding.  Further, there was actually no reason to extend
   1.370 +the API in this manner, as the color transform could have just as easily been
   1.371 +activated by way of a new JPEG colorspace constant, thus preserving backward
   1.372 +ABI compatibility.
   1.373 +
   1.374 +Our research (see link above) has shown that lossless SmartScale does not
   1.375 +generally accomplish anything that can't already be accomplished better with
   1.376 +existing, standard lossless formats.  Thus, at this time, it is our belief that
   1.377 +there is not sufficient technical justification for software to upgrade from
   1.378 +libjpeg v8 to libjpeg v9, and therefore, not sufficient technical justification
   1.379 +for us to emulate the libjpeg v9 ABI.
   1.380 +
   1.381 +=====================================
   1.382 +In-Memory Source/Destination Managers
   1.383 +=====================================
   1.384 +
   1.385 +By default, libjpeg-turbo 1.3 and later includes the jpeg_mem_src() and
   1.386 +jpeg_mem_dest() functions, even when not emulating the libjpeg v8 API/ABI.
   1.387 +Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8
   1.388 +API/ABI emulation in order to use the in-memory source/destination managers,
   1.389 +but several projects requested that those functions be included when emulating
   1.390 +the libjpeg v6b API/ABI as well.  This allows the use of those functions by
   1.391 +programs that need them without breaking ABI compatibility for programs that
   1.392 +don't, and it allows those functions to be provided in the "official"
   1.393 +libjpeg-turbo binaries.
   1.394 +
   1.395 +Those who are concerned about maintaining strict conformance with the libjpeg
   1.396 +v6b or v7 API can pass an argument of --without-mem-srcdst to configure or
   1.397 +an argument of -DWITH_MEM_SRCDST=0 to CMake prior to building libjpeg-turbo.
   1.398 +This will restore the pre-1.3 behavior, in which jpeg_mem_src() and
   1.399 +jpeg_mem_dest() are only included when emulating the libjpeg v8 API/ABI.
   1.400 +
   1.401 +On Un*x systems, including the in-memory source/destination managers changes
   1.402 +the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI
   1.403 +emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation.
   1.404 +
   1.405 +Note that, on most Un*x systems, the dynamic linker will not look for a
   1.406 +function in a library until that function is actually used.  Thus, if a program
   1.407 +is built against libjpeg-turbo 1.3+ and uses jpeg_mem_src() or jpeg_mem_dest(),
   1.408 +that program will not fail if run against an older version of libjpeg-turbo or
   1.409 +against libjpeg v7- until the program actually tries to call jpeg_mem_src() or
   1.410 +jpeg_mem_dest().  Such is not the case on Windows.  If a program is built
   1.411 +against the libjpeg-turbo 1.3+ DLL and uses jpeg_mem_src() or jpeg_mem_dest(),
   1.412 +then it must use the libjpeg-turbo 1.3+ DLL at run time.
   1.413 +
   1.414 +Both cjpeg and djpeg have been extended to allow testing the in-memory
   1.415 +source/destination manager functions.  See their respective man pages for more
   1.416 +details.
   1.417 +
   1.418 +
   1.419 +*******************************************************************************
   1.420 +**     Mathematical Compatibility
   1.421 +*******************************************************************************
   1.422 +
   1.423 +For the most part, libjpeg-turbo should produce identical output to libjpeg
   1.424 +v6b.  The one exception to this is when using the floating point DCT/IDCT, in
   1.425 +which case the outputs of libjpeg v6b and libjpeg-turbo are not guaranteed to
   1.426 +be identical (the accuracy of the floating point DCT/IDCT is constant when
   1.427 +using libjpeg-turbo's SIMD extensions, but otherwise, it can depend heavily on
   1.428 +the compiler and compiler settings.)
   1.429 +
   1.430 +While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is
   1.431 +still using the same algorithms as libjpeg v6b, so there are several specific
   1.432 +cases in which libjpeg-turbo cannot be expected to produce the same output as
   1.433 +libjpeg v8:
   1.434 +
   1.435 +-- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
   1.436 +   implements those scaling algorithms a bit differently than libjpeg v6b does,
   1.437 +   and libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
   1.438 +
   1.439 +-- When using chrominance subsampling, because libjpeg v8 implements this
   1.440 +   with its DCT/IDCT scaling algorithms rather than with a separate
   1.441 +   downsampling/upsampling algorithm.
   1.442 +
   1.443 +-- When using the floating point IDCT, for the reasons stated above and also
   1.444 +   because the floating point IDCT algorithm was modified in libjpeg v8a to
   1.445 +   improve accuracy.
   1.446 +
   1.447 +-- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
   1.448 +   "non-smooth") chrominance upsampling, because libjpeg v8 does not support
   1.449 +   merged upsampling with scaling factors > 1.
   1.450 +
   1.451 +
   1.452 +*******************************************************************************
   1.453 +**     Performance Pitfalls
   1.454 +*******************************************************************************
   1.455 +
   1.456 +===============
   1.457 +Restart Markers
   1.458 +===============
   1.459 +
   1.460 +The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
   1.461 +in a way that makes the rest of the libjpeg infrastructure happy, so it is
   1.462 +necessary to use the slow Huffman decoder when decompressing a JPEG image that
   1.463 +has restart markers.  This can cause the decompression performance to drop by
   1.464 +as much as 20%, but the performance will still be much greater than that of
   1.465 +libjpeg.  Many consumer packages, such as PhotoShop, use restart markers when
   1.466 +generating JPEG images, so images generated by those programs will experience
   1.467 +this issue.
   1.468 +
   1.469 +===============================================
   1.470 +Fast Integer Forward DCT at High Quality Levels
   1.471 +===============================================
   1.472 +
   1.473 +The algorithm used by the SIMD-accelerated quantization function cannot produce
   1.474 +correct results whenever the fast integer forward DCT is used along with a JPEG
   1.475 +quality of 98-100.  Thus, libjpeg-turbo must use the non-SIMD quantization
   1.476 +function in those cases.  This causes performance to drop by as much as 40%.
   1.477 +It is therefore strongly advised that you use the slow integer forward DCT
   1.478 +whenever encoding images with a JPEG quality of 98 or higher.

mercurial