xref: /btstack/3rd-party/lc3-google/src/bits.c (revision 9a19cd786042b1fc78813d984efdd045e84593df)
1*9a19cd78SMatthias Ringwald /******************************************************************************
2*9a19cd78SMatthias Ringwald  *
3*9a19cd78SMatthias Ringwald  *  Copyright 2021 Google, Inc.
4*9a19cd78SMatthias Ringwald  *
5*9a19cd78SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6*9a19cd78SMatthias Ringwald  *  you may not use this file except in compliance with the License.
7*9a19cd78SMatthias Ringwald  *  You may obtain a copy of the License at:
8*9a19cd78SMatthias Ringwald  *
9*9a19cd78SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10*9a19cd78SMatthias Ringwald  *
11*9a19cd78SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
12*9a19cd78SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13*9a19cd78SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*9a19cd78SMatthias Ringwald  *  See the License for the specific language governing permissions and
15*9a19cd78SMatthias Ringwald  *  limitations under the License.
16*9a19cd78SMatthias Ringwald  *
17*9a19cd78SMatthias Ringwald  ******************************************************************************/
18*9a19cd78SMatthias Ringwald 
19*9a19cd78SMatthias Ringwald #include "bits.h"
20*9a19cd78SMatthias Ringwald #include "common.h"
21*9a19cd78SMatthias Ringwald 
22*9a19cd78SMatthias Ringwald 
23*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
24*9a19cd78SMatthias Ringwald  *  Common
25*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
26*9a19cd78SMatthias Ringwald 
27*9a19cd78SMatthias Ringwald static inline int ac_get(struct lc3_bits_buffer *);
28*9a19cd78SMatthias Ringwald static inline void accu_load(struct lc3_bits_accu *, struct lc3_bits_buffer *);
29*9a19cd78SMatthias Ringwald 
30*9a19cd78SMatthias Ringwald /**
31*9a19cd78SMatthias Ringwald  * Arithmetic coder return range bits
32*9a19cd78SMatthias Ringwald  * ac              Arithmetic coder
33*9a19cd78SMatthias Ringwald  * return          1 + log2(ac->range)
34*9a19cd78SMatthias Ringwald  */
35*9a19cd78SMatthias Ringwald static int ac_get_range_bits(const struct lc3_bits_ac *ac)
36*9a19cd78SMatthias Ringwald {
37*9a19cd78SMatthias Ringwald     int nbits = 0;
38*9a19cd78SMatthias Ringwald 
39*9a19cd78SMatthias Ringwald     for (unsigned r = ac->range; r; r >>= 1, nbits++);
40*9a19cd78SMatthias Ringwald 
41*9a19cd78SMatthias Ringwald     return nbits;
42*9a19cd78SMatthias Ringwald }
43*9a19cd78SMatthias Ringwald 
44*9a19cd78SMatthias Ringwald /**
45*9a19cd78SMatthias Ringwald  * Arithmetic coder return pending bits
46*9a19cd78SMatthias Ringwald  * ac              Arithmetic coder
47*9a19cd78SMatthias Ringwald  * return          Pending bits
48*9a19cd78SMatthias Ringwald  */
49*9a19cd78SMatthias Ringwald static int ac_get_pending_bits(const struct lc3_bits_ac *ac)
50*9a19cd78SMatthias Ringwald {
51*9a19cd78SMatthias Ringwald     return 26 - ac_get_range_bits(ac) +
52*9a19cd78SMatthias Ringwald         ((ac->cache >= 0) + ac->carry_count) * 8;
53*9a19cd78SMatthias Ringwald }
54*9a19cd78SMatthias Ringwald 
55*9a19cd78SMatthias Ringwald /**
56*9a19cd78SMatthias Ringwald  * Return number of bits left in the bitstream
57*9a19cd78SMatthias Ringwald  * bits            Bitstream context
58*9a19cd78SMatthias Ringwald  * return          >= 0: Number of bits left  < 0: Overflow
59*9a19cd78SMatthias Ringwald  */
60*9a19cd78SMatthias Ringwald static int get_bits_left(const struct lc3_bits *bits)
61*9a19cd78SMatthias Ringwald {
62*9a19cd78SMatthias Ringwald     const struct lc3_bits_buffer *buffer = &bits->buffer;
63*9a19cd78SMatthias Ringwald     const struct lc3_bits_accu *accu = &bits->accu;
64*9a19cd78SMatthias Ringwald     const struct lc3_bits_ac *ac = &bits->ac;
65*9a19cd78SMatthias Ringwald 
66*9a19cd78SMatthias Ringwald     uintptr_t end = (uintptr_t)buffer->p_bw +
67*9a19cd78SMatthias Ringwald         (bits->mode == LC3_BITS_MODE_READ ? LC3_ACCU_BITS/8 : 0);
68*9a19cd78SMatthias Ringwald 
69*9a19cd78SMatthias Ringwald     uintptr_t start = (uintptr_t)buffer->p_fw -
70*9a19cd78SMatthias Ringwald         (bits->mode == LC3_BITS_MODE_READ ? LC3_AC_BITS/8 : 0);
71*9a19cd78SMatthias Ringwald 
72*9a19cd78SMatthias Ringwald     int n = end > start ? (int)(end - start) : -(int)(start - end);
73*9a19cd78SMatthias Ringwald 
74*9a19cd78SMatthias Ringwald     return 8 * n - (accu->n + accu->nover + ac_get_pending_bits(ac));
75*9a19cd78SMatthias Ringwald }
76*9a19cd78SMatthias Ringwald 
77*9a19cd78SMatthias Ringwald /**
78*9a19cd78SMatthias Ringwald  * Setup bitstream writing
79*9a19cd78SMatthias Ringwald  */
80*9a19cd78SMatthias Ringwald void lc3_setup_bits(struct lc3_bits *bits,
81*9a19cd78SMatthias Ringwald     enum lc3_bits_mode mode, void *buffer, int len)
82*9a19cd78SMatthias Ringwald {
83*9a19cd78SMatthias Ringwald     *bits = (struct lc3_bits){
84*9a19cd78SMatthias Ringwald         .mode = mode,
85*9a19cd78SMatthias Ringwald         .accu = {
86*9a19cd78SMatthias Ringwald             .n = mode == LC3_BITS_MODE_READ ? LC3_ACCU_BITS : 0,
87*9a19cd78SMatthias Ringwald         },
88*9a19cd78SMatthias Ringwald         .ac = {
89*9a19cd78SMatthias Ringwald             .range = 0xffffff,
90*9a19cd78SMatthias Ringwald             .cache = -1
91*9a19cd78SMatthias Ringwald         },
92*9a19cd78SMatthias Ringwald         .buffer = {
93*9a19cd78SMatthias Ringwald             .start = (uint8_t *)buffer, .end  = (uint8_t *)buffer + len,
94*9a19cd78SMatthias Ringwald             .p_fw  = (uint8_t *)buffer, .p_bw = (uint8_t *)buffer + len,
95*9a19cd78SMatthias Ringwald         }
96*9a19cd78SMatthias Ringwald     };
97*9a19cd78SMatthias Ringwald 
98*9a19cd78SMatthias Ringwald     if (mode == LC3_BITS_MODE_READ) {
99*9a19cd78SMatthias Ringwald         struct lc3_bits_ac *ac = &bits->ac;
100*9a19cd78SMatthias Ringwald         struct lc3_bits_accu *accu = &bits->accu;
101*9a19cd78SMatthias Ringwald         struct lc3_bits_buffer *buffer = &bits->buffer;
102*9a19cd78SMatthias Ringwald 
103*9a19cd78SMatthias Ringwald         ac->low  = ac_get(buffer) << 16;
104*9a19cd78SMatthias Ringwald         ac->low |= ac_get(buffer) <<  8;
105*9a19cd78SMatthias Ringwald         ac->low |= ac_get(buffer);
106*9a19cd78SMatthias Ringwald 
107*9a19cd78SMatthias Ringwald         accu_load(accu, buffer);
108*9a19cd78SMatthias Ringwald     }
109*9a19cd78SMatthias Ringwald }
110*9a19cd78SMatthias Ringwald 
111*9a19cd78SMatthias Ringwald /**
112*9a19cd78SMatthias Ringwald  * Return number of bits left in the bitstream
113*9a19cd78SMatthias Ringwald  */
114*9a19cd78SMatthias Ringwald int lc3_get_bits_left(const struct lc3_bits *bits)
115*9a19cd78SMatthias Ringwald {
116*9a19cd78SMatthias Ringwald     return LC3_MAX(get_bits_left(bits), 0);
117*9a19cd78SMatthias Ringwald }
118*9a19cd78SMatthias Ringwald 
119*9a19cd78SMatthias Ringwald /**
120*9a19cd78SMatthias Ringwald  * Return number of bits left in the bitstream
121*9a19cd78SMatthias Ringwald  */
122*9a19cd78SMatthias Ringwald int lc3_check_bits(const struct lc3_bits *bits)
123*9a19cd78SMatthias Ringwald {
124*9a19cd78SMatthias Ringwald     const struct lc3_bits_ac *ac = &bits->ac;
125*9a19cd78SMatthias Ringwald 
126*9a19cd78SMatthias Ringwald     return -(get_bits_left(bits) < 0 || ac->error);
127*9a19cd78SMatthias Ringwald }
128*9a19cd78SMatthias Ringwald 
129*9a19cd78SMatthias Ringwald 
130*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
131*9a19cd78SMatthias Ringwald  *  Writing
132*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
133*9a19cd78SMatthias Ringwald 
134*9a19cd78SMatthias Ringwald /**
135*9a19cd78SMatthias Ringwald  * Flush the bits accumulator
136*9a19cd78SMatthias Ringwald  * accu            Bitstream accumulator
137*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
138*9a19cd78SMatthias Ringwald  */
139*9a19cd78SMatthias Ringwald static inline void accu_flush(
140*9a19cd78SMatthias Ringwald     struct lc3_bits_accu *accu, struct lc3_bits_buffer *buffer)
141*9a19cd78SMatthias Ringwald {
142*9a19cd78SMatthias Ringwald     int nbytes = LC3_MIN(accu->n >> 3,
143*9a19cd78SMatthias Ringwald         LC3_MAX(buffer->p_bw - buffer->p_fw, 0));
144*9a19cd78SMatthias Ringwald 
145*9a19cd78SMatthias Ringwald     accu->n -= 8 * nbytes;
146*9a19cd78SMatthias Ringwald 
147*9a19cd78SMatthias Ringwald     for ( ; nbytes; accu->v >>= 8, nbytes--)
148*9a19cd78SMatthias Ringwald         *(--buffer->p_bw) = accu->v & 0xff;
149*9a19cd78SMatthias Ringwald 
150*9a19cd78SMatthias Ringwald     if (accu->n >= 8)
151*9a19cd78SMatthias Ringwald         accu->n = 0;
152*9a19cd78SMatthias Ringwald }
153*9a19cd78SMatthias Ringwald 
154*9a19cd78SMatthias Ringwald /**
155*9a19cd78SMatthias Ringwald  * Arithmetic coder put byte
156*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
157*9a19cd78SMatthias Ringwald  * byte            Byte to output
158*9a19cd78SMatthias Ringwald  */
159*9a19cd78SMatthias Ringwald static inline void ac_put(struct lc3_bits_buffer *buffer, int byte)
160*9a19cd78SMatthias Ringwald {
161*9a19cd78SMatthias Ringwald     if (buffer->p_fw < buffer->end)
162*9a19cd78SMatthias Ringwald         *(buffer->p_fw++) = byte;
163*9a19cd78SMatthias Ringwald }
164*9a19cd78SMatthias Ringwald 
165*9a19cd78SMatthias Ringwald /**
166*9a19cd78SMatthias Ringwald  * Arithmetic coder range shift
167*9a19cd78SMatthias Ringwald  * ac              Arithmetic coder
168*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
169*9a19cd78SMatthias Ringwald  */
170*9a19cd78SMatthias Ringwald static inline void ac_shift(
171*9a19cd78SMatthias Ringwald     struct lc3_bits_ac *ac, struct lc3_bits_buffer *buffer)
172*9a19cd78SMatthias Ringwald {
173*9a19cd78SMatthias Ringwald     if (ac->low < 0xff0000 || ac->carry)
174*9a19cd78SMatthias Ringwald     {
175*9a19cd78SMatthias Ringwald         if (ac->cache >= 0)
176*9a19cd78SMatthias Ringwald             ac_put(buffer, ac->cache + ac->carry);
177*9a19cd78SMatthias Ringwald 
178*9a19cd78SMatthias Ringwald         for ( ; ac->carry_count > 0; ac->carry_count--)
179*9a19cd78SMatthias Ringwald             ac_put(buffer, ac->carry ? 0x00 : 0xff);
180*9a19cd78SMatthias Ringwald 
181*9a19cd78SMatthias Ringwald          ac->cache = ac->low >> 16;
182*9a19cd78SMatthias Ringwald          ac->carry = 0;
183*9a19cd78SMatthias Ringwald     }
184*9a19cd78SMatthias Ringwald     else
185*9a19cd78SMatthias Ringwald          ac->carry_count++;
186*9a19cd78SMatthias Ringwald 
187*9a19cd78SMatthias Ringwald     ac->low = (ac->low << 8) & 0xffffff;
188*9a19cd78SMatthias Ringwald }
189*9a19cd78SMatthias Ringwald 
190*9a19cd78SMatthias Ringwald /**
191*9a19cd78SMatthias Ringwald  * Arithmetic coder termination
192*9a19cd78SMatthias Ringwald  * ac              Arithmetic coder
193*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
194*9a19cd78SMatthias Ringwald  * end_val/nbits   End value and count of bits to terminate (1 to 8)
195*9a19cd78SMatthias Ringwald  */
196*9a19cd78SMatthias Ringwald static void ac_terminate(struct lc3_bits_ac *ac,
197*9a19cd78SMatthias Ringwald     struct lc3_bits_buffer *buffer)
198*9a19cd78SMatthias Ringwald {
199*9a19cd78SMatthias Ringwald     int nbits = 25 - ac_get_range_bits(ac);
200*9a19cd78SMatthias Ringwald     unsigned mask = 0xffffff >> nbits;
201*9a19cd78SMatthias Ringwald     unsigned val  = ac->low + mask;
202*9a19cd78SMatthias Ringwald     unsigned high = ac->low + ac->range;
203*9a19cd78SMatthias Ringwald 
204*9a19cd78SMatthias Ringwald     bool over_val  = val  >> 24;
205*9a19cd78SMatthias Ringwald     bool over_high = high >> 24;
206*9a19cd78SMatthias Ringwald 
207*9a19cd78SMatthias Ringwald     val  = (val  & 0xffffff) & ~mask;
208*9a19cd78SMatthias Ringwald     high = (high & 0xffffff);
209*9a19cd78SMatthias Ringwald 
210*9a19cd78SMatthias Ringwald     if (over_val == over_high) {
211*9a19cd78SMatthias Ringwald 
212*9a19cd78SMatthias Ringwald         if (val + mask >= high) {
213*9a19cd78SMatthias Ringwald             nbits++;
214*9a19cd78SMatthias Ringwald             mask >>= 1;
215*9a19cd78SMatthias Ringwald             val = ((ac->low + mask) & 0xffffff) & ~mask;
216*9a19cd78SMatthias Ringwald         }
217*9a19cd78SMatthias Ringwald 
218*9a19cd78SMatthias Ringwald         ac->carry |= val < ac->low;
219*9a19cd78SMatthias Ringwald     }
220*9a19cd78SMatthias Ringwald 
221*9a19cd78SMatthias Ringwald     ac->low = val;
222*9a19cd78SMatthias Ringwald 
223*9a19cd78SMatthias Ringwald     for (; nbits > 8; nbits -= 8)
224*9a19cd78SMatthias Ringwald         ac_shift(ac, buffer);
225*9a19cd78SMatthias Ringwald     ac_shift(ac, buffer);
226*9a19cd78SMatthias Ringwald 
227*9a19cd78SMatthias Ringwald     int end_val = ac->cache >> (8 - nbits);
228*9a19cd78SMatthias Ringwald 
229*9a19cd78SMatthias Ringwald     if (ac->carry_count) {
230*9a19cd78SMatthias Ringwald         ac_put(buffer, ac->cache);
231*9a19cd78SMatthias Ringwald         for ( ; ac->carry_count > 1; ac->carry_count--)
232*9a19cd78SMatthias Ringwald             ac_put(buffer, 0xff);
233*9a19cd78SMatthias Ringwald 
234*9a19cd78SMatthias Ringwald         end_val = nbits < 8 ? 0 : 0xff;
235*9a19cd78SMatthias Ringwald     }
236*9a19cd78SMatthias Ringwald 
237*9a19cd78SMatthias Ringwald     if (buffer->p_fw < buffer->end) {
238*9a19cd78SMatthias Ringwald         *buffer->p_fw &= 0xff >> nbits;
239*9a19cd78SMatthias Ringwald         *buffer->p_fw |= end_val << (8 - nbits);
240*9a19cd78SMatthias Ringwald     }
241*9a19cd78SMatthias Ringwald }
242*9a19cd78SMatthias Ringwald 
243*9a19cd78SMatthias Ringwald /**
244*9a19cd78SMatthias Ringwald  * Flush and terminate bitstream
245*9a19cd78SMatthias Ringwald  */
246*9a19cd78SMatthias Ringwald void lc3_flush_bits(struct lc3_bits *bits)
247*9a19cd78SMatthias Ringwald {
248*9a19cd78SMatthias Ringwald     struct lc3_bits_ac *ac = &bits->ac;
249*9a19cd78SMatthias Ringwald     struct lc3_bits_accu *accu = &bits->accu;
250*9a19cd78SMatthias Ringwald     struct lc3_bits_buffer *buffer = &bits->buffer;
251*9a19cd78SMatthias Ringwald 
252*9a19cd78SMatthias Ringwald     int nleft = buffer->p_bw - buffer->p_fw;
253*9a19cd78SMatthias Ringwald     for (int n = 8 * nleft - accu->n; n > 0; n -= 32)
254*9a19cd78SMatthias Ringwald         lc3_put_bits(bits, 0, LC3_MIN(n, 32));
255*9a19cd78SMatthias Ringwald 
256*9a19cd78SMatthias Ringwald     accu_flush(accu, buffer);
257*9a19cd78SMatthias Ringwald 
258*9a19cd78SMatthias Ringwald     ac_terminate(ac, buffer);
259*9a19cd78SMatthias Ringwald }
260*9a19cd78SMatthias Ringwald 
261*9a19cd78SMatthias Ringwald /**
262*9a19cd78SMatthias Ringwald  * Write from 1 to 32 bits,
263*9a19cd78SMatthias Ringwald  * exceeding the capacity of the accumulator
264*9a19cd78SMatthias Ringwald  */
265*9a19cd78SMatthias Ringwald void lc3_put_bits_generic(struct lc3_bits *bits, unsigned v, int n)
266*9a19cd78SMatthias Ringwald {
267*9a19cd78SMatthias Ringwald     struct lc3_bits_accu *accu = &bits->accu;
268*9a19cd78SMatthias Ringwald 
269*9a19cd78SMatthias Ringwald     /* --- Fulfill accumulator and flush -- */
270*9a19cd78SMatthias Ringwald 
271*9a19cd78SMatthias Ringwald     int n1 = LC3_MIN(LC3_ACCU_BITS - accu->n, n);
272*9a19cd78SMatthias Ringwald     if (n1) {
273*9a19cd78SMatthias Ringwald         accu->v |= v << accu->n;
274*9a19cd78SMatthias Ringwald         accu->n = LC3_ACCU_BITS;
275*9a19cd78SMatthias Ringwald     }
276*9a19cd78SMatthias Ringwald 
277*9a19cd78SMatthias Ringwald     accu_flush(accu, &bits->buffer);
278*9a19cd78SMatthias Ringwald 
279*9a19cd78SMatthias Ringwald     /* --- Accumulate remaining bits -- */
280*9a19cd78SMatthias Ringwald 
281*9a19cd78SMatthias Ringwald     accu->v = v >> n1;
282*9a19cd78SMatthias Ringwald     accu->n = n - n1;
283*9a19cd78SMatthias Ringwald }
284*9a19cd78SMatthias Ringwald 
285*9a19cd78SMatthias Ringwald /**
286*9a19cd78SMatthias Ringwald  * Arithmetic coder renormalization
287*9a19cd78SMatthias Ringwald  */
288*9a19cd78SMatthias Ringwald void lc3_ac_write_renorm(struct lc3_bits *bits)
289*9a19cd78SMatthias Ringwald {
290*9a19cd78SMatthias Ringwald     struct lc3_bits_ac *ac = &bits->ac;
291*9a19cd78SMatthias Ringwald 
292*9a19cd78SMatthias Ringwald     for ( ; ac->range < 0x10000; ac->range <<= 8)
293*9a19cd78SMatthias Ringwald         ac_shift(ac, &bits->buffer);
294*9a19cd78SMatthias Ringwald }
295*9a19cd78SMatthias Ringwald 
296*9a19cd78SMatthias Ringwald 
297*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
298*9a19cd78SMatthias Ringwald  *  Reading
299*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
300*9a19cd78SMatthias Ringwald 
301*9a19cd78SMatthias Ringwald /**
302*9a19cd78SMatthias Ringwald  * Arithmetic coder get byte
303*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
304*9a19cd78SMatthias Ringwald  * return          Byte read, 0 on overflow
305*9a19cd78SMatthias Ringwald  */
306*9a19cd78SMatthias Ringwald static inline int ac_get(struct lc3_bits_buffer *buffer)
307*9a19cd78SMatthias Ringwald {
308*9a19cd78SMatthias Ringwald     return buffer->p_fw < buffer->end ? *(buffer->p_fw++) : 0;
309*9a19cd78SMatthias Ringwald }
310*9a19cd78SMatthias Ringwald 
311*9a19cd78SMatthias Ringwald /**
312*9a19cd78SMatthias Ringwald  * Load the accumulator
313*9a19cd78SMatthias Ringwald  * accu            Bitstream accumulator
314*9a19cd78SMatthias Ringwald  * buffer          Bitstream buffer
315*9a19cd78SMatthias Ringwald  */
316*9a19cd78SMatthias Ringwald static inline void accu_load(struct lc3_bits_accu *accu,
317*9a19cd78SMatthias Ringwald     struct lc3_bits_buffer *buffer)
318*9a19cd78SMatthias Ringwald {
319*9a19cd78SMatthias Ringwald     int nbytes = LC3_MIN(accu->n >> 3, buffer->p_bw - buffer->start);
320*9a19cd78SMatthias Ringwald 
321*9a19cd78SMatthias Ringwald     accu->n -= 8 * nbytes;
322*9a19cd78SMatthias Ringwald 
323*9a19cd78SMatthias Ringwald     for ( ; nbytes; nbytes--) {
324*9a19cd78SMatthias Ringwald         accu->v >>= 8;
325*9a19cd78SMatthias Ringwald         accu->v |= *(--buffer->p_bw) << (LC3_ACCU_BITS - 8);
326*9a19cd78SMatthias Ringwald     }
327*9a19cd78SMatthias Ringwald 
328*9a19cd78SMatthias Ringwald     if (accu->n >= 8) {
329*9a19cd78SMatthias Ringwald         accu->nover = LC3_MIN(accu->nover + accu->n, LC3_ACCU_BITS);
330*9a19cd78SMatthias Ringwald         accu->v >>= accu->n;
331*9a19cd78SMatthias Ringwald         accu->n = 0;
332*9a19cd78SMatthias Ringwald     }
333*9a19cd78SMatthias Ringwald }
334*9a19cd78SMatthias Ringwald 
335*9a19cd78SMatthias Ringwald /**
336*9a19cd78SMatthias Ringwald  * Read from 1 to 32 bits,
337*9a19cd78SMatthias Ringwald  * exceeding the capacity of the accumulator
338*9a19cd78SMatthias Ringwald  */
339*9a19cd78SMatthias Ringwald unsigned lc3_get_bits_generic(struct lc3_bits *bits, int n)
340*9a19cd78SMatthias Ringwald {
341*9a19cd78SMatthias Ringwald     struct lc3_bits_accu *accu = &bits->accu;
342*9a19cd78SMatthias Ringwald     struct lc3_bits_buffer *buffer = &bits->buffer;
343*9a19cd78SMatthias Ringwald 
344*9a19cd78SMatthias Ringwald     /* --- Fulfill accumulator and read -- */
345*9a19cd78SMatthias Ringwald 
346*9a19cd78SMatthias Ringwald     accu_load(accu, buffer);
347*9a19cd78SMatthias Ringwald 
348*9a19cd78SMatthias Ringwald     int n1 = LC3_MIN(LC3_ACCU_BITS - accu->n, n);
349*9a19cd78SMatthias Ringwald     unsigned v = (accu->v >> accu->n) & ((1u << n1) - 1);
350*9a19cd78SMatthias Ringwald     accu->n += n1;
351*9a19cd78SMatthias Ringwald 
352*9a19cd78SMatthias Ringwald     /* --- Second round --- */
353*9a19cd78SMatthias Ringwald 
354*9a19cd78SMatthias Ringwald     int n2 = n - n1;
355*9a19cd78SMatthias Ringwald 
356*9a19cd78SMatthias Ringwald     if (n2) {
357*9a19cd78SMatthias Ringwald         accu_load(accu, buffer);
358*9a19cd78SMatthias Ringwald 
359*9a19cd78SMatthias Ringwald         v |= ((accu->v >> accu->n) & ((1u << n2) - 1)) << n1;
360*9a19cd78SMatthias Ringwald         accu->n += n2;
361*9a19cd78SMatthias Ringwald     }
362*9a19cd78SMatthias Ringwald 
363*9a19cd78SMatthias Ringwald     return v;
364*9a19cd78SMatthias Ringwald }
365*9a19cd78SMatthias Ringwald 
366*9a19cd78SMatthias Ringwald /**
367*9a19cd78SMatthias Ringwald  * Arithmetic coder renormalization
368*9a19cd78SMatthias Ringwald  */
369*9a19cd78SMatthias Ringwald void lc3_ac_read_renorm(struct lc3_bits *bits)
370*9a19cd78SMatthias Ringwald {
371*9a19cd78SMatthias Ringwald     struct lc3_bits_ac *ac = &bits->ac;
372*9a19cd78SMatthias Ringwald 
373*9a19cd78SMatthias Ringwald     for ( ; ac->range < 0x10000; ac->range <<= 8)
374*9a19cd78SMatthias Ringwald         ac->low = ((ac->low << 8) | ac_get(&bits->buffer)) & 0xffffff;
375*9a19cd78SMatthias Ringwald }
376