kusano 7d535a
kusano 7d535a
 ============================================================================
kusano 7d535a
 LZO -- a real-time data compression library
kusano 7d535a
 ============================================================================
kusano 7d535a
kusano 7d535a
 Author  : Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
           <markus@oberhumer.com></markus@oberhumer.com>
kusano 7d535a
           http://www.oberhumer.com/opensource/lzo/
kusano 7d535a
 Version : 2.03
kusano 7d535a
 Date    : 30 Apr 2008
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Abstract
kusano 7d535a
 --------
kusano 7d535a
 LZO is a portable lossless data compression library written in ANSI C.
kusano 7d535a
 It offers pretty fast compression and very fast decompression.
kusano 7d535a
 Decompression requires no memory.
kusano 7d535a
kusano 7d535a
 In addition there are slower compression levels achieving a quite
kusano 7d535a
 competitive compression ratio while still decompressing at
kusano 7d535a
 this very high speed.
kusano 7d535a
kusano 7d535a
 The LZO algorithms and implementations are copyrighted OpenSource
kusano 7d535a
 distributed under the GNU General Public License.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Introduction
kusano 7d535a
 ------------
kusano 7d535a
 LZO is a data compression library which is suitable for data
kusano 7d535a
 de-/compression in real-time. This means it favours speed
kusano 7d535a
 over compression ratio.
kusano 7d535a
kusano 7d535a
 The acronym LZO is standing for Lempel-Ziv-Oberhumer.
kusano 7d535a
kusano 7d535a
 LZO is written in ANSI C. Both the source code and the compressed
kusano 7d535a
 data format are designed to be portable across platforms.
kusano 7d535a
kusano 7d535a
 LZO implements a number of algorithms with the following features:
kusano 7d535a
kusano 7d535a
 - Decompression is simple and *very* fast.
kusano 7d535a
 - Requires no memory for decompression.
kusano 7d535a
 - Compression is pretty fast.
kusano 7d535a
 - Requires 64 kB of memory for compression.
kusano 7d535a
 - Allows you to dial up extra compression at a speed cost in the
kusano 7d535a
   compressor. The speed of the decompressor is not reduced.
kusano 7d535a
 - Includes compression levels for generating pre-compressed
kusano 7d535a
   data which achieve a quite competitive compression ratio.
kusano 7d535a
 - There is also a compression level which needs only 8 kB for compression.
kusano 7d535a
 - Algorithm is thread safe.
kusano 7d535a
 - Algorithm is lossless.
kusano 7d535a
kusano 7d535a
 LZO supports overlapping compression and in-place decompression.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Design criteria
kusano 7d535a
 ---------------
kusano 7d535a
 LZO was designed with speed in mind. Decompressor speed has been
kusano 7d535a
 favoured over compressor speed. Real-time decompression should be
kusano 7d535a
 possible for virtually any application. The implementation of the
kusano 7d535a
 LZO1X decompressor in optimized i386 assembler code runs about at
kusano 7d535a
 the third of the speed of a memcpy() - and even faster for many files.
kusano 7d535a
kusano 7d535a
 In fact I first wrote the decompressor of each algorithm thereby
kusano 7d535a
 defining the compressed data format, verified it with manually
kusano 7d535a
 created test data and at last added the compressor.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Performance
kusano 7d535a
 -----------
kusano 7d535a
 To keep you interested, here is an overview of the average results
kusano 7d535a
 when compressing the Calgary Corpus test suite with a blocksize
kusano 7d535a
 of 256 kB, originally done on an ancient Intel Pentium 133.
kusano 7d535a
kusano 7d535a
 The naming convention of the various algorithms goes LZOxx-N, where N is
kusano 7d535a
 the compression level. Range 1-9 indicates the fast standard levels using
kusano 7d535a
 64 kB memory for compression. Level 99 offers better compression at the
kusano 7d535a
 cost of more memory (256 kB), and is still reasonably fast.
kusano 7d535a
 Level 999 achieves nearly optimal compression - but it is slow
kusano 7d535a
 and uses much memory, and is mainly intended for generating
kusano 7d535a
 pre-compressed data.
kusano 7d535a
kusano 7d535a
 The C version of LZO1X-1 is about 4-5 times faster than the fastest
kusano 7d535a
 zlib compression level, and it also outperforms other algorithms
