xref: /rk3399_rockchip-uboot/lib/lzma/LzmaDec.h (revision 96764df1b47ddebfb50fadf5af72530b07b5fc89)
178acc472SPeter Tyser /* LzmaDec.h -- LZMA Decoder
2*5fe8380dSStefan Reinauer 2009-02-07 : Igor Pavlov : Public domain */
378acc472SPeter Tyser 
4*5fe8380dSStefan Reinauer #ifndef __LZMA_DEC_H
5*5fe8380dSStefan Reinauer #define __LZMA_DEC_H
678acc472SPeter Tyser 
778acc472SPeter Tyser #include "Types.h"
878acc472SPeter Tyser 
978acc472SPeter Tyser /* #define _LZMA_PROB32 */
1078acc472SPeter Tyser /* _LZMA_PROB32 can increase the speed on some CPUs,
1178acc472SPeter Tyser    but memory usage for CLzmaDec::probs will be doubled in that case */
1278acc472SPeter Tyser 
1378acc472SPeter Tyser #ifdef _LZMA_PROB32
1478acc472SPeter Tyser #define CLzmaProb UInt32
1578acc472SPeter Tyser #else
1678acc472SPeter Tyser #define CLzmaProb UInt16
1778acc472SPeter Tyser #endif
1878acc472SPeter Tyser 
1978acc472SPeter Tyser 
2078acc472SPeter Tyser /* ---------- LZMA Properties ---------- */
2178acc472SPeter Tyser 
2278acc472SPeter Tyser #define LZMA_PROPS_SIZE 5
2378acc472SPeter Tyser 
2478acc472SPeter Tyser typedef struct _CLzmaProps
2578acc472SPeter Tyser {
2678acc472SPeter Tyser   unsigned lc, lp, pb;
2778acc472SPeter Tyser   UInt32 dicSize;
2878acc472SPeter Tyser } CLzmaProps;
2978acc472SPeter Tyser 
3078acc472SPeter Tyser /* LzmaProps_Decode - decodes properties
3178acc472SPeter Tyser Returns:
3278acc472SPeter Tyser   SZ_OK
3378acc472SPeter Tyser   SZ_ERROR_UNSUPPORTED - Unsupported properties
3478acc472SPeter Tyser */
3578acc472SPeter Tyser 
3678acc472SPeter Tyser SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
3778acc472SPeter Tyser 
3878acc472SPeter Tyser 
3978acc472SPeter Tyser /* ---------- LZMA Decoder state ---------- */
4078acc472SPeter Tyser 
4178acc472SPeter Tyser /* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
4278acc472SPeter Tyser    Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
4378acc472SPeter Tyser 
4478acc472SPeter Tyser #define LZMA_REQUIRED_INPUT_MAX 20
4578acc472SPeter Tyser 
4678acc472SPeter Tyser typedef struct
4778acc472SPeter Tyser {
4878acc472SPeter Tyser   CLzmaProps prop;
4978acc472SPeter Tyser   CLzmaProb *probs;
5078acc472SPeter Tyser   Byte *dic;
5178acc472SPeter Tyser   const Byte *buf;
5278acc472SPeter Tyser   UInt32 range, code;
5378acc472SPeter Tyser   SizeT dicPos;
5478acc472SPeter Tyser   SizeT dicBufSize;
5578acc472SPeter Tyser   UInt32 processedPos;
5678acc472SPeter Tyser   UInt32 checkDicSize;
5778acc472SPeter Tyser   unsigned state;
5878acc472SPeter Tyser   UInt32 reps[4];
5978acc472SPeter Tyser   unsigned remainLen;
6078acc472SPeter Tyser   int needFlush;
6178acc472SPeter Tyser   int needInitState;
6278acc472SPeter Tyser   UInt32 numProbs;
6378acc472SPeter Tyser   unsigned tempBufSize;
6478acc472SPeter Tyser   Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
6578acc472SPeter Tyser } CLzmaDec;
6678acc472SPeter Tyser 
6778acc472SPeter Tyser #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
6878acc472SPeter Tyser 
6978acc472SPeter Tyser void LzmaDec_Init(CLzmaDec *p);
7078acc472SPeter Tyser 
7178acc472SPeter Tyser /* There are two types of LZMA streams:
7278acc472SPeter Tyser      0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
7378acc472SPeter Tyser      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
7478acc472SPeter Tyser 
7578acc472SPeter Tyser typedef enum
7678acc472SPeter Tyser {
7778acc472SPeter Tyser   LZMA_FINISH_ANY,   /* finish at any point */
7878acc472SPeter Tyser   LZMA_FINISH_END    /* block must be finished at the end */
7978acc472SPeter Tyser } ELzmaFinishMode;
8078acc472SPeter Tyser 
8178acc472SPeter Tyser /* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
8278acc472SPeter Tyser 
8378acc472SPeter Tyser    You must use LZMA_FINISH_END, when you know that current output buffer
8478acc472SPeter Tyser    covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
8578acc472SPeter Tyser 
8678acc472SPeter Tyser    If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
8778acc472SPeter Tyser    and output value of destLen will be less than output buffer size limit.
8878acc472SPeter Tyser    You can check status result also.
8978acc472SPeter Tyser 
9078acc472SPeter Tyser    You can use multiple checks to test data integrity after full decompression:
9178acc472SPeter Tyser      1) Check Result and "status" variable.
9278acc472SPeter Tyser      2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
9378acc472SPeter Tyser      3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
9478acc472SPeter Tyser         You must use correct finish mode in that case. */
9578acc472SPeter Tyser 
9678acc472SPeter Tyser typedef enum
9778acc472SPeter Tyser {
9878acc472SPeter Tyser   LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
9978acc472SPeter Tyser   LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
10078acc472SPeter Tyser   LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
10178acc472SPeter Tyser   LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
10278acc472SPeter Tyser   LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
10378acc472SPeter Tyser } ELzmaStatus;
10478acc472SPeter Tyser 
10578acc472SPeter Tyser /* ELzmaStatus is used only as output value for function call */
10678acc472SPeter Tyser 
10778acc472SPeter Tyser 
10878acc472SPeter Tyser /* ---------- Interfaces ---------- */
10978acc472SPeter Tyser 
11078acc472SPeter Tyser /* There are 3 levels of interfaces:
11178acc472SPeter Tyser      1) Dictionary Interface
11278acc472SPeter Tyser      2) Buffer Interface
11378acc472SPeter Tyser      3) One Call Interface
11478acc472SPeter Tyser    You can select any of these interfaces, but don't mix functions from different
11578acc472SPeter Tyser    groups for same object. */
11678acc472SPeter Tyser 
11778acc472SPeter Tyser 
11878acc472SPeter Tyser /* There are two variants to allocate state for Dictionary Interface:
11978acc472SPeter Tyser      1) LzmaDec_Allocate / LzmaDec_Free
12078acc472SPeter Tyser      2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
12178acc472SPeter Tyser    You can use variant 2, if you set dictionary buffer manually.
12278acc472SPeter Tyser    For Buffer Interface you must always use variant 1.
12378acc472SPeter Tyser 
12478acc472SPeter Tyser LzmaDec_Allocate* can return:
12578acc472SPeter Tyser   SZ_OK
12678acc472SPeter Tyser   SZ_ERROR_MEM         - Memory allocation error
12778acc472SPeter Tyser   SZ_ERROR_UNSUPPORTED - Unsupported properties
12878acc472SPeter Tyser */
12978acc472SPeter Tyser 
13078acc472SPeter Tyser SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
13178acc472SPeter Tyser void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
13278acc472SPeter Tyser 
13378acc472SPeter Tyser SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
13478acc472SPeter Tyser void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
13578acc472SPeter Tyser 
13678acc472SPeter Tyser /* ---------- Dictionary Interface ---------- */
13778acc472SPeter Tyser 
13878acc472SPeter Tyser /* You can use it, if you want to eliminate the overhead for data copying from
13978acc472SPeter Tyser    dictionary to some other external buffer.
14078acc472SPeter Tyser    You must work with CLzmaDec variables directly in this interface.
14178acc472SPeter Tyser 
14278acc472SPeter Tyser    STEPS:
14378acc472SPeter Tyser      LzmaDec_Constr()
14478acc472SPeter Tyser      LzmaDec_Allocate()
14578acc472SPeter Tyser      for (each new stream)
14678acc472SPeter Tyser      {
14778acc472SPeter Tyser        LzmaDec_Init()
14878acc472SPeter Tyser        while (it needs more decompression)
14978acc472SPeter Tyser        {
15078acc472SPeter Tyser          LzmaDec_DecodeToDic()
15178acc472SPeter Tyser          use data from CLzmaDec::dic and update CLzmaDec::dicPos
15278acc472SPeter Tyser        }
15378acc472SPeter Tyser      }
15478acc472SPeter Tyser      LzmaDec_Free()
15578acc472SPeter Tyser */
15678acc472SPeter Tyser 
15778acc472SPeter Tyser /* LzmaDec_DecodeToDic
15878acc472SPeter Tyser 
15978acc472SPeter Tyser    The decoding to internal dictionary buffer (CLzmaDec::dic).
16078acc472SPeter Tyser    You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
16178acc472SPeter Tyser 
16278acc472SPeter Tyser finishMode:
16378acc472SPeter Tyser   It has meaning only if the decoding reaches output limit (dicLimit).
16478acc472SPeter Tyser   LZMA_FINISH_ANY - Decode just dicLimit bytes.
16578acc472SPeter Tyser   LZMA_FINISH_END - Stream must be finished after dicLimit.
16678acc472SPeter Tyser 
16778acc472SPeter Tyser Returns:
16878acc472SPeter Tyser   SZ_OK
16978acc472SPeter Tyser     status:
17078acc472SPeter Tyser       LZMA_STATUS_FINISHED_WITH_MARK
17178acc472SPeter Tyser       LZMA_STATUS_NOT_FINISHED
17278acc472SPeter Tyser       LZMA_STATUS_NEEDS_MORE_INPUT
17378acc472SPeter Tyser       LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
17478acc472SPeter Tyser   SZ_ERROR_DATA - Data error
17578acc472SPeter Tyser */
17678acc472SPeter Tyser 
17778acc472SPeter Tyser SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
17878acc472SPeter Tyser     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
17978acc472SPeter Tyser 
18078acc472SPeter Tyser 
18178acc472SPeter Tyser /* ---------- Buffer Interface ---------- */
18278acc472SPeter Tyser 
18378acc472SPeter Tyser /* It's zlib-like interface.
18478acc472SPeter Tyser    See LzmaDec_DecodeToDic description for information about STEPS and return results,
18578acc472SPeter Tyser    but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
18678acc472SPeter Tyser    to work with CLzmaDec variables manually.
18778acc472SPeter Tyser 
18878acc472SPeter Tyser finishMode:
18978acc472SPeter Tyser   It has meaning only if the decoding reaches output limit (*destLen).
19078acc472SPeter Tyser   LZMA_FINISH_ANY - Decode just destLen bytes.
19178acc472SPeter Tyser   LZMA_FINISH_END - Stream must be finished after (*destLen).
19278acc472SPeter Tyser */
19378acc472SPeter Tyser 
19478acc472SPeter Tyser SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
19578acc472SPeter Tyser     const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
19678acc472SPeter Tyser 
19778acc472SPeter Tyser 
19878acc472SPeter Tyser /* ---------- One Call Interface ---------- */
19978acc472SPeter Tyser 
20078acc472SPeter Tyser /* LzmaDecode
20178acc472SPeter Tyser 
20278acc472SPeter Tyser finishMode:
20378acc472SPeter Tyser   It has meaning only if the decoding reaches output limit (*destLen).
20478acc472SPeter Tyser   LZMA_FINISH_ANY - Decode just destLen bytes.
20578acc472SPeter Tyser   LZMA_FINISH_END - Stream must be finished after (*destLen).
20678acc472SPeter Tyser 
20778acc472SPeter Tyser Returns:
20878acc472SPeter Tyser   SZ_OK
20978acc472SPeter Tyser     status:
21078acc472SPeter Tyser       LZMA_STATUS_FINISHED_WITH_MARK
21178acc472SPeter Tyser       LZMA_STATUS_NOT_FINISHED
21278acc472SPeter Tyser       LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
21378acc472SPeter Tyser   SZ_ERROR_DATA - Data error
21478acc472SPeter Tyser   SZ_ERROR_MEM  - Memory allocation error
21578acc472SPeter Tyser   SZ_ERROR_UNSUPPORTED - Unsupported properties
21678acc472SPeter Tyser   SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
21778acc472SPeter Tyser */
21878acc472SPeter Tyser 
21978acc472SPeter Tyser SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
22078acc472SPeter Tyser     const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
22178acc472SPeter Tyser     ELzmaStatus *status, ISzAlloc *alloc);
22278acc472SPeter Tyser 
22378acc472SPeter Tyser #endif
224