Source code
Revision control
Copy as Markdown
Other Tools
/* Ppmd7.h -- PPMdH compression codec↩
2017-04-03 : Igor Pavlov : Public domain↩
This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */↩
↩
/* This code supports virtual RangeDecoder and includes the implementation↩
of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H.↩
If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */↩
↩
#ifndef __PPMD7_H↩
#define __PPMD7_H↩
↩
#include "Ppmd.h"↩
↩
EXTERN_C_BEGIN↩
↩
#define PPMD7_MIN_ORDER 2↩
#define PPMD7_MAX_ORDER 64↩
↩
#define PPMD7_MIN_MEM_SIZE (1 << 11)↩
#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)↩
↩
struct CPpmd7_Context_;↩
↩
typedef↩
#ifdef PPMD_32BIT↩
struct CPpmd7_Context_ *↩
#else↩
UInt32↩
#endif↩
CPpmd7_Context_Ref;↩
↩
typedef struct CPpmd7_Context_↩
{↩
UInt16 NumStats;↩
UInt16 SummFreq;↩
CPpmd_State_Ref Stats;↩
CPpmd7_Context_Ref Suffix;↩
} CPpmd7_Context;↩
↩
#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)↩
↩
typedef struct↩
{↩
CPpmd7_Context *MinContext, *MaxContext;↩
CPpmd_State *FoundState;↩
unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;↩
Int32 RunLength, InitRL; /* must be 32-bit at least */↩
↩
UInt32 Size;↩
UInt32 GlueCount;↩
Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;↩
UInt32 AlignOffset;↩
↩
Byte Indx2Units[PPMD_NUM_INDEXES];↩
Byte Units2Indx[128];↩
CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];↩
Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256];↩
CPpmd_See DummySee, See[25][16];↩
UInt16 BinSumm[128][64];↩
} CPpmd7;↩
↩
void Ppmd7_Construct(CPpmd7 *p);↩
Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc);↩
void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc);↩
void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);↩
#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)↩
↩
↩
/* ---------- Internal Functions ---------- */↩
↩
extern const Byte PPMD7_kExpEscape[16];↩
↩
#ifdef PPMD_32BIT↩
#define Ppmd7_GetPtr(p, ptr) (ptr)↩
#define Ppmd7_GetContext(p, ptr) (ptr)↩
#define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)↩
#else↩
#define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))↩
#define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))↩
#define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))↩
#endif↩
↩
void Ppmd7_Update1(CPpmd7 *p);↩
void Ppmd7_Update1_0(CPpmd7 *p);↩
void Ppmd7_Update2(CPpmd7 *p);↩
void Ppmd7_UpdateBin(CPpmd7 *p);↩
↩
#define Ppmd7_GetBinSumm(p) \↩
&p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \↩
p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \↩
(p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \↩
2 * p->HB2Flag[(unsigned)Ppmd7Context_OneState(p->MinContext)->Symbol] + \↩
((p->RunLength >> 26) & 0x20)]↩
↩
CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);↩
↩
↩
/* ---------- Decode ---------- */↩
↩
typedef struct IPpmd7_RangeDec IPpmd7_RangeDec;↩
↩
struct IPpmd7_RangeDec↩
{↩
UInt32 (*GetThreshold)(const IPpmd7_RangeDec *p, UInt32 total);↩
void (*Decode)(const IPpmd7_RangeDec *p, UInt32 start, UInt32 size);↩
UInt32 (*DecodeBit)(const IPpmd7_RangeDec *p, UInt32 size0);↩
};↩
↩
typedef struct↩
{↩
IPpmd7_RangeDec vt;↩
UInt32 Range;↩
UInt32 Code;↩
IByteIn *Stream;↩
} CPpmd7z_RangeDec;↩
↩
void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);↩
Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p);↩
#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)↩
↩
int Ppmd7_DecodeSymbol(CPpmd7 *p, const IPpmd7_RangeDec *rc);↩
↩
↩
/* ---------- Encode ---------- */↩
↩
typedef struct↩
{↩
UInt64 Low;↩
UInt32 Range;↩
Byte Cache;↩
UInt64 CacheSize;↩
IByteOut *Stream;↩
} CPpmd7z_RangeEnc;↩
↩
void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p);↩
void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p);↩
↩
void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);↩
↩
EXTERN_C_END↩
↩
#endif↩