~ubuntu-branches/ubuntu/raring/glmark2/raring

« back to all changes in this revision

Viewing changes to src/libjpeg-turbo/README-turbo.txt

  • Committer: Package Import Robot
  • Author(s): Ricardo Salveti de Araujo
  • Date: 2012-08-21 15:38:09 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20120821153809-bwux72bat8qp2n5v
Tags: 2012.08-0ubuntu1
* New upstream release 2012.08 (LP: #1039736)
  - Avoid crashing if gl used is not >= 2.0 (LP: #842279)
* Bumping dh compatibility level to v9
* debian/control:
  - Update Standards-Version to 3.9.3.
  - Add libjpeg-dev build dependency.
  - Use libegl1-x11-dev as an build-dep alternative instead of libegl1-dev.
  - Update description of glmark2-data binary package.
* debian/copyright:
  - Refresh copyright based on the current upstrem version
* debian/rules:
  - Clean compiled python code from unpacked waflib/ directory, as
    described in http://wiki.debian.org/UnpackWaf

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
*******************************************************************************
 
2
**     Background
 
3
*******************************************************************************
 
4
 
 
5
libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX,
 
6
SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86,
 
7
x86-64, and ARM systems.  On such systems, libjpeg-turbo is generally 2-4x as
 
8
fast as the unmodified version of libjpeg, all else being equal.
 
9
 
 
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
 
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
 
14
encoding/decoding, and various bug fixes.  The goal was to produce a fully
 
15
open-source codec that could replace the partially closed-source TurboJPEG/IPP
 
16
codec used by VirtualGL and TurboVNC.  libjpeg-turbo generally achieves 80-120%
 
17
of the performance of TurboJPEG/IPP.  It is faster in some areas but slower in
 
18
others.
 
19
 
 
20
In early 2010, libjpeg-turbo spun off into its own independent project, with
 
21
the goal of making high-speed JPEG compression/decompression technology
 
22
available to a broader range of users and developers.
 
23
 
 
24
 
 
25
*******************************************************************************
 
26
**     License
 
27
*******************************************************************************
 
28
 
 
29
Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by
 
30
libjpeg (see README.)  The TurboJPEG/OSS wrapper (both C and Java versions) and
 
31
associated test programs bear a similar license, which is reproduced below:
 
32
 
 
33
Redistribution and use in source and binary forms, with or without
 
34
modification, are permitted provided that the following conditions are met:
 
35
 
 
36
- Redistributions of source code must retain the above copyright notice,
 
37
  this list of conditions and the following disclaimer.
 
38
- Redistributions in binary form must reproduce the above copyright notice,
 
39
  this list of conditions and the following disclaimer in the documentation
 
40
  and/or other materials provided with the distribution.
 
41
- Neither the name of the libjpeg-turbo Project nor the names of its
 
42
  contributors may be used to endorse or promote products derived from this
 
43
  software without specific prior written permission.
 
44
 
 
45
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
 
46
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
47
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
48
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 
49
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
50
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
51
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
52
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
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
 
55
POSSIBILITY OF SUCH DAMAGE.
 
56
 
 
57
 
 
58
*******************************************************************************
 
59
**     Using libjpeg-turbo
 
60
*******************************************************************************
 
61
 
 
62
libjpeg-turbo includes two APIs that can be used to compress and decompress
 
63
JPEG images:
 
64
 
 
65
  TurboJPEG API:  This API provides an easy-to-use interface for compressing
 
66
  and decompressing JPEG images in memory.  It also provides some functionality
 
67
  that would not be straightforward to achieve using the underlying libjpeg
 
68
  API, such as generating planar YUV images and performing multiple
 
69
  simultaneous lossless transforms on an image.  The Java interface for
 
70
  libjpeg-turbo is written on top of the TurboJPEG API.
 
71
 
 
72
  libjpeg API:  This is the de facto industry-standard API for compressing and
 
73
  decompressing JPEG images.  It is more difficult to use than the TurboJPEG
 
74
  API but also more powerful.  libjpeg-turbo is both API/ABI-compatible and
 
75
  mathematically compatible with libjpeg v6b.  It can also optionally be
 
76
  configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.)
 
77
 
 
78
 
 
79
=============================
 
80
Replacing libjpeg at Run Time
 
81
=============================
 
82
 
 
83
If a Unix application is dynamically linked with libjpeg, then you can replace
 
84
libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH.
 
85
For instance:
 
86
 
 
87
  [Using libjpeg]
 
88
  > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
 
89
  real  0m0.392s
 
90
  user  0m0.074s
 
91
  sys   0m0.020s
 
92
 
 
93
  [Using libjpeg-turbo]
 
94
  > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
 
95
  > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
 
96
  real  0m0.109s
 
97
  user  0m0.029s
 
98
  sys   0m0.010s
 
99
 
 
100
NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and
 
101
architecture.
 
102
 
 
103
System administrators can also replace the libjpeg sym links in /usr/{lib} with
 
104
links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}.
 
105
This will effectively accelerate every application that uses the libjpeg
 
106
dynamic library on the system.
 
