1*27162e4eSAndroid Build Coastguard Worker# LZ4 API Example : Dictionary Random Access 2*27162e4eSAndroid Build Coastguard Worker 3*27162e4eSAndroid Build Coastguard Worker`dictionaryRandomAccess.c` is LZ4 API example which implements dictionary compression and random access decompression. 4*27162e4eSAndroid Build Coastguard Worker 5*27162e4eSAndroid Build Coastguard WorkerPlease note that the output file is not compatible with lz4frame and is platform dependent. 6*27162e4eSAndroid Build Coastguard Worker 7*27162e4eSAndroid Build Coastguard Worker 8*27162e4eSAndroid Build Coastguard Worker## What's the point of this example ? 9*27162e4eSAndroid Build Coastguard Worker 10*27162e4eSAndroid Build Coastguard Worker - Dictionary based compression for homogeneous files. 11*27162e4eSAndroid Build Coastguard Worker - Random access to compressed blocks. 12*27162e4eSAndroid Build Coastguard Worker 13*27162e4eSAndroid Build Coastguard Worker 14*27162e4eSAndroid Build Coastguard Worker## How the compression works 15*27162e4eSAndroid Build Coastguard Worker 16*27162e4eSAndroid Build Coastguard WorkerReads the dictionary from a file, and uses it as the history for each block. 17*27162e4eSAndroid Build Coastguard WorkerThis allows each block to be independent, but maintains compression ratio. 18*27162e4eSAndroid Build Coastguard Worker 19*27162e4eSAndroid Build Coastguard Worker``` 20*27162e4eSAndroid Build Coastguard Worker Dictionary 21*27162e4eSAndroid Build Coastguard Worker + 22*27162e4eSAndroid Build Coastguard Worker | 23*27162e4eSAndroid Build Coastguard Worker v 24*27162e4eSAndroid Build Coastguard Worker +---------+ 25*27162e4eSAndroid Build Coastguard Worker | Block#1 | 26*27162e4eSAndroid Build Coastguard Worker +----+----+ 27*27162e4eSAndroid Build Coastguard Worker | 28*27162e4eSAndroid Build Coastguard Worker v 29*27162e4eSAndroid Build Coastguard Worker {Out#1} 30*27162e4eSAndroid Build Coastguard Worker 31*27162e4eSAndroid Build Coastguard Worker 32*27162e4eSAndroid Build Coastguard Worker Dictionary 33*27162e4eSAndroid Build Coastguard Worker + 34*27162e4eSAndroid Build Coastguard Worker | 35*27162e4eSAndroid Build Coastguard Worker v 36*27162e4eSAndroid Build Coastguard Worker +---------+ 37*27162e4eSAndroid Build Coastguard Worker | Block#2 | 38*27162e4eSAndroid Build Coastguard Worker +----+----+ 39*27162e4eSAndroid Build Coastguard Worker | 40*27162e4eSAndroid Build Coastguard Worker v 41*27162e4eSAndroid Build Coastguard Worker {Out#2} 42*27162e4eSAndroid Build Coastguard Worker``` 43*27162e4eSAndroid Build Coastguard Worker 44*27162e4eSAndroid Build Coastguard WorkerAfter writing the magic bytes `TEST` and then the compressed blocks, write out the jump table. 45*27162e4eSAndroid Build Coastguard WorkerThe last 4 bytes is an integer containing the number of blocks in the stream. 46*27162e4eSAndroid Build Coastguard WorkerIf there are `N` blocks, then just before the last 4 bytes is `N + 1` 4 byte integers containing the offsets at the beginning and end of each block. 47*27162e4eSAndroid Build Coastguard WorkerLet `Offset#K` be the total number of bytes written after writing out `Block#K` *including* the magic bytes for simplicity. 48*27162e4eSAndroid Build Coastguard Worker 49*27162e4eSAndroid Build Coastguard Worker``` 50*27162e4eSAndroid Build Coastguard Worker+------+---------+ +---------+---+----------+ +----------+-----+ 51*27162e4eSAndroid Build Coastguard Worker| TEST | Block#1 | ... | Block#N | 4 | Offset#1 | ... | Offset#N | N+1 | 52*27162e4eSAndroid Build Coastguard Worker+------+---------+ +---------+---+----------+ +----------+-----+ 53*27162e4eSAndroid Build Coastguard Worker``` 54*27162e4eSAndroid Build Coastguard Worker 55*27162e4eSAndroid Build Coastguard Worker## How the decompression works 56*27162e4eSAndroid Build Coastguard Worker 57*27162e4eSAndroid Build Coastguard WorkerDecompression will do reverse order. 58*27162e4eSAndroid Build Coastguard Worker 59*27162e4eSAndroid Build Coastguard Worker - Seek to the last 4 bytes of the file and read the number of offsets. 60*27162e4eSAndroid Build Coastguard Worker - Read each offset into an array. 61*27162e4eSAndroid Build Coastguard Worker - Seek to the first block containing data we want to read. 62*27162e4eSAndroid Build Coastguard Worker We know where to look because we know each block contains a fixed amount of uncompressed data, except possibly the last. 63*27162e4eSAndroid Build Coastguard Worker - Decompress it and write what data we need from it to the file. 64*27162e4eSAndroid Build Coastguard Worker - Read the next block. 65*27162e4eSAndroid Build Coastguard Worker - Decompress it and write that page to the file. 66*27162e4eSAndroid Build Coastguard Worker 67*27162e4eSAndroid Build Coastguard WorkerContinue these procedures until all the required data has been read. 68