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