00001 #include "utypes.h" 00002 00003 #ifndef PPM_H 00004 00005 #define PPM_H 00006 00007 #include "arith.h" 00008 00009 /* pour le calcul éventuel de quelques statistiques */ 00010 /* #define STAT */ 00011 00012 /* mise en mode debogage */ 00013 /* #define DEBUG */ 00014 00015 /* nombre de noeuds maximum: peut être modifié, mais doit être tel que: 00016 * HASH_SIZE+NODE_NBMAX<65530 00017 */ 00018 //#define NODE_NBMAX 40000 00019 00020 /* 00021 * taille des buffers d'entrée/sortie 00022 */ 00023 #define BUFSIZE 1024 00024 00025 /* 00026 * Taille de la table de hachage 00027 */ 00028 #define HASH_SIZE 16384 00029 00030 /* ordre maximale de prédiction utilisé (Phi) */ 00031 #define ORDER_MAX 4 00032 00033 /* fréquence maximale d'un symbole */ 00034 #define RENORM_FREQSYM 250 00035 00036 /* fréquence maximale pour la somme des fréquences des symboles d'un contexte */ 00037 #define RENORM_FREQTOT 15000 00038 00039 /* nombre de couples symbole,fréquence dans les structures de noeuds 00040 * ajusté pour faire au total 16 octets */ 00041 #define NODE_SFNB 7 00042 #define HDR_SFNB 2 00043 00044 /* nombre de symboles à coder sans compter les symboles spéciaux */ 00045 #define SYM_NB 256 00046 00047 /* nombre de symboles spéciaux: pour extension si besoin de signalisation */ 00048 #define SYM_SPECIAL_NB 1 00049 00050 /* code associé au symbole ESCAPE (jamais codé de façon explicite) */ 00051 #define SYM_ESCAPE 256 00052 00053 /* code de fin de fichier */ 00054 #define SYM_EOF 256 00055 00056 /* valeur NULL pour les pointeurs stockés dans des USHORT */ 00057 #define NIL 0xFFFF 00058 00059 /* codage de NIL utilisé pour retrouver l'adresse dans la table de hachage 00060 * d'un contexte en regardant seulement CTXHDR.hash_next */ 00061 #define HASH_ADDRESS (65530-HASH_SIZE) 00062 00063 00064 /* stockage d'un couple symbole, fréquence */ 00065 typedef struct { 00066 UCHAR sym; /* numéro du symbole */ 00067 UCHAR freq; /* fréquence du symbole */ 00068 } SYMFREQ; 00069 00070 00071 /* header pour gérer un contexte */ 00072 typedef struct { 00073 USHORT ctx_next; /* contexte suivant (moins utilisé) */ 00074 USHORT ctx_prev; /* contexte précédent (plus utilisé) */ 00075 USHORT hash_next; /* contexte suivant dans une entrée de la table 00076 * de hachage */ 00077 UCHAR order; /* ordre du contexte */ 00078 UCHAR sym[ORDER_MAX]; /* symboles constituant le contexte */ 00079 UCHAR sf_max; /* nombre de symboles-1 dans la liste L */ 00080 union { 00081 SYMFREQ sf[HDR_SFNB]; /* s'il y a moins de HDR_SFNB symboles dans 00082 * le contexte, on les stocke directement ici 00083 */ 00084 struct { 00085 USHORT freq_tot; /* sinon on stocke la fréquence totale (c) */ 00086 USHORT sf_next; /* et un pointeur sur le premier noeud 00087 * constituant la liste L des symboles associés 00088 * au contexte */ 00089 } l; 00090 } sf; 00091 } CTXHDR; 00092 00093 /* structure pour gérer NODE_SFNB éléments de la liste des symboles associés 00094 * à un contexte */ 00095 typedef struct { 00096 SYMFREQ sf[NODE_SFNB]; /* les couples symbole, fréquence */ 00097 USHORT sf_next; /* pointeur sur l'éventuel bloc suivant */ 00098 } CTXSYMFREQ; 00099 00100 /* 00101 * structure de base pour la gestion de la mémoire: le noeud 00102 */ 00103 00104 typedef union _NODE { 00105 CTXHDR hdr; /* si le noeud contient un header de contexte */ 00106 CTXSYMFREQ sf; /* si le noeud contient une partie de la liste L */ 00107 USHORT free_next; /* si le noeud est vide: pointeur sur un noeud vide 00108 * suivant */ 00109 } NODE; 00110 00111 class ppm_worker 00112 { 00113 00114 /* gestion des noeuds */ 00115 NODE *node_heap; /* heap contenant tous les noeuds */ 00116 UINT node_free_nb; /* nombre de noeuds vides */ 00117 UINT node_free_first; /* premier noeud de la liste des noeuds vides */ 00118 UINT node_free_last; /* dernier noeud de la liste des noeuds vides */ 00119 00120 /* gestion de la liste des contextes les plus utilisés */ 00121 USHORT *hash_table; /* table de hachage pour rechercher un contexte */ 00122 UINT ctx_first; /* premier contexte: le plus utilisé */ 00123 UINT ctx_last; /* dernier contexte: le moins utilisé */ 00124 UINT ctx_nb; /* nombre de contextes */ 00125 00126 /* données caractérisant le contexte courant */ 00127 UCHAR sym_context[ORDER_MAX+1]; /* symboles précédants le symbole en cours 00128 * de codage */ 00129 int sym_hash[ORDER_MAX+1]; /* index dans la table de hachage 00130 * correspondants aux différentes longueurs 00131 * de contextes 00132 */ 00133 00134 /* système d'exclusion des caractères */ 00135 UCHAR sym_excl[SYM_NB]; /* tableau pour l'exclusion */ 00136 UCHAR sym_excl_code; /* code courant pour l'exclusion */ 00137 00138 00139 /* déclaration des fonctions de base */ 00140 00141 /* noeuds */ 00142 void Node_Free(UINT p); 00143 UINT Node_Alloc(void); 00144 00145 /* contextes */ 00146 void Context_DeleteLast(void); 00147 void Context_MoveFirst(UINT c); 00148 void Context_New(int sym,int order); 00149 void Context_NewSym(int sym,UINT c); 00150 UINT Context_Search(int order); 00151 void Context_Renorm(UINT ctx); 00152 void Hash_Update(int sym); 00153 void Sym_ExcludeReset(void); 00154 00155 /* codage */ 00156 /* 00157 void Encode_NewSym(int sym); 00158 int Encode_NoExclude(int sym,UINT ctx); 00159 int Decode_Exclude(UINT ctx); 00160 int PPM_Decode(void); 00161 */ 00162 00163 /* décodage */ 00164 int Decode_NewSym(void); 00165 int Decode_NoExclude(UINT ctx); 00166 int Decode_Exclude(UINT ctx); 00167 00168 #ifdef STAT 00169 void PrintStat(void); 00170 #endif 00171 public: 00172 ArithClass arith; 00173 int PPM_Init(unsigned short); 00174 void PPM_End(void); 00175 int PPM_Decode(void); 00176 }; 00177 00178 #endif 00179
1.4.2