xref: /aosp_15_r20/external/libjpeg-turbo/README.md (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
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