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