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