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