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