xref: /aosp_15_r20/external/lz4/examples/streaming_api_basics.md (revision 27162e4e17433d5aa7cb38e7b6a433a09405fc7f)
1*27162e4eSAndroid Build Coastguard Worker# LZ4 Streaming API Basics
2*27162e4eSAndroid Build Coastguard Workerby *Takayuki Matsuoka*
3*27162e4eSAndroid Build Coastguard Worker## LZ4 API sets
4*27162e4eSAndroid Build Coastguard Worker
5*27162e4eSAndroid Build Coastguard WorkerLZ4 has the following API sets :
6*27162e4eSAndroid Build Coastguard Worker
7*27162e4eSAndroid Build Coastguard Worker - "Auto Framing" API (lz4frame.h) :
8*27162e4eSAndroid Build Coastguard Worker   This is most recommended API for usual application.
9*27162e4eSAndroid Build Coastguard Worker   It guarantees interoperability with other LZ4 framing format compliant tools/libraries
10*27162e4eSAndroid Build Coastguard Worker   such as LZ4 command line utility, node-lz4, etc.
11*27162e4eSAndroid Build Coastguard Worker - "Block" API : This is recommended for simple purpose.
12*27162e4eSAndroid Build Coastguard Worker   It compresses single raw memory block to LZ4 memory block and vice versa.
13*27162e4eSAndroid Build Coastguard Worker - "Streaming" API : This is designed for complex things.
14*27162e4eSAndroid Build Coastguard Worker   For example, compress huge stream data in restricted memory environment.
15*27162e4eSAndroid Build Coastguard Worker
16*27162e4eSAndroid Build Coastguard WorkerBasically, you should use "Auto Framing" API.
17*27162e4eSAndroid Build Coastguard WorkerBut if you want to write advanced application, it's time to use Block or Streaming APIs.
18*27162e4eSAndroid Build Coastguard Worker
19*27162e4eSAndroid Build Coastguard Worker
20*27162e4eSAndroid Build Coastguard Worker## What is difference between Block and Streaming API ?
21*27162e4eSAndroid Build Coastguard Worker
22*27162e4eSAndroid Build Coastguard WorkerBlock API (de)compresses a single contiguous memory block.
23*27162e4eSAndroid Build Coastguard WorkerIn other words, LZ4 library finds redundancy from a single contiguous memory block.
24*27162e4eSAndroid Build Coastguard WorkerStreaming API does same thing but (de)compresses multiple adjacent contiguous memory blocks.
25*27162e4eSAndroid Build Coastguard WorkerSo Streaming API could find more redundancy than Block API.
26*27162e4eSAndroid Build Coastguard Worker
27*27162e4eSAndroid Build Coastguard WorkerThe following figure shows difference between API and block sizes.
28*27162e4eSAndroid Build Coastguard WorkerIn these figures, the original data is split into 4KiBytes contiguous chunks.
29*27162e4eSAndroid Build Coastguard Worker
30*27162e4eSAndroid Build Coastguard Worker```
31*27162e4eSAndroid Build Coastguard WorkerOriginal Data
32*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
33*27162e4eSAndroid Build Coastguard Worker    | 4KiB Chunk A  | 4KiB Chunk B  | C  | D  |... |
34*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
35*27162e4eSAndroid Build Coastguard Worker
36*27162e4eSAndroid Build Coastguard WorkerExample (1) : Block API, 4KiB Block
37*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
38*27162e4eSAndroid Build Coastguard Worker    | 4KiB Chunk A  | 4KiB Chunk B  | C  | D  |... |
39*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
40*27162e4eSAndroid Build Coastguard Worker    | Block #1      | Block #2      | #3 | #4 |... |
41*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
42*27162e4eSAndroid Build Coastguard Worker
43*27162e4eSAndroid Build Coastguard Worker                    (No Dependency)
44*27162e4eSAndroid Build Coastguard Worker
45*27162e4eSAndroid Build Coastguard Worker
46*27162e4eSAndroid Build Coastguard WorkerExample (2) : Block API, 8KiB Block
47*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
48*27162e4eSAndroid Build Coastguard Worker    | 4KiB Chunk A  | 4KiB Chunk B  | C  | D  |... |
49*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+----+----+----+
50*27162e4eSAndroid Build Coastguard Worker    |            Block #1           |Block #2 |... |
51*27162e4eSAndroid Build Coastguard Worker    +--------------------+----------+-------+-+----+
52*27162e4eSAndroid Build Coastguard Worker          ^              |             ^    |
53*27162e4eSAndroid Build Coastguard Worker          |              |             |    |
54*27162e4eSAndroid Build Coastguard Worker          +--------------+             +----+
55*27162e4eSAndroid Build Coastguard Worker          Internal Dependency          Internal Dependency
56*27162e4eSAndroid Build Coastguard Worker
57*27162e4eSAndroid Build Coastguard Worker
58*27162e4eSAndroid Build Coastguard WorkerExample (3) : Streaming API, 4KiB Block
59*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+-----+----+----+
60*27162e4eSAndroid Build Coastguard Worker    | 4KiB Chunk A  | 4KiB Chunk B  | C   | D  |... |
61*27162e4eSAndroid Build Coastguard Worker    +---------------+---------------+-----+----+----+
62*27162e4eSAndroid Build Coastguard Worker    | Block #1      | Block #2      | #3  | #4 |... |
63*27162e4eSAndroid Build Coastguard Worker    +---------------+----+----------+-+---+-+--+----+
64*27162e4eSAndroid Build Coastguard Worker          ^              |   ^        | ^   |
65*27162e4eSAndroid Build Coastguard Worker          |              |   |        | |   |
66*27162e4eSAndroid Build Coastguard Worker          +--------------+   +--------+ +---+
67*27162e4eSAndroid Build Coastguard Worker          Dependency         Dependency Dependency
68*27162e4eSAndroid Build Coastguard Worker```
69*27162e4eSAndroid Build Coastguard Worker
70*27162e4eSAndroid Build Coastguard Worker - In example (1), there is no dependency.
71*27162e4eSAndroid Build Coastguard Worker   All blocks are compressed independently.
72*27162e4eSAndroid Build Coastguard Worker - In example (2), naturally 8KiBytes block has internal dependency.
73*27162e4eSAndroid Build Coastguard Worker   But still block #1 and #2 are compressed independently.
74*27162e4eSAndroid Build Coastguard Worker - In example (3), block #2 has dependency to #1,
75*27162e4eSAndroid Build Coastguard Worker   also #3 has dependency to #2 and #1, #4 has #3, #2 and #1, and so on.
76*27162e4eSAndroid Build Coastguard Worker
77*27162e4eSAndroid Build Coastguard WorkerHere, we can observe difference between example (2) and (3).
78*27162e4eSAndroid Build Coastguard WorkerIn (2), there's no dependency between chunk B and C, but (3) has dependency between B and C.
79*27162e4eSAndroid Build Coastguard WorkerThis dependency improves compression ratio.
80*27162e4eSAndroid Build Coastguard Worker
81*27162e4eSAndroid Build Coastguard Worker
82*27162e4eSAndroid Build Coastguard Worker## Restriction of Streaming API
83*27162e4eSAndroid Build Coastguard Worker
84*27162e4eSAndroid Build Coastguard WorkerFor efficiency, Streaming API doesn't keep a mirror copy of dependent (de)compressed memory.
85*27162e4eSAndroid Build Coastguard WorkerThis means users should keep these dependent (de)compressed memory explicitly.
86*27162e4eSAndroid Build Coastguard WorkerUsually, "Dependent memory" is previous adjacent contiguous memory up to 64KiBytes.
87*27162e4eSAndroid Build Coastguard WorkerLZ4 will not access further memories.
88