xref: /aosp_15_r20/external/lzma/C/Ppmd7.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* Ppmd7.h -- Ppmd7 (PPMdH) compression codec
2*f6dc9357SAndroid Build Coastguard Worker 2023-04-02 : Igor Pavlov : Public domain
3*f6dc9357SAndroid Build Coastguard Worker This code is based on:
4*f6dc9357SAndroid Build Coastguard Worker   PPMd var.H (2001): Dmitry Shkarin : Public domain */
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_PPMD7_H
8*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_PPMD7_H
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "Ppmd.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_MIN_ORDER 2
15*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_MAX_ORDER 64
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_MIN_MEM_SIZE (1 << 11)
18*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker struct CPpmd7_Context_;
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker typedef Ppmd_Ref_Type(struct CPpmd7_Context_) CPpmd7_Context_Ref;
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker // MY_CPU_pragma_pack_push_1
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker typedef struct CPpmd7_Context_
27*f6dc9357SAndroid Build Coastguard Worker {
28*f6dc9357SAndroid Build Coastguard Worker   UInt16 NumStats;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker   union
32*f6dc9357SAndroid Build Coastguard Worker   {
33*f6dc9357SAndroid Build Coastguard Worker     UInt16 SummFreq;
34*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State2 State2;
35*f6dc9357SAndroid Build Coastguard Worker   } Union2;
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker   union
38*f6dc9357SAndroid Build Coastguard Worker   {
39*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State_Ref Stats;
40*f6dc9357SAndroid Build Coastguard Worker     CPpmd_State4 State4;
41*f6dc9357SAndroid Build Coastguard Worker   } Union4;
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker   CPpmd7_Context_Ref Suffix;
44*f6dc9357SAndroid Build Coastguard Worker } CPpmd7_Context;
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker // MY_CPU_pragma_pop
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->Union2)
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker typedef struct
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   UInt32 Range;
56*f6dc9357SAndroid Build Coastguard Worker   UInt32 Code;
57*f6dc9357SAndroid Build Coastguard Worker   UInt32 Low;
58*f6dc9357SAndroid Build Coastguard Worker   IByteInPtr Stream;
59*f6dc9357SAndroid Build Coastguard Worker } CPpmd7_RangeDec;
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker typedef struct
63*f6dc9357SAndroid Build Coastguard Worker {
64*f6dc9357SAndroid Build Coastguard Worker   UInt32 Range;
65*f6dc9357SAndroid Build Coastguard Worker   Byte Cache;
66*f6dc9357SAndroid Build Coastguard Worker   // Byte _dummy_[3];
67*f6dc9357SAndroid Build Coastguard Worker   UInt64 Low;
68*f6dc9357SAndroid Build Coastguard Worker   UInt64 CacheSize;
69*f6dc9357SAndroid Build Coastguard Worker   IByteOutPtr Stream;
70*f6dc9357SAndroid Build Coastguard Worker } CPpmd7z_RangeEnc;
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker typedef struct
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker   CPpmd7_Context *MinContext, *MaxContext;
76*f6dc9357SAndroid Build Coastguard Worker   CPpmd_State *FoundState;
77*f6dc9357SAndroid Build Coastguard Worker   unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;
78*f6dc9357SAndroid Build Coastguard Worker   Int32 RunLength, InitRL; /* must be 32-bit at least */
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
81*f6dc9357SAndroid Build Coastguard Worker   UInt32 GlueCount;
82*f6dc9357SAndroid Build Coastguard Worker   UInt32 AlignOffset;
83*f6dc9357SAndroid Build Coastguard Worker   Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker   union
89*f6dc9357SAndroid Build Coastguard Worker   {
90*f6dc9357SAndroid Build Coastguard Worker     CPpmd7_RangeDec dec;
91*f6dc9357SAndroid Build Coastguard Worker     CPpmd7z_RangeEnc enc;
92*f6dc9357SAndroid Build Coastguard Worker   } rc;
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   Byte Indx2Units[PPMD_NUM_INDEXES + 2]; // +2 for alignment
95*f6dc9357SAndroid Build Coastguard Worker   Byte Units2Indx[128];
96*f6dc9357SAndroid Build Coastguard Worker   CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker   Byte NS2BSIndx[256], NS2Indx[256];
99*f6dc9357SAndroid Build Coastguard Worker   Byte ExpEscape[16];
100*f6dc9357SAndroid Build Coastguard Worker   CPpmd_See DummySee, See[25][16];
101*f6dc9357SAndroid Build Coastguard Worker   UInt16 BinSumm[128][64];
102*f6dc9357SAndroid Build Coastguard Worker   // int LastSymbol;
103*f6dc9357SAndroid Build Coastguard Worker } CPpmd7;
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Construct(CPpmd7 *p);
107*f6dc9357SAndroid Build Coastguard Worker BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc);
108*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc);
109*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);
110*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker /* ---------- Internal Functions ---------- */
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7_GetPtr(p, ptr)     Ppmd_GetPtr(p, ptr)
116*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7_GetContext(p, ptr) Ppmd_GetPtr_Type(p, ptr, CPpmd7_Context)
117*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7_GetStats(p, ctx)   Ppmd_GetPtr_Type(p, (ctx)->Union4.Stats, CPpmd_State)
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Update1(CPpmd7 *p);
120*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Update1_0(CPpmd7 *p);
121*f6dc9357SAndroid Build Coastguard Worker void Ppmd7_Update2(CPpmd7 *p);
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_HiBitsFlag_3(sym) ((((unsigned)sym + 0xC0) >> (8 - 3)) & (1 << 3))
124*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_HiBitsFlag_4(sym) ((((unsigned)sym + 0xC0) >> (8 - 4)) & (1 << 4))
125*f6dc9357SAndroid Build Coastguard Worker // #define PPMD7_HiBitsFlag_3(sym) ((sym) < 0x40 ? 0 : (1 << 3))
126*f6dc9357SAndroid Build Coastguard Worker // #define PPMD7_HiBitsFlag_4(sym) ((sym) < 0x40 ? 0 : (1 << 4))
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7_GetBinSumm(p) \
129*f6dc9357SAndroid Build Coastguard Worker     &p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1] \
130*f6dc9357SAndroid Build Coastguard Worker     [ p->PrevSuccess + ((p->RunLength >> 26) & 0x20) \
131*f6dc9357SAndroid Build Coastguard Worker     + p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] \
132*f6dc9357SAndroid Build Coastguard Worker     + PPMD7_HiBitsFlag_4(Ppmd7Context_OneState(p->MinContext)->Symbol) \
133*f6dc9357SAndroid Build Coastguard Worker     + (p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol)) ]
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker /*
139*f6dc9357SAndroid Build Coastguard Worker We support two versions of Ppmd7 (PPMdH) methods that use same CPpmd7 structure:
140*f6dc9357SAndroid Build Coastguard Worker   1) Ppmd7a_*: original PPMdH
141*f6dc9357SAndroid Build Coastguard Worker   2) Ppmd7z_*: modified PPMdH with 7z Range Coder
142*f6dc9357SAndroid Build Coastguard Worker Ppmd7_*: the structures and functions that are common for both versions of PPMd7 (PPMdH)
143*f6dc9357SAndroid Build Coastguard Worker */
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker /* ---------- Decode ---------- */
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_SYM_END    (-1)
148*f6dc9357SAndroid Build Coastguard Worker #define PPMD7_SYM_ERROR  (-2)
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker /*
151*f6dc9357SAndroid Build Coastguard Worker You must set (CPpmd7::rc.dec.Stream) before Ppmd7*_RangeDec_Init()
152*f6dc9357SAndroid Build Coastguard Worker 
153*f6dc9357SAndroid Build Coastguard Worker Ppmd7*_DecodeSymbol()
154*f6dc9357SAndroid Build Coastguard Worker out:
155*f6dc9357SAndroid Build Coastguard Worker   >= 0 : decoded byte
156*f6dc9357SAndroid Build Coastguard Worker     -1 : PPMD7_SYM_END   : End of payload marker
157*f6dc9357SAndroid Build Coastguard Worker     -2 : PPMD7_SYM_ERROR : Data error
158*f6dc9357SAndroid Build Coastguard Worker */
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker /* Ppmd7a_* : original PPMdH */
161*f6dc9357SAndroid Build Coastguard Worker BoolInt Ppmd7a_RangeDec_Init(CPpmd7_RangeDec *p);
162*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7a_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
163*f6dc9357SAndroid Build Coastguard Worker int Ppmd7a_DecodeSymbol(CPpmd7 *p);
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker /* Ppmd7z_* : modified PPMdH with 7z Range Coder */
166*f6dc9357SAndroid Build Coastguard Worker BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p);
167*f6dc9357SAndroid Build Coastguard Worker #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
168*f6dc9357SAndroid Build Coastguard Worker int Ppmd7z_DecodeSymbol(CPpmd7 *p);
169*f6dc9357SAndroid Build Coastguard Worker // Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim);
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker 
172*f6dc9357SAndroid Build Coastguard Worker /* ---------- Encode ---------- */
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker void Ppmd7z_Init_RangeEnc(CPpmd7 *p);
175*f6dc9357SAndroid Build Coastguard Worker void Ppmd7z_Flush_RangeEnc(CPpmd7 *p);
176*f6dc9357SAndroid Build Coastguard Worker // void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol);
177*f6dc9357SAndroid Build Coastguard Worker void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim);
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker #endif
182