xref: /aosp_15_r20/external/liblc3/src/bits.h (revision 49fe348c0058011ee60b6957cdd9d52742df84bc)
1*49fe348cSAndroid Build Coastguard Worker /******************************************************************************
2*49fe348cSAndroid Build Coastguard Worker  *
3*49fe348cSAndroid Build Coastguard Worker  *  Copyright 2022 Google LLC
4*49fe348cSAndroid Build Coastguard Worker  *
5*49fe348cSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*49fe348cSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*49fe348cSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*49fe348cSAndroid Build Coastguard Worker  *
9*49fe348cSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*49fe348cSAndroid Build Coastguard Worker  *
11*49fe348cSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*49fe348cSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*49fe348cSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*49fe348cSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*49fe348cSAndroid Build Coastguard Worker  *  limitations under the License.
16*49fe348cSAndroid Build Coastguard Worker  *
17*49fe348cSAndroid Build Coastguard Worker  ******************************************************************************/
18*49fe348cSAndroid Build Coastguard Worker 
19*49fe348cSAndroid Build Coastguard Worker /**
20*49fe348cSAndroid Build Coastguard Worker  * The bitstream is written by the 2 ends of the buffer :
21*49fe348cSAndroid Build Coastguard Worker  *
22*49fe348cSAndroid Build Coastguard Worker  * - Arthmetic coder put bits while increasing memory addresses
23*49fe348cSAndroid Build Coastguard Worker  *   in the buffer (forward)
24*49fe348cSAndroid Build Coastguard Worker  *
25*49fe348cSAndroid Build Coastguard Worker  * - Plain bits are puts starting the end of the buffer, with memeory
26*49fe348cSAndroid Build Coastguard Worker  *   addresses decreasing (backward)
27*49fe348cSAndroid Build Coastguard Worker  *
28*49fe348cSAndroid Build Coastguard Worker  *       .---------------------------------------------------.
29*49fe348cSAndroid Build Coastguard Worker  *       | > > > > > > > > > > :         : < < < < < < < < < |
30*49fe348cSAndroid Build Coastguard Worker  *       '---------------------------------------------------'
31*49fe348cSAndroid Build Coastguard Worker  *       |---------------------> - - - - - - - - - - - - - ->|
32*49fe348cSAndroid Build Coastguard Worker  *                              |< - - - <-------------------|
33*49fe348cSAndroid Build Coastguard Worker  *          Arithmetic coding                  Plain bits
34*49fe348cSAndroid Build Coastguard Worker  *          `lc3_put_symbol()`               `lc3_put_bits()`
35*49fe348cSAndroid Build Coastguard Worker  *
36*49fe348cSAndroid Build Coastguard Worker  * - The forward writing is protected against buffer overflow, it cannot
37*49fe348cSAndroid Build Coastguard Worker  *   write after the buffer, but can overwrite plain bits previously
38*49fe348cSAndroid Build Coastguard Worker  *   written in the buffer.
39*49fe348cSAndroid Build Coastguard Worker  *
40*49fe348cSAndroid Build Coastguard Worker  * - The backward writing is protected against overwrite of the arithmetic
41*49fe348cSAndroid Build Coastguard Worker  *   coder bitstream. In such way, the backward bitstream is always limited
42*49fe348cSAndroid Build Coastguard Worker  *   by the aritmetic coder bitstream, and can be overwritten by him.
43*49fe348cSAndroid Build Coastguard Worker  *
44*49fe348cSAndroid Build Coastguard Worker  *       .---------------------------------------------------.
45*49fe348cSAndroid Build Coastguard Worker  *       | > > > > > > > > > > :         : < < < < < < < < < |
46*49fe348cSAndroid Build Coastguard Worker  *       '---------------------------------------------------'
47*49fe348cSAndroid Build Coastguard Worker  *       |---------------------> - - - - - - - - - - - - - ->|
48*49fe348cSAndroid Build Coastguard Worker  *       |< - - - - - - - - - - -  - - - <-------------------|
49*49fe348cSAndroid Build Coastguard Worker  *          Arithmetic coding                  Plain bits
50*49fe348cSAndroid Build Coastguard Worker  *          `lc3_get_symbol()`               `lc3_get_bits()`
51*49fe348cSAndroid Build Coastguard Worker  *
52*49fe348cSAndroid Build Coastguard Worker  * - Reading is limited to read of the complementary end of the buffer.
53*49fe348cSAndroid Build Coastguard Worker  *
54*49fe348cSAndroid Build Coastguard Worker  * - The procedure `lc3_check_bits()` returns indication that read has been
55*49fe348cSAndroid Build Coastguard Worker  *   made crossing the other bit plane.
56*49fe348cSAndroid Build Coastguard Worker  *
57*49fe348cSAndroid Build Coastguard Worker  */
58*49fe348cSAndroid Build Coastguard Worker 
59*49fe348cSAndroid Build Coastguard Worker #ifndef __LC3_BITS_H
60*49fe348cSAndroid Build Coastguard Worker #define __LC3_BITS_H
61*49fe348cSAndroid Build Coastguard Worker 
62*49fe348cSAndroid Build Coastguard Worker #include "common.h"
63*49fe348cSAndroid Build Coastguard Worker 
64*49fe348cSAndroid Build Coastguard Worker 
65*49fe348cSAndroid Build Coastguard Worker /**
66*49fe348cSAndroid Build Coastguard Worker  * Bitstream mode
67*49fe348cSAndroid Build Coastguard Worker  */
68*49fe348cSAndroid Build Coastguard Worker 
69*49fe348cSAndroid Build Coastguard Worker enum lc3_bits_mode {
70*49fe348cSAndroid Build Coastguard Worker     LC3_BITS_MODE_READ,
71*49fe348cSAndroid Build Coastguard Worker     LC3_BITS_MODE_WRITE,
72*49fe348cSAndroid Build Coastguard Worker };
73*49fe348cSAndroid Build Coastguard Worker 
74*49fe348cSAndroid Build Coastguard Worker /**
75*49fe348cSAndroid Build Coastguard Worker  * Arithmetic coder symbol interval
76*49fe348cSAndroid Build Coastguard Worker  * The model split the interval in 17 symbols
77*49fe348cSAndroid Build Coastguard Worker  */
78*49fe348cSAndroid Build Coastguard Worker 
79*49fe348cSAndroid Build Coastguard Worker struct lc3_ac_symbol {
80*49fe348cSAndroid Build Coastguard Worker     uint16_t low   : 16;
81*49fe348cSAndroid Build Coastguard Worker     uint16_t range : 16;
82*49fe348cSAndroid Build Coastguard Worker };
83*49fe348cSAndroid Build Coastguard Worker 
84*49fe348cSAndroid Build Coastguard Worker struct lc3_ac_model {
85*49fe348cSAndroid Build Coastguard Worker     struct lc3_ac_symbol s[17];
86*49fe348cSAndroid Build Coastguard Worker };
87*49fe348cSAndroid Build Coastguard Worker 
88*49fe348cSAndroid Build Coastguard Worker /**
89*49fe348cSAndroid Build Coastguard Worker  * Bitstream context
90*49fe348cSAndroid Build Coastguard Worker  */
91*49fe348cSAndroid Build Coastguard Worker 
92*49fe348cSAndroid Build Coastguard Worker #define LC3_ACCU_BITS (int)(8 * sizeof(unsigned))
93*49fe348cSAndroid Build Coastguard Worker 
94*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_accu {
95*49fe348cSAndroid Build Coastguard Worker     unsigned v;
96*49fe348cSAndroid Build Coastguard Worker     int n, nover;
97*49fe348cSAndroid Build Coastguard Worker };
98*49fe348cSAndroid Build Coastguard Worker 
99*49fe348cSAndroid Build Coastguard Worker #define LC3_AC_BITS (int)(24)
100*49fe348cSAndroid Build Coastguard Worker 
101*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_ac {
102*49fe348cSAndroid Build Coastguard Worker     unsigned low, range;
103*49fe348cSAndroid Build Coastguard Worker     int cache, carry, carry_count;
104*49fe348cSAndroid Build Coastguard Worker     bool error;
105*49fe348cSAndroid Build Coastguard Worker };
106*49fe348cSAndroid Build Coastguard Worker 
107*49fe348cSAndroid Build Coastguard Worker struct lc3_bits_buffer {
108*49fe348cSAndroid Build Coastguard Worker     const uint8_t *start, *end;
109*49fe348cSAndroid Build Coastguard Worker     uint8_t *p_fw, *p_bw;
110*49fe348cSAndroid Build Coastguard Worker };
111*49fe348cSAndroid Build Coastguard Worker 
112*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_bits {
113*49fe348cSAndroid Build Coastguard Worker     enum lc3_bits_mode mode;
114*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_ac ac;
115*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_accu accu;
116*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_buffer buffer;
117*49fe348cSAndroid Build Coastguard Worker } lc3_bits_t;
118*49fe348cSAndroid Build Coastguard Worker 
119*49fe348cSAndroid Build Coastguard Worker 
120*49fe348cSAndroid Build Coastguard Worker /**
121*49fe348cSAndroid Build Coastguard Worker  * Setup bitstream reading/writing
122*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
123*49fe348cSAndroid Build Coastguard Worker  * mode            Either READ or WRITE mode
124*49fe348cSAndroid Build Coastguard Worker  * buffer, len     Output buffer and length (in bytes)
125*49fe348cSAndroid Build Coastguard Worker  */
126*49fe348cSAndroid Build Coastguard Worker void lc3_setup_bits(lc3_bits_t *bits,
127*49fe348cSAndroid Build Coastguard Worker     enum lc3_bits_mode mode, void *buffer, int len);
128*49fe348cSAndroid Build Coastguard Worker 
129*49fe348cSAndroid Build Coastguard Worker /**
130*49fe348cSAndroid Build Coastguard Worker  * Return number of bits left in the bitstream
131*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
132*49fe348cSAndroid Build Coastguard Worker  * return          Number of bits left
133*49fe348cSAndroid Build Coastguard Worker  */
134*49fe348cSAndroid Build Coastguard Worker int lc3_get_bits_left(const lc3_bits_t *bits);
135*49fe348cSAndroid Build Coastguard Worker 
136*49fe348cSAndroid Build Coastguard Worker /**
137*49fe348cSAndroid Build Coastguard Worker  * Check if error occured on bitstream reading/writing
138*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
139*49fe348cSAndroid Build Coastguard Worker  * return          0: Ok  -1: Bitstream overflow or AC reading error
140*49fe348cSAndroid Build Coastguard Worker  */
141*49fe348cSAndroid Build Coastguard Worker int lc3_check_bits(const lc3_bits_t *bits);
142*49fe348cSAndroid Build Coastguard Worker 
143*49fe348cSAndroid Build Coastguard Worker /**
144*49fe348cSAndroid Build Coastguard Worker  * Put a bit
145*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
146*49fe348cSAndroid Build Coastguard Worker  * v               Bit value, 0 or 1
147*49fe348cSAndroid Build Coastguard Worker  */
148*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_bit(lc3_bits_t *bits, int v);
149*49fe348cSAndroid Build Coastguard Worker 
150*49fe348cSAndroid Build Coastguard Worker /**
151*49fe348cSAndroid Build Coastguard Worker  * Put from 1 to 32 bits
152*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
153*49fe348cSAndroid Build Coastguard Worker  * v, n            Value, in range 0 to 2^n - 1, and bits count (1 to 32)
154*49fe348cSAndroid Build Coastguard Worker  */
155*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_bits(lc3_bits_t *bits, unsigned v, int n);
156*49fe348cSAndroid Build Coastguard Worker 
157*49fe348cSAndroid Build Coastguard Worker /**
158*49fe348cSAndroid Build Coastguard Worker  * Put arithmetic coder symbol
159*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
160*49fe348cSAndroid Build Coastguard Worker  * model, s        Model distribution and symbol value
161*49fe348cSAndroid Build Coastguard Worker  */
162*49fe348cSAndroid Build Coastguard Worker static inline void lc3_put_symbol(lc3_bits_t *bits,
163*49fe348cSAndroid Build Coastguard Worker     const struct lc3_ac_model *model, unsigned s);
164*49fe348cSAndroid Build Coastguard Worker 
165*49fe348cSAndroid Build Coastguard Worker /**
166*49fe348cSAndroid Build Coastguard Worker  * Flush and terminate bitstream writing
167*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
168*49fe348cSAndroid Build Coastguard Worker  */
169*49fe348cSAndroid Build Coastguard Worker void lc3_flush_bits(lc3_bits_t *bits);
170*49fe348cSAndroid Build Coastguard Worker 
171*49fe348cSAndroid Build Coastguard Worker /**
172*49fe348cSAndroid Build Coastguard Worker  * Get a bit
173*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
174*49fe348cSAndroid Build Coastguard Worker  */
175*49fe348cSAndroid Build Coastguard Worker static inline int lc3_get_bit(lc3_bits_t *bits);
176*49fe348cSAndroid Build Coastguard Worker 
177*49fe348cSAndroid Build Coastguard Worker /**
178*49fe348cSAndroid Build Coastguard Worker  * Get from 1 to 32 bits
179*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
180*49fe348cSAndroid Build Coastguard Worker  * n               Number of bits to read (1 to 32)
181*49fe348cSAndroid Build Coastguard Worker  * return          The value read
182*49fe348cSAndroid Build Coastguard Worker  */
183*49fe348cSAndroid Build Coastguard Worker static inline unsigned lc3_get_bits(lc3_bits_t *bits,  int n);
184*49fe348cSAndroid Build Coastguard Worker 
185*49fe348cSAndroid Build Coastguard Worker /**
186*49fe348cSAndroid Build Coastguard Worker  * Get arithmetic coder symbol
187*49fe348cSAndroid Build Coastguard Worker  * bits            Bitstream context
188*49fe348cSAndroid Build Coastguard Worker  * model           Model distribution
189*49fe348cSAndroid Build Coastguard Worker  * return          The value read
190*49fe348cSAndroid Build Coastguard Worker  */
191*49fe348cSAndroid Build Coastguard Worker static inline unsigned lc3_get_symbol(lc3_bits_t *bits,
192*49fe348cSAndroid Build Coastguard Worker     const struct lc3_ac_model *model);
193*49fe348cSAndroid Build Coastguard Worker 
194*49fe348cSAndroid Build Coastguard Worker 
195*49fe348cSAndroid Build Coastguard Worker 
196*49fe348cSAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
197*49fe348cSAndroid Build Coastguard Worker  *  Inline implementations
198*49fe348cSAndroid Build Coastguard Worker  * -------------------------------------------------------------------------- */
199*49fe348cSAndroid Build Coastguard Worker 
200*49fe348cSAndroid Build Coastguard Worker void lc3_put_bits_generic(lc3_bits_t *bits, unsigned v, int n);
201*49fe348cSAndroid Build Coastguard Worker unsigned lc3_get_bits_generic(struct lc3_bits *bits, int n);
202*49fe348cSAndroid Build Coastguard Worker 
203*49fe348cSAndroid Build Coastguard Worker void lc3_ac_read_renorm(lc3_bits_t *bits);
204*49fe348cSAndroid Build Coastguard Worker void lc3_ac_write_renorm(lc3_bits_t *bits);
205*49fe348cSAndroid Build Coastguard Worker 
206*49fe348cSAndroid Build Coastguard Worker 
207*49fe348cSAndroid Build Coastguard Worker /**
208*49fe348cSAndroid Build Coastguard Worker  * Put a bit
209*49fe348cSAndroid Build Coastguard Worker  */
lc3_put_bit(lc3_bits_t * bits,int v)210*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_bit(lc3_bits_t *bits, int v)
211*49fe348cSAndroid Build Coastguard Worker {
212*49fe348cSAndroid Build Coastguard Worker     lc3_put_bits(bits, v, 1);
213*49fe348cSAndroid Build Coastguard Worker }
214*49fe348cSAndroid Build Coastguard Worker 
215*49fe348cSAndroid Build Coastguard Worker /**
216*49fe348cSAndroid Build Coastguard Worker  * Put from 1 to 32 bits
217*49fe348cSAndroid Build Coastguard Worker  */
lc3_put_bits(struct lc3_bits * bits,unsigned v,int n)218*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_bits(
219*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits *bits, unsigned v, int n)
220*49fe348cSAndroid Build Coastguard Worker {
221*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_accu *accu = &bits->accu;
222*49fe348cSAndroid Build Coastguard Worker 
223*49fe348cSAndroid Build Coastguard Worker     if (accu->n + n <= LC3_ACCU_BITS) {
224*49fe348cSAndroid Build Coastguard Worker         accu->v |= v << accu->n;
225*49fe348cSAndroid Build Coastguard Worker         accu->n += n;
226*49fe348cSAndroid Build Coastguard Worker     } else {
227*49fe348cSAndroid Build Coastguard Worker         lc3_put_bits_generic(bits, v, n);
228*49fe348cSAndroid Build Coastguard Worker     }
229*49fe348cSAndroid Build Coastguard Worker }
230*49fe348cSAndroid Build Coastguard Worker 
231*49fe348cSAndroid Build Coastguard Worker /**
232*49fe348cSAndroid Build Coastguard Worker  * Get a bit
233*49fe348cSAndroid Build Coastguard Worker  */
lc3_get_bit(lc3_bits_t * bits)234*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline int lc3_get_bit(lc3_bits_t *bits)
235*49fe348cSAndroid Build Coastguard Worker {
236*49fe348cSAndroid Build Coastguard Worker     return lc3_get_bits(bits, 1);
237*49fe348cSAndroid Build Coastguard Worker }
238*49fe348cSAndroid Build Coastguard Worker 
239*49fe348cSAndroid Build Coastguard Worker /**
240*49fe348cSAndroid Build Coastguard Worker  * Get from 1 to 32 bits
241*49fe348cSAndroid Build Coastguard Worker  */
lc3_get_bits(struct lc3_bits * bits,int n)242*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline unsigned lc3_get_bits(struct lc3_bits *bits, int n)
243*49fe348cSAndroid Build Coastguard Worker {
244*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_accu *accu = &bits->accu;
245*49fe348cSAndroid Build Coastguard Worker 
246*49fe348cSAndroid Build Coastguard Worker     if (accu->n + n <= LC3_ACCU_BITS) {
247*49fe348cSAndroid Build Coastguard Worker         int v = (accu->v >> accu->n) & ((1u << n) - 1);
248*49fe348cSAndroid Build Coastguard Worker         return (accu->n += n), v;
249*49fe348cSAndroid Build Coastguard Worker     }
250*49fe348cSAndroid Build Coastguard Worker     else {
251*49fe348cSAndroid Build Coastguard Worker         return lc3_get_bits_generic(bits, n);
252*49fe348cSAndroid Build Coastguard Worker     }
253*49fe348cSAndroid Build Coastguard Worker }
254*49fe348cSAndroid Build Coastguard Worker 
255*49fe348cSAndroid Build Coastguard Worker /**
256*49fe348cSAndroid Build Coastguard Worker  * Put arithmetic coder symbol
257*49fe348cSAndroid Build Coastguard Worker  */
lc3_put_symbol(struct lc3_bits * bits,const struct lc3_ac_model * model,unsigned s)258*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline void lc3_put_symbol(
259*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits *bits, const struct lc3_ac_model *model, unsigned s)
260*49fe348cSAndroid Build Coastguard Worker {
261*49fe348cSAndroid Build Coastguard Worker     const struct lc3_ac_symbol *symbols = model->s;
262*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_ac *ac = &bits->ac;
263*49fe348cSAndroid Build Coastguard Worker     unsigned range = ac->range >> 10;
264*49fe348cSAndroid Build Coastguard Worker 
265*49fe348cSAndroid Build Coastguard Worker     ac->low += range * symbols[s].low;
266*49fe348cSAndroid Build Coastguard Worker     ac->range = range * symbols[s].range;
267*49fe348cSAndroid Build Coastguard Worker 
268*49fe348cSAndroid Build Coastguard Worker     ac->carry |= ac->low >> 24;
269*49fe348cSAndroid Build Coastguard Worker     ac->low &= 0xffffff;
270*49fe348cSAndroid Build Coastguard Worker 
271*49fe348cSAndroid Build Coastguard Worker     if (ac->range < 0x10000)
272*49fe348cSAndroid Build Coastguard Worker         lc3_ac_write_renorm(bits);
273*49fe348cSAndroid Build Coastguard Worker }
274*49fe348cSAndroid Build Coastguard Worker 
275*49fe348cSAndroid Build Coastguard Worker /**
276*49fe348cSAndroid Build Coastguard Worker  * Get arithmetic coder symbol
277*49fe348cSAndroid Build Coastguard Worker  */
lc3_get_symbol(lc3_bits_t * bits,const struct lc3_ac_model * model)278*49fe348cSAndroid Build Coastguard Worker LC3_HOT static inline unsigned lc3_get_symbol(
279*49fe348cSAndroid Build Coastguard Worker     lc3_bits_t *bits, const struct lc3_ac_model *model)
280*49fe348cSAndroid Build Coastguard Worker {
281*49fe348cSAndroid Build Coastguard Worker     const struct lc3_ac_symbol *symbols = model->s;
282*49fe348cSAndroid Build Coastguard Worker     struct lc3_bits_ac *ac = &bits->ac;
283*49fe348cSAndroid Build Coastguard Worker 
284*49fe348cSAndroid Build Coastguard Worker     unsigned range = (ac->range >> 10) & 0xffff;
285*49fe348cSAndroid Build Coastguard Worker 
286*49fe348cSAndroid Build Coastguard Worker     ac->error |= (ac->low >= (range << 10));
287*49fe348cSAndroid Build Coastguard Worker     if (ac->error)
288*49fe348cSAndroid Build Coastguard Worker         ac->low = 0;
289*49fe348cSAndroid Build Coastguard Worker 
290*49fe348cSAndroid Build Coastguard Worker     int s = 16;
291*49fe348cSAndroid Build Coastguard Worker 
292*49fe348cSAndroid Build Coastguard Worker     if (ac->low < range * symbols[s].low) {
293*49fe348cSAndroid Build Coastguard Worker         s >>= 1;
294*49fe348cSAndroid Build Coastguard Worker         s -= ac->low < range * symbols[s].low ? 4 : -4;
295*49fe348cSAndroid Build Coastguard Worker         s -= ac->low < range * symbols[s].low ? 2 : -2;
296*49fe348cSAndroid Build Coastguard Worker         s -= ac->low < range * symbols[s].low ? 1 : -1;
297*49fe348cSAndroid Build Coastguard Worker         s -= ac->low < range * symbols[s].low;
298*49fe348cSAndroid Build Coastguard Worker     }
299*49fe348cSAndroid Build Coastguard Worker 
300*49fe348cSAndroid Build Coastguard Worker     ac->low -= range * symbols[s].low;
301*49fe348cSAndroid Build Coastguard Worker     ac->range = range * symbols[s].range;
302*49fe348cSAndroid Build Coastguard Worker 
303*49fe348cSAndroid Build Coastguard Worker     if (ac->range < 0x10000)
304*49fe348cSAndroid Build Coastguard Worker         lc3_ac_read_renorm(bits);
305*49fe348cSAndroid Build Coastguard Worker 
306*49fe348cSAndroid Build Coastguard Worker     return s;
307*49fe348cSAndroid Build Coastguard Worker }
308*49fe348cSAndroid Build Coastguard Worker 
309*49fe348cSAndroid Build Coastguard Worker #endif /* __LC3_BITS_H */
310