2 * Copyright (c) 2012 Andrew D'Addesio
3 * Copyright (c) 2013-2014 Mozilla Corporation
4 * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #define OPUS_RC_BITS 32
27 #define OPUS_RC_CEIL ((1 << OPUS_RC_SYM) - 1)
28 #define OPUS_RC_TOP (1u << 31)
29 #define OPUS_RC_BOT (OPUS_RC_TOP >> OPUS_RC_SYM)
30 #define OPUS_RC_SHIFT (OPUS_RC_BITS - OPUS_RC_SYM - 1)
32 static av_always_inline
void opus_rc_enc_carryout(OpusRangeCoder
*rc
, int cbuf
)
34 const int cb
= cbuf
>> OPUS_RC_SYM
, mb
= (OPUS_RC_CEIL
+ cb
) & OPUS_RC_CEIL
;
35 if (cbuf
== OPUS_RC_CEIL
) {
39 rc
->rng_cur
[0] = rc
->rem
+ cb
;
40 rc
->rng_cur
+= (rc
->rem
>= 0);
41 for (; rc
->ext
> 0; rc
->ext
--)
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
,
67 uint32_t low
, uint32_t high
,
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
);
76 /* Main encoding function, this needs to go fast */
77 static av_always_inline
void opus_rc_enc_update(OpusRangeCoder
*rc
, uint32_t b
, uint32_t p
,
78 uint32_t p_tot
, const int ptwo
)
80 uint32_t rscaled
, cnd
= !!b
;
81 if (ptwo
) /* Whole function is inlined so hopefully branch is optimized out */
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
)
92 unsigned int k
, scale
, total
, symbol
, low
, high
;
96 scale
= rc
->range
/ total
;
97 symbol
= rc
->value
/ scale
+ 1;
98 symbol
= total
- FFMIN(symbol
, total
);
100 for (k
= 0; cdf
[k
] <= symbol
; k
++);
102 low
= k
? cdf
[k
-1] : 0;
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
) {
127 opus_rc_dec_normalize(rc
);
131 void ff_opus_rc_enc_log(OpusRangeCoder
*rc
, int val
, uint32_t bits
)
133 bits
= (1 << bits
) - 1;
134 opus_rc_enc_update(rc
, (!!val
)*bits
, bits
+ !!val
, bits
+ 1, 1);
138 * CELT: read 1-25 raw bits at the end of the frame, backwards byte-wise
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;
150 value
= av_mod_uintp2(rc
->rb
.cacheval
, count
);
151 rc
->rb
.cacheval
>>= count
;
152 rc
->rb
.cachelen
-= count
;
153 rc
->total_bits
+= count
;
159 * CELT: write 0 - 31 bits to the rawbits buffer
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
);
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
);
180 * CELT: read a uniform distribution
182 uint32_t ff_opus_rc_dec_uint(OpusRangeCoder
*rc
, uint32_t size
)
184 uint32_t bits
, k
, scale
, total
;
186 bits
= opus_ilog(size
- 1);
187 total
= (bits
> 8) ? ((size
- 1) >> (bits
- 8)) + 1 : size
;
189 scale
= rc
->range
/ total
;
190 k
= rc
->value
/ scale
+ 1;
191 k
= total
- FFMIN(k
, total
);
192 opus_rc_dec_update(rc
, scale
, k
, k
+ 1, total
);
195 k
= k
<< (bits
- 8) | ff_opus_rc_get_raw(rc
, bits
- 8);
196 return FFMIN(k
, size
- 1);
202 * CELT: write a uniformly distributed integer
204 void ff_opus_rc_enc_uint(OpusRangeCoder
*rc
, uint32_t val
, uint32_t size
)
206 const int ps
= FFMAX(opus_ilog(size
- 1) - 8, 0);
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
)
213 /* Use a probability of 3 up to itheta=8192 and then use 1 after */
214 uint32_t k
, scale
, symbol
, total
= (k0
+1)*3 + k0
;
215 scale
= rc
->range
/ total
;
216 symbol
= rc
->value
/ scale
+ 1;
217 symbol
= total
- FFMIN(symbol
, total
);
219 k
= (symbol
< (k0
+1)*3) ? symbol
/3 : symbol
- (k0
+1)*2;
221 opus_rc_dec_update(rc
, scale
, (k
<= k0
) ? 3*(k
+0) : (k
-1-k0
) + 3*(k0
+1),
222 (k
<= k0
) ? 3*(k
+1) : (k
-0-k0
) + 3*(k0
+1), total
);
226 void ff_opus_rc_enc_uint_step(OpusRangeCoder
*rc
, uint32_t val
, int k0
)
228 const uint32_t a
= val
<= k0
, b
= 2*a
+ 1;
230 val
= b
*(val
+ k0
) - 3*a
*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
)
236 uint32_t k
, scale
, symbol
, total
, low
, center
;
238 total
= ((qn
>>1) + 1) * ((qn
>>1) + 1);
239 scale
= rc
->range
/ total
;
240 center
= rc
->value
/ scale
+ 1;
241 center
= total
- FFMIN(center
, total
);
243 if (center
< total
>> 1) {
244 k
= (ff_sqrt(8 * center
+ 1) - 1) >> 1;
245 low
= k
* (k
+ 1) >> 1;
248 k
= (2*(qn
+ 1) - ff_sqrt(8*(total
- center
- 1) + 1)) >> 1;
249 low
= total
- ((qn
+ 1 - k
) * (qn
+ 2 - k
) >> 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
)
260 uint32_t symbol
, low
, total
;
262 total
= ((qn
>>1) + 1) * ((qn
>>1) + 1);
265 low
= k
* (k
+ 1) >> 1;
268 low
= total
- ((qn
+ 1 - k
) * (qn
+ 2 - k
) >> 1);
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
)
277 /* extends the range coder to model a Laplace distribution */
279 uint32_t scale
, low
= 0, center
;
281 scale
= rc
->range
>> 15;
282 center
= rc
->value
/ scale
+ 1;
283 center
= (1 << 15) - FFMIN(center
, 1 << 15);
285 if (center
>= symbol
) {
288 symbol
= 1 + ((32768 - 32 - symbol
) * (16384-decay
) >> 15);
290 while (symbol
> 1 && center
>= low
+ 2 * symbol
) {
294 symbol
= (((symbol
- 2) * decay
) >> 15) + 1;
298 int distance
= (center
- low
) >> 1;
303 if (center
< low
+ symbol
)
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
)
316 uint32_t low
= symbol
;
317 int i
= 1, val
= FFABS(*value
), pos
= *value
> 0;
319 opus_rc_enc_update(rc
, 0, symbol
, 1 << 15, 1);
322 symbol
= ((32768 - 32 - symbol
)*(16384 - decay
)) >> 15;
323 for (; i
< val
&& symbol
; i
++) {
324 low
+= (symbol
<< 1) + 2;
325 symbol
= (symbol
*decay
) >> 14;
328 low
+= (++symbol
)*pos
;
330 const int distance
= FFMIN(val
- i
, (((32768 - low
) - !pos
) >> 1) - 1);
331 low
+= pos
+ (distance
<< 1);
332 symbol
= FFMIN(1, 32768 - low
);
333 *value
= FFSIGN(*value
)*(distance
+ i
);
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
);
345 rc
->value
= 127 - get_bits(&rc
->gb
, 7);
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
;
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
);
363 uint32_t mask
= (OPUS_RC_TOP
- 1) >> bits
;
364 uint32_t end
= (rc
->value
+ mask
) & ~mask
;
366 if ((end
| mask
) >= rc
->value
+ rc
->range
) {
369 end
= (rc
->value
+ mask
) & ~mask
;
372 /* Finish what's left */
374 opus_rc_enc_carryout(rc
, end
>> OPUS_RC_SHIFT
);
375 end
= (end
<< OPUS_RC_SYM
) & (OPUS_RC_TOP
- 1);
379 /* Flush out anything left or marked */
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;
388 /* Put the rawbits part, if any */
389 if (rc
->rb
.bytes
|| rc
->rb
.cachelen
) {
391 uint8_t *rb_src
, *rb_dst
;
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);
395 lap
= &dst
[rng_bytes
] - rb_dst
;
396 for (i
= 0; i
< lap
; i
++)
397 rb_dst
[i
] |= rb_src
[i
];
398 memcpy(&rb_dst
[lap
], &rb_src
[lap
], FFMAX(rc
->rb
.bytes
- lap
, 0));
402 void ff_opus_rc_enc_init(OpusRangeCoder
*rc
)
405 rc
->range
= OPUS_RC_TOP
;
406 rc
->total_bits
= OPUS_RC_BITS
+ 1;
409 rc
->rng_cur
= rc
->buf
;
410 ff_opus_rc_dec_raw_init(rc
, rc
->buf
+ OPUS_MAX_PACKET_SIZE
+ 8, 0);