Index: README-turbo.txt |
=================================================================== |
--- README-turbo.txt (revision 134206) |
+++ README-turbo.txt (working copy) |
@@ -3,31 +3,31 @@ |
******************************************************************************* |
libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, |
-SSE2, etc.) to accelerate baseline JPEG compression and decompression on x86 |
-and x86-64 systems. On such systems, libjpeg-turbo is generally 2-4x as fast |
-as the unmodified version of libjpeg, all else being equal. |
+SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, |
+x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as |
+fast as the unmodified version of libjpeg, all else being equal. |
libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but |
the TigerVNC and VirtualGL projects made numerous enhancements to the codec in |
2009, including improved support for Mac OS X, 64-bit support, support for |
-32-bit and big endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman |
-encoding/decoding, and various bug fixes. The goal was to produce a fully open |
-source codec that could replace the partially closed source TurboJPEG/IPP codec |
-used by VirtualGL and TurboVNC. libjpeg-turbo generally performs in the range |
-of 80-120% of TurboJPEG/IPP. It is faster in some areas but slower in others. |
+32-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman |
+encoding/decoding, and various bug fixes. The goal was to produce a fully |
+open-source codec that could replace the partially closed-source TurboJPEG/IPP |
+codec used by VirtualGL and TurboVNC. libjpeg-turbo generally achieves 80-120% |
+of the performance of TurboJPEG/IPP. It is faster in some areas but slower in |
+others. |
In early 2010, libjpeg-turbo spun off into its own independent project, with |
the goal of making high-speed JPEG compression/decompression technology |
-available to a broader range of users and developers. The libjpeg-turbo shared |
-libraries can be used as drop-in replacements for libjpeg on most systems. |
+available to a broader range of users and developers. |
******************************************************************************* |
** License |
******************************************************************************* |
-libjpeg-turbo is licensed under a non-restrictive, BSD-style license |
-(see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and |
+Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by |
+libjpeg (see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and |
associated test programs bear a similar license, which is reproduced below: |
Redistribution and use in source and binary forms, with or without |
@@ -62,16 +62,16 @@ |
libjpeg-turbo includes two APIs that can be used to compress and decompress |
JPEG images: |
- TurboJPEG/OSS: This API wraps libjpeg-turbo and provides an easy-to-use |
- interface for compressing and decompressing JPEG images in memory. It also |
- provides some features that would not be straightforward to implement using |
- the underlying libjpeg API, such as generating planar YUV images and |
- performing multiple simultaneous lossless transforms on an image. The Java |
- interface for libjpeg-turbo is written on top of TurboJPEG/OSS. |
+ TurboJPEG API: This API provides an easy-to-use interface for compressing |
+ and decompressing JPEG images in memory. It also provides some functionality |
+ that would not be straightforward to achieve using the underlying libjpeg |
+ API, such as generating planar YUV images and performing multiple |
+ simultaneous lossless transforms on an image. The Java interface for |
+ libjpeg-turbo is written on top of the TurboJPEG API. |
- libjpeg API: This is the industry standard API for compressing and |
- decompressing JPEG images. It is more difficult to use than TurboJPEG/OSS |
- but also more powerful. libjpeg-turbo is both API/ABI-compatible and |
+ libjpeg API: This is the de facto industry-standard API for compressing and |
+ decompressing JPEG images. It is more difficult to use than the TurboJPEG |
+ API but also more powerful. libjpeg-turbo is both API/ABI-compatible and |
mathematically compatible with libjpeg v6b. It can also optionally be |
configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.) |
@@ -101,13 +101,13 @@ |
architecture. |
System administrators can also replace the libjpeg sym links in /usr/{lib} with |
-links to the libjpeg dynamic library located in /opt/libjpeg-turbo/{lib}. This |
-will effectively accelerate every dynamically linked libjpeg application on the |
-system. |
+links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}. |
+This will effectively accelerate every application that uses the libjpeg |
+dynamic library on the system. |
The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL |
-(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether libjpeg v6b, v7, or |
-v8 emulation is enabled) into c:\libjpeg-turbo[64]\bin, and the PATH |
+(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether it was built with |
+libjpeg v6b, v7, or v8 emulation) into c:\libjpeg-turbo[64]\bin, and the PATH |
environment variable can be modified such that this directory is searched |
before any others that might contain a libjpeg DLL. However, if a libjpeg |
DLL exists in an application's install directory, then Windows will load this |
@@ -117,16 +117,16 @@ |
application's install directory to accelerate it. |
The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
-Visual C++ requires the Visual C++ 2008 C run time DLL (msvcr90.dll). |
+Visual C++ requires the Visual C++ 2008 C run-time DLL (msvcr90.dll). |
msvcr90.dll ships with more recent versions of Windows, but users of older |
Windows releases can obtain it from the Visual C++ 2008 Redistributable |
Package, which is available as a free download from Microsoft's web site. |
-NOTE: Features of libjpeg that require passing a C run time structure, such |
+NOTE: Features of libjpeg that require passing a C run-time structure, such |
as a file handle, from an application to libjpeg will probably not work with |
the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for |
Visual C++, unless the application is also built to use the Visual C++ 2008 C |
-run time DLL. In particular, this affects jpeg_stdio_dest() and |
+run-time DLL. In particular, this affects jpeg_stdio_dest() and |
jpeg_stdio_src(). |
Mac applications typically embed their own copies of the libjpeg dylib inside |
@@ -146,7 +146,7 @@ |
libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by |
VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper |
library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo |
-instead of the closed source Intel Performance Primitives. You can replace the |
+instead of the closed-source Intel Performance Primitives. You can replace the |
TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order |
to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec |
at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit |
@@ -157,7 +157,7 @@ |
You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with |
the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically. |
libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which |
-are used to build TurboVNC 1.0 and later. |
+are used to build VirtualGL 2.2 and TurboVNC 1.0 and later. |
======================================== |
Using libjpeg-turbo in Your Own Programs |
@@ -256,25 +256,18 @@ |
libjpeg v7 and v8 API/ABI support |
================================= |
-libjpeg v7 and v8 added new features to the API/ABI, and, unfortunately, the |
-compression and decompression structures were extended in a backward- |
-incompatible manner to accommodate these features. Thus, programs that are |
+With libjpeg v7 and v8, new features were added that necessitated extending the |
+compression and decompression structures. Unfortunately, due to the exposed |
+nature of those structures, extending them also necessitated breaking backward |
+ABI compatibility with previous libjpeg releases. Thus, programs that are |
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is |
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not |
as widely used as v6b, enough programs (including a few Linux distros) have |
made the switch that it was desirable to provide support for the libjpeg v7/v8 |
-API/ABI in libjpeg-turbo. |
+API/ABI in libjpeg-turbo. Although libjpeg-turbo can now be configured as a |
+drop-in replacement for libjpeg v7 or v8, it should be noted that not all of |
+the features in libjpeg v7 and v8 are supported (see below.) |
-Some of the libjpeg v7 and v8 features -- DCT scaling, to name one -- involve |
-deep modifications to the code that cannot be accommodated by libjpeg-turbo |
-without either breaking compatibility with libjpeg v6b or producing an |
-unsupportable mess. In order to fully support libjpeg v8 with all of its |
-features, we would have to essentially port the SIMD extensions to the libjpeg |
-v8 code base and maintain two separate code trees. We are hesitant to do this |
-until/unless the newer libjpeg code bases garner more community support and |
-involvement and until/unless we have some notion of whether future libjpeg |
-releases will also be backward-incompatible. |
- |
By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an |
argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version |
of libjpeg-turbo that emulates the libjpeg v7 or v8 API/ABI, so that programs |
@@ -292,6 +285,11 @@ |
for convenience purposes. It has always been possible to implement this |
feature with libjpeg v6b (see rdswitch.c for an example.) |
+-- libjpeg: IDCT scaling extensions in decompressor |
+ libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8, |
+ 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 |
+ and 1/2 are SIMD-accelerated.) |
+ |
-- cjpeg: 32-bit BMP support |
-- jpegtran: lossless cropping |
@@ -312,18 +310,29 @@ |
-- libjpeg: DCT scaling in compressor |
cinfo.scale_num and cinfo.scale_denom are silently ignored. |
+ There is no technical reason why DCT scaling cannot be supported, but |
+ without the SmartScale extension (see below), it would only be able to |
+ down-scale using ratios of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and 8/9, |
+ which is of limited usefulness. |
--- libjpeg: IDCT scaling extensions in decompressor |
- libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4, |
- and 1/8 (same as libjpeg v6b.) |
+-- libjpeg: SmartScale |
+ cinfo.block_size is silently ignored. |
+ SmartScale is an extension to the JPEG format that allows for DCT block |
+ sizes other than 8x8. It would be difficult to support this feature while |
+ retaining backward compatibility with libjpeg v6b. |
-- libjpeg: Fancy downsampling in compressor |
cinfo.do_fancy_downsampling is silently ignored. |
+ This requires the DCT scaling feature, which is not supported. |
-- jpegtran: Scaling |
- Seems to depend on the DCT scaling feature, which isn't supported. |
+ This requires both the DCT scaling and SmartScale features, which are not |
+ supported. |
+-- Lossless RGB JPEG files |
+ This requires the SmartScale feature, which is not supported. |
+ |
******************************************************************************* |
** Performance pitfalls |
******************************************************************************* |
@@ -333,12 +342,13 @@ |
=============== |
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers |
-in a way that makes libjpeg happy, so it is necessary to use the slow Huffman |
-decoder when decompressing a JPEG image that has restart markers. This can |
-cause the decompression performance to drop by as much as 20%, but the |
-performance will still be much much greater than that of libjpeg v6b. Many |
-consumer packages, such as PhotoShop, use restart markers when generating JPEG |
-images, so images generated by those programs will experience this issue. |
+in a way that makes the rest of the libjpeg infrastructure happy, so it is |
+necessary to use the slow Huffman decoder when decompressing a JPEG image that |
+has restart markers. This can cause the decompression performance to drop by |
+as much as 20%, but the performance will still be much greater than that of |
+libjpeg. Many consumer packages, such as PhotoShop, use restart markers when |
+generating JPEG images, so images generated by those programs will experience |
+this issue. |
=============================================== |
Fast Integer Forward DCT at High Quality Levels |