Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ppm.h

Go to the documentation of this file.
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 

Generated on Sat Nov 5 16:16:56 2005 for OPIE by  doxygen 1.4.2