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 #include "bits.h" 20*9a19cd78SMatthias Ringwald #include "common.h" 21*9a19cd78SMatthias Ringwald 22*9a19cd78SMatthias Ringwald 23*9a19cd78SMatthias Ringwald /* ---------------------------------------------------------------------------- 24*9a19cd78SMatthias Ringwald * Common 25*9a19cd78SMatthias Ringwald * -------------------------------------------------------------------------- */ 26*9a19cd78SMatthias Ringwald 27*9a19cd78SMatthias Ringwald static inline int ac_get(struct lc3_bits_buffer *); 28*9a19cd78SMatthias Ringwald static inline void accu_load(struct lc3_bits_accu *, struct lc3_bits_buffer *); 29*9a19cd78SMatthias Ringwald 30*9a19cd78SMatthias Ringwald /** 31*9a19cd78SMatthias Ringwald * Arithmetic coder return range bits 32*9a19cd78SMatthias Ringwald * ac Arithmetic coder 33*9a19cd78SMatthias Ringwald * return 1 + log2(ac->range) 34*9a19cd78SMatthias Ringwald */ 35*9a19cd78SMatthias Ringwald static int ac_get_range_bits(const struct lc3_bits_ac *ac) 36*9a19cd78SMatthias Ringwald { 37*9a19cd78SMatthias Ringwald int nbits = 0; 38*9a19cd78SMatthias Ringwald 39*9a19cd78SMatthias Ringwald for (unsigned r = ac->range; r; r >>= 1, nbits++); 40*9a19cd78SMatthias Ringwald 41*9a19cd78SMatthias Ringwald return nbits; 42*9a19cd78SMatthias Ringwald } 43*9a19cd78SMatthias Ringwald 44*9a19cd78SMatthias Ringwald /** 45*9a19cd78SMatthias Ringwald * Arithmetic coder return pending bits 46*9a19cd78SMatthias Ringwald * ac Arithmetic coder 47*9a19cd78SMatthias Ringwald * return Pending bits 48*9a19cd78SMatthias Ringwald */ 49*9a19cd78SMatthias Ringwald static int ac_get_pending_bits(const struct lc3_bits_ac *ac) 50*9a19cd78SMatthias Ringwald { 51*9a19cd78SMatthias Ringwald return 26 - ac_get_range_bits(ac) + 52*9a19cd78SMatthias Ringwald ((ac->cache >= 0) + ac->carry_count) * 8; 53*9a19cd78SMatthias Ringwald } 54*9a19cd78SMatthias Ringwald 55*9a19cd78SMatthias Ringwald /** 56*9a19cd78SMatthias Ringwald * Return number of bits left in the bitstream 57*9a19cd78SMatthias Ringwald * bits Bitstream context 58*9a19cd78SMatthias Ringwald * return >= 0: Number of bits left < 0: Overflow 59*9a19cd78SMatthias Ringwald */ 60*9a19cd78SMatthias Ringwald static int get_bits_left(const struct lc3_bits *bits) 61*9a19cd78SMatthias Ringwald { 62*9a19cd78SMatthias Ringwald const struct lc3_bits_buffer *buffer = &bits->buffer; 63*9a19cd78SMatthias Ringwald const struct lc3_bits_accu *accu = &bits->accu; 64*9a19cd78SMatthias Ringwald const struct lc3_bits_ac *ac = &bits->ac; 65*9a19cd78SMatthias Ringwald 66*9a19cd78SMatthias Ringwald uintptr_t end = (uintptr_t)buffer->p_bw + 67*9a19cd78SMatthias Ringwald (bits->mode == LC3_BITS_MODE_READ ? LC3_ACCU_BITS/8 : 0); 68*9a19cd78SMatthias Ringwald 69*9a19cd78SMatthias Ringwald uintptr_t start = (uintptr_t)buffer->p_fw - 70*9a19cd78SMatthias Ringwald (bits->mode == LC3_BITS_MODE_READ ? LC3_AC_BITS/8 : 0); 71*9a19cd78SMatthias Ringwald 72*9a19cd78SMatthias Ringwald int n = end > start ? (int)(end - start) : -(int)(start - end); 73*9a19cd78SMatthias Ringwald 74*9a19cd78SMatthias Ringwald return 8 * n - (accu->n + accu->nover + ac_get_pending_bits(ac)); 75*9a19cd78SMatthias Ringwald } 76*9a19cd78SMatthias Ringwald 77*9a19cd78SMatthias Ringwald /** 78*9a19cd78SMatthias Ringwald * Setup bitstream writing 79*9a19cd78SMatthias Ringwald */ 80*9a19cd78SMatthias Ringwald void lc3_setup_bits(struct lc3_bits *bits, 81*9a19cd78SMatthias Ringwald enum lc3_bits_mode mode, void *buffer, int len) 82*9a19cd78SMatthias Ringwald { 83*9a19cd78SMatthias Ringwald *bits = (struct lc3_bits){ 84*9a19cd78SMatthias Ringwald .mode = mode, 85*9a19cd78SMatthias Ringwald .accu = { 86*9a19cd78SMatthias Ringwald .n = mode == LC3_BITS_MODE_READ ? LC3_ACCU_BITS : 0, 87*9a19cd78SMatthias Ringwald }, 88*9a19cd78SMatthias Ringwald .ac = { 89*9a19cd78SMatthias Ringwald .range = 0xffffff, 90*9a19cd78SMatthias Ringwald .cache = -1 91*9a19cd78SMatthias Ringwald }, 92*9a19cd78SMatthias Ringwald .buffer = { 93*9a19cd78SMatthias Ringwald .start = (uint8_t *)buffer, .end = (uint8_t *)buffer + len, 94*9a19cd78SMatthias Ringwald .p_fw = (uint8_t *)buffer, .p_bw = (uint8_t *)buffer + len, 95*9a19cd78SMatthias Ringwald } 96*9a19cd78SMatthias Ringwald }; 97*9a19cd78SMatthias Ringwald 98*9a19cd78SMatthias Ringwald if (mode == LC3_BITS_MODE_READ) { 99*9a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 100*9a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 101*9a19cd78SMatthias Ringwald struct lc3_bits_buffer *buffer = &bits->buffer; 102*9a19cd78SMatthias Ringwald 103*9a19cd78SMatthias Ringwald ac->low = ac_get(buffer) << 16; 104*9a19cd78SMatthias Ringwald ac->low |= ac_get(buffer) << 8; 105*9a19cd78SMatthias Ringwald ac->low |= ac_get(buffer); 106*9a19cd78SMatthias Ringwald 107*9a19cd78SMatthias Ringwald accu_load(accu, buffer); 108*9a19cd78SMatthias Ringwald } 109*9a19cd78SMatthias Ringwald } 110*9a19cd78SMatthias Ringwald 111*9a19cd78SMatthias Ringwald /** 112*9a19cd78SMatthias Ringwald * Return number of bits left in the bitstream 113*9a19cd78SMatthias Ringwald */ 114*9a19cd78SMatthias Ringwald int lc3_get_bits_left(const struct lc3_bits *bits) 115*9a19cd78SMatthias Ringwald { 116*9a19cd78SMatthias Ringwald return LC3_MAX(get_bits_left(bits), 0); 117*9a19cd78SMatthias Ringwald } 118*9a19cd78SMatthias Ringwald 119*9a19cd78SMatthias Ringwald /** 120*9a19cd78SMatthias Ringwald * Return number of bits left in the bitstream 121*9a19cd78SMatthias Ringwald */ 122*9a19cd78SMatthias Ringwald int lc3_check_bits(const struct lc3_bits *bits) 123*9a19cd78SMatthias Ringwald { 124*9a19cd78SMatthias Ringwald const struct lc3_bits_ac *ac = &bits->ac; 125*9a19cd78SMatthias Ringwald 126*9a19cd78SMatthias Ringwald return -(get_bits_left(bits) < 0 || ac->error); 127*9a19cd78SMatthias Ringwald } 128*9a19cd78SMatthias Ringwald 129*9a19cd78SMatthias Ringwald 130*9a19cd78SMatthias Ringwald /* ---------------------------------------------------------------------------- 131*9a19cd78SMatthias Ringwald * Writing 132*9a19cd78SMatthias Ringwald * -------------------------------------------------------------------------- */ 133*9a19cd78SMatthias Ringwald 134*9a19cd78SMatthias Ringwald /** 135*9a19cd78SMatthias Ringwald * Flush the bits accumulator 136*9a19cd78SMatthias Ringwald * accu Bitstream accumulator 137*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 138*9a19cd78SMatthias Ringwald */ 139*9a19cd78SMatthias Ringwald static inline void accu_flush( 140*9a19cd78SMatthias Ringwald struct lc3_bits_accu *accu, struct lc3_bits_buffer *buffer) 141*9a19cd78SMatthias Ringwald { 142*9a19cd78SMatthias Ringwald int nbytes = LC3_MIN(accu->n >> 3, 143*9a19cd78SMatthias Ringwald LC3_MAX(buffer->p_bw - buffer->p_fw, 0)); 144*9a19cd78SMatthias Ringwald 145*9a19cd78SMatthias Ringwald accu->n -= 8 * nbytes; 146*9a19cd78SMatthias Ringwald 147*9a19cd78SMatthias Ringwald for ( ; nbytes; accu->v >>= 8, nbytes--) 148*9a19cd78SMatthias Ringwald *(--buffer->p_bw) = accu->v & 0xff; 149*9a19cd78SMatthias Ringwald 150*9a19cd78SMatthias Ringwald if (accu->n >= 8) 151*9a19cd78SMatthias Ringwald accu->n = 0; 152*9a19cd78SMatthias Ringwald } 153*9a19cd78SMatthias Ringwald 154*9a19cd78SMatthias Ringwald /** 155*9a19cd78SMatthias Ringwald * Arithmetic coder put byte 156*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 157*9a19cd78SMatthias Ringwald * byte Byte to output 158*9a19cd78SMatthias Ringwald */ 159*9a19cd78SMatthias Ringwald static inline void ac_put(struct lc3_bits_buffer *buffer, int byte) 160*9a19cd78SMatthias Ringwald { 161*9a19cd78SMatthias Ringwald if (buffer->p_fw < buffer->end) 162*9a19cd78SMatthias Ringwald *(buffer->p_fw++) = byte; 163*9a19cd78SMatthias Ringwald } 164*9a19cd78SMatthias Ringwald 165*9a19cd78SMatthias Ringwald /** 166*9a19cd78SMatthias Ringwald * Arithmetic coder range shift 167*9a19cd78SMatthias Ringwald * ac Arithmetic coder 168*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 169*9a19cd78SMatthias Ringwald */ 170*9a19cd78SMatthias Ringwald static inline void ac_shift( 171*9a19cd78SMatthias Ringwald struct lc3_bits_ac *ac, struct lc3_bits_buffer *buffer) 172*9a19cd78SMatthias Ringwald { 173*9a19cd78SMatthias Ringwald if (ac->low < 0xff0000 || ac->carry) 174*9a19cd78SMatthias Ringwald { 175*9a19cd78SMatthias Ringwald if (ac->cache >= 0) 176*9a19cd78SMatthias Ringwald ac_put(buffer, ac->cache + ac->carry); 177*9a19cd78SMatthias Ringwald 178*9a19cd78SMatthias Ringwald for ( ; ac->carry_count > 0; ac->carry_count--) 179*9a19cd78SMatthias Ringwald ac_put(buffer, ac->carry ? 0x00 : 0xff); 180*9a19cd78SMatthias Ringwald 181*9a19cd78SMatthias Ringwald ac->cache = ac->low >> 16; 182*9a19cd78SMatthias Ringwald ac->carry = 0; 183*9a19cd78SMatthias Ringwald } 184*9a19cd78SMatthias Ringwald else 185*9a19cd78SMatthias Ringwald ac->carry_count++; 186*9a19cd78SMatthias Ringwald 187*9a19cd78SMatthias Ringwald ac->low = (ac->low << 8) & 0xffffff; 188*9a19cd78SMatthias Ringwald } 189*9a19cd78SMatthias Ringwald 190*9a19cd78SMatthias Ringwald /** 191*9a19cd78SMatthias Ringwald * Arithmetic coder termination 192*9a19cd78SMatthias Ringwald * ac Arithmetic coder 193*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 194*9a19cd78SMatthias Ringwald * end_val/nbits End value and count of bits to terminate (1 to 8) 195*9a19cd78SMatthias Ringwald */ 196*9a19cd78SMatthias Ringwald static void ac_terminate(struct lc3_bits_ac *ac, 197*9a19cd78SMatthias Ringwald struct lc3_bits_buffer *buffer) 198*9a19cd78SMatthias Ringwald { 199*9a19cd78SMatthias Ringwald int nbits = 25 - ac_get_range_bits(ac); 200*9a19cd78SMatthias Ringwald unsigned mask = 0xffffff >> nbits; 201*9a19cd78SMatthias Ringwald unsigned val = ac->low + mask; 202*9a19cd78SMatthias Ringwald unsigned high = ac->low + ac->range; 203*9a19cd78SMatthias Ringwald 204*9a19cd78SMatthias Ringwald bool over_val = val >> 24; 205*9a19cd78SMatthias Ringwald bool over_high = high >> 24; 206*9a19cd78SMatthias Ringwald 207*9a19cd78SMatthias Ringwald val = (val & 0xffffff) & ~mask; 208*9a19cd78SMatthias Ringwald high = (high & 0xffffff); 209*9a19cd78SMatthias Ringwald 210*9a19cd78SMatthias Ringwald if (over_val == over_high) { 211*9a19cd78SMatthias Ringwald 212*9a19cd78SMatthias Ringwald if (val + mask >= high) { 213*9a19cd78SMatthias Ringwald nbits++; 214*9a19cd78SMatthias Ringwald mask >>= 1; 215*9a19cd78SMatthias Ringwald val = ((ac->low + mask) & 0xffffff) & ~mask; 216*9a19cd78SMatthias Ringwald } 217*9a19cd78SMatthias Ringwald 218*9a19cd78SMatthias Ringwald ac->carry |= val < ac->low; 219*9a19cd78SMatthias Ringwald } 220*9a19cd78SMatthias Ringwald 221*9a19cd78SMatthias Ringwald ac->low = val; 222*9a19cd78SMatthias Ringwald 223*9a19cd78SMatthias Ringwald for (; nbits > 8; nbits -= 8) 224*9a19cd78SMatthias Ringwald ac_shift(ac, buffer); 225*9a19cd78SMatthias Ringwald ac_shift(ac, buffer); 226*9a19cd78SMatthias Ringwald 227*9a19cd78SMatthias Ringwald int end_val = ac->cache >> (8 - nbits); 228*9a19cd78SMatthias Ringwald 229*9a19cd78SMatthias Ringwald if (ac->carry_count) { 230*9a19cd78SMatthias Ringwald ac_put(buffer, ac->cache); 231*9a19cd78SMatthias Ringwald for ( ; ac->carry_count > 1; ac->carry_count--) 232*9a19cd78SMatthias Ringwald ac_put(buffer, 0xff); 233*9a19cd78SMatthias Ringwald 234*9a19cd78SMatthias Ringwald end_val = nbits < 8 ? 0 : 0xff; 235*9a19cd78SMatthias Ringwald } 236*9a19cd78SMatthias Ringwald 237*9a19cd78SMatthias Ringwald if (buffer->p_fw < buffer->end) { 238*9a19cd78SMatthias Ringwald *buffer->p_fw &= 0xff >> nbits; 239*9a19cd78SMatthias Ringwald *buffer->p_fw |= end_val << (8 - nbits); 240*9a19cd78SMatthias Ringwald } 241*9a19cd78SMatthias Ringwald } 242*9a19cd78SMatthias Ringwald 243*9a19cd78SMatthias Ringwald /** 244*9a19cd78SMatthias Ringwald * Flush and terminate bitstream 245*9a19cd78SMatthias Ringwald */ 246*9a19cd78SMatthias Ringwald void lc3_flush_bits(struct lc3_bits *bits) 247*9a19cd78SMatthias Ringwald { 248*9a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 249*9a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 250*9a19cd78SMatthias Ringwald struct lc3_bits_buffer *buffer = &bits->buffer; 251*9a19cd78SMatthias Ringwald 252*9a19cd78SMatthias Ringwald int nleft = buffer->p_bw - buffer->p_fw; 253*9a19cd78SMatthias Ringwald for (int n = 8 * nleft - accu->n; n > 0; n -= 32) 254*9a19cd78SMatthias Ringwald lc3_put_bits(bits, 0, LC3_MIN(n, 32)); 255*9a19cd78SMatthias Ringwald 256*9a19cd78SMatthias Ringwald accu_flush(accu, buffer); 257*9a19cd78SMatthias Ringwald 258*9a19cd78SMatthias Ringwald ac_terminate(ac, buffer); 259*9a19cd78SMatthias Ringwald } 260*9a19cd78SMatthias Ringwald 261*9a19cd78SMatthias Ringwald /** 262*9a19cd78SMatthias Ringwald * Write from 1 to 32 bits, 263*9a19cd78SMatthias Ringwald * exceeding the capacity of the accumulator 264*9a19cd78SMatthias Ringwald */ 265*9a19cd78SMatthias Ringwald void lc3_put_bits_generic(struct lc3_bits *bits, unsigned v, int n) 266*9a19cd78SMatthias Ringwald { 267*9a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 268*9a19cd78SMatthias Ringwald 269*9a19cd78SMatthias Ringwald /* --- Fulfill accumulator and flush -- */ 270*9a19cd78SMatthias Ringwald 271*9a19cd78SMatthias Ringwald int n1 = LC3_MIN(LC3_ACCU_BITS - accu->n, n); 272*9a19cd78SMatthias Ringwald if (n1) { 273*9a19cd78SMatthias Ringwald accu->v |= v << accu->n; 274*9a19cd78SMatthias Ringwald accu->n = LC3_ACCU_BITS; 275*9a19cd78SMatthias Ringwald } 276*9a19cd78SMatthias Ringwald 277*9a19cd78SMatthias Ringwald accu_flush(accu, &bits->buffer); 278*9a19cd78SMatthias Ringwald 279*9a19cd78SMatthias Ringwald /* --- Accumulate remaining bits -- */ 280*9a19cd78SMatthias Ringwald 281*9a19cd78SMatthias Ringwald accu->v = v >> n1; 282*9a19cd78SMatthias Ringwald accu->n = n - n1; 283*9a19cd78SMatthias Ringwald } 284*9a19cd78SMatthias Ringwald 285*9a19cd78SMatthias Ringwald /** 286*9a19cd78SMatthias Ringwald * Arithmetic coder renormalization 287*9a19cd78SMatthias Ringwald */ 288*9a19cd78SMatthias Ringwald void lc3_ac_write_renorm(struct lc3_bits *bits) 289*9a19cd78SMatthias Ringwald { 290*9a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 291*9a19cd78SMatthias Ringwald 292*9a19cd78SMatthias Ringwald for ( ; ac->range < 0x10000; ac->range <<= 8) 293*9a19cd78SMatthias Ringwald ac_shift(ac, &bits->buffer); 294*9a19cd78SMatthias Ringwald } 295*9a19cd78SMatthias Ringwald 296*9a19cd78SMatthias Ringwald 297*9a19cd78SMatthias Ringwald /* ---------------------------------------------------------------------------- 298*9a19cd78SMatthias Ringwald * Reading 299*9a19cd78SMatthias Ringwald * -------------------------------------------------------------------------- */ 300*9a19cd78SMatthias Ringwald 301*9a19cd78SMatthias Ringwald /** 302*9a19cd78SMatthias Ringwald * Arithmetic coder get byte 303*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 304*9a19cd78SMatthias Ringwald * return Byte read, 0 on overflow 305*9a19cd78SMatthias Ringwald */ 306*9a19cd78SMatthias Ringwald static inline int ac_get(struct lc3_bits_buffer *buffer) 307*9a19cd78SMatthias Ringwald { 308*9a19cd78SMatthias Ringwald return buffer->p_fw < buffer->end ? *(buffer->p_fw++) : 0; 309*9a19cd78SMatthias Ringwald } 310*9a19cd78SMatthias Ringwald 311*9a19cd78SMatthias Ringwald /** 312*9a19cd78SMatthias Ringwald * Load the accumulator 313*9a19cd78SMatthias Ringwald * accu Bitstream accumulator 314*9a19cd78SMatthias Ringwald * buffer Bitstream buffer 315*9a19cd78SMatthias Ringwald */ 316*9a19cd78SMatthias Ringwald static inline void accu_load(struct lc3_bits_accu *accu, 317*9a19cd78SMatthias Ringwald struct lc3_bits_buffer *buffer) 318*9a19cd78SMatthias Ringwald { 319*9a19cd78SMatthias Ringwald int nbytes = LC3_MIN(accu->n >> 3, buffer->p_bw - buffer->start); 320*9a19cd78SMatthias Ringwald 321*9a19cd78SMatthias Ringwald accu->n -= 8 * nbytes; 322*9a19cd78SMatthias Ringwald 323*9a19cd78SMatthias Ringwald for ( ; nbytes; nbytes--) { 324*9a19cd78SMatthias Ringwald accu->v >>= 8; 325*9a19cd78SMatthias Ringwald accu->v |= *(--buffer->p_bw) << (LC3_ACCU_BITS - 8); 326*9a19cd78SMatthias Ringwald } 327*9a19cd78SMatthias Ringwald 328*9a19cd78SMatthias Ringwald if (accu->n >= 8) { 329*9a19cd78SMatthias Ringwald accu->nover = LC3_MIN(accu->nover + accu->n, LC3_ACCU_BITS); 330*9a19cd78SMatthias Ringwald accu->v >>= accu->n; 331*9a19cd78SMatthias Ringwald accu->n = 0; 332*9a19cd78SMatthias Ringwald } 333*9a19cd78SMatthias Ringwald } 334*9a19cd78SMatthias Ringwald 335*9a19cd78SMatthias Ringwald /** 336*9a19cd78SMatthias Ringwald * Read from 1 to 32 bits, 337*9a19cd78SMatthias Ringwald * exceeding the capacity of the accumulator 338*9a19cd78SMatthias Ringwald */ 339*9a19cd78SMatthias Ringwald unsigned lc3_get_bits_generic(struct lc3_bits *bits, int n) 340*9a19cd78SMatthias Ringwald { 341*9a19cd78SMatthias Ringwald struct lc3_bits_accu *accu = &bits->accu; 342*9a19cd78SMatthias Ringwald struct lc3_bits_buffer *buffer = &bits->buffer; 343*9a19cd78SMatthias Ringwald 344*9a19cd78SMatthias Ringwald /* --- Fulfill accumulator and read -- */ 345*9a19cd78SMatthias Ringwald 346*9a19cd78SMatthias Ringwald accu_load(accu, buffer); 347*9a19cd78SMatthias Ringwald 348*9a19cd78SMatthias Ringwald int n1 = LC3_MIN(LC3_ACCU_BITS - accu->n, n); 349*9a19cd78SMatthias Ringwald unsigned v = (accu->v >> accu->n) & ((1u << n1) - 1); 350*9a19cd78SMatthias Ringwald accu->n += n1; 351*9a19cd78SMatthias Ringwald 352*9a19cd78SMatthias Ringwald /* --- Second round --- */ 353*9a19cd78SMatthias Ringwald 354*9a19cd78SMatthias Ringwald int n2 = n - n1; 355*9a19cd78SMatthias Ringwald 356*9a19cd78SMatthias Ringwald if (n2) { 357*9a19cd78SMatthias Ringwald accu_load(accu, buffer); 358*9a19cd78SMatthias Ringwald 359*9a19cd78SMatthias Ringwald v |= ((accu->v >> accu->n) & ((1u << n2) - 1)) << n1; 360*9a19cd78SMatthias Ringwald accu->n += n2; 361*9a19cd78SMatthias Ringwald } 362*9a19cd78SMatthias Ringwald 363*9a19cd78SMatthias Ringwald return v; 364*9a19cd78SMatthias Ringwald } 365*9a19cd78SMatthias Ringwald 366*9a19cd78SMatthias Ringwald /** 367*9a19cd78SMatthias Ringwald * Arithmetic coder renormalization 368*9a19cd78SMatthias Ringwald */ 369*9a19cd78SMatthias Ringwald void lc3_ac_read_renorm(struct lc3_bits *bits) 370*9a19cd78SMatthias Ringwald { 371*9a19cd78SMatthias Ringwald struct lc3_bits_ac *ac = &bits->ac; 372*9a19cd78SMatthias Ringwald 373*9a19cd78SMatthias Ringwald for ( ; ac->range < 0x10000; ac->range <<= 8) 374*9a19cd78SMatthias Ringwald ac->low = ((ac->low << 8) | ac_get(&bits->buffer)) & 0xffffff; 375*9a19cd78SMatthias Ringwald } 376