OLD | NEW |
1 ******************************************************************************* | 1 ******************************************************************************* |
2 ** Background | 2 ** Background |
3 ******************************************************************************* | 3 ******************************************************************************* |
4 | 4 |
5 libjpeg-turbo is a high-speed version of libjpeg for x86 and x86-64 processors | 5 libjpeg-turbo is a derivative of libjpeg which uses SIMD instructions (MMX, |
6 which uses SIMD instructions (MMX, SSE2, etc.) to accelerate baseline JPEG | 6 SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86 |
7 compression and decompression. libjpeg-turbo is generally 2-4x as fast | 7 and x86-64 systems. On such systems, libjpeg-turbo is generally 2-4x as fast |
8 as the unmodified version of libjpeg, all else being equal. | 8 as the unmodified version of libjpeg, all else being equal. |
9 | 9 |
10 libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but | 10 libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but |
11 the TigerVNC and VirtualGL projects made numerous enhancements to the codec, | 11 the TigerVNC and VirtualGL projects made numerous enhancements to the codec in |
12 including improved support for Mac OS X, 64-bit support, support for 32-bit | 12 2009, including improved support for Mac OS X, 64-bit support, support for |
13 and big endian pixel formats, accelerated Huffman encoding/decoding, and | 13 32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman |
14 various bug fixes. The goal was to produce a fully open source codec that | 14 encoding/decoding, and various bug fixes. The goal was to produce a fully open |
15 could replace the partially closed source TurboJPEG/IPP codec used by VirtualGL | 15 source codec that could replace the partially closed source TurboJPEG/IPP codec |
16 and TurboVNC. libjpeg-turbo generally performs in the range of 80-120% of | 16 used by VirtualGL and TurboVNC. libjpeg-turbo generally performs in the range |
17 TurboJPEG/IPP. It is faster in some areas but slower in others. | 17 of 80-120% of TurboJPEG/IPP. It is faster in some areas but slower in others. |
18 | 18 |
19 It was decided to split libjpeg-turbo into a separate SDK so that other | 19 In early 2010, libjpeg-turbo spun off into its own independent project, with |
20 projects could take advantage of this technology. The libjpeg-turbo shared | 20 the goal of making high-speed JPEG compression/decompression technology |
| 21 available to a broader range of users and developers. The libjpeg-turbo shared |
21 libraries can be used as drop-in replacements for libjpeg on most systems. | 22 libraries can be used as drop-in replacements for libjpeg on most systems. |
22 | 23 |
23 | 24 |
24 ******************************************************************************* | 25 ******************************************************************************* |
25 ** License | 26 ** License |
26 ******************************************************************************* | 27 ******************************************************************************* |
27 | 28 |
28 Some of the optimizations to the Huffman encoder (jchuff.c) and decoder | 29 libjpeg-turbo is licensed under a non-restrictive, BSD-style license |
29 (jdhuff.c) were borrowed from VirtualGL, and thus any distribution of | 30 (see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and |
30 libjpeg-turbo which includes those optimizations must, as a whole, be subject | 31 associated test programs bear a similar license, which is reproduced below: |
31 to the terms of the wxWindows Library Licence, Version 3.1. A copy of this | |
32 license can be found in this directory under LICENSE.txt. The wxWindows | |
33 Library License is based on the LGPL but includes provisions which allow the | |
34 Library to be statically linked into proprietary libraries and applications | |
35 without requiring the resulting binaries to be distributed under the terms of | |
36 the LGPL. | |
37 | 32 |
38 The rest of the source code, apart from the Huffman codec optimizations, falls | 33 Redistribution and use in source and binary forms, with or without |
39 under a less restrictive, BSD-style license (see README.) You can choose to | 34 modification, are permitted provided that the following conditions are met: |
40 distribute libjpeg-turbo, as a whole, under this BSD-style license by simply | 35 |
41 replacing the optimized jchuff.c and jdhuff.c with their unoptimized | 36 - Redistributions of source code must retain the above copyright notice, |
42 counterparts from the libjpeg v6b source. | 37 this list of conditions and the following disclaimer. |
| 38 - Redistributions in binary form must reproduce the above copyright notice, |
| 39 this list of conditions and the following disclaimer in the documentation |
| 40 and/or other materials provided with the distribution. |
| 41 - Neither the name of the libjpeg-turbo Project nor the names of its |
| 42 contributors may be used to endorse or promote products derived from this |
| 43 software without specific prior written permission. |
| 44 |
| 45 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", |
| 46 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 47 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 48 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE |
| 49 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 50 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 51 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 52 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 53 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 54 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 55 POSSIBILITY OF SUCH DAMAGE. |
43 | 56 |
44 | 57 |
45 ******************************************************************************* | 58 ******************************************************************************* |
46 ** Using libjpeg-turbo | 59 ** Using libjpeg-turbo |
47 ******************************************************************************* | 60 ******************************************************************************* |
48 | 61 |
| 62 libjpeg-turbo includes two APIs which can be used to compress and decompress |
| 63 JPEG images: |
| 64 |
| 65 TurboJPEG/OSS: This API wraps libjpeg-turbo and provides an easy-to-use |
| 66 interface for compressing and decompressing JPEG images in memory. It also |
| 67 provides some features that would not be straightforward to implement using |
| 68 the underlying libjpeg API, such as generating planar YUV images and |
| 69 performing multiple simultaneous lossless transforms on an image. The Java |
| 70 interface for libjpeg-turbo is written on top of TurboJPEG/OSS. |
| 71 |
| 72 libjpeg API: This is the industry standard API for compressing and |
| 73 decompressing JPEG images. It is more difficult to use than TurboJPEG/OSS |
| 74 but also more powerful. libjpeg-turbo is both API/ABI-compatible and |
| 75 mathematically compatible with libjpeg v6b. It can also optionally be |
| 76 configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.) |
| 77 |
| 78 |
49 ============================= | 79 ============================= |
50 Replacing libjpeg at Run Time | 80 Replacing libjpeg at Run Time |
51 ============================= | 81 ============================= |
52 | 82 |
53 If a Unix application is dynamically linked with libjpeg, then you can replace | 83 If a Unix application is dynamically linked with libjpeg, then you can replace |
54 libjpeg with libjpeg-turbo at run time by manipulating the LD_LIBRARY_PATH. | 84 libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH. |
55 For instance: | 85 For instance: |
56 | 86 |
57 [Using libjpeg] | 87 [Using libjpeg] |
58 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg | 88 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg |
59 real 0m0.392s | 89 real 0m0.392s |
60 user 0m0.074s | 90 user 0m0.074s |
61 sys 0m0.020s | 91 sys 0m0.020s |
62 | 92 |
63 [Using libjpeg-turbo] | 93 [Using libjpeg-turbo] |
64 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH | 94 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH |
65 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg | 95 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg |
66 real 0m0.109s | 96 real 0m0.109s |
67 user 0m0.029s | 97 user 0m0.029s |
68 sys 0m0.010s | 98 sys 0m0.010s |
69 | 99 |
70 NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and | 100 NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and |
71 architecture. | 101 architecture. |
72 | 102 |
73 System administrators can also replace the libjpeg sym links in /usr/{lib} with | 103 System administrators can also replace the libjpeg sym links in /usr/{lib} with |
74 links to the libjpeg dynamic library located in /opt/libjpeg-turbo/{lib}. This | 104 links to the libjpeg dynamic library located in /opt/libjpeg-turbo/{lib}. This |
75 will effectively accelerate every dynamically linked libjpeg application on the | 105 will effectively accelerate every dynamically linked libjpeg application on the |
76 system. | 106 system. |
77 | 107 |
78 The Windows distribution of the libjpeg-turbo SDK installs jpeg62.dll into | 108 The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL |
79 c:\libjpeg-turbo\bin, and the PATH environment variable can be modified such | 109 (jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether libjpeg v6b, v7, or |
80 that this directory is searched before any others that might contain | 110 v8 emulation is enabled) into c:\libjpeg-turbo[64]\bin, and the PATH |
81 jpeg62.dll. However, if jpeg62.dll also exists in an application's install | 111 environment variable can be modified such that this directory is searched |
82 directory, then Windows will load the application's version of it first. Thus, | 112 before any others that might contain a libjpeg DLL. However, if a libjpeg |
83 if an application ships with jpeg62.dll, then back up the application's version | 113 DLL exists in an application's install directory, then Windows will load this |
84 of jpeg62.dll and copy c:\libjpeg-turbo\bin\jpeg62.dll into the application's | 114 DLL first whenever the application is launched. Thus, if an application ships |
85 install directory to accelerate it. | 115 with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's |
| 116 version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the |
| 117 application's install directory to accelerate it. |
86 | 118 |
87 The version of jpeg62.dll distributed in the libjpeg-turbo SDK requires the | 119 The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
88 Visual C++ 2008 C run time DLL (msvcr90.dll). This library ships with more | 120 Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll). |
89 recent versions of Windows, but users of older versions can obtain it from the | 121 msvcr90.dll ships with more recent versions of Windows, but users of older |
90 Visual C++ 2008 Redistributable Package, which is available as a free download | 122 Windows releases can obtain it from the Visual C++ 2008 Redistributable |
91 from Microsoft's web site. | 123 Package, which is available as a free download from Microsoft's web site. |
92 | 124 |
93 NOTE: Features of libjpeg which require passing a C run time structure, such | 125 NOTE: Features of libjpeg which require passing a C run time structure, such |
94 as a file handle, from an application to libjpeg will probably not work with | 126 as a file handle, from an application to libjpeg will probably not work with |
95 the distributed version of jpeg62.dll unless the application is also built to | 127 the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
96 use the Visual C++ 2008 C run time DLL. In particular, this affects | 128 Visual C++, unless the application is also built to use the Visual C++ 2008 C |
97 jpeg_stdio_dest() and jpeg_stdio_src(). | 129 run time DLL. In particular, this affects jpeg_stdio_dest() and |
| 130 jpeg_stdio_src(). |
98 | 131 |
99 Mac applications typically embed their own copies of libjpeg.62.dylib inside | 132 Mac applications typically embed their own copies of the libjpeg dylib inside |
100 the (hidden) application bundle, so it is not possible to globally replace | 133 the (hidden) application bundle, so it is not possible to globally replace |
101 libjpeg on OS X systems. If an application uses a shared library version of | 134 libjpeg on OS X systems. If an application uses a shared library version of |
102 libjpeg, then it may be possible to replace the application's version of it. | 135 libjpeg, then it may be possible to replace the application's version of it. |
103 This would generally involve copying libjpeg.62.dylib into the appropriate | 136 This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into |
104 place in the application bundle and using install_name_tool to repoint the | 137 the appropriate place in the application bundle and using install_name_tool to |
105 dylib to the new directory. This requires an advanced knowledge of OS X and | 138 repoint the dylib to the new directory. This requires an advanced knowledge of |
106 would not survive an upgrade or a re-install of the application. Thus, it is | 139 OS X and would not survive an upgrade or a re-install of the application. |
107 not recommended for most users. | 140 Thus, it is not recommended for most users. |
108 | 141 |
109 ======================= | 142 ======================= |
110 Replacing TurboJPEG/IPP | 143 Replacing TurboJPEG/IPP |
111 ======================= | 144 ======================= |
112 | 145 |
113 libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by | 146 libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by |
114 VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper | 147 VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper |
115 library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo | 148 library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo |
116 instead of the closed source Intel Performance Primitives. You can replace the | 149 instead of the closed source Intel Performance Primitives. You can replace the |
117 TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order | 150 TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order |
118 to make existing releases of VirtualGL 2.1.x and TurboVNC use the new codec at | 151 to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec |
119 run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit | 152 at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit |
120 binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and | 153 binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and |
121 32-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install | 154 32-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install |
122 both the 64-bit and 32-bit versions of libjpeg-turbo. | 155 both the 64-bit and 32-bit versions of libjpeg-turbo. |
123 | 156 |
124 You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with | 157 You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with |
125 the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically. | 158 the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically. |
126 libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which | 159 libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which |
127 are used to build TurboVNC 1.0 and later. | 160 are used to build TurboVNC 1.0 and later. |
128 | 161 |
129 ======================================== | 162 ======================================== |
130 Using libjpeg-turbo in Your Own Programs | 163 Using libjpeg-turbo in Your Own Programs |
131 ======================================== | 164 ======================================== |
132 | 165 |
133 For the most part, libjpeg-turbo should work identically to libjpeg, so in | 166 For the most part, libjpeg-turbo should work identically to libjpeg, so in |
134 most cases, an application can be built against libjpeg and then run against | 167 most cases, an application can be built against libjpeg and then run against |
135 libjpeg-turbo. On Unix systems, you can build against libjpeg-turbo instead | 168 libjpeg-turbo. On Unix systems (including Cygwin), you can build against |
136 of libjpeg by setting | 169 libjpeg-turbo instead of libjpeg by setting |
137 | 170 |
138 CPATH=/opt/libjpeg-turbo/include | 171 CPATH=/opt/libjpeg-turbo/include |
139 and | 172 and |
140 LIBRARY_PATH=/opt/libjpeg-turbo/{lib} | 173 LIBRARY_PATH=/opt/libjpeg-turbo/{lib} |
141 | 174 |
142 ({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a | 175 ({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a |
143 64-bit application.) | 176 64-bit application.) |
144 | 177 |
145 If using Cygwin, then set | |
146 | |
147 CPATH=/cygdrive/c/libjpeg-turbo-gcc[64]/include | |
148 and | |
149 LIBRARY_PATH=/cygdrive/c/libjpeg-turbo-gcc[64]/lib | |
150 | |
151 If using MinGW, then set | 178 If using MinGW, then set |
152 | 179 |
153 CPATH=/c/libjpeg-turbo-gcc[64]/include | 180 CPATH=/c/libjpeg-turbo-gcc[64]/include |
154 and | 181 and |
155 LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib | 182 LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib |
156 | 183 |
157 Building against libjpeg-turbo is useful, for instance, if you want to build an | 184 Building against libjpeg-turbo is useful, for instance, if you want to build an |
158 application that leverages the libjpeg-turbo colorspace extensions (see below.) | 185 application that leverages the libjpeg-turbo colorspace extensions (see below.) |
159 On Linux and Solaris systems, you would still need to manipulate the | 186 On Linux and Solaris systems, you would still need to manipulate |
160 LD_LIBRARY_PATH or sym links appropriately to use libjpeg-turbo at run time. | 187 LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run |
161 On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker to | 188 time. On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker |
162 force the use of libjpeg-turbo at run time rather than libjpeg (also useful if | 189 to force the use of libjpeg-turbo at run time rather than libjpeg (also useful |
163 you want to leverage the colorspace extensions), or you can link against the | 190 if you want to leverage the colorspace extensions), or you can link against the |
164 libjpeg-turbo static library. | 191 libjpeg-turbo static library. |
165 | 192 |
166 To force a Linux, Solaris, or MinGW application to link against the static | 193 To force a Linux, Solaris, or MinGW application to link against the static |
167 version of libjpeg-turbo, you can use the following linker options: | 194 version of libjpeg-turbo, you can use the following linker options: |
168 | 195 |
169 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic | 196 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic |
170 | 197 |
171 On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command | 198 On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command |
172 line (this also works on Linux and Solaris.) | 199 line (this also works on Linux and Solaris.) |
173 | 200 |
174 To build Visual C++ applications using libjpeg-turbo, add | 201 To build Visual C++ applications using libjpeg-turbo, add |
175 c:\libjpeg-turbo[64]\include to your system or user INCLUDE environment | 202 c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment |
176 variable and c:\libjpeg-turbo[64]\lib to your system or user LIB environment | 203 variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment |
177 variable, and then link against either jpeg.lib (to use jpeg62.dll) or | 204 variable, and then link against either jpeg.lib (to use the DLL version of |
178 jpeg-static.lib (to use the static version of libjpeg-turbo.) | 205 libjpeg-turbo) or jpeg-static.lib (to use the static version of libjpeg-turbo.) |
179 | 206 |
180 ===================== | 207 ===================== |
181 Colorspace Extensions | 208 Colorspace Extensions |
182 ===================== | 209 ===================== |
183 | 210 |
184 libjpeg-turbo includes extensions which allow JPEG images to be compressed | 211 libjpeg-turbo includes extensions which allow JPEG images to be compressed |
185 directly from (and decompressed directly to) buffers which use BGR, BGRA, | 212 directly from (and decompressed directly to) buffers which use BGR, BGRX, |
186 RGBA, ABGR, and ARGB pixel ordering. This is implemented with six new | 213 RGBX, XBGR, and XRGB pixel ordering. This is implemented with six new |
187 colorspace constants: | 214 colorspace constants: |
188 | 215 |
189 JCS_EXT_RGB /* red/green/blue */ | 216 JCS_EXT_RGB /* red/green/blue */ |
190 JCS_EXT_RGBX /* red/green/blue/x */ | 217 JCS_EXT_RGBX /* red/green/blue/x */ |
191 JCS_EXT_BGR /* blue/green/red */ | 218 JCS_EXT_BGR /* blue/green/red */ |
192 JCS_EXT_BGRX /* blue/green/red/x */ | 219 JCS_EXT_BGRX /* blue/green/red/x */ |
193 JCS_EXT_XBGR /* x/blue/green/red */ | 220 JCS_EXT_XBGR /* x/blue/green/red */ |
194 JCS_EXT_XRGB /* x/red/green/blue */ | 221 JCS_EXT_XRGB /* x/red/green/blue */ |
195 | 222 |
196 Setting cinfo.in_color_space (compression) or cinfo.out_color_space | 223 Setting cinfo.in_color_space (compression) or cinfo.out_color_space |
197 (decompression) to one of these values will cause libjpeg-turbo to read the | 224 (decompression) to one of these values will cause libjpeg-turbo to read the |
198 red, green, and blue values from (or write them to) the appropriate position in | 225 red, green, and blue values from (or write them to) the appropriate position in |
199 the pixel when YUV conversion is performed. | 226 the pixel when YUV conversion is performed. |
200 | 227 |
201 Your application can check for the existence of these extensions at compile | 228 Your application can check for the existence of these extensions at compile |
202 time with: | 229 time with: |
203 | 230 |
204 #ifdef JCS_EXTENSIONS | 231 #ifdef JCS_EXTENSIONS |
205 | 232 |
206 At run time, attempting to use these extensions with a version of libjpeg | 233 At run time, attempting to use these extensions with a version of libjpeg |
207 that doesn't support them will result in a "Bogus input colorspace" error. | 234 that doesn't support them will result in a "Bogus input colorspace" error. |
| 235 |
| 236 ================================= |
| 237 libjpeg v7 and v8 API/ABI support |
| 238 ================================= |
| 239 |
| 240 libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the |
| 241 compression and decompression structures were extended in a backward- |
| 242 incompatible manner to accommodate these features. Thus, programs which are |
| 243 built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is |
| 244 based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not |
| 245 as widely used as v6b, enough programs (including a few Linux distros) have |
| 246 made the switch that it was desirable to provide support for the libjpeg v7/v8 |
| 247 API/ABI in libjpeg-turbo. |
| 248 |
| 249 Some of the libjpeg v7 and v8 features -- DCT scaling, to name one -- involve |
| 250 deep modifications to the code which cannot be accommodated by libjpeg-turbo |
| 251 without either breaking compatibility with libjpeg v6b or producing an |
| 252 unsupportable mess. In order to fully support libjpeg v8 with all of its |
| 253 features, we would have to essentially port the SIMD extensions to the libjpeg |
| 254 v8 code base and maintain two separate code trees. We are hesitant to do this |
| 255 until/unless the newer libjpeg code bases garner more community support and |
| 256 involvement and until/unless we have some notion of whether future libjpeg |
| 257 releases will also be backward-incompatible. |
| 258 |
| 259 By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an |
| 260 argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version |
| 261 of libjpeg-turbo which emulates the libjpeg v7 or v8 API/ABI, so that programs |
| 262 which are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The |
| 263 following section describes which libjpeg v7+ features are supported and which |
| 264 aren't. |
| 265 |
| 266 libjpeg v7 and v8 Features: |
| 267 --------------------------- |
| 268 |
| 269 Fully supported: |
| 270 |
| 271 -- cjpeg: Separate quality settings for luminance and chrominance |
| 272 Note that the libpjeg v7+ API was extended to accommodate this feature only |
| 273 for convenience purposes. It has always been possible to implement this |
| 274 feature with libjpeg v6b (see rdswitch.c for an example.) |
| 275 |
| 276 -- cjpeg: 32-bit BMP support |
| 277 |
| 278 -- jpegtran: lossless cropping |
| 279 |
| 280 -- jpegtran: -perfect option |
| 281 |
| 282 -- rdjpgcom: -raw option |
| 283 |
| 284 -- rdjpgcom: locale awareness |
| 285 |
| 286 |
| 287 Fully supported when using libjpeg v7/v8 emulation: |
| 288 |
| 289 -- libjpeg: In-memory source and destination managers |
| 290 |
| 291 |
| 292 Not supported: |
| 293 |
| 294 -- libjpeg: DCT scaling in compressor |
| 295 cinfo.scale_num and cinfo.scale_denom are silently ignored. |
| 296 |
| 297 -- libjpeg: IDCT scaling extensions in decompressor |
| 298 libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4, |
| 299 and 1/8 (same as libjpeg v6b.) |
| 300 |
| 301 -- libjpeg: Fancy downsampling in compressor |
| 302 cinfo.do_fancy_downsampling is silently ignored. |
| 303 |
| 304 -- jpegtran: Scaling |
| 305 Seems to depend on the DCT scaling feature, which isn't supported. |
| 306 |
| 307 |
| 308 ******************************************************************************* |
| 309 ** Performance pitfalls |
| 310 ******************************************************************************* |
| 311 |
| 312 =============== |
| 313 Restart Markers |
| 314 =============== |
| 315 |
| 316 The optimized Huffman decoder in libjpeg-turbo does not handle restart markers |
| 317 in a way that makes libjpeg happy, so it is necessary to use the slow Huffman |
| 318 decoder when decompressing a JPEG image that has restart markers. This can |
| 319 cause the decompression performance to drop by as much as 20%, but the |
| 320 performance will still be much much greater than that of libjpeg v6b. Many |
| 321 consumer packages, such as PhotoShop, use restart markers when generating JPEG |
| 322 images, so images generated by those programs will experience this issue. |
| 323 |
| 324 =============================================== |
| 325 Fast Integer Forward DCT at High Quality Levels |
| 326 =============================================== |
| 327 |
| 328 The algorithm used by the SIMD-accelerated quantization function cannot produce |
| 329 correct results whenever the fast integer forward DCT is used along with a JPEG |
| 330 quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization |
| 331 function in those cases. This causes performance to drop by as much as 40%. |
| 332 It is therefore strongly advised that you use the slow integer forward DCT |
| 333 whenever encoding images with a JPEG quality of 98 or higher. |
OLD | NEW |