| 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 |