kusano 7d535a
 like LZRW1-A and LZV in both compression ratio and compression speed
kusano 7d535a
 and decompression speed.
kusano 7d535a
kusano 7d535a
 +------------------------------------------------------------------------+
kusano 7d535a
 | Algorithm        Length  CxB   ComLen  %Remn  Bits   Com K/s   Dec K/s |
kusano 7d535a
 | ---------        ------  ---   ------  -----  ----   -------   ------- |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | memcpy()         224401    1   224401  100.0  8.00  60956.83  59124.58 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1-1           224401    1   117362   53.1  4.25   4665.24  13341.98 |
kusano 7d535a
 | LZO1-99          224401    1   101560   46.7  3.73   1373.29  13823.40 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1A-1          224401    1   115174   51.7  4.14   4937.83  14410.35 |
kusano 7d535a
 | LZO1A-99         224401    1    99958   45.5  3.64   1362.72  14734.17 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1B-1          224401    1   109590   49.6  3.97   4565.53  15438.34 |
kusano 7d535a
 | LZO1B-2          224401    1   106235   48.4  3.88   4297.33  15492.79 |
kusano 7d535a
 | LZO1B-3          224401    1   104395   47.8  3.83   4018.21  15373.52 |
kusano 7d535a
 | LZO1B-4          224401    1   104828   47.4  3.79   3024.48  15100.11 |
kusano 7d535a
 | LZO1B-5          224401    1   102724   46.7  3.73   2827.82  15427.62 |
kusano 7d535a
 | LZO1B-6          224401    1   101210   46.0  3.68   2615.96  15325.68 |
kusano 7d535a
 | LZO1B-7          224401    1   101388   46.0  3.68   2430.89  15361.47 |
kusano 7d535a
 | LZO1B-8          224401    1    99453   45.2  3.62   2183.87  15402.77 |
kusano 7d535a
 | LZO1B-9          224401    1    99118   45.0  3.60   1677.06  15069.60 |
kusano 7d535a
 | LZO1B-99         224401    1    95399   43.6  3.48   1286.87  15656.11 |
kusano 7d535a
 | LZO1B-999        224401    1    83934   39.1  3.13    232.40  16445.05 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1C-1          224401    1   111735   50.4  4.03   4883.08  15570.91 |
kusano 7d535a
 | LZO1C-2          224401    1   108652   49.3  3.94   4424.24  15733.14 |
kusano 7d535a
 | LZO1C-3          224401    1   106810   48.7  3.89   4127.65  15645.69 |
kusano 7d535a
 | LZO1C-4          224401    1   105717   47.7  3.82   3007.92  15346.44 |
kusano 7d535a
 | LZO1C-5          224401    1   103605   47.0  3.76   2829.15  15153.88 |
kusano 7d535a
 | LZO1C-6          224401    1   102585   46.5  3.72   2631.37  15257.58 |
kusano 7d535a
 | LZO1C-7          224401    1   101937   46.2  3.70   2378.57  15492.49 |
kusano 7d535a
 | LZO1C-8          224401    1   100779   45.6  3.65   2171.93  15386.07 |
kusano 7d535a
 | LZO1C-9          224401    1   100255   45.4  3.63   1691.44  15194.68 |
kusano 7d535a
 | LZO1C-99         224401    1    97252   44.1  3.53   1462.88  15341.37 |
kusano 7d535a
 | LZO1C-999        224401    1    87740   40.2  3.21    306.44  16411.94 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1F-1          224401    1   113412   50.8  4.07   4755.97  16074.12 |
kusano 7d535a
 | LZO1F-999        224401    1    89599   40.3  3.23    280.68  16553.90 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1X-1(11)      224401    1   118810   52.6  4.21   4544.42  15879.04 |
kusano 7d535a
 | LZO1X-1(12)      224401    1   113675   50.6  4.05   4411.15  15721.59 |
kusano 7d535a
 | LZO1X-1          224401    1   109323   49.4  3.95   4991.76  15584.89 |
kusano 7d535a
 | LZO1X-1(15)      224401    1   108500   49.1  3.93   5077.50  15744.56 |
kusano 7d535a
 | LZO1X-999        224401    1    82854   38.0  3.04    135.77  16548.48 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1Y-1          224401    1   110820   49.8  3.98   4952.52  15638.82 |
