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