Multiplier-free entropy coder
[opus.git] / libentcode / entdec.c
1 #include <stddef.h>
2 #include "entdec.h"
3
4
5
6 void ec_byte_readinit(ec_byte_buffer *_b,unsigned char *_buf,long _bytes){
7   _b->buf=_b->ptr=_buf;
8   _b->storage=_bytes;
9 }
10
11 int ec_byte_look1(ec_byte_buffer *_b){
12   ptrdiff_t endbyte;
13   endbyte=_b->ptr-_b->buf;
14   if(endbyte>=_b->storage)return -1;
15   else return _b->ptr[0];
16 }
17
18 int ec_byte_look4(ec_byte_buffer *_b,ec_uint32 *_val){
19   ptrdiff_t endbyte;
20   endbyte=_b->ptr-_b->buf;
21   if(endbyte+4>_b->storage){
22     if(endbyte<_b->storage){
23       *_val=_b->ptr[0];
24       endbyte++;
25       if(endbyte<_b->storage){
26         *_val|=(ec_uint32)_b->ptr[1]<<8;
27         endbyte++;
28         if(endbyte<_b->storage)*_val|=(ec_uint32)_b->ptr[2]<<16;
29       }
30     }
31     return -1;
32   }
33   else{
34     *_val=_b->ptr[0];
35     *_val|=(ec_uint32)_b->ptr[1]<<8;
36     *_val|=(ec_uint32)_b->ptr[2]<<16;
37     *_val|=(ec_uint32)_b->ptr[3]<<24;
38   }
39   return 0;
40 }
41
42 void ec_byte_adv1(ec_byte_buffer *_b){
43   _b->ptr++;
44 }
45
46 void ec_byte_adv4(ec_byte_buffer *_b){
47   _b->ptr+=4;
48 }
49
50 int ec_byte_read1(ec_byte_buffer *_b){
51   ptrdiff_t endbyte;
52   endbyte=_b->ptr-_b->buf;
53   if(endbyte>=_b->storage)return -1;
54   else return *(_b->ptr++);
55 }
56
57 int ec_byte_read4(ec_byte_buffer *_b,ec_uint32 *_val){
58   unsigned char *end;
59   end=_b->buf+_b->storage;
60   if(_b->ptr+4>end){
61     if(_b->ptr<end){
62       *_val=*(_b->ptr++);
63       if(_b->ptr<end){
64         *_val|=(ec_uint32)*(_b->ptr++)<<8;
65         if(_b->ptr<end)*_val|=(ec_uint32)*(_b->ptr++)<<16;
66       }
67     }
68     return -1;
69   }
70   else{
71     *_val=(*_b->ptr++);
72     *_val|=(ec_uint32)*(_b->ptr++)<<8;
73     *_val|=(ec_uint32)*(_b->ptr++)<<16;
74     *_val|=(ec_uint32)*(_b->ptr++)<<24;
75   }
76   return 0;
77 }
78
79
80
81 ec_uint32 ec_dec_bits(ec_dec *_this,int _ftb){
82   ec_uint32 t;
83   unsigned  s;
84   unsigned  ft;
85   t=0;
86   while(_ftb>EC_UNIT_BITS){
87     s=ec_decode(_this,EC_UNIT_MASK+1);
88     ec_dec_update(_this,s,s+1,EC_UNIT_MASK+1);
89     t=t<<EC_UNIT_BITS|s;
90     _ftb-=EC_UNIT_BITS;
91   }
92   ft=1U<<_ftb;
93   s=ec_decode(_this,ft);
94   ec_dec_update(_this,s,s+1,ft);
95   t=t<<_ftb|s;
96   return t;
97 }
98
99 ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
100   ec_uint32 mask;
101   ec_uint32 ft;
102   ec_uint32 t;
103   unsigned  s;
104   int       ftb;
105   t=0;
106   _ft--;
107   ftb=EC_ILOG(_ft);
108   while(ftb>EC_UNIT_BITS){
109     ftb-=EC_UNIT_BITS;
110     ft=(_ft>>ftb)+1;
111     s=ec_decode(_this,ft);
112     ec_dec_update(_this,s,s+1,ft);
113     t=t<<EC_UNIT_BITS|s;
114     if(s<ft-1)return t<<ftb|ec_dec_bits(_this,ftb);
115     mask=((ec_uint32)1<<ftb)-1;
116     _ft=_ft&mask;
117   }
118   _ft++;
119   s=ec_decode(_this,_ft);
120   ec_dec_update(_this,s,s+1,_ft);
121   t=t<<ftb|s;
122   return t;
123 }