kusano 7d535a
 | LZO1Y-999        224401    1    83614   38.2  3.05    135.07  16385.40 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO1Z-999        224401    1    83034   38.0  3.04    133.31  10553.74 |
kusano 7d535a
 |                                                                        |
kusano 7d535a
 | LZO2A-999        224401    1    87880   40.0  3.20    301.21   8115.75 |
kusano 7d535a
 +------------------------------------------------------------------------+
kusano 7d535a
kusano 7d535a
 Notes:
kusano 7d535a
  - CxB is the number of blocks
kusano 7d535a
  - K/s is the speed measured in 1000 uncompressed bytes per second
kusano 7d535a
  - the assembler decompressors are even faster
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Short documentation
kusano 7d535a
 -------------------
kusano 7d535a
 LZO is a block compression algorithm - it compresses and decompresses
kusano 7d535a
 a block of data. Block size must be the same for compression
kusano 7d535a
 and decompression.
kusano 7d535a
kusano 7d535a
 LZO compresses a block of data into matches (a sliding dictionary)
kusano 7d535a
 and runs of non-matching literals. LZO takes care about long matches
kusano 7d535a
 and long literal runs so that it produces good results on highly
kusano 7d535a
 redundant data and deals acceptably with non-compressible data.
kusano 7d535a
kusano 7d535a
 When dealing with uncompressible data, LZO expands the input
kusano 7d535a
 block by a maximum of 16 bytes per 1024 bytes input.
kusano 7d535a
kusano 7d535a
 I have verified LZO using such tools as valgrind and other memory checkers.
kusano 7d535a
 And in addition to compressing gigabytes of files when tuning some parameters
