1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2012 Andrew D'Addesio 3cabdff1aSopenharmony_ci * Copyright (c) 2013-2014 Mozilla Corporation 4cabdff1aSopenharmony_ci * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "opus_rc.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#define OPUS_RC_BITS 32 26cabdff1aSopenharmony_ci#define OPUS_RC_SYM 8 27cabdff1aSopenharmony_ci#define OPUS_RC_CEIL ((1 << OPUS_RC_SYM) - 1) 28cabdff1aSopenharmony_ci#define OPUS_RC_TOP (1u << 31) 29cabdff1aSopenharmony_ci#define OPUS_RC_BOT (OPUS_RC_TOP >> OPUS_RC_SYM) 30cabdff1aSopenharmony_ci#define OPUS_RC_SHIFT (OPUS_RC_BITS - OPUS_RC_SYM - 1) 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_cistatic av_always_inline void opus_rc_enc_carryout(OpusRangeCoder *rc, int cbuf) 33cabdff1aSopenharmony_ci{ 34cabdff1aSopenharmony_ci const int cb = cbuf >> OPUS_RC_SYM, mb = (OPUS_RC_CEIL + cb) & OPUS_RC_CEIL; 35cabdff1aSopenharmony_ci if (cbuf == OPUS_RC_CEIL) { 36cabdff1aSopenharmony_ci rc->ext++; 37cabdff1aSopenharmony_ci return; 38cabdff1aSopenharmony_ci } 39cabdff1aSopenharmony_ci rc->rng_cur[0] = rc->rem + cb; 40cabdff1aSopenharmony_ci rc->rng_cur += (rc->rem >= 0); 41cabdff1aSopenharmony_ci for (; rc->ext > 0; rc->ext--) 42cabdff1aSopenharmony_ci *rc->rng_cur++ = mb; 43cabdff1aSopenharmony_ci av_assert0(rc->rng_cur < rc->rb.position); 44cabdff1aSopenharmony_ci rc->rem = cbuf & OPUS_RC_CEIL; /* Propagate */ 45cabdff1aSopenharmony_ci} 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_cistatic av_always_inline void opus_rc_dec_normalize(OpusRangeCoder *rc) 48cabdff1aSopenharmony_ci{ 49cabdff1aSopenharmony_ci while (rc->range <= OPUS_RC_BOT) { 50cabdff1aSopenharmony_ci rc->value = ((rc->value << OPUS_RC_SYM) | (get_bits(&rc->gb, OPUS_RC_SYM) ^ OPUS_RC_CEIL)) & (OPUS_RC_TOP - 1); 51cabdff1aSopenharmony_ci rc->range <<= OPUS_RC_SYM; 52cabdff1aSopenharmony_ci rc->total_bits += OPUS_RC_SYM; 53cabdff1aSopenharmony_ci } 54cabdff1aSopenharmony_ci} 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_cistatic av_always_inline void opus_rc_enc_normalize(OpusRangeCoder *rc) 57cabdff1aSopenharmony_ci{ 58cabdff1aSopenharmony_ci while (rc->range <= OPUS_RC_BOT) { 59cabdff1aSopenharmony_ci opus_rc_enc_carryout(rc, rc->value >> OPUS_RC_SHIFT); 60cabdff1aSopenharmony_ci rc->value = (rc->value << OPUS_RC_SYM) & (OPUS_RC_TOP - 1); 61cabdff1aSopenharmony_ci rc->range <<= OPUS_RC_SYM; 62cabdff1aSopenharmony_ci rc->total_bits += OPUS_RC_SYM; 63cabdff1aSopenharmony_ci } 64cabdff1aSopenharmony_ci} 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_cistatic av_always_inline void opus_rc_dec_update(OpusRangeCoder *rc, uint32_t scale, 67cabdff1aSopenharmony_ci uint32_t low, uint32_t high, 68cabdff1aSopenharmony_ci uint32_t total) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci rc->value -= scale * (total - high); 71cabdff1aSopenharmony_ci rc->range = low ? scale * (high - low) 72cabdff1aSopenharmony_ci : rc->range - scale * (total - high); 73cabdff1aSopenharmony_ci opus_rc_dec_normalize(rc); 74cabdff1aSopenharmony_ci} 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci/* Main encoding function, this needs to go fast */ 77cabdff1aSopenharmony_cistatic av_always_inline void opus_rc_enc_update(OpusRangeCoder *rc, uint32_t b, uint32_t p, 78cabdff1aSopenharmony_ci uint32_t p_tot, const int ptwo) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci uint32_t rscaled, cnd = !!b; 81cabdff1aSopenharmony_ci if (ptwo) /* Whole function is inlined so hopefully branch is optimized out */ 82cabdff1aSopenharmony_ci rscaled = rc->range >> ff_log2(p_tot); 83cabdff1aSopenharmony_ci else 84cabdff1aSopenharmony_ci rscaled = rc->range/p_tot; 85cabdff1aSopenharmony_ci rc->value += cnd*(rc->range - rscaled*(p_tot - b)); 86cabdff1aSopenharmony_ci rc->range = (!cnd)*(rc->range - rscaled*(p_tot - p)) + cnd*rscaled*(p - b); 87cabdff1aSopenharmony_ci opus_rc_enc_normalize(rc); 88cabdff1aSopenharmony_ci} 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ciuint32_t ff_opus_rc_dec_cdf(OpusRangeCoder *rc, const uint16_t *cdf) 91cabdff1aSopenharmony_ci{ 92cabdff1aSopenharmony_ci unsigned int k, scale, total, symbol, low, high; 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci total = *cdf++; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci scale = rc->range / total; 97cabdff1aSopenharmony_ci symbol = rc->value / scale + 1; 98cabdff1aSopenharmony_ci symbol = total - FFMIN(symbol, total); 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci for (k = 0; cdf[k] <= symbol; k++); 101cabdff1aSopenharmony_ci high = cdf[k]; 102cabdff1aSopenharmony_ci low = k ? cdf[k-1] : 0; 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci opus_rc_dec_update(rc, scale, low, high, total); 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci return k; 107cabdff1aSopenharmony_ci} 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_civoid ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf) 110cabdff1aSopenharmony_ci{ 111cabdff1aSopenharmony_ci opus_rc_enc_update(rc, (!!val)*cdf[val], cdf[val + 1], cdf[0], 1); 112cabdff1aSopenharmony_ci} 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ciuint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits) 115cabdff1aSopenharmony_ci{ 116cabdff1aSopenharmony_ci uint32_t k, scale; 117cabdff1aSopenharmony_ci scale = rc->range >> bits; // in this case, scale = symbol 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci if (rc->value >= scale) { 120cabdff1aSopenharmony_ci rc->value -= scale; 121cabdff1aSopenharmony_ci rc->range -= scale; 122cabdff1aSopenharmony_ci k = 0; 123cabdff1aSopenharmony_ci } else { 124cabdff1aSopenharmony_ci rc->range = scale; 125cabdff1aSopenharmony_ci k = 1; 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci opus_rc_dec_normalize(rc); 128cabdff1aSopenharmony_ci return k; 129cabdff1aSopenharmony_ci} 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_civoid ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits) 132cabdff1aSopenharmony_ci{ 133cabdff1aSopenharmony_ci bits = (1 << bits) - 1; 134cabdff1aSopenharmony_ci opus_rc_enc_update(rc, (!!val)*bits, bits + !!val, bits + 1, 1); 135cabdff1aSopenharmony_ci} 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci/** 138cabdff1aSopenharmony_ci * CELT: read 1-25 raw bits at the end of the frame, backwards byte-wise 139cabdff1aSopenharmony_ci */ 140cabdff1aSopenharmony_ciuint32_t ff_opus_rc_get_raw(OpusRangeCoder *rc, uint32_t count) 141cabdff1aSopenharmony_ci{ 142cabdff1aSopenharmony_ci uint32_t value = 0; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci while (rc->rb.bytes && rc->rb.cachelen < count) { 145cabdff1aSopenharmony_ci rc->rb.cacheval |= *--rc->rb.position << rc->rb.cachelen; 146cabdff1aSopenharmony_ci rc->rb.cachelen += 8; 147cabdff1aSopenharmony_ci rc->rb.bytes--; 148cabdff1aSopenharmony_ci } 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci value = av_mod_uintp2(rc->rb.cacheval, count); 151cabdff1aSopenharmony_ci rc->rb.cacheval >>= count; 152cabdff1aSopenharmony_ci rc->rb.cachelen -= count; 153cabdff1aSopenharmony_ci rc->total_bits += count; 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci return value; 156cabdff1aSopenharmony_ci} 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci/** 159cabdff1aSopenharmony_ci * CELT: write 0 - 31 bits to the rawbits buffer 160cabdff1aSopenharmony_ci */ 161cabdff1aSopenharmony_civoid ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count) 162cabdff1aSopenharmony_ci{ 163cabdff1aSopenharmony_ci const int to_write = FFMIN(32 - rc->rb.cachelen, count); 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci rc->total_bits += count; 166cabdff1aSopenharmony_ci rc->rb.cacheval |= av_mod_uintp2(val, to_write) << rc->rb.cachelen; 167cabdff1aSopenharmony_ci rc->rb.cachelen = (rc->rb.cachelen + to_write) % 32; 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci if (!rc->rb.cachelen && count) { 170cabdff1aSopenharmony_ci AV_WB32((uint8_t *)rc->rb.position, rc->rb.cacheval); 171cabdff1aSopenharmony_ci rc->rb.bytes += 4; 172cabdff1aSopenharmony_ci rc->rb.position -= 4; 173cabdff1aSopenharmony_ci rc->rb.cachelen = count - to_write; 174cabdff1aSopenharmony_ci rc->rb.cacheval = av_mod_uintp2(val >> to_write, rc->rb.cachelen); 175cabdff1aSopenharmony_ci av_assert0(rc->rng_cur < rc->rb.position); 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci} 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci/** 180cabdff1aSopenharmony_ci * CELT: read a uniform distribution 181cabdff1aSopenharmony_ci */ 182cabdff1aSopenharmony_ciuint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size) 183cabdff1aSopenharmony_ci{ 184cabdff1aSopenharmony_ci uint32_t bits, k, scale, total; 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci bits = opus_ilog(size - 1); 187cabdff1aSopenharmony_ci total = (bits > 8) ? ((size - 1) >> (bits - 8)) + 1 : size; 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci scale = rc->range / total; 190cabdff1aSopenharmony_ci k = rc->value / scale + 1; 191cabdff1aSopenharmony_ci k = total - FFMIN(k, total); 192cabdff1aSopenharmony_ci opus_rc_dec_update(rc, scale, k, k + 1, total); 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci if (bits > 8) { 195cabdff1aSopenharmony_ci k = k << (bits - 8) | ff_opus_rc_get_raw(rc, bits - 8); 196cabdff1aSopenharmony_ci return FFMIN(k, size - 1); 197cabdff1aSopenharmony_ci } else 198cabdff1aSopenharmony_ci return k; 199cabdff1aSopenharmony_ci} 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_ci/** 202cabdff1aSopenharmony_ci * CELT: write a uniformly distributed integer 203cabdff1aSopenharmony_ci */ 204cabdff1aSopenharmony_civoid ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size) 205cabdff1aSopenharmony_ci{ 206cabdff1aSopenharmony_ci const int ps = FFMAX(opus_ilog(size - 1) - 8, 0); 207cabdff1aSopenharmony_ci opus_rc_enc_update(rc, val >> ps, (val >> ps) + 1, ((size - 1) >> ps) + 1, 0); 208cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, val, ps); 209cabdff1aSopenharmony_ci} 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ciuint32_t ff_opus_rc_dec_uint_step(OpusRangeCoder *rc, int k0) 212cabdff1aSopenharmony_ci{ 213cabdff1aSopenharmony_ci /* Use a probability of 3 up to itheta=8192 and then use 1 after */ 214cabdff1aSopenharmony_ci uint32_t k, scale, symbol, total = (k0+1)*3 + k0; 215cabdff1aSopenharmony_ci scale = rc->range / total; 216cabdff1aSopenharmony_ci symbol = rc->value / scale + 1; 217cabdff1aSopenharmony_ci symbol = total - FFMIN(symbol, total); 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci k = (symbol < (k0+1)*3) ? symbol/3 : symbol - (k0+1)*2; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci opus_rc_dec_update(rc, scale, (k <= k0) ? 3*(k+0) : (k-1-k0) + 3*(k0+1), 222cabdff1aSopenharmony_ci (k <= k0) ? 3*(k+1) : (k-0-k0) + 3*(k0+1), total); 223cabdff1aSopenharmony_ci return k; 224cabdff1aSopenharmony_ci} 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_civoid ff_opus_rc_enc_uint_step(OpusRangeCoder *rc, uint32_t val, int k0) 227cabdff1aSopenharmony_ci{ 228cabdff1aSopenharmony_ci const uint32_t a = val <= k0, b = 2*a + 1; 229cabdff1aSopenharmony_ci k0 = (k0 + 1) << 1; 230cabdff1aSopenharmony_ci val = b*(val + k0) - 3*a*k0; 231cabdff1aSopenharmony_ci opus_rc_enc_update(rc, val, val + b, (k0 << 1) - 1, 0); 232cabdff1aSopenharmony_ci} 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ciuint32_t ff_opus_rc_dec_uint_tri(OpusRangeCoder *rc, int qn) 235cabdff1aSopenharmony_ci{ 236cabdff1aSopenharmony_ci uint32_t k, scale, symbol, total, low, center; 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci total = ((qn>>1) + 1) * ((qn>>1) + 1); 239cabdff1aSopenharmony_ci scale = rc->range / total; 240cabdff1aSopenharmony_ci center = rc->value / scale + 1; 241cabdff1aSopenharmony_ci center = total - FFMIN(center, total); 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci if (center < total >> 1) { 244cabdff1aSopenharmony_ci k = (ff_sqrt(8 * center + 1) - 1) >> 1; 245cabdff1aSopenharmony_ci low = k * (k + 1) >> 1; 246cabdff1aSopenharmony_ci symbol = k + 1; 247cabdff1aSopenharmony_ci } else { 248cabdff1aSopenharmony_ci k = (2*(qn + 1) - ff_sqrt(8*(total - center - 1) + 1)) >> 1; 249cabdff1aSopenharmony_ci low = total - ((qn + 1 - k) * (qn + 2 - k) >> 1); 250cabdff1aSopenharmony_ci symbol = qn + 1 - k; 251cabdff1aSopenharmony_ci } 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci opus_rc_dec_update(rc, scale, low, low + symbol, total); 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci return k; 256cabdff1aSopenharmony_ci} 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_civoid ff_opus_rc_enc_uint_tri(OpusRangeCoder *rc, uint32_t k, int qn) 259cabdff1aSopenharmony_ci{ 260cabdff1aSopenharmony_ci uint32_t symbol, low, total; 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci total = ((qn>>1) + 1) * ((qn>>1) + 1); 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci if (k <= qn >> 1) { 265cabdff1aSopenharmony_ci low = k * (k + 1) >> 1; 266cabdff1aSopenharmony_ci symbol = k + 1; 267cabdff1aSopenharmony_ci } else { 268cabdff1aSopenharmony_ci low = total - ((qn + 1 - k) * (qn + 2 - k) >> 1); 269cabdff1aSopenharmony_ci symbol = qn + 1 - k; 270cabdff1aSopenharmony_ci } 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci opus_rc_enc_update(rc, low, low + symbol, total, 0); 273cabdff1aSopenharmony_ci} 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ciint ff_opus_rc_dec_laplace(OpusRangeCoder *rc, uint32_t symbol, int decay) 276cabdff1aSopenharmony_ci{ 277cabdff1aSopenharmony_ci /* extends the range coder to model a Laplace distribution */ 278cabdff1aSopenharmony_ci int value = 0; 279cabdff1aSopenharmony_ci uint32_t scale, low = 0, center; 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci scale = rc->range >> 15; 282cabdff1aSopenharmony_ci center = rc->value / scale + 1; 283cabdff1aSopenharmony_ci center = (1 << 15) - FFMIN(center, 1 << 15); 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci if (center >= symbol) { 286cabdff1aSopenharmony_ci value++; 287cabdff1aSopenharmony_ci low = symbol; 288cabdff1aSopenharmony_ci symbol = 1 + ((32768 - 32 - symbol) * (16384-decay) >> 15); 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci while (symbol > 1 && center >= low + 2 * symbol) { 291cabdff1aSopenharmony_ci value++; 292cabdff1aSopenharmony_ci symbol *= 2; 293cabdff1aSopenharmony_ci low += symbol; 294cabdff1aSopenharmony_ci symbol = (((symbol - 2) * decay) >> 15) + 1; 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci if (symbol <= 1) { 298cabdff1aSopenharmony_ci int distance = (center - low) >> 1; 299cabdff1aSopenharmony_ci value += distance; 300cabdff1aSopenharmony_ci low += 2 * distance; 301cabdff1aSopenharmony_ci } 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci if (center < low + symbol) 304cabdff1aSopenharmony_ci value *= -1; 305cabdff1aSopenharmony_ci else 306cabdff1aSopenharmony_ci low += symbol; 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci opus_rc_dec_update(rc, scale, low, FFMIN(low + symbol, 32768), 32768); 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci return value; 312cabdff1aSopenharmony_ci} 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_civoid ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay) 315cabdff1aSopenharmony_ci{ 316cabdff1aSopenharmony_ci uint32_t low = symbol; 317cabdff1aSopenharmony_ci int i = 1, val = FFABS(*value), pos = *value > 0; 318cabdff1aSopenharmony_ci if (!val) { 319cabdff1aSopenharmony_ci opus_rc_enc_update(rc, 0, symbol, 1 << 15, 1); 320cabdff1aSopenharmony_ci return; 321cabdff1aSopenharmony_ci } 322cabdff1aSopenharmony_ci symbol = ((32768 - 32 - symbol)*(16384 - decay)) >> 15; 323cabdff1aSopenharmony_ci for (; i < val && symbol; i++) { 324cabdff1aSopenharmony_ci low += (symbol << 1) + 2; 325cabdff1aSopenharmony_ci symbol = (symbol*decay) >> 14; 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci if (symbol) { 328cabdff1aSopenharmony_ci low += (++symbol)*pos; 329cabdff1aSopenharmony_ci } else { 330cabdff1aSopenharmony_ci const int distance = FFMIN(val - i, (((32768 - low) - !pos) >> 1) - 1); 331cabdff1aSopenharmony_ci low += pos + (distance << 1); 332cabdff1aSopenharmony_ci symbol = FFMIN(1, 32768 - low); 333cabdff1aSopenharmony_ci *value = FFSIGN(*value)*(distance + i); 334cabdff1aSopenharmony_ci } 335cabdff1aSopenharmony_ci opus_rc_enc_update(rc, low, low + symbol, 1 << 15, 1); 336cabdff1aSopenharmony_ci} 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ciint ff_opus_rc_dec_init(OpusRangeCoder *rc, const uint8_t *data, int size) 339cabdff1aSopenharmony_ci{ 340cabdff1aSopenharmony_ci int ret = init_get_bits8(&rc->gb, data, size); 341cabdff1aSopenharmony_ci if (ret < 0) 342cabdff1aSopenharmony_ci return ret; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci rc->range = 128; 345cabdff1aSopenharmony_ci rc->value = 127 - get_bits(&rc->gb, 7); 346cabdff1aSopenharmony_ci rc->total_bits = 9; 347cabdff1aSopenharmony_ci opus_rc_dec_normalize(rc); 348cabdff1aSopenharmony_ci 349cabdff1aSopenharmony_ci return 0; 350cabdff1aSopenharmony_ci} 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_civoid ff_opus_rc_dec_raw_init(OpusRangeCoder *rc, const uint8_t *rightend, uint32_t bytes) 353cabdff1aSopenharmony_ci{ 354cabdff1aSopenharmony_ci rc->rb.position = rightend; 355cabdff1aSopenharmony_ci rc->rb.bytes = bytes; 356cabdff1aSopenharmony_ci rc->rb.cachelen = 0; 357cabdff1aSopenharmony_ci rc->rb.cacheval = 0; 358cabdff1aSopenharmony_ci} 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_civoid ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size) 361cabdff1aSopenharmony_ci{ 362cabdff1aSopenharmony_ci int rng_bytes, bits = OPUS_RC_BITS - opus_ilog(rc->range); 363cabdff1aSopenharmony_ci uint32_t mask = (OPUS_RC_TOP - 1) >> bits; 364cabdff1aSopenharmony_ci uint32_t end = (rc->value + mask) & ~mask; 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci if ((end | mask) >= rc->value + rc->range) { 367cabdff1aSopenharmony_ci bits++; 368cabdff1aSopenharmony_ci mask >>= 1; 369cabdff1aSopenharmony_ci end = (rc->value + mask) & ~mask; 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci 372cabdff1aSopenharmony_ci /* Finish what's left */ 373cabdff1aSopenharmony_ci while (bits > 0) { 374cabdff1aSopenharmony_ci opus_rc_enc_carryout(rc, end >> OPUS_RC_SHIFT); 375cabdff1aSopenharmony_ci end = (end << OPUS_RC_SYM) & (OPUS_RC_TOP - 1); 376cabdff1aSopenharmony_ci bits -= OPUS_RC_SYM; 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci /* Flush out anything left or marked */ 380cabdff1aSopenharmony_ci if (rc->rem >= 0 || rc->ext > 0) 381cabdff1aSopenharmony_ci opus_rc_enc_carryout(rc, 0); 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci rng_bytes = rc->rng_cur - rc->buf; 384cabdff1aSopenharmony_ci memcpy(dst, rc->buf, rng_bytes); 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci rc->waste = size*8 - (rc->rb.bytes*8 + rc->rb.cachelen) - rng_bytes*8; 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci /* Put the rawbits part, if any */ 389cabdff1aSopenharmony_ci if (rc->rb.bytes || rc->rb.cachelen) { 390cabdff1aSopenharmony_ci int i, lap; 391cabdff1aSopenharmony_ci uint8_t *rb_src, *rb_dst; 392cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, 0, 32 - rc->rb.cachelen); 393cabdff1aSopenharmony_ci rb_src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rc->rb.bytes; 394cabdff1aSopenharmony_ci rb_dst = dst + FFMAX(size - rc->rb.bytes, 0); 395cabdff1aSopenharmony_ci lap = &dst[rng_bytes] - rb_dst; 396cabdff1aSopenharmony_ci for (i = 0; i < lap; i++) 397cabdff1aSopenharmony_ci rb_dst[i] |= rb_src[i]; 398cabdff1aSopenharmony_ci memcpy(&rb_dst[lap], &rb_src[lap], FFMAX(rc->rb.bytes - lap, 0)); 399cabdff1aSopenharmony_ci } 400cabdff1aSopenharmony_ci} 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_civoid ff_opus_rc_enc_init(OpusRangeCoder *rc) 403cabdff1aSopenharmony_ci{ 404cabdff1aSopenharmony_ci rc->value = 0; 405cabdff1aSopenharmony_ci rc->range = OPUS_RC_TOP; 406cabdff1aSopenharmony_ci rc->total_bits = OPUS_RC_BITS + 1; 407cabdff1aSopenharmony_ci rc->rem = -1; 408cabdff1aSopenharmony_ci rc->ext = 0; 409cabdff1aSopenharmony_ci rc->rng_cur = rc->buf; 410cabdff1aSopenharmony_ci ff_opus_rc_dec_raw_init(rc, rc->buf + OPUS_MAX_PACKET_SIZE + 8, 0); 411cabdff1aSopenharmony_ci} 412