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