1 | /* Lzma86.h -- LZMA + x86 (BCJ) Filter |
2 | 2009-08-14 : Igor Pavlov : Public domain */ |
3 | |
4 | #ifndef __LZMA86_H |
5 | #define __LZMA86_H |
6 | |
7 | #include "Types.h" |
8 | |
9 | EXTERN_C_BEGIN |
10 | |
11 | #define LZMA86_SIZE_OFFSET (1 + 5) |
12 | #define (LZMA86_SIZE_OFFSET + 8) |
13 | |
14 | /* |
15 | It's an example for LZMA + x86 Filter use. |
16 | You can use .lzma86 extension, if you write that stream to file. |
17 | .lzma86 header adds one additional byte to standard .lzma header. |
18 | .lzma86 header (14 bytes): |
19 | Offset Size Description |
20 | 0 1 = 0 - no filter, pure LZMA |
21 | = 1 - x86 filter + LZMA |
22 | 1 1 lc, lp and pb in encoded form |
23 | 2 4 dictSize (little endian) |
24 | 6 8 uncompressed size (little endian) |
25 | |
26 | |
27 | Lzma86_Encode |
28 | ------------- |
29 | level - compression level: 0 <= level <= 9, the default value for "level" is 5. |
30 | |
31 | dictSize - The dictionary size in bytes. The maximum value is |
32 | 128 MB = (1 << 27) bytes for 32-bit version |
33 | 1 GB = (1 << 30) bytes for 64-bit version |
34 | The default value is 16 MB = (1 << 24) bytes, for level = 5. |
35 | It's recommended to use the dictionary that is larger than 4 KB and |
36 | that can be calculated as (1 << N) or (3 << N) sizes. |
37 | For better compression ratio dictSize must be >= inSize. |
38 | |
39 | filterMode: |
40 | SZ_FILTER_NO - no Filter |
41 | SZ_FILTER_YES - x86 Filter |
42 | SZ_FILTER_AUTO - it tries both alternatives to select best. |
43 | Encoder will use 2 or 3 passes: |
44 | 2 passes when FILTER_NO provides better compression. |
45 | 3 passes when FILTER_YES provides better compression. |
46 | |
47 | Lzma86Encode allocates Data with MyAlloc functions. |
48 | RAM Requirements for compressing: |
49 | RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize |
50 | filterMode FilterBlockSize |
51 | SZ_FILTER_NO 0 |
52 | SZ_FILTER_YES inSize |
53 | SZ_FILTER_AUTO inSize |
54 | |
55 | |
56 | Return code: |
57 | SZ_OK - OK |
58 | SZ_ERROR_MEM - Memory allocation error |
59 | SZ_ERROR_PARAM - Incorrect paramater |
60 | SZ_ERROR_OUTPUT_EOF - output buffer overflow |
61 | SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) |
62 | */ |
63 | |
64 | enum ESzFilterMode |
65 | { |
66 | SZ_FILTER_NO, |
67 | SZ_FILTER_YES, |
68 | SZ_FILTER_AUTO |
69 | }; |
70 | |
71 | SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, |
72 | int level, UInt32 dictSize, int filterMode); |
73 | |
74 | |
75 | /* |
76 | Lzma86_GetUnpackSize: |
77 | In: |
78 | src - input data |
79 | srcLen - input data size |
80 | Out: |
81 | unpackSize - size of uncompressed stream |
82 | Return code: |
83 | SZ_OK - OK |
84 | SZ_ERROR_INPUT_EOF - Error in headers |
85 | */ |
86 | |
87 | SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); |
88 | |
89 | /* |
90 | Lzma86_Decode: |
91 | In: |
92 | dest - output data |
93 | destLen - output data size |
94 | src - input data |
95 | srcLen - input data size |
96 | Out: |
97 | destLen - processed output size |
98 | srcLen - processed input size |
99 | Return code: |
100 | SZ_OK - OK |
101 | SZ_ERROR_DATA - Data error |
102 | SZ_ERROR_MEM - Memory allocation error |
103 | SZ_ERROR_UNSUPPORTED - unsupported file |
104 | SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer |
105 | */ |
106 | |
107 | SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); |
108 | |
109 | EXTERN_C_END |
110 | |
111 | #endif |
112 | |