mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-24 06:35:42 +00:00
112 lines
3.1 KiB
C
112 lines
3.1 KiB
C
/* Lzma86.h -- LZMA + x86 (BCJ) Filter
|
|
2013-01-18 : Igor Pavlov : Public domain */
|
|
|
|
#ifndef __LZMA86_H
|
|
#define __LZMA86_H
|
|
|
|
#include "7zTypes.h"
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
#define LZMA86_SIZE_OFFSET (1 + 5)
|
|
#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8)
|
|
|
|
/*
|
|
It's an example for LZMA + x86 Filter use.
|
|
You can use .lzma86 extension, if you write that stream to file.
|
|
.lzma86 header adds one additional byte to standard .lzma header.
|
|
.lzma86 header (14 bytes):
|
|
Offset Size Description
|
|
0 1 = 0 - no filter, pure LZMA
|
|
= 1 - x86 filter + LZMA
|
|
1 1 lc, lp and pb in encoded form
|
|
2 4 dictSize (little endian)
|
|
6 8 uncompressed size (little endian)
|
|
|
|
|
|
Lzma86_Encode
|
|
-------------
|
|
level - compression level: 0 <= level <= 9, the default value for "level" is 5.
|
|
|
|
dictSize - The dictionary size in bytes. The maximum value is
|
|
128 MB = (1 << 27) bytes for 32-bit version
|
|
1 GB = (1 << 30) bytes for 64-bit version
|
|
The default value is 16 MB = (1 << 24) bytes, for level = 5.
|
|
It's recommended to use the dictionary that is larger than 4 KB and
|
|
that can be calculated as (1 << N) or (3 << N) sizes.
|
|
For better compression ratio dictSize must be >= inSize.
|
|
|
|
filterMode:
|
|
SZ_FILTER_NO - no Filter
|
|
SZ_FILTER_YES - x86 Filter
|
|
SZ_FILTER_AUTO - it tries both alternatives to select best.
|
|
Encoder will use 2 or 3 passes:
|
|
2 passes when FILTER_NO provides better compression.
|
|
3 passes when FILTER_YES provides better compression.
|
|
|
|
Lzma86Encode allocates Data with MyAlloc functions.
|
|
RAM Requirements for compressing:
|
|
RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize
|
|
filterMode FilterBlockSize
|
|
SZ_FILTER_NO 0
|
|
SZ_FILTER_YES inSize
|
|
SZ_FILTER_AUTO inSize
|
|
|
|
|
|
Return code:
|
|
SZ_OK - OK
|
|
SZ_ERROR_MEM - Memory allocation error
|
|
SZ_ERROR_PARAM - Incorrect paramater
|
|
SZ_ERROR_OUTPUT_EOF - output buffer overflow
|
|
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
|
|
*/
|
|
|
|
enum ESzFilterMode
|
|
{
|
|
SZ_FILTER_NO,
|
|
SZ_FILTER_YES,
|
|
SZ_FILTER_AUTO
|
|
};
|
|
|
|
SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen,
|
|
int level, UInt32 dictSize, int filterMode);
|
|
|
|
|
|
/*
|
|
Lzma86_GetUnpackSize:
|
|
In:
|
|
src - input data
|
|
srcLen - input data size
|
|
Out:
|
|
unpackSize - size of uncompressed stream
|
|
Return code:
|
|
SZ_OK - OK
|
|
SZ_ERROR_INPUT_EOF - Error in headers
|
|
*/
|
|
|
|
SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize);
|
|
|
|
/*
|
|
Lzma86_Decode:
|
|
In:
|
|
dest - output data
|
|
destLen - output data size
|
|
src - input data
|
|
srcLen - input data size
|
|
Out:
|
|
destLen - processed output size
|
|
srcLen - processed input size
|
|
Return code:
|
|
SZ_OK - OK
|
|
SZ_ERROR_DATA - Data error
|
|
SZ_ERROR_MEM - Memory allocation error
|
|
SZ_ERROR_UNSUPPORTED - unsupported file
|
|
SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer
|
|
*/
|
|
|
|
SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen);
|
|
|
|
EXTERN_C_END
|
|
|
|
#endif
|