73 lines
2.6 KiB
C
73 lines
2.6 KiB
C
#if !defined(_probmod_H)
|
|
# define _probmod_H (1)
|
|
# include "entcode.h"
|
|
|
|
typedef struct ec_probsamp ec_probsamp;
|
|
typedef struct ec_probmod ec_probmod;
|
|
|
|
/*A sample from a probability distribution.
|
|
This is the information needed to encode a symbol or update the decoder
|
|
state.*/
|
|
struct ec_probsamp{
|
|
/*The cumulative frequency of all symbols preceding this one in the
|
|
alphabet.*/
|
|
unsigned fl;
|
|
/*The frequency of the symbol coded.*/
|
|
unsigned fs;
|
|
/*The total frequency of all symbols in the alphabet.*/
|
|
unsigned ft;
|
|
};
|
|
|
|
|
|
/*A simple frequency-count probability model.*/
|
|
struct ec_probmod{
|
|
/*The number of symbols in this context.*/
|
|
int sz;
|
|
/*The largest power of two less than or equal to sz.*/
|
|
int split;
|
|
/*The amount by which to increment the frequency count of an observed
|
|
symbol.*/
|
|
unsigned inc;
|
|
/*The current total frequency count.*/
|
|
unsigned ft;
|
|
/*The maximum total frequency count allowed before the counts are rescaled.
|
|
Note that this should be larger than (inc+1>>1)+sz-1, since at most one
|
|
rescaling is done per decoded symbol.
|
|
Otherwise, this threshold might be exceeded.
|
|
This must be less than 2**23 for a range coder, and 2**31 for an
|
|
arithmetic coder.*/
|
|
unsigned thresh;
|
|
/*The binary indexed tree used to keep track of the frequency counts.*/
|
|
unsigned *bitree;
|
|
};
|
|
|
|
|
|
/*Initializes a probability model of the given size.
|
|
The amount to increment and all frequency counts are initialized to 1.
|
|
The rescaling threshold is initialized to 2**23.
|
|
_sz: The number of symbols in this context.*/
|
|
void ec_probmod_init(ec_probmod *_this,unsigned _sz);
|
|
/*Initializes a probability model of the given size.
|
|
The amount to increment is initialized to 1.
|
|
The rescaling threshold is initialized to 2**23.
|
|
_sz: The number of symbols in this context.
|
|
_counts: The initial frequency count of each symbol.*/
|
|
void ec_probmod_init_from_counts(ec_probmod *_this,unsigned _sz,
|
|
const unsigned *_counts);
|
|
/*Initializes a probability model of the given size.
|
|
_sz: The number of symbols in this context.
|
|
_inc: The amount by which to increment the frequency count of an observed
|
|
symbol.
|
|
_thresh: The maximum total frequency count allowed before the counts are
|
|
rescaled.
|
|
See above for restrictions on this value.
|
|
_counts: The initial frequency count of each symbol, or NULL to initialize
|
|
each frequency count to 1.*/
|
|
void ec_probmod_init_full(ec_probmod *_this,unsigned _sz,unsigned _inc,
|
|
unsigned _thresh,const unsigned *_counts);
|
|
/*Frees all memory used by this probability model.*/
|
|
void ec_probmod_clear(ec_probmod *_this);
|
|
|
|
|
|
|
|
#endif
|