Moved the content of libentcode into libcelt to reduce dependencies,
[opus.git] / libcelt / probdec.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "probdec.h"
4 #include "bitrdec.h"
5
6
7
8 /*Gets the cumulative frequency count between _lo and _hi, as well as the
9    cumulative frequency count below _lo.*/
10 static unsigned ec_probmod_get_total(ec_probmod *_this,unsigned *_fl,
11  unsigned _lo,unsigned _hi){
12   *_fl=ec_bitree_get_cumul(_this->bitree,_lo);
13   return ec_bitree_get_cumul(_this->bitree,_hi)-*_fl;
14 }
15
16 static int ec_probmod_find_and_update(ec_probmod *_this,ec_probsamp *_samp,
17  unsigned _freq){
18   int sym;
19   sym=ec_bitree_find_and_update(_this->bitree,_this->sz,_this->split,
20    _freq,&_samp->fl,_this->inc);
21   _samp->fs=ec_bitree_get_freq(_this->bitree,sym)-_this->inc;
22   _this->ft+=_this->inc;
23   if(_this->ft>_this->thresh){
24     ec_bitree_halve(_this->bitree,_this->sz,_this->split);
25     _this->ft=ec_bitree_get_cumul(_this->bitree,_this->sz);
26   }
27   return sym;
28 }
29
30
31
32 int ec_probmod_read(ec_probmod *_this,ec_dec *_dec){
33   ec_probsamp samp;
34   unsigned    freq;
35   int         sym;
36   samp.ft=_this->ft;
37   freq=ec_decode(_dec,samp.ft);
38   sym=ec_probmod_find_and_update(_this,&samp,freq);
39   ec_dec_update(_dec,samp.fl,samp.fl+samp.fs,samp.ft);
40   return sym;
41 }
42
43 int ec_probmod_read_range(ec_probmod *_this,ec_dec *_dec,int _lo,int _hi){
44   ec_probsamp samp;
45   unsigned    freq;
46   unsigned    base;
47   int         sz;
48   int         sym;
49   sz=_this->sz;
50   _lo=EC_MINI(_lo,sz);
51   _hi=EC_MINI(_hi,sz);
52   if(_hi<=_lo)return -1;
53   samp.ft=ec_probmod_get_total(_this,&base,_lo,_hi);
54   freq=ec_decode(_dec,samp.ft);
55   sym=ec_probmod_find_and_update(_this,&samp,freq+base);
56   samp.fl-=base;
57   ec_dec_update(_dec,samp.fl,samp.fl+samp.fs,samp.ft);
58   return sym;
59 }