kusano 7d535a
 I have also consulted various `lint' programs to spot potential portability
kusano 7d535a
 problems. LZO is free of any known bugs.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 The algorithms
kusano 7d535a
 --------------
kusano 7d535a
 There are too many algorithms implemented. But I want to support
kusano 7d535a
 unlimited backward compatibility, so I will not reduce the LZO
kusano 7d535a
 distribution in the future.
kusano 7d535a
kusano 7d535a
 As the many object files are mostly independent of each other, the
kusano 7d535a
 size overhead for an executable statically linked with the LZO library
kusano 7d535a
 is usually pretty low (just a few kB) because the linker will only add
kusano 7d535a
 the modules that you are actually using.
kusano 7d535a
kusano 7d535a
 I first published LZO1 and LZO1A in the Internet newsgroups
kusano 7d535a
 comp.compression and comp.compression.research in March 1996.
kusano 7d535a
 They are mainly included for compatibility reasons. The LZO2A
kusano 7d535a
 decompressor is too slow, and there is no fast compressor anyway.
kusano 7d535a
kusano 7d535a
 My experiments have shown that LZO1B is good with a large blocksize
kusano 7d535a
 or with very redundant data, LZO1F is good with a small blocksize or
kusano 7d535a
 with binary data and that LZO1X is often the best choice of all.
kusano 7d535a
 LZO1Y and LZO1Z are almost identical to LZO1X - they can achieve a
kusano 7d535a
 better compression ratio on some files.
kusano 7d535a
 Beware, your mileage may vary.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Usage of the library
kusano 7d535a
 --------------------
kusano 7d535a
 Despite of its size, the basic usage of LZO is really very simple.
kusano 7d535a
kusano 7d535a
 Let's assume you want to compress some data with LZO1X-1:
kusano 7d535a
   A) compression
kusano 7d535a
      * include <lzo lzo1x.h=""></lzo>
kusano 7d535a
        call lzo_init()
kusano 7d535a
        compress your data with lzo1x_1_compress()
kusano 7d535a
      * link your application with the LZO library
kusano 7d535a
   B) decompression
kusano 7d535a
      * include <lzo lzo1x.h=""></lzo>
kusano 7d535a
        call lzo_init()
kusano 7d535a
        decompress your data with lzo1x_decompress()
kusano 7d535a
      * link your application with the LZO library
kusano 7d535a
kusano 7d535a
 The program examples/simple.c shows a fully working example.
kusano 7d535a
 See also LZO.FAQ for more information.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Building LZO
kusano 7d535a
 ------------
kusano 7d535a
 As LZO uses Autoconf+Automake+Libtool the building process under
kusano 7d535a
 UNIX systems should be very unproblematic. Shared libraries are
kusano 7d535a
 supported on many architectures as well.
kusano 7d535a
 For detailed instructions see the file INSTALL.
kusano 7d535a
kusano 7d535a
 Please note that due to the design of the ELF executable format
kusano 7d535a
 the performance of a shared library on i386 systems (e.g. Linux)
kusano 7d535a
 is a little bit slower, so you may want to link your applications
kusano 7d535a
 with the static version (liblzo2.a) anyway.
kusano 7d535a
kusano 7d535a
 For building under DOS, Win16, Win32, OS/2 and other systems
kusano 7d535a
 take a look at the file B/00readme.txt.
kusano 7d535a
kusano 7d535a
 In case of troubles (like decompression data errors) try recompiling
kusano 7d535a
 everything without optimizations - LZO may break the optimizer
kusano 7d535a
 of your compiler. See the file BUGS.
kusano 7d535a
kusano 7d535a
 LZO is written in ANSI C. In particular this means:
kusano 7d535a
   - your compiler must understand prototypes
kusano 7d535a
   - your compiler must understand prototypes in function pointers
kusano 7d535a
   - your compiler must correctly promote integrals ("value-preserving")
kusano 7d535a
   - your preprocessor must implement #elif, #error and stringizing
kusano 7d535a
   - you must have a conforming and correct <limits.h> header</limits.h>
kusano 7d535a
   - you must have <stddef.h>, <string.h> and other ANSI C headers</string.h></stddef.h>
kusano 7d535a
   - you should have size_t and ptrdiff_t
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Portability
kusano 7d535a
 -----------
kusano 7d535a
 I have built and tested LZO successfully on a variety of platforms
kusano 7d535a
 including DOS (16 + 32 bit), Windows 3.x (16-bit), Win32, Win64,
kusano 7d535a
 Linux, *BSD, HP-UX and many more.
kusano 7d535a
kusano 7d535a
 LZO is also reported to work under AIX, ConvexOS, IRIX, MacOS, PalmOS (Pilot),
kusano 7d535a
 PSX (Sony Playstation), Solaris, SunOS, TOS (Atari ST) and VxWorks.
kusano 7d535a
 Furthermore it is said that its performance on a Cray is superior
kusano 7d535a
 to all other machines...
kusano 7d535a
kusano 7d535a
 And I think it would be much fun to translate the decompressors
kusano 7d535a
 to Z-80 or 6502 assembly.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 The future
kusano 7d535a
 ----------
kusano 7d535a
 Here is what I'm planning for the next months. No promises, though...
kusano 7d535a
kusano 7d535a
 - interfaces to .NET and Mono
kusano 7d535a
 - interfaces to Perl, Java, Python, Delphi, Visual Basic, ...
kusano 7d535a
 - improve documentation and API reference
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Some comments about the source code
kusano 7d535a
 -----------------------------------
kusano 7d535a
 Be warned: the main source code in the `src' directory is a
kusano 7d535a
 real pain to understand as I've experimented with hundreds of slightly
kusano 7d535a
 different versions. It contains many #if and some gotos, and
kusano 7d535a
 is *completely optimized for speed* and not for readability.
kusano 7d535a
 Code sharing of the different algorithms is implemented by stressing
kusano 7d535a
 the preprocessor - this can be really confusing. Lots of marcos and
kusano 7d535a
 assertions don't make things better.
kusano 7d535a
kusano 7d535a
 Nevertheless LZO compiles very quietly on a variety of
kusano 7d535a
 compilers with the highest warning levels turned on, even
kusano 7d535a
 in C++ mode.
kusano 7d535a
kusano 7d535a
kusano 7d535a
 Copyright
kusano 7d535a
 ---------
kusano 7d535a
 LZO is Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
kusano 7d535a
 2005, 2006, 2007, 2008 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
kusano 7d535a
 LZO is distributed under the terms of the GNU General Public License (GPL).
kusano 7d535a
 See the file COPYING.
kusano 7d535a
kusano 7d535a
 Special licenses for commercial and other applications which
kusano 7d535a
 are not willing to accept the GNU General Public License
kusano 7d535a
 are available by contacting the author.
kusano 7d535a
kusano 7d535a
kusano 7d535a