OLD | NEW |
1 ******************************************************************************* | 1 ******************************************************************************* |
2 ** Background | 2 ** Background |
3 ******************************************************************************* | 3 ******************************************************************************* |
4 | 4 |
5 libjpeg-turbo is a derivative of libjpeg which uses SIMD instructions (MMX, | 5 libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, |
6 SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86 | 6 SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86 |
7 and x86-64 systems. On such systems, 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 in | 11 the TigerVNC and VirtualGL projects made numerous enhancements to the codec in |
12 2009, including improved support for Mac OS X, 64-bit support, support for | 12 2009, including improved support for Mac OS X, 64-bit support, support for |
13 32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman | 13 32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman |
14 encoding/decoding, and various bug fixes. The goal was to produce a fully open | 14 encoding/decoding, and various bug fixes. The goal was to produce a fully open |
15 source codec that could replace the partially closed source TurboJPEG/IPP codec | 15 source codec that could replace the partially closed source TurboJPEG/IPP codec |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 52 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
53 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 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 | 54 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
55 POSSIBILITY OF SUCH DAMAGE. | 55 POSSIBILITY OF SUCH DAMAGE. |
56 | 56 |
57 | 57 |
58 ******************************************************************************* | 58 ******************************************************************************* |
59 ** Using libjpeg-turbo | 59 ** Using libjpeg-turbo |
60 ******************************************************************************* | 60 ******************************************************************************* |
61 | 61 |
62 libjpeg-turbo includes two APIs which can be used to compress and decompress | 62 libjpeg-turbo includes two APIs that can be used to compress and decompress |
63 JPEG images: | 63 JPEG images: |
64 | 64 |
65 TurboJPEG/OSS: This API wraps libjpeg-turbo and provides an easy-to-use | 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 | 66 interface for compressing and decompressing JPEG images in memory. It also |
67 provides some features that would not be straightforward to implement using | 67 provides some features that would not be straightforward to implement using |
68 the underlying libjpeg API, such as generating planar YUV images and | 68 the underlying libjpeg API, such as generating planar YUV images and |
69 performing multiple simultaneous lossless transforms on an image. The Java | 69 performing multiple simultaneous lossless transforms on an image. The Java |
70 interface for libjpeg-turbo is written on top of TurboJPEG/OSS. | 70 interface for libjpeg-turbo is written on top of TurboJPEG/OSS. |
71 | 71 |
72 libjpeg API: This is the industry standard API for compressing and | 72 libjpeg API: This is the industry standard API for compressing and |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's | 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 | 116 version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the |
117 application's install directory to accelerate it. | 117 application's install directory to accelerate it. |
118 | 118 |
119 The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for | 119 The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
120 Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll). | 120 Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll). |
121 msvcr90.dll ships with more recent versions of Windows, but users of older | 121 msvcr90.dll ships with more recent versions of Windows, but users of older |
122 Windows releases can obtain it from the Visual C++ 2008 Redistributable | 122 Windows releases can obtain it from the Visual C++ 2008 Redistributable |
123 Package, which is available as a free download from Microsoft's web site. | 123 Package, which is available as a free download from Microsoft's web site. |
124 | 124 |
125 NOTE: Features of libjpeg which require passing a C run time structure, such | 125 NOTE: Features of libjpeg that require passing a C run time structure, such |
126 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 |
127 the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for | 127 the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
128 Visual C++, unless the application is also built to use the Visual C++ 2008 C | 128 Visual C++, unless the application is also built to use the Visual C++ 2008 C |
129 run time DLL. In particular, this affects jpeg_stdio_dest() and | 129 run time DLL. In particular, this affects jpeg_stdio_dest() and |
130 jpeg_stdio_src(). | 130 jpeg_stdio_src(). |
131 | 131 |
132 Mac applications typically embed their own copies of the libjpeg dylib inside | 132 Mac applications typically embed their own copies of the libjpeg dylib inside |
133 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 |
134 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 |
135 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. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 To build Visual C++ applications using libjpeg-turbo, add | 201 To build Visual C++ applications using libjpeg-turbo, add |
202 c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment | 202 c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment |
203 variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment | 203 variable and c:\libjpeg-turbo[64]\lib to the system or user LIB environment |
204 variable, and then link against either jpeg.lib (to use the DLL version of | 204 variable, and then link against either jpeg.lib (to use the DLL version of |
205 libjpeg-turbo) or 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.) |
206 | 206 |
207 ===================== | 207 ===================== |
208 Colorspace Extensions | 208 Colorspace Extensions |
209 ===================== | 209 ===================== |
210 | 210 |
211 libjpeg-turbo includes extensions which allow JPEG images to be compressed | 211 libjpeg-turbo includes extensions that allow JPEG images to be compressed |
212 directly from (and decompressed directly to) buffers which use BGR, BGRX, | 212 directly from (and decompressed directly to) buffers that use BGR, BGRX, |
213 RGBX, XBGR, and XRGB pixel ordering. This is implemented with six new | 213 RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new |
214 colorspace constants: | 214 colorspace constants: |
215 | 215 |
216 JCS_EXT_RGB /* red/green/blue */ | 216 JCS_EXT_RGB /* red/green/blue */ |
217 JCS_EXT_RGBX /* red/green/blue/x */ | 217 JCS_EXT_RGBX /* red/green/blue/x */ |
218 JCS_EXT_BGR /* blue/green/red */ | 218 JCS_EXT_BGR /* blue/green/red */ |
219 JCS_EXT_BGRX /* blue/green/red/x */ | 219 JCS_EXT_BGRX /* blue/green/red/x */ |
220 JCS_EXT_XBGR /* x/blue/green/red */ | 220 JCS_EXT_XBGR /* x/blue/green/red */ |
221 JCS_EXT_XRGB /* x/red/green/blue */ | 221 JCS_EXT_XRGB /* x/red/green/blue */ |
| 222 JCS_EXT_RGBA /* red/green/blue/alpha */ |
| 223 JCS_EXT_BGRA /* blue/green/red/alpha */ |
| 224 JCS_EXT_ABGR /* alpha/blue/green/red */ |
| 225 JCS_EXT_ARGB /* alpha/red/green/blue */ |
222 | 226 |
223 Setting cinfo.in_color_space (compression) or cinfo.out_color_space | 227 Setting cinfo.in_color_space (compression) or cinfo.out_color_space |
224 (decompression) to one of these values will cause libjpeg-turbo to read the | 228 (decompression) to one of these values will cause libjpeg-turbo to read the |
225 red, green, and blue values from (or write them to) the appropriate position in | 229 red, green, and blue values from (or write them to) the appropriate position in |
226 the pixel when YUV conversion is performed. | 230 the pixel when compressing from/decompressing to an RGB buffer. |
227 | 231 |
228 Your application can check for the existence of these extensions at compile | 232 Your application can check for the existence of these extensions at compile |
229 time with: | 233 time with: |
230 | 234 |
231 #ifdef JCS_EXTENSIONS | 235 #ifdef JCS_EXTENSIONS |
232 | 236 |
233 At run time, attempting to use these extensions with a version of libjpeg | 237 At run time, attempting to use these extensions with a version of libjpeg |
234 that doesn't support them will result in a "Bogus input colorspace" error. | 238 that doesn't support them will result in a "Bogus input colorspace" error. |
235 | 239 |
| 240 When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the |
| 241 X byte is undefined, and in order to ensure the best performance, libjpeg-turbo |
| 242 can set that byte to whatever value it wishes. If an application expects the X |
| 243 byte to be used as an alpha channel, then it should specify JCS_EXT_RGBA, |
| 244 JCS_EXT_BGRA, JCS_EXT_ABGR, or JCS_EXT_ARGB. When these colorspace constants |
| 245 are used, the X byte is guaranteed to be 0xFF, which is interpreted as opaque. |
| 246 |
| 247 Your application can check for the existence of the alpha channel colorspace |
| 248 extensions at compile time with: |
| 249 |
| 250 #ifdef JCS_ALPHA_EXTENSIONS |
| 251 |
| 252 jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check |
| 253 for the existence of the colorspace extensions at compile time and run time. |
| 254 |
236 ================================= | 255 ================================= |
237 libjpeg v7 and v8 API/ABI support | 256 libjpeg v7 and v8 API/ABI support |
238 ================================= | 257 ================================= |
239 | 258 |
240 libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the | 259 libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the |
241 compression and decompression structures were extended in a backward- | 260 compression and decompression structures were extended in a backward- |
242 incompatible manner to accommodate these features. Thus, programs which are | 261 incompatible manner to accommodate these features. Thus, programs that are |
243 built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is | 262 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 | 263 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 | 264 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 | 265 made the switch that it was desirable to provide support for the libjpeg v7/v8 |
247 API/ABI in libjpeg-turbo. | 266 API/ABI in libjpeg-turbo. |
248 | 267 |
249 Some of the libjpeg v7 and v8 features -- DCT scaling, to name one -- involve | 268 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 | 269 deep modifications to the code that cannot be accommodated by libjpeg-turbo |
251 without either breaking compatibility with libjpeg v6b or producing an | 270 without either breaking compatibility with libjpeg v6b or producing an |
252 unsupportable mess. In order to fully support libjpeg v8 with all of its | 271 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 | 272 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 | 273 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 | 274 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 | 275 involvement and until/unless we have some notion of whether future libjpeg |
257 releases will also be backward-incompatible. | 276 releases will also be backward-incompatible. |
258 | 277 |
259 By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an | 278 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 | 279 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 | 280 of libjpeg-turbo that 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 | 281 that 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 | 282 following section describes which libjpeg v7+ features are supported and which |
264 aren't. | 283 aren't. |
265 | 284 |
266 libjpeg v7 and v8 Features: | 285 libjpeg v7 and v8 Features: |
267 --------------------------- | 286 --------------------------- |
268 | 287 |
269 Fully supported: | 288 Fully supported: |
270 | 289 |
271 -- cjpeg: Separate quality settings for luminance and chrominance | 290 -- cjpeg: Separate quality settings for luminance and chrominance |
272 Note that the libpjeg v7+ API was extended to accommodate this feature only | 291 Note that the libpjeg v7+ API was extended to accommodate this feature only |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 =============================================== | 343 =============================================== |
325 Fast Integer Forward DCT at High Quality Levels | 344 Fast Integer Forward DCT at High Quality Levels |
326 =============================================== | 345 =============================================== |
327 | 346 |
328 The algorithm used by the SIMD-accelerated quantization function cannot produce | 347 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 | 348 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 | 349 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%. | 350 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 | 351 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. | 352 whenever encoding images with a JPEG quality of 98 or higher. |
OLD | NEW |