107
 
 
108
The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL
 
109
(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether it was built with
 
110
libjpeg v6b, v7, or v8 emulation) into c:\libjpeg-turbo[64]\bin, and the PATH
 
111
environment variable can be modified such that this directory is searched
 
112
before any others that might contain a libjpeg DLL.  However, if a libjpeg
 
113
DLL exists in an application's install directory, then Windows will load this
 
114
DLL first whenever the application is launched.  Thus, if an application ships
 
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
 
117
application's install directory to accelerate it.
 
118
 
 
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).
 
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
 
123
Package, which is available as a free download from Microsoft's web site.
 
124
 
 
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
 
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
 
129
run-time DLL.  In particular, this affects jpeg_stdio_dest() and
 
130
jpeg_stdio_src().
 
131
 
 
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
 
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.
 
136
This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into
 
137
the appropriate place in the application bundle and using install_name_tool to
 
138
repoint the dylib to the new directory.  This requires an advanced knowledge of
 
139
OS X and would not survive an upgrade or a re-install of the application.
 
140
Thus, it is not recommended for most users.
 
141
 
 
142
=======================
 
143
Replacing TurboJPEG/IPP
 
144
=======================
 
145
 
 
146
libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by
 
147
VirtualGL 2.1.x and TurboVNC 0.6 (and prior.)  libjpeg-turbo contains a wrapper
 
148
library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo
 
149
instead of the closed-source Intel Performance Primitives.  You can replace the
 
150
TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order
 
151
to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec
 
152
at run time.  Note that the 64-bit libjpeg-turbo packages contain only 64-bit
 
153
binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and
 
154
32-bit binaries.  Thus, to replace a TurboJPEG/IPP 64-bit package, install
 
155
both the 64-bit and 32-bit versions of libjpeg-turbo.
 
156
 
 
157
You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with
 
158
the libjpeg-turbo SDK instead of TurboJPEG/IPP.  It should work identically.
 
159
libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which
 
160
are used to build VirtualGL 2.2 and TurboVNC 1.0 and later.
 
161
 
 
162
========================================
 
163
Using libjpeg-turbo in Your Own Programs
 
164
========================================
 
165
 
 
166
For the most part, libjpeg-turbo should work identically to libjpeg, so in
 
167
most cases, an application can be built against libjpeg and then run against
 
168
libjpeg-turbo.  On Unix systems (including Cygwin), you can build against
 
169
libjpeg-turbo instead of libjpeg by setting
 
170
 
 
171
  CPATH=/opt/libjpeg-turbo/include
 
172
  and
 
173
  LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
 
174
 
 
175
({lib} = lib32 or lib64, depending on whether you are building a 32-bit or a
 
176
64-bit application.)
 
177
 
 
178
If using MinGW, then set
 
179
 
 
180
  CPATH=/c/libjpeg-turbo-gcc[64]/include
 
181
  and
 
182
  LIBRARY_PATH=/c/libjpeg-turbo-gcc[64]/lib
 
183
 
 
184
Building against libjpeg-turbo is useful, for instance, if you want to build an
 
185
application that leverages the libjpeg-turbo colorspace extensions (see below.)
 
186
On Linux and Solaris systems, you would still need to manipulate
 
187
LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run
 
188
time.  On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker
 
189
to force the use of libjpeg-turbo at run time rather than libjpeg (also useful
 
190
if you want to leverage the colorspace extensions), or you can link against the
 
191
libjpeg-turbo static library.
 
192
 
 
193
To force a Linux, Solaris, or MinGW application to link against the static
 
194
version of libjpeg-turbo, you can use the following linker options:
 
195
 
 
196
  -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
 
197
 
 
198
On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command
 
199
line (this also works on Linux and Solaris.)
 
200
 
 
201
To build Visual C++ applications using libjpeg-turbo, add
 
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
 
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.)
 
206
 
 
207
=====================
 
208
Colorspace Extensions
 
209
=====================
 
210
 
 
211
libjpeg-turbo includes extensions that allow JPEG images to be compressed
 
212
directly from (and decompressed directly to) buffers that use BGR, BGRX,
 
213
RGBX, XBGR, and XRGB pixel ordering.  This is implemented with ten new
 
214
colorspace constants:
 
215
 
 
216
  JCS_EXT_RGB   /* red/green/blue */
 
217
  JCS_EXT_RGBX  /* red/green/blue/x */
 
218
  JCS_EXT_BGR   /* blue/green/red */
 
219
  JCS_EXT_BGRX  /* blue/green/red/x */
 
220
  JCS_EXT_XBGR  /* x/blue/green/red */
 
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 */
 
226
 
 
227
Setting cinfo.in_color_space (compression) or cinfo.out_color_space
 
228
(decompression) to one of these values will cause libjpeg-turbo to read the
 
229
red, green, and blue values from (or write them to) the appropriate position in
 
230
the pixel when compressing from/decompressing to an RGB buffer.
 
231
 
 
232
Your application can check for the existence of these extensions at compile
 
233
time with:
 
234
 
 
235
  #ifdef JCS_EXTENSIONS
 
