19a19cd78SMatthias Ringwald /****************************************************************************** 29a19cd78SMatthias Ringwald * 3*4930cef6SMatthias Ringwald * Copyright 2022 Google LLC 49a19cd78SMatthias Ringwald * 59a19cd78SMatthias Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 69a19cd78SMatthias Ringwald * you may not use this file except in compliance with the License. 79a19cd78SMatthias Ringwald * You may obtain a copy of the License at: 89a19cd78SMatthias Ringwald * 99a19cd78SMatthias Ringwald * http://www.apache.org/licenses/LICENSE-2.0 109a19cd78SMatthias Ringwald * 119a19cd78SMatthias Ringwald * Unless required by applicable law or agreed to in writing, software 129a19cd78SMatthias Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 139a19cd78SMatthias Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149a19cd78SMatthias Ringwald * See the License for the specific language governing permissions and 159a19cd78SMatthias Ringwald * limitations under the License. 169a19cd78SMatthias Ringwald * 179a19cd78SMatthias Ringwald ******************************************************************************/ 189a19cd78SMatthias Ringwald 199a19cd78SMatthias Ringwald /** 209a19cd78SMatthias Ringwald * LC3 - Bitstream management 219a19cd78SMatthias Ringwald * 229a19cd78SMatthias Ringwald * The bitstream is written by the 2 ends of the buffer : 239a19cd78SMatthias Ringwald * 249a19cd78SMatthias Ringwald * - Arthmetic coder put bits while increasing memory addresses 259a19cd78SMatthias Ringwald * in the buffer (forward) 269a19cd78SMatthias Ringwald * 279a19cd78SMatthias Ringwald * - Plain bits are puts starting the end of the buffer, with memeory 289a19cd78SMatthias Ringwald * addresses decreasing (backward) 299a19cd78SMatthias Ringwald * 309a19cd78SMatthias Ringwald * .---------------------------------------------------. 319a19cd78SMatthias Ringwald * | > > > > > > > > > > : : < < < < < < < < < | 329a19cd78SMatthias Ringwald * '---------------------------------------------------' 339a19cd78SMatthias Ringwald * |---------------------> - - - - - - - - - - - - - ->| 349a19cd78SMatthias Ringwald * |< - - - <-------------------| 359a19cd78SMatthias Ringwald * Arithmetic coding Plain bits 369a19cd78SMatthias Ringwald * `lc3_put_symbol()` `lc3_put_bits()` 379a19cd78SMatthias Ringwald * 389a19cd78SMatthias Ringwald * - The forward writing is protected against buffer overflow, it cannot 399a19cd78SMatthias Ringwald * write after the buffer, but can overwrite plain bits previously 409a19cd78SMatthias Ringwald * written in the buffer. 419a19cd78SMatthias Ringwald * 429a19cd78SMatthias Ringwald * - The backward writing is protected against overwrite of the arithmetic 439a19cd78SMatthias Ringwald * coder bitstream. In such way, the backward bitstream is always limited 449a19cd78SMatthias Ringwald * by the aritmetic coder bitstream, and can be overwritten by him. 459a19cd78SMatthias Ringwald * 469a19cd78SMatthias Ringwald * .---------------------------------------------------. 479a19cd78SMatthias Ringwald * | > > > > > > > > > > : : < < < < < < < < < | 489a19cd78SMatthias Ringwald * '---------------------------------------------------' 499a19cd78SMatthias Ringwald * |---------------------> - - - - - - - - - - - - - ->| 509a19cd78SMatthias Ringwald * |< - - - - - - - - - - - - - - <-------------------| 519a19cd78SMatthias Ringwald * Arithmetic coding Plain bits 529a19cd78SMatthias Ringwald * `lc3_get_symbol()` `lc3_get_bits()` 539a19cd78SMatthias Ringwald * 549a19cd78SMatthias Ringwald * - Reading is limited to read of the complementary end of the buffer. 559a19cd78SMatthias Ringwald * 569a19cd78SMatthias Ringwald * - The procedure `lc3_check_bits()` returns indication that read has been 579a19cd78SMatthias Ringwald * made crossing the other bit plane. 589a19cd78SMatthias Ringwald * 599a19cd78SMatthias Ringwald * 609a19cd78SMatthias Ringwald * Reference : Low Complexity Communication Codec (LC3) 619a19cd78SMatthias Ringwald * Bluetooth Specification v1.0 629a19cd78SMatthias Ringwald * 639a19cd78SMatthias Ringwald */ 649a19cd78SMatthias Ringwald 659a19cd78SMatthias Ringwald #ifndef __LC3_BITS_H 669a19cd78SMatthias Ringwald #define __LC3_BITS_H 679a19cd78SMatthias Ringwald 689a19cd78SMatthias Ringwald #include "common.h" 699a19cd78SMatthias Ringwald 709a19cd78SMatthias Ringwald 719a19cd78SMatthias Ringwald /** 729a19cd78SMatthias Ringwald * Bitstream mode 739a19cd78SMatthias Ringwald */ 749a19cd78SMatthias Ringwald 759a19cd78SMatthias Ringwald enum lc3_bits_mode { 769a19cd78SMatthias Ringwald LC3_BITS_MODE_READ, 779a19cd78SMatthias Ringwald LC3_BITS_MODE_WRITE, 789a19cd78SMatthias Ringwald }; 799a19cd78SMatthias Ringwald 809a19cd78SMatthias Ringwald /** 819a19cd78SMatthias Ringwald * Arithmetic coder symbol interval 829a19cd78SMatthias Ringwald * The model split the interval in 17 symbols 839a19cd78SMatthias Ringwald */ 849a19cd78SMatthias Ringwald 859a19cd78SMatthias Ringwald struct lc3_ac_symbol { 869a19cd78SMatthias Ringwald uint16_t low : 16; 879a19cd78SMatthias Ringwald uint16_t range : 16; 889a19cd78SMatthias Ringwald }; 899a19cd78SMatthias Ringwald 909a19cd78SMatthias Ringwald struct lc3_ac_model { 919a19cd78SMatthias Ringwald struct lc3_ac_symbol s[17]; 929a19cd78SMatthias Ringwald }; 939a19cd78SMatthias Ringwald 949a19cd78SMatthias Ringwald /** 959a19cd78SMatthias Ringwald * Bitstream context 969a19cd78SMatthias Ringwald */ 979a19cd78SMatthias Ringwald 989a19cd78SMatthias Ringwald #define LC3_ACCU_BITS (int)(8 * sizeof(unsigned)) 999a19cd78SMatthias Ringwald 1009a19cd78SMatthias Ringwald struct lc3_bits_accu { 1019a19cd78SMatthias Ringwald unsigned v; 1029a19cd78SMatthias Ringwald int n, nover; 1039a19cd78SMatthias Ringwald }; 1049a19cd78SMatthias Ringwald 1059a19cd78SMatthias Ringwald #define LC3_AC_BITS (int)(24) 1069a19cd78SMatthias Ringwald 1079a19cd78SMatthias Ringwald struct lc3_bits_ac { 1089a19cd78SMatthias Ringwald unsigned low, range; 1099a19cd78SMatthias Ringwald int cache, carry, carry_count; 1109a19cd78SMatthias Ringwald bool error; 1119a19cd78SMatthias Ringwald }; 1129a19cd78SMatthias Ringwald 1139a19cd78SMatthias Ringwald struct lc3_bits_buffer { 1149a19cd78SMatthias Ringwald const uint8_t *start, *end; 1159a19cd78SMatthias Ringwald uint8_t *p_fw, *p_bw; 1169a19cd78SMatthias Ringwald }; 1179a19cd78SMatthias Ringwald 1189a19cd78SMatthias Ringwald typedef struct lc3_bits { 1199a19cd78SMatthias Ringwald enum lc3_bits_mode mode; 1209a19cd78SMatthias Ringwald struct lc3_bits_ac ac; 1219a19cd78SMatthias Ringwald struct lc3_bits_accu accu; 1229a19cd78SMatthias Ringwald struct lc3_bits_buffer buffer; 1239a19cd78SMatthias Ringwald } lc3_bits_t; 1249a19cd78SMatthias Ringwald 1259a19cd78SMatthias Ringwald 1269a19cd78SMatthias Ringwald /** 1279a19cd78SMatthias Ringwald * Setup bitstream reading/writing 1289a19cd78SMatthias Ringwald * bits Bitstream context 1299a19cd78SMatthias Ringwald * mode Either READ or WRITE mode 1309a19cd78SMatthias Ringwald * buffer, len Output buffer and length (in bytes) 1319a19cd78SMatthias Ringwald */ 1329a19cd78SMatthias Ringwald void lc3_setup_bits(lc3_bits_t *bits, 1339a19cd78SMatthias Ringwald enum lc3_bits_mode mode, void *buffer, int len); 1349a19cd78SMatthias Ringwald 1359a19cd78SMatthias Ringwald /** 1369a19cd78SMatthias Ringwald * Return number of bits left in the bitstream 1379a19cd78SMatthias Ringwald * bits Bitstream context 1389a19cd78SMatthias Ringwald * return Number of bits left 1399a19cd78SMatthias Ringwald */ 1409a19cd78SMatthias Ringwald int lc3_get_bits_left(const lc3_bits_t *bits); 1419a19cd78SMatthias Ringwald 1429a19cd78SMatthias Ringwald /** 1439a19cd78SMatthias Ringwald * Check if error occured on bitstream reading/writing 1449a19cd78SMatthias Ringwald * bits Bitstream context 1459a19cd78SMatthias Ringwald * return 0: Ok -1: Bitstream overflow or AC reading error 1469a19cd78SMatthias Ringwald */ 1479a19cd78SMatthias Ringwald int lc3_check_bits(const lc3_bits_t *bits); 1489a19cd78SMatthias Ringwald 1499a19cd78SMatthias Ringwald /** 1509a19cd78SMatthias Ringwald * Put a bit 1519a19cd78SMatthias Ringwald * bits Bitstream context 1529a19cd78SMatthias Ringwald * v Bit value, 0 or 1 1539a19cd78SMatthias Ringwald */ 1549a19cd78SMatthias Ringwald static inline void lc3_put_bit(lc3_bits_t *bits, int v); 1559a19cd78SMatthias Ringwald 1569a19cd78SMatthias Ringwald /** 1579a19cd78SMatthias Ringwald * Put from 1 to 32 bits 1589a19cd78SMatthias Ringwald * bits Bitstream context 1599a19cd78SMatthias Ringwald * v, n Value, in range 0 to 2^n - 1, and bits count (1 to 32) 1609a19cd78SMatthias Ringwald */ 1619a19cd78SMatthias Ringwald static inline void lc3_put_bits(lc3_bits_t *bits, unsigned v, int n); 1629a19cd78SMatthias Ringwald 1639a19cd78SMatthias Ringwald /** 1649a19cd78SMatthias Ringwald * Put arithmetic coder symbol 1659a19cd78SMatthias Ringwald * bits Bitstream context 1669a19cd78SMatthias Ringwald * model, s Model distribution and symbol value 1679a19cd78SMatthias Ringwald */ 1689a19cd78SMatthias Ringwald static inline void lc3_put_symbol(lc3_bits_t *bits, 1699a19cd78SMatthias Ringwald const struct lc3_ac_model *model, unsigned s); 1709a19cd78SMatthias Ringwald 1719a19cd78SMatthias Ringwald /** 1729a19cd78SMatthias Ringwald * Flush and terminate bitstream writing 1739a19cd78SMatthias Ringwald * bits Bitstream context 1749a19cd78SMatthias Ringwald */ 1759a19cd78SMatthias Ringwald void lc3_flush_bits(lc3_bits_t *bits); 1769a19cd78SMatthias Ringwald 1779a19cd78SMatthias Ringwald /** 1789a19cd78SMatthias Ringwald * Get a bit 1799a19cd78SMatthias Ringwald * bits Bitstream context 1809a19cd78SMatthias Ringwald */ 1819a19cd78SMatthias Ringwald static inline int lc3_get_bit(lc3_bits_t *bits); 1829a19cd78SMatthias Ringwald 1839a19cd78SMatthias Ringwald /** 1849a19cd78SMatthias Ringwald * Get from 1 to 32 bits 1859a19cd78SMatthias Ringwald * bits Bitstream context 1869a19cd78SMatthias Ringwald * n Number of bits to read (1 to 32) 1879a19cd78SMatthias Ringwald * return The value read 1889a19cd78SMatthias Ringwald */ 1899a19cd78SMatthias Ringwald static inline unsigned lc3_get_bits(lc3_bits_t *bits, int n); 1909a19cd78SMatthias Ringwald 1919a19cd78SMatthias Ringwald /** 1929a19cd78SMatthias Ringwald * Get arithmetic coder symbol 1939a19cd78SMatthias Ringwald * bits Bitstream context 1949a19cd78SMatthias Ringwald * model Model distribution 1959a19cd78SMatthias Ringwald * return The value read 1969a19cd78SMatthias Ringwald */ 1979a19cd78SMatthias Ringwald static inline unsigned lc3_get_symbol(lc3_bits_t *bits, 1989a19cd78SMatthias Ringwald const struct lc3_ac_model *model); 1999a19cd78SMatthias Ringwald 2009a19cd78SMatthias Ringwald 2019a19cd78SMatthias Ringwald 2029a19cd78SMatthias Ringwald /* ---------------------------------------------------------------------------- 2039a19cd78SMatthias Ringwald * Inline implementations 2049a19cd78SMatthias Ringwald * -------------------------------------------------------------------------- */ 2059a19cd78SMatthias Ringwald 2069a19cd78SMatthias Ringwald void lc3_put_bits_generic(lc3_bits_t *bits, unsigned v, int n); 2079a19cd78SMatthias Ringwald unsigned lc3_get_bits_generic(struct lc3_bits *bits, int n); 2089a19cd78SMatthias Ringwald 2099a19cd78SMatthias Ringwald void lc3_ac_read_renorm(lc3_bits_t *bits); 2109a19cd78SMatthias Ringwald void lc3_ac_write_renorm(lc3_bits_t *bits); 2119a19cd78SMatthias Ringwald 2129a19cd78SMatthias Ringwald 2139a19cd78SMatthias Ringwald /** 2149a19cd78SMatthias Ringwald * Put a bit 2159a19cd78SMatthias Ringwald */ 216*4930cef6SMatthias Ringwald LC3_HOT static inline void lc3_put_bit(lc3_bits_t *bits, int v) 2179a19cd78SMatthias Ringwald { 2189a19cd78SMatthias Ringwald lc3_put_bits(bits, v, 1); 2199a19cd78SMatthias Ringwald } 2209a19cd78SMatthias Ringwald 2219a19cd78SMatthias Ringwald /** 2229a19cd78SMatthias Ringwald * Put from 1 to 32 bits 2239a19cd78SMatthias Ringwald */ 224*4930cef6SMatthias Ringwald LC3_HOT static inline void lc3_put_bits( 225*4930cef6SMatthias Ringwald struct lc3_bits *bits, unsigned v, int n) 2269a19cd78SMatthias Ringwald { 2279a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 2289a19cd78SMatthias Ringwald 2299a19cd78SMatthias Ringwald if (accu->n + n <= LC3_ACCU_BITS) { 2309a19cd78SMatthias Ringwald accu->v |= v << accu->n; 2319a19cd78SMatthias Ringwald accu->n += n; 2329a19cd78SMatthias Ringwald } else { 2339a19cd78SMatthias Ringwald lc3_put_bits_generic(bits, v, n); 2349a19cd78SMatthias Ringwald } 2359a19cd78SMatthias Ringwald } 2369a19cd78SMatthias Ringwald 2379a19cd78SMatthias Ringwald /** 2389a19cd78SMatthias Ringwald * Get a bit 2399a19cd78SMatthias Ringwald */ 240*4930cef6SMatthias Ringwald LC3_HOT static inline int lc3_get_bit(lc3_bits_t *bits) 2419a19cd78SMatthias Ringwald { 2429a19cd78SMatthias Ringwald return lc3_get_bits(bits, 1); 2439a19cd78SMatthias Ringwald } 2449a19cd78SMatthias Ringwald 2459a19cd78SMatthias Ringwald /** 2469a19cd78SMatthias Ringwald * Get from 1 to 32 bits 2479a19cd78SMatthias Ringwald */ 248*4930cef6SMatthias Ringwald LC3_HOT static inline unsigned lc3_get_bits(struct lc3_bits *bits, int n) 2499a19cd78SMatthias Ringwald { 2509a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 2519a19cd78SMatthias Ringwald 2529a19cd78SMatthias Ringwald if (accu->n + n <= LC3_ACCU_BITS) { 2539a19cd78SMatthias Ringwald int v = (accu->v >> accu->n) & ((1u << n) - 1); 2549a19cd78SMatthias Ringwald return (accu->n += n), v; 2559a19cd78SMatthias Ringwald } 2569a19cd78SMatthias Ringwald else { 2579a19cd78SMatthias Ringwald return lc3_get_bits_generic(bits, n); 2589a19cd78SMatthias Ringwald } 2599a19cd78SMatthias Ringwald } 2609a19cd78SMatthias Ringwald 2619a19cd78SMatthias Ringwald /** 2629a19cd78SMatthias Ringwald * Put arithmetic coder symbol 2639a19cd78SMatthias Ringwald */ 264*4930cef6SMatthias Ringwald LC3_HOT static inline void lc3_put_symbol( 2659a19cd78SMatthias Ringwald struct lc3_bits *bits, const struct lc3_ac_model *model, unsigned s) 2669a19cd78SMatthias Ringwald { 2679a19cd78SMatthias Ringwald const struct lc3_ac_symbol *symbols = model->s; 2689a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 2699a19cd78SMatthias Ringwald unsigned range = ac->range >> 10; 2709a19cd78SMatthias Ringwald 2719a19cd78SMatthias Ringwald ac->low += range * symbols[s].low; 2729a19cd78SMatthias Ringwald ac->range = range * symbols[s].range; 2739a19cd78SMatthias Ringwald 2749a19cd78SMatthias Ringwald ac->carry |= ac->low >> 24; 2759a19cd78SMatthias Ringwald ac->low &= 0xffffff; 2769a19cd78SMatthias Ringwald 2779a19cd78SMatthias Ringwald if (ac->range < 0x10000) 2789a19cd78SMatthias Ringwald lc3_ac_write_renorm(bits); 2799a19cd78SMatthias Ringwald } 2809a19cd78SMatthias Ringwald 2819a19cd78SMatthias Ringwald /** 2829a19cd78SMatthias Ringwald * Get arithmetic coder symbol 2839a19cd78SMatthias Ringwald */ 284*4930cef6SMatthias Ringwald LC3_HOT static inline unsigned lc3_get_symbol( 2859a19cd78SMatthias Ringwald lc3_bits_t *bits, const struct lc3_ac_model *model) 2869a19cd78SMatthias Ringwald { 2879a19cd78SMatthias Ringwald const struct lc3_ac_symbol *symbols = model->s; 2889a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 2899a19cd78SMatthias Ringwald 2909a19cd78SMatthias Ringwald unsigned range = (ac->range >> 10) & 0xffff; 2919a19cd78SMatthias Ringwald 2929a19cd78SMatthias Ringwald ac->error |= (ac->low >= (range << 10)); 2939a19cd78SMatthias Ringwald if (ac->error) 2949a19cd78SMatthias Ringwald ac->low = 0; 2959a19cd78SMatthias Ringwald 2969a19cd78SMatthias Ringwald int s = 16; 2979a19cd78SMatthias Ringwald 2989a19cd78SMatthias Ringwald if (ac->low < range * symbols[s].low) { 2999a19cd78SMatthias Ringwald s >>= 1; 3009a19cd78SMatthias Ringwald s -= ac->low < range * symbols[s].low ? 4 : -4; 3019a19cd78SMatthias Ringwald s -= ac->low < range * symbols[s].low ? 2 : -2; 3029a19cd78SMatthias Ringwald s -= ac->low < range * symbols[s].low ? 1 : -1; 3039a19cd78SMatthias Ringwald s -= ac->low < range * symbols[s].low; 3049a19cd78SMatthias Ringwald } 3059a19cd78SMatthias Ringwald 3069a19cd78SMatthias Ringwald ac->low -= range * symbols[s].low; 3079a19cd78SMatthias Ringwald ac->range = range * symbols[s].range; 3089a19cd78SMatthias Ringwald 3099a19cd78SMatthias Ringwald if (ac->range < 0x10000) 3109a19cd78SMatthias Ringwald lc3_ac_read_renorm(bits); 3119a19cd78SMatthias Ringwald 3129a19cd78SMatthias Ringwald return s; 3139a19cd78SMatthias Ringwald } 3149a19cd78SMatthias Ringwald 3159a19cd78SMatthias Ringwald #endif /* __LC3_BITS_H */ 316