Index: third_party/libjpeg_turbo/README-turbo.txt |
=================================================================== |
--- third_party/libjpeg_turbo/README-turbo.txt (revision 95020) |
+++ third_party/libjpeg_turbo/README-turbo.txt (working copy) |
@@ -2,22 +2,23 @@ |
** Background |
******************************************************************************* |
-libjpeg-turbo is a high-speed version of libjpeg for x86 and x86-64 processors |
-which uses SIMD instructions (MMX, SSE2, etc.) to accelerate baseline JPEG |
-compression and decompression. libjpeg-turbo is generally 2-4x as fast |
+libjpeg-turbo is a derivative of libjpeg which uses SIMD instructions (MMX, |
+SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86 |
+and x86-64 systems. On such systems, libjpeg-turbo is generally 2-4x as fast |
as the unmodified version of libjpeg, all else being equal. |
libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but |
-the TigerVNC and VirtualGL projects made numerous enhancements to the codec, |
-including improved support for Mac OS X, 64-bit support, support for 32-bit |
-and big endian pixel formats, accelerated Huffman encoding/decoding, and |
-various bug fixes. The goal was to produce a fully open source codec that |
-could replace the partially closed source TurboJPEG/IPP codec used by VirtualGL |
-and TurboVNC. libjpeg-turbo generally performs in the range of 80-120% of |
-TurboJPEG/IPP. It is faster in some areas but slower in others. |
+the TigerVNC and VirtualGL projects made numerous enhancements to the codec in |
+2009, including improved support for Mac OS X, 64-bit support, support for |
+32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman |
+encoding/decoding, and various bug fixes. The goal was to produce a fully open |
+source codec that could replace the partially closed source TurboJPEG/IPP codec |
+used by VirtualGL and TurboVNC. libjpeg-turbo generally performs in the range |
+of 80-120% of TurboJPEG/IPP. It is faster in some areas but slower in others. |
-It was decided to split libjpeg-turbo into a separate SDK so that other |
-projects could take advantage of this technology. The libjpeg-turbo shared |
+In early 2010, libjpeg-turbo spun off into its own independent project, with |
+the goal of making high-speed JPEG compression/decompression technology |
+available to a broader range of users and developers. The libjpeg-turbo shared |
libraries can be used as drop-in replacements for libjpeg on most systems. |
@@ -25,33 +26,62 @@ |
** License |
******************************************************************************* |
-Some of the optimizations to the Huffman encoder (jchuff.c) and decoder |
-(jdhuff.c) were borrowed from VirtualGL, and thus any distribution of |
-libjpeg-turbo which includes those optimizations must, as a whole, be subject |
-to the terms of the wxWindows Library Licence, Version 3.1. A copy of this |
-license can be found in this directory under LICENSE.txt. The wxWindows |
-Library License is based on the LGPL but includes provisions which allow the |
-Library to be statically linked into proprietary libraries and applications |
-without requiring the resulting binaries to be distributed under the terms of |
-the LGPL. |
+libjpeg-turbo is licensed under a non-restrictive, BSD-style license |
+(see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and |
+associated test programs bear a similar license, which is reproduced below: |
-The rest of the source code, apart from the Huffman codec optimizations, falls |
-under a less restrictive, BSD-style license (see README.) You can choose to |
-distribute libjpeg-turbo, as a whole, under this BSD-style license by simply |
-replacing the optimized jchuff.c and jdhuff.c with their unoptimized |
-counterparts from the libjpeg v6b source. |
+Redistribution and use in source and binary forms, with or without |
+modification, are permitted provided that the following conditions are met: |
+- Redistributions of source code must retain the above copyright notice, |
+ this list of conditions and the following disclaimer. |
+- Redistributions in binary form must reproduce the above copyright notice, |
+ this list of conditions and the following disclaimer in the documentation |
+ and/or other materials provided with the distribution. |
+- Neither the name of the libjpeg-turbo Project nor the names of its |
+ contributors may be used to endorse or promote products derived from this |
+ software without specific prior written permission. |
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", |
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE |
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
+POSSIBILITY OF SUCH DAMAGE. |
+ |
+ |
******************************************************************************* |
** Using libjpeg-turbo |
******************************************************************************* |
+libjpeg-turbo includes two APIs which can be used to compress and decompress |
+JPEG images: |
+ |
+ TurboJPEG/OSS: This API wraps libjpeg-turbo and provides an easy-to-use |
+ interface for compressing and decompressing JPEG images in memory. It also |
+ provides some features that would not be straightforward to implement using |
+ the underlying libjpeg API, such as generating planar YUV images and |
+ performing multiple simultaneous lossless transforms on an image. The Java |
+ interface for libjpeg-turbo is written on top of TurboJPEG/OSS. |
+ |
+ libjpeg API: This is the industry standard API for compressing and |
+ decompressing JPEG images. It is more difficult to use than TurboJPEG/OSS |
+ but also more powerful. libjpeg-turbo is both API/ABI-compatible and |
+ mathematically compatible with libjpeg v6b. It can also optionally be |
+ configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.) |
+ |
+ |
============================= |
Replacing libjpeg at Run Time |
============================= |
If a Unix application is dynamically linked with libjpeg, then you can replace |
-libjpeg with libjpeg-turbo at run time by manipulating the LD_LIBRARY_PATH. |
+libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH. |
For instance: |
[Using libjpeg] |
@@ -75,36 +105,39 @@ |
will effectively accelerate every dynamically linked libjpeg application on the |
system. |
-The Windows distribution of the libjpeg-turbo SDK installs jpeg62.dll into |
-c:\libjpeg-turbo\bin, and the PATH environment variable can be modified such |
-that this directory is searched before any others that might contain |
-jpeg62.dll. However, if jpeg62.dll also exists in an application's install |
-directory, then Windows will load the application's version of it first. Thus, |
-if an application ships with jpeg62.dll, then back up the application's version |
-of jpeg62.dll and copy c:\libjpeg-turbo\bin\jpeg62.dll into the application's |
-install directory to accelerate it. |
+The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL |
+(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether libjpeg v6b, v7, or |
+v8 emulation is enabled) into c:\libjpeg-turbo[64]\bin, and the PATH |
+environment variable can be modified such that this directory is searched |
+before any others that might contain a libjpeg DLL. However, if a libjpeg |
+DLL exists in an application's install directory, then Windows will load this |
+DLL first whenever the application is launched. Thus, if an application ships |
+with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's |
+version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the |
+application's install directory to accelerate it. |
-The version of jpeg62.dll distributed in the libjpeg-turbo SDK requires the |
-Visual C++ 2008 C run time DLL (msvcr90.dll). This library ships with more |
-recent versions of Windows, but users of older versions can obtain it from the |
-Visual C++ 2008 Redistributable Package, which is available as a free download |
-from Microsoft's web site. |
+The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
+Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll). |
+msvcr90.dll ships with more recent versions of Windows, but users of older |
+Windows releases can obtain it from the Visual C++ 2008 Redistributable |
+Package, which is available as a free download from Microsoft's web site. |
NOTE: Features of libjpeg which require passing a C run time structure, such |
as a file handle, from an application to libjpeg will probably not work with |
-the distributed version of jpeg62.dll unless the application is also built to |
-use the Visual C++ 2008 C run time DLL. In particular, this affects |
-jpeg_stdio_dest() and jpeg_stdio_src(). |
+the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
+Visual C++, unless the application is also built to use the Visual C++ 2008 C |
+run time DLL. In particular, this affects jpeg_stdio_dest() and |
+jpeg_stdio_src(). |
-Mac applications typically embed their own copies of libjpeg.62.dylib inside |
+Mac applications typically embed their own copies of the libjpeg dylib inside |
the (hidden) application bundle, so it is not possible to globally replace |
libjpeg on OS X systems. If an application uses a shared library version of |
libjpeg, then it may be possible to replace the application's version of it. |
-This would generally involve copying libjpeg.62.dylib into the appropriate |
-place in the application bundle and using install_name_tool to repoint the |
-dylib to the new directory. This requires an advanced knowledge of OS X and |
-would not survive an upgrade or a re-install of the application. Thus, it is |
-not recommended for most users. |
+This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into |
+the appropriate place in the application bundle and using install_name_tool to |
+repoint the dylib to the new directory. This requires an advanced knowledge of |
+OS X and would not survive an upgrade or a re-install of the application. |
+Thus, it is not recommended for most users. |
======================= |
Replacing TurboJPEG/IPP |
@@ -115,8 +148,8 @@ |
library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo |
instead of the closed source Intel Performance Primitives. You can replace the |
TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order |
-to make existing releases of VirtualGL 2.1.x and TurboVNC use the new codec at |
-run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit |
+to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec |
+at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit |
binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and |
32-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install |
both the 64-bit and 32-bit versions of libjpeg-turbo. |
@@ -132,8 +165,8 @@ |
For the most part, libjpeg-turbo should work identically to libjpeg, so in |
most cases, an application can be built against libjpeg and then run against |
-libjpeg-turbo. On Unix systems, you can build against libjpeg-turbo instead |
-of libjpeg by setting |
+libjpeg-turbo. On Unix systems (including Cygwin), you can build against |
+libjpeg-turbo instead of libjpeg by setting |
CPATH=/opt/libjpeg-turbo/include |
and |
@@ -142,12 +175,6 @@ |
({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a |
64-bit application.) |
-If using Cygwin, then set |
- |
- CPATH=/cygdrive/c/libjpeg-turbo-gcc[64]/include |
- and |
- LIBRARY_PATH=/cygdrive/c/libjpeg-turbo-gcc[64]/lib |
- |
If using MinGW, then set |
CPATH=/c/libjpeg-turbo-gcc[64]/include |
@@ -156,11 +183,11 @@ |
Building against libjpeg-turbo is useful, for instance, if you want to build an |
application that leverages the libjpeg-turbo colorspace extensions (see below.) |
-On Linux and Solaris systems, you would still need to manipulate the |
-LD_LIBRARY_PATH or sym links appropriately to use libjpeg-turbo at run time. |
-On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker to |
-force the use of libjpeg-turbo at run time rather than libjpeg (also useful if |
-you want to leverage the colorspace extensions), or you can link against the |
+On Linux and Solaris systems, you would still need to manipulate |
+LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run |
+time. On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker |
+to force the use of libjpeg-turbo at run time rather than libjpeg (also useful |
+if you want to leverage the colorspace extensions), or you can link against the |
libjpeg-turbo static library. |
To force a Linux, Solaris, or MinGW application to link against the static |
@@ -172,18 +199,18 @@ |
line (this also works on Linux and Solaris.) |
To build Visual C++ applications using libjpeg-turbo, add |
-c:\libjpeg-turbo[64]\include to your system or user INCLUDE environment |
-variable and c:\libjpeg-turbo[64]\lib to your system or user LIB environment |
-variable, and then link against either jpeg.lib (to use jpeg62.dll) or |
-jpeg-static.lib (to use the static version of libjpeg-turbo.) |
+c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment |
+variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment |
+variable, and then link against either jpeg.lib (to use the DLL version of |
+libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.) |
===================== |
Colorspace Extensions |
===================== |
libjpeg-turbo includes extensions which allow JPEG images to be compressed |
-directly from (and decompressed directly to) buffers which use BGR, BGRA, |
-RGBA, ABGR, and ARGB pixel ordering. This is implemented with six new |
+directly from (and decompressed directly to) buffers which use BGR, BGRX, |
+RGBX, XBGR, and XRGB pixel ordering. This is implemented with six new |
colorspace constants: |
JCS_EXT_RGB /* red/green/blue */ |
@@ -205,3 +232,102 @@ |
At run time, attempting to use these extensions with a version of libjpeg |
that doesn't support them will result in a "Bogus input colorspace" error. |
+ |
+================================= |
+libjpeg v7 and v8 API/ABI support |
+================================= |
+ |
+libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the |
+compression and decompression structures were extended in a backward- |
+incompatible manner to accommodate these features. Thus, programs which are |
+built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is |
+based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not |
+as widely used as v6b, enough programs (including a few Linux distros) have |
+made the switch that it was desirable to provide support for the libjpeg v7/v8 |
+API/ABI in libjpeg-turbo. |
+ |
+Some of the libjpeg v7 and v8 features -- DCT scaling, to name one -- involve |
+deep modifications to the code which cannot be accommodated by libjpeg-turbo |
+without either breaking compatibility with libjpeg v6b or producing an |
+unsupportable mess. In order to fully support libjpeg v8 with all of its |
+features, we would have to essentially port the SIMD extensions to the libjpeg |
+v8 code base and maintain two separate code trees. We are hesitant to do this |
+until/unless the newer libjpeg code bases garner more community support and |
+involvement and until/unless we have some notion of whether future libjpeg |
+releases will also be backward-incompatible. |
+ |
+By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an |
+argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version |
+of libjpeg-turbo which emulates the libjpeg v7 or v8 API/ABI, so that programs |
+which are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The |
+following section describes which libjpeg v7+ features are supported and which |
+aren't. |
+ |
+libjpeg v7 and v8 Features: |
+--------------------------- |
+ |
+Fully supported: |
+ |
+-- cjpeg: Separate quality settings for luminance and chrominance |
+ Note that the libpjeg v7+ API was extended to accommodate this feature only |
+ for convenience purposes. It has always been possible to implement this |
+ feature with libjpeg v6b (see rdswitch.c for an example.) |
+ |
+-- cjpeg: 32-bit BMP support |
+ |
+-- jpegtran: lossless cropping |
+ |
+-- jpegtran: -perfect option |
+ |
+-- rdjpgcom: -raw option |
+ |
+-- rdjpgcom: locale awareness |
+ |
+ |
+Fully supported when using libjpeg v7/v8 emulation: |
+ |
+-- libjpeg: In-memory source and destination managers |
+ |
+ |
+Not supported: |
+ |
+-- libjpeg: DCT scaling in compressor |
+ cinfo.scale_num and cinfo.scale_denom are silently ignored. |
+ |
+-- libjpeg: IDCT scaling extensions in decompressor |
+ libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4, |
+ and 1/8 (same as libjpeg v6b.) |
+ |
+-- libjpeg: Fancy downsampling in compressor |
+ cinfo.do_fancy_downsampling is silently ignored. |
+ |
+-- jpegtran: Scaling |
+ Seems to depend on the DCT scaling feature, which isn't supported. |
+ |
+ |
+******************************************************************************* |
+** Performance pitfalls |
+******************************************************************************* |
+ |
+=============== |
+Restart Markers |
+=============== |
+ |
+The optimized Huffman decoder in libjpeg-turbo does not handle restart markers |
+in a way that makes libjpeg happy, so it is necessary to use the slow Huffman |
+decoder when decompressing a JPEG image that has restart markers. This can |
+cause the decompression performance to drop by as much as 20%, but the |
+performance will still be much much greater than that of libjpeg v6b. Many |
+consumer packages, such as PhotoShop, use restart markers when generating JPEG |
+images, so images generated by those programs will experience this issue. |
+ |
+=============================================== |
+Fast Integer Forward DCT at High Quality Levels |
+=============================================== |
+ |
+The algorithm used by the SIMD-accelerated quantization function cannot produce |
+correct results whenever the fast integer forward DCT is used along with a JPEG |
+quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization |
+function in those cases. This causes performance to drop by as much as 40%. |
+It is therefore strongly advised that you use the slow integer forward DCT |
+whenever encoding images with a JPEG quality of 98 or higher. |