236
 
 
237
At run time, attempting to use these extensions with a version of libjpeg
 
238
that doesn't support them will result in a "Bogus input colorspace" error.
 
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
 
 
255
=================================
 
256
libjpeg v7 and v8 API/ABI support
 
257
=================================
 
258
 
 
259
With libjpeg v7 and v8, new features were added that necessitated extending the
 
260
compression and decompression structures.  Unfortunately, due to the exposed
 
261
nature of those structures, extending them also necessitated breaking backward
 
262
ABI compatibility with previous libjpeg releases.  Thus, programs that are
 
263
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
 
264
based on the libjpeg v6b code base.  Although libjpeg v7 and v8 are still not
 
265
as widely used as v6b, enough programs (including a few Linux distros) have
 
266
made the switch that it was desirable to provide support for the libjpeg v7/v8
 
267
API/ABI in libjpeg-turbo.  Although libjpeg-turbo can now be configured as a
 
268
drop-in replacement for libjpeg v7 or v8, it should be noted that not all of
 
269
the features in libjpeg v7 and v8 are supported (see below.)
 
270
 
 
271
By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an
 
272
argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version
 
273
of libjpeg-turbo that emulates the libjpeg v7 or v8 API/ABI, so that programs
 
274
that are built against libjpeg v7 or v8 can be run with libjpeg-turbo.  The
 
275
following section describes which libjpeg v7+ features are supported and which
 
276
aren't.
 
277
 
 
278
libjpeg v7 and v8 Features:
 
279
---------------------------
 
280
 
 
281
Fully supported:
 
282
 
 
283
-- cjpeg: Separate quality settings for luminance and chrominance
 
284
   Note that the libpjeg v7+ API was extended to accommodate this feature only
 
285
   for convenience purposes.  It has always been possible to implement this
 
286
   feature with libjpeg v6b (see rdswitch.c for an example.)
 
287
 
 
288
-- cjpeg: 32-bit BMP support
 
289
 
 
290
-- jpegtran: lossless cropping
 
291
 
 
292
-- jpegtran: -perfect option
 
293
 
 
294
-- rdjpgcom: -raw option
 
295
 
 
296
-- rdjpgcom: locale awareness
 
297
 
 
298
 
 
299
Fully supported when using libjpeg v7/v8 emulation:
 
300
 
 
301
-- libjpeg: In-memory source and destination managers
 
302
 
 
303
 
 
304
Not supported:
 
305
 
 
306
-- libjpeg: DCT scaling in compressor
 
307
   cinfo.scale_num and cinfo.scale_denom are silently ignored.
 
308
   There is no technical reason why DCT scaling cannot be supported, but
 
309
   without the SmartScale extension (see below), it would only be able to
 
310
   down-scale using ratios of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and 8/9,
 
311
   which is of limited usefulness.
 
312
 
 
313
-- libjpeg: SmartScale
 
314
   cinfo.block_size is silently ignored.
 
315
   SmartScale is an extension to the JPEG format that allows for DCT block
 
316
   sizes other than 8x8.  It would be difficult to support this feature while
 
317
   retaining backward compatibility with libjpeg v6b.
 
318
 
 
319
-- libjpeg: IDCT scaling extensions in decompressor
 
320
   libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4,
 
321
   and 1/8 (same as libjpeg v6b.)
 
322
 
 
323
-- libjpeg: Fancy downsampling in compressor
 
324
   cinfo.do_fancy_downsampling is silently ignored.
 
325
   This requires the DCT scaling feature, which is not supported.
 
326
 
 
327
-- jpegtran: Scaling
 
328
   This requires both the DCT scaling and SmartScale features, which are not
 
329
   supported.
 
330
 
 
331
-- Lossless RGB JPEG files
 
332
   This requires the SmartScale feature, which is not supported.
 
333
 
 
334
 
 
335
*******************************************************************************
 
336
**     Performance pitfalls
 
337
*******************************************************************************
 
338
 
 
339
===============
 
340
Restart Markers
 
341
===============
 
342
 
 
343
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
 
344
in a way that makes the rest of the libjpeg infrastructure happy, so it is
 
345
necessary to use the slow Huffman decoder when decompressing a JPEG image that
 
346
has restart markers.  This can cause the decompression performance to drop by
 
347
as much as 20%, but the performance will still be much greater than that of
 
348
libjpeg.  Many consumer packages, such as PhotoShop, use restart markers when
 
349
generating JPEG images, so images generated by those programs will experience
 
350
this issue.
 
351
 
 
352
===============================================
 
353
Fast Integer Forward DCT at High Quality Levels
 
354
===============================================
 
355
 
 
356
The algorithm used by the SIMD-accelerated quantization function cannot produce
 
357
correct results whenever the fast integer forward DCT is used along with a JPEG
 
358
quality of 98-100.  Thus, libjpeg-turbo must use the non-SIMD quantization
 
359
function in those cases.  This causes performance to drop by as much as 40%.
 
360
It is therefore strongly advised that you use the slow integer forward DCT
 
361
whenever encoding images with a JPEG quality of 98 or higher.