OLD | NEW |
(Empty) | |
| 1 Background |
| 2 ========== |
| 3 |
| 4 libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, |
| 5 NEON, AltiVec) to accelerate baseline JPEG compression and decompression on |
| 6 x86, x86-64, ARM, and PowerPC systems. On such systems, libjpeg-turbo is |
| 7 generally 2-6x as fast as libjpeg, all else being equal. On other types of |
| 8 systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by |
| 9 virtue of its highly-optimized Huffman coding routines. In many cases, the |
| 10 performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs. |
| 11 |
| 12 libjpeg-turbo implements both the traditional libjpeg API as well as the less |
| 13 powerful but more straightforward TurboJPEG API. libjpeg-turbo also features |
| 14 colorspace extensions that allow it to compress from/decompress to 32-bit and |
| 15 big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java |
| 16 interface. |
| 17 |
| 18 libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated |
| 19 derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and |
| 20 VirtualGL projects made numerous enhancements to the codec in 2009, and in |
| 21 early 2010, libjpeg-turbo spun off into an independent project, with the goal |
| 22 of making high-speed JPEG compression/decompression technology available to a |
| 23 broader range of users and developers. |
| 24 |
| 25 |
| 26 License |
| 27 ======= |
| 28 |
| 29 libjpeg-turbo is covered by three compatible BSD-style open source licenses. |
| 30 Refer to [LICENSE.md](LICENSE.md) for a roll-up of license terms. |
| 31 |
| 32 |
| 33 Using libjpeg-turbo |
| 34 =================== |
| 35 |
| 36 libjpeg-turbo includes two APIs that can be used to compress and decompress |
| 37 JPEG images: |
| 38 |
| 39 - **TurboJPEG API** |
| 40 This API provides an easy-to-use interface for compressing and decompressing |
| 41 JPEG images in memory. It also provides some functionality that would not be |
| 42 straightforward to achieve using the underlying libjpeg API, such as |
| 43 generating planar YUV images and performing multiple simultaneous lossless |
| 44 transforms on an image. The Java interface for libjpeg-turbo is written on |
| 45 top of the TurboJPEG API. |
| 46 |
| 47 - **libjpeg API** |
| 48 This is the de facto industry-standard API for compressing and decompressing |
| 49 JPEG images. It is more difficult to use than the TurboJPEG API but also |
| 50 more powerful. The libjpeg API implementation in libjpeg-turbo is both |
| 51 API/ABI-compatible and mathematically compatible with libjpeg v6b. It can |
| 52 also optionally be configured to be API/ABI-compatible with libjpeg v7 and v8 |
| 53 (see below.) |
| 54 |
| 55 There is no significant performance advantage to either API when both are used |
| 56 to perform similar operations. |
| 57 |
| 58 Colorspace Extensions |
| 59 --------------------- |
| 60 |
| 61 libjpeg-turbo includes extensions that allow JPEG images to be compressed |
| 62 directly from (and decompressed directly to) buffers that use BGR, BGRX, |
| 63 RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new |
| 64 colorspace constants: |
| 65 |
| 66 JCS_EXT_RGB /* red/green/blue */ |
| 67 JCS_EXT_RGBX /* red/green/blue/x */ |
| 68 JCS_EXT_BGR /* blue/green/red */ |
| 69 JCS_EXT_BGRX /* blue/green/red/x */ |
| 70 JCS_EXT_XBGR /* x/blue/green/red */ |
| 71 JCS_EXT_XRGB /* x/red/green/blue */ |
| 72 JCS_EXT_RGBA /* red/green/blue/alpha */ |
| 73 JCS_EXT_BGRA /* blue/green/red/alpha */ |
| 74 JCS_EXT_ABGR /* alpha/blue/green/red */ |
| 75 JCS_EXT_ARGB /* alpha/red/green/blue */ |
| 76 |
| 77 Setting `cinfo.in_color_space` (compression) or `cinfo.out_color_space` |
| 78 (decompression) to one of these values will cause libjpeg-turbo to read the |
| 79 red, green, and blue values from (or write them to) the appropriate position in |
| 80 the pixel when compressing from/decompressing to an RGB buffer. |
| 81 |
| 82 Your application can check for the existence of these extensions at compile |
| 83 time with: |
| 84 |
| 85 #ifdef JCS_EXTENSIONS |
| 86 |
| 87 At run time, attempting to use these extensions with a libjpeg implementation |
| 88 that does not support them will result in a "Bogus input colorspace" error. |
| 89 Applications can trap this error in order to test whether run-time support is |
| 90 available for the colorspace extensions. |
| 91 |
| 92 When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the |
| 93 X byte is undefined, and in order to ensure the best performance, libjpeg-turbo |
| 94 can set that byte to whatever value it wishes. If an application expects the X |
| 95 byte to be used as an alpha channel, then it should specify `JCS_EXT_RGBA`, |
| 96 `JCS_EXT_BGRA`, `JCS_EXT_ABGR`, or `JCS_EXT_ARGB`. When these colorspace |
| 97 constants are used, the X byte is guaranteed to be 0xFF, which is interpreted |
| 98 as opaque. |
| 99 |
| 100 Your application can check for the existence of the alpha channel colorspace |
| 101 extensions at compile time with: |
| 102 |
| 103 #ifdef JCS_ALPHA_EXTENSIONS |
| 104 |
| 105 [jcstest.c](jcstest.c), located in the libjpeg-turbo source tree, demonstrates |
| 106 how to check for the existence of the colorspace extensions at compile time and |
| 107 run time. |
| 108 |
| 109 libjpeg v7 and v8 API/ABI Emulation |
| 110 ----------------------------------- |
| 111 |
| 112 With libjpeg v7 and v8, new features were added that necessitated extending the |
| 113 compression and decompression structures. Unfortunately, due to the exposed |
| 114 nature of those structures, extending them also necessitated breaking backward |
| 115 ABI compatibility with previous libjpeg releases. Thus, programs that were |
| 116 built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is |
| 117 based on the libjpeg v6b code base. Although libjpeg v7 and v8 are not |
| 118 as widely used as v6b, enough programs (including a few Linux distros) made |
| 119 the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs |
| 120 in libjpeg-turbo. It should be noted, however, that this feature was added |
| 121 primarily so that applications that had already been compiled to use libjpeg |
| 122 v7+ could take advantage of accelerated baseline JPEG encoding/decoding |
| 123 without recompiling. libjpeg-turbo does not claim to support all of the |
| 124 libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all |
| 125 cases (see below.) |
| 126 |
| 127 By passing an argument of `--with-jpeg7` or `--with-jpeg8` to `configure`, or |
| 128 an argument of `-DWITH_JPEG7=1` or `-DWITH_JPEG8=1` to `cmake`, you can build a |
| 129 version of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that |
| 130 programs that are built against libjpeg v7 or v8 can be run with libjpeg-turbo. |
| 131 The following section describes which libjpeg v7+ features are supported and |
| 132 which aren't. |
| 133 |
| 134 ### Support for libjpeg v7 and v8 Features |
| 135 |
| 136 #### Fully supported |
| 137 |
| 138 - **libjpeg: IDCT scaling extensions in decompressor** |
| 139 libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8, |
| 140 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 |
| 141 and 1/2 are SIMD-accelerated.) |
| 142 |
| 143 - **libjpeg: Arithmetic coding** |
| 144 |
| 145 - **libjpeg: In-memory source and destination managers** |
| 146 See notes below. |
| 147 |
| 148 - **cjpeg: Separate quality settings for luminance and chrominance** |
| 149 Note that the libpjeg v7+ API was extended to accommodate this feature only |
| 150 for convenience purposes. It has always been possible to implement this |
| 151 feature with libjpeg v6b (see rdswitch.c for an example.) |
| 152 |
| 153 - **cjpeg: 32-bit BMP support** |
| 154 |
| 155 - **cjpeg: `-rgb` option** |
| 156 |
| 157 - **jpegtran: Lossless cropping** |
| 158 |
| 159 - **jpegtran: `-perfect` option** |
| 160 |
| 161 - **jpegtran: Forcing width/height when performing lossless crop** |
| 162 |
| 163 - **rdjpgcom: `-raw` option** |
| 164 |
| 165 - **rdjpgcom: Locale awareness** |
| 166 |
| 167 |
| 168 #### Not supported |
| 169 |
| 170 NOTE: As of this writing, extensive research has been conducted into the |
| 171 usefulness of DCT scaling as a means of data reduction and SmartScale as a |
| 172 means of quality improvement. The reader is invited to peruse the research at |
| 173 http://www.libjpeg-turbo.org/About/SmartScale and draw his/her own conclusions, |
| 174 but it is the general belief of our project that these features have not |
| 175 demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo. |
| 176 |
| 177 - **libjpeg: DCT scaling in compressor** |
| 178 `cinfo.scale_num` and `cinfo.scale_denom` are silently ignored. |
| 179 There is no technical reason why DCT scaling could not be supported when |
| 180 emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see |
| 181 below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and |
| 182 8/9 would be available, which is of limited usefulness. |
| 183 |
| 184 - **libjpeg: SmartScale** |
| 185 `cinfo.block_size` is silently ignored. |
| 186 SmartScale is an extension to the JPEG format that allows for DCT block |
| 187 sizes other than 8x8. Providing support for this new format would be |
| 188 feasible (particularly without full acceleration.) However, until/unless |
| 189 the format becomes either an official industry standard or, at minimum, an |
| 190 accepted solution in the community, we are hesitant to implement it, as |
| 191 there is no sense of whether or how it might change in the future. It is |
| 192 our belief that SmartScale has not demonstrated sufficient usefulness as a |
| 193 lossless format nor as a means of quality enhancement, and thus our primary |
| 194 interest in providing this feature would be as a means of supporting |
| 195 additional DCT scaling factors. |
| 196 |
| 197 - **libjpeg: Fancy downsampling in compressor** |
| 198 `cinfo.do_fancy_downsampling` is silently ignored. |
| 199 This requires the DCT scaling feature, which is not supported. |
| 200 |
| 201 - **jpegtran: Scaling** |
| 202 This requires both the DCT scaling and SmartScale features, which are not |
| 203 supported. |
| 204 |
| 205 - **Lossless RGB JPEG files** |
| 206 This requires the SmartScale feature, which is not supported. |
| 207 |
| 208 ### What About libjpeg v9? |
| 209 |
| 210 libjpeg v9 introduced yet another field to the JPEG compression structure |
| 211 (`color_transform`), thus making the ABI backward incompatible with that of |
| 212 libjpeg v8. This new field was introduced solely for the purpose of supporting |
| 213 lossless SmartScale encoding. Furthermore, there was actually no reason to |
| 214 extend the API in this manner, as the color transform could have just as easily |
| 215 been activated by way of a new JPEG colorspace constant, thus preserving |
| 216 backward ABI compatibility. |
| 217 |
| 218 Our research (see link above) has shown that lossless SmartScale does not |
| 219 generally accomplish anything that can't already be accomplished better with |
| 220 existing, standard lossless formats. Therefore, at this time it is our belief |
| 221 that there is not sufficient technical justification for software projects to |
| 222 upgrade from libjpeg v8 to libjpeg v9, and thus there is not sufficient |
| 223 echnical justification for us to emulate the libjpeg v9 ABI. |
| 224 |
| 225 In-Memory Source/Destination Managers |
| 226 ------------------------------------- |
| 227 |
| 228 By default, libjpeg-turbo 1.3 and later includes the `jpeg_mem_src()` and |
| 229 `jpeg_mem_dest()` functions, even when not emulating the libjpeg v8 API/ABI. |
| 230 Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8 |
| 231 API/ABI emulation in order to use the in-memory source/destination managers, |
| 232 but several projects requested that those functions be included when emulating |
| 233 the libjpeg v6b API/ABI as well. This allows the use of those functions by |
| 234 programs that need them, without breaking ABI compatibility for programs that |
| 235 don't, and it allows those functions to be provided in the "official" |
| 236 libjpeg-turbo binaries. |
| 237 |
| 238 Those who are concerned about maintaining strict conformance with the libjpeg |
| 239 v6b or v7 API can pass an argument of `--without-mem-srcdst` to `configure` or |
| 240 an argument of `-DWITH_MEM_SRCDST=0` to `cmake` prior to building |
| 241 libjpeg-turbo. This will restore the pre-1.3 behavior, in which |
| 242 `jpeg_mem_src()` and `jpeg_mem_dest()` are only included when emulating the |
| 243 libjpeg v8 API/ABI. |
| 244 |
| 245 On Un*x systems, including the in-memory source/destination managers changes |
| 246 the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI |
| 247 emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation. |
| 248 |
| 249 Note that, on most Un*x systems, the dynamic linker will not look for a |
| 250 function in a library until that function is actually used. Thus, if a program |
| 251 is built against libjpeg-turbo 1.3+ and uses `jpeg_mem_src()` or |
| 252 `jpeg_mem_dest()`, that program will not fail if run against an older version |
| 253 of libjpeg-turbo or against libjpeg v7- until the program actually tries to |
| 254 call `jpeg_mem_src()` or `jpeg_mem_dest()`. Such is not the case on Windows. |
| 255 If a program is built against the libjpeg-turbo 1.3+ DLL and uses |
| 256 `jpeg_mem_src()` or `jpeg_mem_dest()`, then it must use the libjpeg-turbo 1.3+ |
| 257 DLL at run time. |
| 258 |
| 259 Both cjpeg and djpeg have been extended to allow testing the in-memory |
| 260 source/destination manager functions. See their respective man pages for more |
| 261 details. |
| 262 |
| 263 |
| 264 Mathematical Compatibility |
| 265 ========================== |
| 266 |
| 267 For the most part, libjpeg-turbo should produce identical output to libjpeg |
| 268 v6b. The one exception to this is when using the floating point DCT/IDCT, in |
| 269 which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the |
| 270 following reasons: |
| 271 |
| 272 - The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so |
| 273 slightly more accurate than the implementation in libjpeg v6b, but not by |
| 274 any amount perceptible to human vision (generally in the range of 0.01 to |
| 275 0.08 dB gain in PNSR.) |
| 276 |
| 277 - When not using the SIMD extensions, libjpeg-turbo uses the more accurate |
| 278 (and slightly faster) floating point IDCT algorithm introduced in libjpeg |
| 279 v8a as opposed to the algorithm used in libjpeg v6b. It should be noted, |
| 280 however, that this algorithm basically brings the accuracy of the floating |
| 281 point IDCT in line with the accuracy of the slow integer IDCT. The floating |
| 282 point DCT/IDCT algorithms are mainly a legacy feature, and they do not |
| 283 produce significantly more accuracy than the slow integer algorithms (to put |
| 284 numbers on this, the typical difference in PNSR between the two algorithms |
| 285 is less than 0.10 dB, whereas changing the quality level by 1 in the upper |
| 286 range of the quality scale is typically more like a 1.0 dB difference.) |
| 287 |
| 288 - If the floating point algorithms in libjpeg-turbo are not implemented using |
| 289 SIMD instructions on a particular platform, then the accuracy of the |
| 290 floating point DCT/IDCT can depend on the compiler settings. |
| 291 |
| 292 While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood it is |
| 293 still using the same algorithms as libjpeg v6b, so there are several specific |
| 294 cases in which libjpeg-turbo cannot be expected to produce the same output as |
| 295 libjpeg v8: |
| 296 |
| 297 - When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8 |
| 298 implements those scaling algorithms differently than libjpeg v6b does, and |
| 299 libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior. |
| 300 |
| 301 - When using chrominance subsampling, because libjpeg v8 implements this |
| 302 with its DCT/IDCT scaling algorithms rather than with a separate |
| 303 downsampling/upsampling algorithm. In our testing, the subsampled/upsampled |
| 304 output of libjpeg v8 is less accurate than that of libjpeg v6b for this |
| 305 reason. |
| 306 |
| 307 - When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or |
| 308 "non-smooth") chrominance upsampling, because libjpeg v8 does not support |
| 309 merged upsampling with scaling factors > 1. |
| 310 |
| 311 |
| 312 Performance Pitfalls |
| 313 ==================== |
| 314 |
| 315 Restart Markers |
| 316 --------------- |
| 317 |
| 318 The optimized Huffman decoder in libjpeg-turbo does not handle restart markers |
| 319 in a way that makes the rest of the libjpeg infrastructure happy, so it is |
| 320 necessary to use the slow Huffman decoder when decompressing a JPEG image that |
| 321 has restart markers. This can cause the decompression performance to drop by |
| 322 as much as 20%, but the performance will still be much greater than that of |
| 323 libjpeg. Many consumer packages, such as PhotoShop, use restart markers when |
| 324 generating JPEG images, so images generated by those programs will experience |
| 325 this issue. |
| 326 |
| 327 Fast Integer Forward DCT at High Quality Levels |
| 328 ----------------------------------------------- |
| 329 |
| 330 The algorithm used by the SIMD-accelerated quantization function cannot produce |
| 331 correct results whenever the fast integer forward DCT is used along with a JPEG |
| 332 quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization |
| 333 function in those cases. This causes performance to drop by as much as 40%. |
| 334 It is therefore strongly advised that you use the slow integer forward DCT |
| 335 whenever encoding images with a JPEG quality of 98 or higher. |
OLD | NEW |