xref: /aosp_15_r20/external/lz4/examples/blockStreaming_doubleBuffer.md (revision 27162e4e17433d5aa7cb38e7b6a433a09405fc7f)
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