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