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