blob: 4704114fbe2b115bac49cf110fa8b5a1bf7ce381 [file] [log] [blame]
DRC101f09a2010-02-12 22:52:37 +00001*******************************************************************************
2** Background
3*******************************************************************************
4
5libjpeg-turbo is a high-speed version of libjpeg for x86 and x86-64 processors
6which uses SIMD instructions (MMX, SSE2, etc.) to accelerate baseline JPEG
DRCce1546e2010-02-13 23:06:03 +00007compression and decompression. libjpeg-turbo is generally 2-4x as fast
DRC101f09a2010-02-12 22:52:37 +00008as the unmodified version of libjpeg, all else being equal.
9
10libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but
11the TigerVNC and VirtualGL projects made numerous enhancements to the codec,
12including improved support for Mac OS X, 64-bit support, support for 32-bit
13and big endian pixel formats, accelerated Huffman encoding/decoding, and
14various bug fixes. The goal was to produce a fully open source codec that
15could replace the partially closed source TurboJPEG/IPP codec used by VirtualGL
DRCce1546e2010-02-13 23:06:03 +000016and TurboVNC. libjpeg-turbo generally performs in the range of 80-120% of
DRC101f09a2010-02-12 22:52:37 +000017TurboJPEG/IPP. It is faster in some areas but slower in others.
18
19It was decided to split libjpeg-turbo into a separate SDK so that other
DRC68fef832010-02-16 05:29:10 +000020projects could take advantage of this technology. The libjpeg-turbo shared
21libraries can be used as drop-in replacements for libjpeg on most systems.
DRC101f09a2010-02-12 22:52:37 +000022
23
24*******************************************************************************
DRCce1546e2010-02-13 23:06:03 +000025** License
26*******************************************************************************
27
28Some of the optimizations to the Huffman encoder/decoder were borrowed from
DRC68fef832010-02-16 05:29:10 +000029VirtualGL, and thus the libjpeg-turbo distribution, as a whole, falls under the
30wxWindows Library Licence, Version 3.1. A copy of this license can be found in
31this directory under LICENSE.txt. The rest of the source code, apart from
32these modifications, falls under a less restrictive license (see README.)
DRCce1546e2010-02-13 23:06:03 +000033
34
35*******************************************************************************
DRC68fef832010-02-16 05:29:10 +000036** Using libjpeg-turbo
DRC101f09a2010-02-12 22:52:37 +000037*******************************************************************************
38
DRC68fef832010-02-16 05:29:10 +000039=============================
40Replacing libjpeg at Run Time
41=============================
DRC101f09a2010-02-12 22:52:37 +000042
DRC68fef832010-02-16 05:29:10 +000043If a Unix application is dynamically linked with libjpeg, then you can replace
44libjpeg with libjpeg-turbo at run time by manipulating the LD_LIBRARY_PATH.
45For instance:
DRC101f09a2010-02-12 22:52:37 +000046
DRC68fef832010-02-16 05:29:10 +000047 [Using libjpeg]
48 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
49 real 0m0.392s
50 user 0m0.074s
51 sys 0m0.020s
DRC101f09a2010-02-12 22:52:37 +000052
DRC68fef832010-02-16 05:29:10 +000053 [Using libjpeg-turbo]
54 > export LD_LIBRARY_PATH=/opt/libjpeg-turbo/{lib}:$LD_LIBRARY_PATH
55 > time cjpeg <vgl_5674_0098.ppm >vgl_5674_0098.jpg
56 real 0m0.109s
57 user 0m0.029s
58 sys 0m0.010s
DRC101f09a2010-02-12 22:52:37 +000059
DRC68fef832010-02-16 05:29:10 +000060NOTE: {lib} can be lib, lib32, lib64, or lib/amd64, depending on the O/S and
61architecture.
DRC101f09a2010-02-12 22:52:37 +000062
DRC68fef832010-02-16 05:29:10 +000063System administrators can also replace the libjpeg sym links in /usr/{lib} with
64links to the libjpeg dynamic library located in /opt/libjpeg-turbo/{lib}. This
65will effectively accelerate every dynamically linked libjpeg application on the
66system.
DRC101f09a2010-02-12 22:52:37 +000067
DRC68fef832010-02-16 05:29:10 +000068The Windows version of libjpeg-turbo installs jpeg62.dll into
DRC7e0b4992010-02-25 05:52:44 +000069c:\libjpeg-turbo\bin, and the PATH environment variable can be modified such
70that this directory is searched before any others that might contain
71jpeg62.dll. However, if jpeg62.dll also exists in an application's install
72directory, then Windows will load the application's version of it first. Thus,
73if an application ships with jpeg62.dll, then back up the application's version
74of jpeg62.dll and copy c:\libjpeg-turbo\bin\jpeg62.dll into the application's
75install directory to accelerate it.
76
77libjpeg-turbo's version of jpeg62.dll requires the Visual C++ 2008 C run time
78DLL (msvcr90.dll). This library ships with more recent versions of Windows,
79but users of older versions can obtain it from the Visual C++ 2008
80Redistributable Package, which is available as a free download from Microsoft's
81web site.
DRC101f09a2010-02-12 22:52:37 +000082
DRC68fef832010-02-16 05:29:10 +000083Mac applications typically embed their own copies of libjpeg.62.dylib inside
84the (hidden) application bundle, so it is not possible to globally replace
85libjpeg on OS X systems. If an application uses a shared library version of
86libjpeg, then it may be possible to replace the application's version of it.
87This would generally involve copying libjpeg.62.dylib into the appropriate
88place in the application bundle and using install_name_tool to repoint the
89dylib to the new directory. This requires an advanced knowledge of OS X and
90would not survive an upgrade or a re-install of the application. Thus, it is
91not recommended for most users.
DRC101f09a2010-02-12 22:52:37 +000092
DRC68fef832010-02-16 05:29:10 +000093=======================
94Replacing TurboJPEG/IPP
95=======================
DRC101f09a2010-02-12 22:52:37 +000096
DRC68fef832010-02-16 05:29:10 +000097libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by
98VirtualGL 2.1.x (and prior) and TurboVNC. libjpeg-turbo contains a wrapper
99library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo
100instead of the closed source Intel Performance Primitives. You can replace the
101TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order
102to make existing releases of VirtualGL 2.1.x and TurboVNC use the new codec at
103run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit
104binaries, whereas the TurboJPEG/IPP 64-bit packages contain both 64-bit and
10532-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install
106both the 64-bit and 32-bit versions of libjpeg-turbo.
DRC101f09a2010-02-12 22:52:37 +0000107
DRC68fef832010-02-16 05:29:10 +0000108You can also build the VirtualGL 2.1.x and TurboVNC source code with
109the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically.
110libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which
111are used to build VirtualGL 2.2 and later.
DRC101f09a2010-02-12 22:52:37 +0000112
DRC68fef832010-02-16 05:29:10 +0000113========================================
114Using libjpeg-turbo in Your Own Programs
115========================================
DRC101f09a2010-02-12 22:52:37 +0000116
DRC68fef832010-02-16 05:29:10 +0000117For the most part, libjpeg-turbo should work identically to libjpeg, so in
118most cases, an application can be built against libjpeg and then run against
119libjpeg-turbo. On Unix systems, you can build against libjpeg-turbo instead
120of libjpeg by setting
DRC101f09a2010-02-12 22:52:37 +0000121
DRC68fef832010-02-16 05:29:10 +0000122 CPATH=/opt/libjpeg-turbo/include
123 and
124 LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
DRC101f09a2010-02-12 22:52:37 +0000125
DRC68fef832010-02-16 05:29:10 +0000126({lib} = lib, lib32, lib64, or lib/amd64, as appropriate.)
DRC101f09a2010-02-12 22:52:37 +0000127
DRC0a1f68e2010-02-24 07:24:26 +0000128If using Cygwin, then set
DRC101f09a2010-02-12 22:52:37 +0000129
DRC0a1f68e2010-02-24 07:24:26 +0000130 CPATH=/cygdrive/c/libjpeg-turbo-gcc/include
131 and
132 LIBRARY_PATH=/cygdrive/c/libjpeg-turbo-gcc/lib
133
134If using MinGW, then set
135
136 CPATH=/c/libjpeg-turbo-gcc/include
137 and
138 LIBRARY_PATH=/c/libjpeg-turbo-gcc/lib
139
140Building against libjpeg-turbo is useful, for instance, if you want to build an
141application that leverages the libjpeg-turbo colorspace extensions (see below.)
142On Linux and Solaris systems, you would still need to manipulate the
143LD_LIBRARY_PATH or sym links appropriately to use libjpeg-turbo at run time.
144On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker to
145force the use of libjpeg-turbo at run time rather than libjpeg (also useful if
146you want to leverage the colorspace extensions), or you can link against the
147libjpeg-turbo static library.
148
149To force a Linux, Solaris, or MinGW application to link against the static
150version of libjpeg-turbo, you can use the following linker options:
DRC101f09a2010-02-12 22:52:37 +0000151
DRC68fef832010-02-16 05:29:10 +0000152 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
DRC101f09a2010-02-12 22:52:37 +0000153
DRC0a1f68e2010-02-24 07:24:26 +0000154On OS X, simply add /opt/libjpeg-turbo/{lib}/libjpeg.a to the linker command
155line (this also works on Linux and Solaris.)
DRC101f09a2010-02-12 22:52:37 +0000156
DRC68fef832010-02-16 05:29:10 +0000157To build Visual C++ applications using libjpeg-turbo, add
158c:\libjpeg-turbo\include to your system or user INCLUDE environment variable
159and c:\libjpeg-turbo\lib to your system or user LIB environment variable, and
160then link against either jpeg.lib (to use jpeg62.dll) or jpeg-static.lib (to
161use the static version of libjpeg-turbo.)
DRC101f09a2010-02-12 22:52:37 +0000162
DRC68fef832010-02-16 05:29:10 +0000163=====================
164Colorspace Extensions
165=====================
DRC101f09a2010-02-12 22:52:37 +0000166
DRC68fef832010-02-16 05:29:10 +0000167libjpeg-turbo includes extensions which allow JPEG images to be compressed
168directly from (and decompressed directly to) buffers which use BGR, BGRA,
169RGBA, ABGR, and ARGB pixel ordering. This is implemented with six new
170colorspace constants:
DRC101f09a2010-02-12 22:52:37 +0000171
DRC68fef832010-02-16 05:29:10 +0000172 JCS_EXT_RGB /* red/green/blue */
173 JCS_EXT_RGBX /* red/green/blue/x */
174 JCS_EXT_BGR /* blue/green/red */
175 JCS_EXT_BGRX /* blue/green/red/x */
176 JCS_EXT_XBGR /* x/blue/green/red */
177 JCS_EXT_XRGB /* x/red/green/blue */
DRC101f09a2010-02-12 22:52:37 +0000178
DRC68fef832010-02-16 05:29:10 +0000179Setting cinfo.in_color_space (compression) or cinfo.out_color_space
180(decompression) to one of these values will cause libjpeg-turbo to read the
181red, green, and blue values from (or write them to) the appropriate position in
182the pixel when YUV conversion is performed.
DRC101f09a2010-02-12 22:52:37 +0000183
DRC68fef832010-02-16 05:29:10 +0000184Your application can check for the existence of these extensions at compile
185time with:
DRC101f09a2010-02-12 22:52:37 +0000186
DRC68fef832010-02-16 05:29:10 +0000187 #ifdef JCS_EXTENSIONS
DRC101f09a2010-02-12 22:52:37 +0000188
DRC68fef832010-02-16 05:29:10 +0000189At run time, attempting to use these extensions with a version of libjpeg
190that doesn't support them will result in a "Bogus input colorspace" error.