1*27162e4eSAndroid Build Coastguard Worker# LZ4 Streaming API Example : Double Buffer 2*27162e4eSAndroid Build Coastguard Workerby *Takayuki Matsuoka* 3*27162e4eSAndroid Build Coastguard Worker 4*27162e4eSAndroid Build Coastguard Worker`blockStreaming_doubleBuffer.c` is LZ4 Streaming API example which implements double buffer (de)compression. 5*27162e4eSAndroid Build Coastguard Worker 6*27162e4eSAndroid Build Coastguard WorkerPlease note : 7*27162e4eSAndroid Build Coastguard Worker 8*27162e4eSAndroid Build Coastguard Worker - Firstly, read "LZ4 Streaming API Basics". 9*27162e4eSAndroid Build Coastguard Worker - This is relatively advanced application example. 10*27162e4eSAndroid Build Coastguard Worker - Output file is not compatible with lz4frame and platform dependent. 11*27162e4eSAndroid Build Coastguard Worker 12*27162e4eSAndroid Build Coastguard Worker 13*27162e4eSAndroid Build Coastguard Worker## What's the point of this example ? 14*27162e4eSAndroid Build Coastguard Worker 15*27162e4eSAndroid Build Coastguard Worker - Handle huge file in small amount of memory 16*27162e4eSAndroid Build Coastguard Worker - Always better compression ratio than Block API 17*27162e4eSAndroid Build Coastguard Worker - Uniform block size 18*27162e4eSAndroid Build Coastguard Worker 19*27162e4eSAndroid Build Coastguard Worker 20*27162e4eSAndroid Build Coastguard Worker## How the compression works 21*27162e4eSAndroid Build Coastguard Worker 22*27162e4eSAndroid Build Coastguard WorkerFirst of all, allocate "Double Buffer" for input and LZ4 compressed data buffer for output. 23*27162e4eSAndroid Build Coastguard WorkerDouble buffer has two pages, "first" page (Page#1) and "second" page (Page#2). 24*27162e4eSAndroid Build Coastguard Worker 25*27162e4eSAndroid Build Coastguard Worker``` 26*27162e4eSAndroid Build Coastguard Worker Double Buffer 27*27162e4eSAndroid Build Coastguard Worker 28*27162e4eSAndroid Build Coastguard Worker Page#1 Page#2 29*27162e4eSAndroid Build Coastguard Worker +---------+---------+ 30*27162e4eSAndroid Build Coastguard Worker | Block#1 | | 31*27162e4eSAndroid Build Coastguard Worker +----+----+---------+ 32*27162e4eSAndroid Build Coastguard Worker | 33*27162e4eSAndroid Build Coastguard Worker v 34*27162e4eSAndroid Build Coastguard Worker {Out#1} 35*27162e4eSAndroid Build Coastguard Worker 36*27162e4eSAndroid Build Coastguard Worker 37*27162e4eSAndroid Build Coastguard Worker Prefix Dependency 38*27162e4eSAndroid Build Coastguard Worker +---------+ 39*27162e4eSAndroid Build Coastguard Worker | | 40*27162e4eSAndroid Build Coastguard Worker v | 41*27162e4eSAndroid Build Coastguard Worker +---------+----+----+ 42*27162e4eSAndroid Build Coastguard Worker | Block#1 | Block#2 | 43*27162e4eSAndroid Build Coastguard Worker +---------+----+----+ 44*27162e4eSAndroid Build Coastguard Worker | 45*27162e4eSAndroid Build Coastguard Worker v 46*27162e4eSAndroid Build Coastguard Worker {Out#2} 47*27162e4eSAndroid Build Coastguard Worker 48*27162e4eSAndroid Build Coastguard Worker 49*27162e4eSAndroid Build Coastguard Worker External Dictionary Mode 50*27162e4eSAndroid Build Coastguard Worker +---------+ 51*27162e4eSAndroid Build Coastguard Worker | | 52*27162e4eSAndroid Build Coastguard Worker | v 53*27162e4eSAndroid Build Coastguard Worker +----+----+---------+ 54*27162e4eSAndroid Build Coastguard Worker | Block#3 | Block#2 | 55*27162e4eSAndroid Build Coastguard Worker +----+----+---------+ 56*27162e4eSAndroid Build Coastguard Worker | 57*27162e4eSAndroid Build Coastguard Worker v 58*27162e4eSAndroid Build Coastguard Worker {Out#3} 59*27162e4eSAndroid Build Coastguard Worker 60*27162e4eSAndroid Build Coastguard Worker 61*27162e4eSAndroid Build Coastguard Worker Prefix Dependency 62*27162e4eSAndroid Build Coastguard Worker +---------+ 63*27162e4eSAndroid Build Coastguard Worker | | 64*27162e4eSAndroid Build Coastguard Worker v | 65*27162e4eSAndroid Build Coastguard Worker +---------+----+----+ 66*27162e4eSAndroid Build Coastguard Worker | Block#3 | Block#4 | 67*27162e4eSAndroid Build Coastguard Worker +---------+----+----+ 68*27162e4eSAndroid Build Coastguard Worker | 69*27162e4eSAndroid Build Coastguard Worker v 70*27162e4eSAndroid Build Coastguard Worker {Out#4} 71*27162e4eSAndroid Build Coastguard Worker``` 72*27162e4eSAndroid Build Coastguard Worker 73*27162e4eSAndroid Build Coastguard WorkerNext, read first block to double buffer's first page. And compress it by `LZ4_compress_continue()`. 74*27162e4eSAndroid Build Coastguard WorkerFor the first time, LZ4 doesn't know any previous dependencies, 75*27162e4eSAndroid Build Coastguard Workerso it just compress the line without dependencies and generates compressed block {Out#1} to LZ4 compressed data buffer. 76*27162e4eSAndroid Build Coastguard WorkerAfter that, write {Out#1} to the file. 77*27162e4eSAndroid Build Coastguard Worker 78*27162e4eSAndroid Build Coastguard WorkerNext, read second block to double buffer's second page. And compress it. 79*27162e4eSAndroid Build Coastguard WorkerThis time, LZ4 can use dependency to Block#1 to improve compression ratio. 80*27162e4eSAndroid Build Coastguard WorkerThis dependency is called "Prefix mode". 81*27162e4eSAndroid Build Coastguard Worker 82*27162e4eSAndroid Build Coastguard WorkerNext, read third block to double buffer's *first* page, and compress it. 83*27162e4eSAndroid Build Coastguard WorkerAlso this time, LZ4 can use dependency to Block#2. 84*27162e4eSAndroid Build Coastguard WorkerThis dependency is called "External Dictonaly mode". 85*27162e4eSAndroid Build Coastguard Worker 86*27162e4eSAndroid Build Coastguard WorkerContinue these procedure to the end of the file. 87*27162e4eSAndroid Build Coastguard Worker 88*27162e4eSAndroid Build Coastguard Worker 89*27162e4eSAndroid Build Coastguard Worker## How the decompression works 90*27162e4eSAndroid Build Coastguard Worker 91*27162e4eSAndroid Build Coastguard WorkerDecompression will do reverse order. 92*27162e4eSAndroid Build Coastguard Worker 93*27162e4eSAndroid Build Coastguard Worker - Read first compressed block. 94*27162e4eSAndroid Build Coastguard Worker - Decompress it to the first page and write that page to the file. 95*27162e4eSAndroid Build Coastguard Worker - Read second compressed block. 96*27162e4eSAndroid Build Coastguard Worker - Decompress it to the second page and write that page to the file. 97*27162e4eSAndroid Build Coastguard Worker - Read third compressed block. 98*27162e4eSAndroid Build Coastguard Worker - Decompress it to the *first* page and write that page to the file. 99*27162e4eSAndroid Build Coastguard Worker 100*27162e4eSAndroid Build Coastguard WorkerContinue these procedure to the end of the compressed file. 101