blob: ccf7d7ef55bc7a0d48618e20d8db5c2fd7d99bfe [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
69%systemroot%\system32. However, if jpeg62.dll also exists in an application's
70install directory, then Windows will load the application's version of it
71first. Thus, if an application ships with jpeg62.dll, then back up the
72application's version of jpeg62.dll and copy %systemroot%\system32\jpeg62.dll
73into the application's install directory to accelerate it.
DRC101f09a2010-02-12 22:52:37 +000074
DRC68fef832010-02-16 05:29:10 +000075Mac applications typically embed their own copies of libjpeg.62.dylib inside
76the (hidden) application bundle, so it is not possible to globally replace
77libjpeg on OS X systems. If an application uses a shared library version of
78libjpeg, then it may be possible to replace the application's version of it.
79This would generally involve copying libjpeg.62.dylib into the appropriate
80place in the application bundle and using install_name_tool to repoint the
81dylib to the new directory. This requires an advanced knowledge of OS X and
82would not survive an upgrade or a re-install of the application. Thus, it is
83not recommended for most users.
DRC101f09a2010-02-12 22:52:37 +000084
DRC68fef832010-02-16 05:29:10 +000085=======================
86Replacing TurboJPEG/IPP
87=======================
DRC101f09a2010-02-12 22:52:37 +000088
DRC68fef832010-02-16 05:29:10 +000089libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by
90VirtualGL 2.1.x (and prior) and TurboVNC. libjpeg-turbo contains a wrapper
91library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo
92instead of the closed source Intel Performance Primitives. You can replace the
93TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order
94to make existing releases of VirtualGL 2.1.x and TurboVNC use the new codec at
95run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit
96binaries, whereas the TurboJPEG/IPP 64-bit packages contain both 64-bit and
9732-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install
98both the 64-bit and 32-bit versions of libjpeg-turbo.
DRC101f09a2010-02-12 22:52:37 +000099
DRC68fef832010-02-16 05:29:10 +0000100You can also build the VirtualGL 2.1.x and TurboVNC source code with
101the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically.
102libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which
103are used to build VirtualGL 2.2 and later.
DRC101f09a2010-02-12 22:52:37 +0000104
DRC68fef832010-02-16 05:29:10 +0000105========================================
106Using libjpeg-turbo in Your Own Programs
107========================================
DRC101f09a2010-02-12 22:52:37 +0000108
DRC68fef832010-02-16 05:29:10 +0000109For the most part, libjpeg-turbo should work identically to libjpeg, so in
110most cases, an application can be built against libjpeg and then run against
111libjpeg-turbo. On Unix systems, you can build against libjpeg-turbo instead
112of libjpeg by setting
DRC101f09a2010-02-12 22:52:37 +0000113
DRC68fef832010-02-16 05:29:10 +0000114 CPATH=/opt/libjpeg-turbo/include
115 and
116 LIBRARY_PATH=/opt/libjpeg-turbo/{lib}
DRC101f09a2010-02-12 22:52:37 +0000117
DRC68fef832010-02-16 05:29:10 +0000118({lib} = lib, lib32, lib64, or lib/amd64, as appropriate.)
DRC101f09a2010-02-12 22:52:37 +0000119
DRC68fef832010-02-16 05:29:10 +0000120This is useful, for instance, if you want to build an application that
121leverages the libjpeg-turbo colorspace extensions (see below.) On Linux and
122Solaris systems, you would still need to manipulate the LD_LIBRARY_PATH or sym
123links appropriately to use libjpeg-turbo at run time. On such systems, you can
124pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of
125libjpeg-turbo at run time rather than libjpeg (also useful if you want to
126leverage the colorspace extensions), or you can link against the libjpeg-turbo
127static library.
DRC101f09a2010-02-12 22:52:37 +0000128
DRC68fef832010-02-16 05:29:10 +0000129To force a Linux or Solaris application to link against the static version of
130libjpeg-turbo, you can use the following linker options:
DRC101f09a2010-02-12 22:52:37 +0000131
DRC68fef832010-02-16 05:29:10 +0000132 -Wl,-Bstatic -ljpeg -Wl,-Bdynamic
DRC101f09a2010-02-12 22:52:37 +0000133
DRC68fef832010-02-16 05:29:10 +0000134or you can simply add /opt/libjpeg-turbo/{lib}/libjpeg.a to the linker command
135line (the latter is the only way to link against the static version of
136libjpeg-turbo on OS X.)
DRC101f09a2010-02-12 22:52:37 +0000137
DRC68fef832010-02-16 05:29:10 +0000138To build Visual C++ applications using libjpeg-turbo, add
139c:\libjpeg-turbo\include to your system or user INCLUDE environment variable
140and c:\libjpeg-turbo\lib to your system or user LIB environment variable, and
141then link against either jpeg.lib (to use jpeg62.dll) or jpeg-static.lib (to
142use the static version of libjpeg-turbo.)
DRC101f09a2010-02-12 22:52:37 +0000143
DRC68fef832010-02-16 05:29:10 +0000144If building an application using Cygwin, then set
DRC101f09a2010-02-12 22:52:37 +0000145
DRC68fef832010-02-16 05:29:10 +0000146 CPATH=/cygdrive/c/libjpeg-turbo/include
147 and
148 LIBRARY_PATH=/cygdrive/c/libjpeg-turbo/lib
DRC101f09a2010-02-12 22:52:37 +0000149
DRC68fef832010-02-16 05:29:10 +0000150If using MinGW, then set
DRC101f09a2010-02-12 22:52:37 +0000151
DRC68fef832010-02-16 05:29:10 +0000152 CPATH=/c/libjpeg-turbo/include
153 and
154 LIBRARY_PATH=/c/libjpeg-turbo/lib
DRC101f09a2010-02-12 22:52:37 +0000155
DRC68fef832010-02-16 05:29:10 +0000156and link using -ljpeg in both cases. NOTE: The static libraries shipped with
157the Windows version of libjpeg-turbo cannot be used with MinGW and Cygwin. If
158you wish to link statically with libjpeg-turbo using MinGW or Cygwin, then you
159will need to build libjpeg-turbo from source using GCC.
DRC101f09a2010-02-12 22:52:37 +0000160
DRC68fef832010-02-16 05:29:10 +0000161=====================
162Colorspace Extensions
163=====================
DRC101f09a2010-02-12 22:52:37 +0000164
DRC68fef832010-02-16 05:29:10 +0000165libjpeg-turbo includes extensions which allow JPEG images to be compressed
166directly from (and decompressed directly to) buffers which use BGR, BGRA,
167RGBA, ABGR, and ARGB pixel ordering. This is implemented with six new
168colorspace constants:
DRC101f09a2010-02-12 22:52:37 +0000169
DRC68fef832010-02-16 05:29:10 +0000170 JCS_EXT_RGB /* red/green/blue */
171 JCS_EXT_RGBX /* red/green/blue/x */
172 JCS_EXT_BGR /* blue/green/red */
173 JCS_EXT_BGRX /* blue/green/red/x */
174 JCS_EXT_XBGR /* x/blue/green/red */
175 JCS_EXT_XRGB /* x/red/green/blue */
DRC101f09a2010-02-12 22:52:37 +0000176
DRC68fef832010-02-16 05:29:10 +0000177Setting cinfo.in_color_space (compression) or cinfo.out_color_space
178(decompression) to one of these values will cause libjpeg-turbo to read the
179red, green, and blue values from (or write them to) the appropriate position in
180the pixel when YUV conversion is performed.
DRC101f09a2010-02-12 22:52:37 +0000181
DRC68fef832010-02-16 05:29:10 +0000182Your application can check for the existence of these extensions at compile
183time with:
DRC101f09a2010-02-12 22:52:37 +0000184
DRC68fef832010-02-16 05:29:10 +0000185 #ifdef JCS_EXTENSIONS
DRC101f09a2010-02-12 22:52:37 +0000186
DRC68fef832010-02-16 05:29:10 +0000187At run time, attempting to use these extensions with a version of libjpeg
188that doesn't support them will result in a "Bogus input colorspace" error.