File indexing completed on 2025-02-02 04:26:00
0001 /* Ppmd7.h -- PPMdH compression codec 0002 2010-03-12 : Igor Pavlov : Public domain 0003 This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ 0004 0005 /* This code supports virtual RangeDecoder and includes the implementation 0006 of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H. 0007 If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */ 0008 0009 #ifndef __PPMD7_H 0010 #define __PPMD7_H 0011 0012 #include "Ppmd.h" 0013 0014 EXTERN_C_BEGIN 0015 0016 #define PPMD7_MIN_ORDER 2 0017 #define PPMD7_MAX_ORDER 64 0018 0019 #define PPMD7_MIN_MEM_SIZE (1 << 11) 0020 #define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3) 0021 0022 struct CPpmd7_Context_; 0023 0024 typedef 0025 #ifdef PPMD_32BIT 0026 struct CPpmd7_Context_ * 0027 #else 0028 UInt32 0029 #endif 0030 CPpmd7_Context_Ref; 0031 0032 typedef struct CPpmd7_Context_ 0033 { 0034 UInt16 NumStats; 0035 UInt16 SummFreq; 0036 CPpmd_State_Ref Stats; 0037 CPpmd7_Context_Ref Suffix; 0038 } CPpmd7_Context; 0039 0040 #define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq) 0041 0042 typedef struct 0043 { 0044 CPpmd7_Context *MinContext, *MaxContext; 0045 CPpmd_State *FoundState; 0046 unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; 0047 Int32 RunLength, InitRL; /* must be 32-bit at least */ 0048 0049 UInt32 Size; 0050 UInt32 GlueCount; 0051 Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; 0052 UInt32 AlignOffset; 0053 0054 Byte Indx2Units[PPMD_NUM_INDEXES]; 0055 Byte Units2Indx[128]; 0056 CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; 0057 Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; 0058 CPpmd_See DummySee, See[25][16]; 0059 UInt16 BinSumm[128][64]; 0060 } CPpmd7; 0061 0062 void Ppmd7_Construct(CPpmd7 *p); 0063 Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc); 0064 void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc); 0065 void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); 0066 #define Ppmd7_WasAllocated(p) ((p)->Base != NULL) 0067 0068 0069 /* ---------- Internal Functions ---------- */ 0070 0071 extern const Byte PPMD7_kExpEscape[16]; 0072 0073 #ifdef PPMD_32BIT 0074 #define Ppmd7_GetPtr(p, ptr) (ptr) 0075 #define Ppmd7_GetContext(p, ptr) (ptr) 0076 #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats) 0077 #else 0078 #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs))) 0079 #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs))) 0080 #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats))) 0081 #endif 0082 0083 void Ppmd7_Update1(CPpmd7 *p); 0084 void Ppmd7_Update1_0(CPpmd7 *p); 0085 void Ppmd7_Update2(CPpmd7 *p); 0086 void Ppmd7_UpdateBin(CPpmd7 *p); 0087 0088 #define Ppmd7_GetBinSumm(p) \ 0089 &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \ 0090 p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \ 0091 (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \ 0092 2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \ 0093 ((p->RunLength >> 26) & 0x20)] 0094 0095 CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); 0096 0097 0098 /* ---------- Decode ---------- */ 0099 0100 typedef struct 0101 { 0102 UInt32 (*GetThreshold)(void *p, UInt32 total); 0103 void (*Decode)(void *p, UInt32 start, UInt32 size); 0104 UInt32 (*DecodeBit)(void *p, UInt32 size0); 0105 } IPpmd7_RangeDec; 0106 0107 typedef struct 0108 { 0109 IPpmd7_RangeDec p; 0110 UInt32 Range; 0111 UInt32 Code; 0112 IByteIn *Stream; 0113 } CPpmd7z_RangeDec; 0114 0115 void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p); 0116 Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); 0117 #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) 0118 0119 int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc); 0120 0121 0122 /* ---------- Encode ---------- */ 0123 0124 typedef struct 0125 { 0126 UInt64 Low; 0127 UInt32 Range; 0128 Byte Cache; 0129 UInt64 CacheSize; 0130 IByteOut *Stream; 0131 } CPpmd7z_RangeEnc; 0132 0133 void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p); 0134 void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p); 0135 0136 void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol); 0137 0138 EXTERN_C_END 0139 0140 #endif