Lines Matching refs:rc

32 static av_always_inline void opus_rc_enc_carryout(OpusRangeCoder *rc, int cbuf)
36 rc->ext++;
39 rc->rng_cur[0] = rc->rem + cb;
40 rc->rng_cur += (rc->rem >= 0);
41 for (; rc->ext > 0; rc->ext--)
42 *rc->rng_cur++ = mb;
43 av_assert0(rc->rng_cur < rc->rb.position);
44 rc->rem = cbuf & OPUS_RC_CEIL; /* Propagate */
47 static av_always_inline void opus_rc_dec_normalize(OpusRangeCoder *rc)
49 while (rc->range <= OPUS_RC_BOT) {
50 rc->value = ((rc->value << OPUS_RC_SYM) | (get_bits(&rc->gb, OPUS_RC_SYM) ^ OPUS_RC_CEIL)) & (OPUS_RC_TOP - 1);
51 rc->range <<= OPUS_RC_SYM;
52 rc->total_bits += OPUS_RC_SYM;
56 static av_always_inline void opus_rc_enc_normalize(OpusRangeCoder *rc)
58 while (rc->range <= OPUS_RC_BOT) {
59 opus_rc_enc_carryout(rc, rc->value >> OPUS_RC_SHIFT);
60 rc->value = (rc->value << OPUS_RC_SYM) & (OPUS_RC_TOP - 1);
61 rc->range <<= OPUS_RC_SYM;
62 rc->total_bits += OPUS_RC_SYM;
66 static av_always_inline void opus_rc_dec_update(OpusRangeCoder *rc, uint32_t scale,
70 rc->value -= scale * (total - high);
71 rc->range = low ? scale * (high - low)
72 : rc->range - scale * (total - high);
73 opus_rc_dec_normalize(rc);
77 static av_always_inline void opus_rc_enc_update(OpusRangeCoder *rc, uint32_t b, uint32_t p,
82 rscaled = rc->range >> ff_log2(p_tot);
84 rscaled = rc->range/p_tot;
85 rc->value += cnd*(rc->range - rscaled*(p_tot - b));
86 rc->range = (!cnd)*(rc->range - rscaled*(p_tot - p)) + cnd*rscaled*(p - b);
87 opus_rc_enc_normalize(rc);
90 uint32_t ff_opus_rc_dec_cdf(OpusRangeCoder *rc, const uint16_t *cdf)
96 scale = rc->range / total;
97 symbol = rc->value / scale + 1;
104 opus_rc_dec_update(rc, scale, low, high, total);
109 void ff_opus_rc_enc_cdf(OpusRangeCoder *rc, int val, const uint16_t *cdf)
111 opus_rc_enc_update(rc, (!!val)*cdf[val], cdf[val + 1], cdf[0], 1);
114 uint32_t ff_opus_rc_dec_log(OpusRangeCoder *rc, uint32_t bits)
117 scale = rc->range >> bits; // in this case, scale = symbol
119 if (rc->value >= scale) {
120 rc->value -= scale;
121 rc->range -= scale;
124 rc->range = scale;
127 opus_rc_dec_normalize(rc);
131 void ff_opus_rc_enc_log(OpusRangeCoder *rc, int val, uint32_t bits)
134 opus_rc_enc_update(rc, (!!val)*bits, bits + !!val, bits + 1, 1);
140 uint32_t ff_opus_rc_get_raw(OpusRangeCoder *rc, uint32_t count)
144 while (rc->rb.bytes && rc->rb.cachelen < count) {
145 rc->rb.cacheval |= *--rc->rb.position << rc->rb.cachelen;
146 rc->rb.cachelen += 8;
147 rc->rb.bytes--;
150 value = av_mod_uintp2(rc->rb.cacheval, count);
151 rc->rb.cacheval >>= count;
152 rc->rb.cachelen -= count;
153 rc->total_bits += count;
161 void ff_opus_rc_put_raw(OpusRangeCoder *rc, uint32_t val, uint32_t count)
163 const int to_write = FFMIN(32 - rc->rb.cachelen, count);
165 rc->total_bits += count;
166 rc->rb.cacheval |= av_mod_uintp2(val, to_write) << rc->rb.cachelen;
167 rc->rb.cachelen = (rc->rb.cachelen + to_write) % 32;
169 if (!rc->rb.cachelen && count) {
170 AV_WB32((uint8_t *)rc->rb.position, rc->rb.cacheval);
171 rc->rb.bytes += 4;
172 rc->rb.position -= 4;
173 rc->rb.cachelen = count - to_write;
174 rc->rb.cacheval = av_mod_uintp2(val >> to_write, rc->rb.cachelen);
175 av_assert0(rc->rng_cur < rc->rb.position);
182 uint32_t ff_opus_rc_dec_uint(OpusRangeCoder *rc, uint32_t size)
189 scale = rc->range / total;
190 k = rc->value / scale + 1;
192 opus_rc_dec_update(rc, scale, k, k + 1, total);
195 k = k << (bits - 8) | ff_opus_rc_get_raw(rc, bits - 8);
204 void ff_opus_rc_enc_uint(OpusRangeCoder *rc, uint32_t val, uint32_t size)
207 opus_rc_enc_update(rc, val >> ps, (val >> ps) + 1, ((size - 1) >> ps) + 1, 0);
208 ff_opus_rc_put_raw(rc, val, ps);
211 uint32_t ff_opus_rc_dec_uint_step(OpusRangeCoder *rc, int k0)
215 scale = rc->range / total;
216 symbol = rc->value / scale + 1;
221 opus_rc_dec_update(rc, scale, (k <= k0) ? 3*(k+0) : (k-1-k0) + 3*(k0+1),
226 void ff_opus_rc_enc_uint_step(OpusRangeCoder *rc, uint32_t val, int k0)
231 opus_rc_enc_update(rc, val, val + b, (k0 << 1) - 1, 0);
234 uint32_t ff_opus_rc_dec_uint_tri(OpusRangeCoder *rc, int qn)
239 scale = rc->range / total;
240 center = rc->value / scale + 1;
253 opus_rc_dec_update(rc, scale, low, low + symbol, total);
258 void ff_opus_rc_enc_uint_tri(OpusRangeCoder *rc, uint32_t k, int qn)
272 opus_rc_enc_update(rc, low, low + symbol, total, 0);
275 int ff_opus_rc_dec_laplace(OpusRangeCoder *rc, uint32_t symbol, int decay)
281 scale = rc->range >> 15;
282 center = rc->value / scale + 1;
309 opus_rc_dec_update(rc, scale, low, FFMIN(low + symbol, 32768), 32768);
314 void ff_opus_rc_enc_laplace(OpusRangeCoder *rc, int *value, uint32_t symbol, int decay)
319 opus_rc_enc_update(rc, 0, symbol, 1 << 15, 1);
335 opus_rc_enc_update(rc, low, low + symbol, 1 << 15, 1);
338 int ff_opus_rc_dec_init(OpusRangeCoder *rc, const uint8_t *data, int size)
340 int ret = init_get_bits8(&rc->gb, data, size);
344 rc->range = 128;
345 rc->value = 127 - get_bits(&rc->gb, 7);
346 rc->total_bits = 9;
347 opus_rc_dec_normalize(rc);
352 void ff_opus_rc_dec_raw_init(OpusRangeCoder *rc, const uint8_t *rightend, uint32_t bytes)
354 rc->rb.position = rightend;
355 rc->rb.bytes = bytes;
356 rc->rb.cachelen = 0;
357 rc->rb.cacheval = 0;
360 void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size)
362 int rng_bytes, bits = OPUS_RC_BITS - opus_ilog(rc->range);
364 uint32_t end = (rc->value + mask) & ~mask;
366 if ((end | mask) >= rc->value + rc->range) {
369 end = (rc->value + mask) & ~mask;
374 opus_rc_enc_carryout(rc, end >> OPUS_RC_SHIFT);
380 if (rc->rem >= 0 || rc->ext > 0)
381 opus_rc_enc_carryout(rc, 0);
383 rng_bytes = rc->rng_cur - rc->buf;
384 memcpy(dst, rc->buf, rng_bytes);
386 rc->waste = size*8 - (rc->rb.bytes*8 + rc->rb.cachelen) - rng_bytes*8;
389 if (rc->rb.bytes || rc->rb.cachelen) {
392 ff_opus_rc_put_raw(rc, 0, 32 - rc->rb.cachelen);
393 rb_src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rc->rb.bytes;
394 rb_dst = dst + FFMAX(size - rc->rb.bytes, 0);
398 memcpy(&rb_dst[lap], &rb_src[lap], FFMAX(rc->rb.bytes - lap, 0));
402 void ff_opus_rc_enc_init(OpusRangeCoder *rc)
404 rc->value = 0;
405 rc->range = OPUS_RC_TOP;
406 rc->total_bits = OPUS_RC_BITS + 1;
407 rc->rem = -1;
408 rc->ext = 0;
409 rc->rng_cur = rc->buf;
410 ff_opus_rc_dec_raw_init(rc, rc->buf + OPUS_MAX_PACKET_SIZE + 8, 0);