Doing multiple rotation passes instead of one produces better pulse spreading.
[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_uint64 ec_dec_bits64(ec_dec *_this,int _ftb){
100   ec_uint64 t;
101   if(_ftb>32){
102     t=ec_dec_bits(_this,32);
103     _ftb-=32;
104   }
105   else t=0;
106   return t<<_ftb|ec_dec_bits(_this,_ftb);
107 }
108
109 ec_uint32 ec_dec_uint(ec_dec *_this,ec_uint32 _ft){
110   ec_uint32 mask;
111   ec_uint32 t;
112   unsigned  ft;
113   unsigned  s;
114   int       ftb;
115   t=0;
116   _ft--;
117   ftb=EC_ILOG(_ft);
118   while(ftb>EC_UNIT_BITS){
119     ftb-=EC_UNIT_BITS;
120     ft=(unsigned)(_ft>>ftb)+1;
121     s=ec_decode(_this,ft);
122     ec_dec_update(_this,s,s+1,ft);
123     t=t<<EC_UNIT_BITS|s;
124     if(s<ft-1)return t<<ftb|ec_dec_bits(_this,ftb);
125     mask=((ec_uint32)1<<ftb)-1;
126     _ft=_ft&mask;
127   }
128   _ft++;
129   s=ec_decode(_this,(unsigned)_ft);
130   ec_dec_update(_this,s,s+1,(unsigned)_ft);
131   t=t<<ftb|s;
132   return t;
133 }
134
135 ec_uint64 ec_dec_uint64(ec_dec *_this,ec_uint64 _ft){
136   ec_uint64 mask;
137   ec_uint64 t;
138   unsigned  ft;
139   unsigned  s;
140   int       ftb;
141   t=0;
142   _ft--;
143   ftb=EC_ILOG64(_ft);
144   while(ftb>EC_UNIT_BITS){
145     ftb-=EC_UNIT_BITS;
146     ft=(unsigned)(_ft>>ftb)+1;
147     s=ec_decode(_this,ft);
148     ec_dec_update(_this,s,s+1,ft);
149     t=t<<EC_UNIT_BITS|s;
150     if(s<ft-1)return t<<ftb|ec_dec_bits64(_this,ftb);
151     mask=((ec_uint64)1<<ftb)-1;
152     _ft=_ft&mask;
153   }
154   _ft++;
155   s=ec_decode(_this,(unsigned)_ft);
156   ec_dec_update(_this,s,s+1,(unsigned)_ft);
157   t=t<<ftb|s;
158   return t;
159 }