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