2 * Opus decoder/demuxer common functions
3 * Copyright (c) 2012 Andrew D'Addesio
4 * Copyright (c) 2013-2014 Mozilla Corporation
6 * This file is part of Libav.
8 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #ifndef AVCODEC_OPUS_H
24 #define AVCODEC_OPUS_H
28 #include "libavutil/audio_fifo.h"
29 #include "libavutil/float_dsp.h"
30 #include "libavutil/frame.h"
32 #include "libavresample/avresample.h"
35 #include "bitstream.h"
37 #define MAX_FRAME_SIZE 1275
39 #define MAX_PACKET_DUR 5760
41 #define CELT_SHORT_BLOCKSIZE 120
42 #define CELT_OVERLAP CELT_SHORT_BLOCKSIZE
43 #define CELT_MAX_LOG_BLOCKS 3
44 #define CELT_MAX_FRAME_SIZE (CELT_SHORT_BLOCKSIZE * (1 << CELT_MAX_LOG_BLOCKS))
45 #define CELT_MAX_BANDS 21
46 #define CELT_VECTORS 11
47 #define CELT_ALLOC_STEPS 6
48 #define CELT_FINE_OFFSET 21
49 #define CELT_MAX_FINE_BITS 8
50 #define CELT_NORM_SCALE 16384
51 #define CELT_QTHETA_OFFSET 4
52 #define CELT_QTHETA_OFFSET_TWOPHASE 16
53 #define CELT_DEEMPH_COEFF 0.85000610f
54 #define CELT_POSTFILTER_MINPERIOD 15
55 #define CELT_ENERGY_SILENCE (-28.0f)
57 #define SILK_HISTORY 322
58 #define SILK_MAX_LPC 16
60 #define ROUND_MULL(a,b,s) (((MUL64(a, b) >> (s - 1)) + 1) >> 1)
61 #define ROUND_MUL16(a,b) ((MUL16(a, b) + 16384) >> 15)
62 #define opus_ilog(i) (av_log2(i) + !!(i))
64 #define OPUS_TS_HEADER 0x7FE0 // 0x3ff (11 bits)
65 #define OPUS_TS_MASK 0xFFE0 // top 11 bits
67 static const uint8_t opus_default_extradata
[30] = {
68 'O', 'p', 'u', 's', 'H', 'e', 'a', 'd',
69 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80 OPUS_BANDWIDTH_NARROWBAND
,
81 OPUS_BANDWIDTH_MEDIUMBAND
,
82 OPUS_BANDWIDTH_WIDEBAND
,
83 OPUS_BANDWIDTH_SUPERWIDEBAND
,
84 OPUS_BANDWIDTH_FULLBAND
87 typedef struct RawBitsContext
{
88 const uint8_t *position
;
90 unsigned int cachelen
;
91 unsigned int cacheval
;
94 typedef struct OpusRangeCoder
{
99 unsigned int total_read_bits
;
102 typedef struct SilkContext SilkContext
;
104 typedef struct CeltContext CeltContext
;
106 typedef struct OpusPacket
{
107 int packet_size
; /** packet size */
108 int data_size
; /** size of the useful data -- packet size - padding */
109 int code
; /** packet code: specifies the frame layout */
110 int stereo
; /** whether this packet is mono or stereo */
111 int vbr
; /** vbr flag */
112 int config
; /** configuration: tells the audio mode,
113 ** bandwidth, and frame duration */
114 int frame_count
; /** frame count */
115 int frame_offset
[MAX_FRAMES
]; /** frame offsets */
116 int frame_size
[MAX_FRAMES
]; /** frame sizes */
117 int frame_duration
; /** frame duration, in samples @ 48kHz */
118 enum OpusMode mode
; /** mode */
119 enum OpusBandwidth bandwidth
; /** bandwidth */
122 typedef struct OpusStreamContext
{
123 AVCodecContext
*avctx
;
127 OpusRangeCoder redundancy_rc
;
130 AVFloatDSPContext
*fdsp
;
132 float silk_buf
[2][960];
133 float *silk_output
[2];
134 DECLARE_ALIGNED(32, float, celt_buf
)[2][960];
135 float *celt_output
[2];
137 float redundancy_buf
[2][960];
138 float *redundancy_output
[2];
140 /* data buffers for the final output data */
145 int out_dummy_allocated_size
;
147 AVAudioResampleContext
*avr
;
148 AVAudioFifo
*celt_delay
;
150 /* number of samples we still want to get from the resampler */
158 // a mapping between an opus stream and an output channel
159 typedef struct ChannelMap
{
163 // when a single decoded channel is mapped to multiple output channels, we
164 // write to the first output directly and copy from it to the others
165 // this field is set to 1 for those copied output channels
167 // this is the index of the output channel to copy from
170 // this channel is silent
174 typedef struct OpusContext
{
175 OpusStreamContext
*streams
;
177 /* current output buffers for each streams */
180 /* Buffers for synchronizing the streams when they have different
181 * resampling delays */
182 AVAudioFifo
**sync_buffers
;
183 /* number of decoded samples for each stream */
184 int *decoded_samples
;
187 int nb_stereo_streams
;
189 AVFloatDSPContext fdsp
;
193 ChannelMap
*channel_maps
;
196 static av_always_inline
void opus_rc_normalize(OpusRangeCoder
*rc
)
198 while (rc
->range
<= 1<<23) {
199 rc
->value
= ((rc
->value
<< 8) | (bitstream_read(&rc
->bc
, 8) ^ 0xFF)) & ((1u << 31) - 1);
201 rc
->total_read_bits
+= 8;
205 static av_always_inline
void opus_rc_update(OpusRangeCoder
*rc
, unsigned int scale
,
206 unsigned int low
, unsigned int high
,
209 rc
->value
-= scale
* (total
- high
);
210 rc
->range
= low
? scale
* (high
- low
)
211 : rc
->range
- scale
* (total
- high
);
212 opus_rc_normalize(rc
);
215 static av_always_inline
unsigned int opus_rc_getsymbol(OpusRangeCoder
*rc
, const uint16_t *cdf
)
217 unsigned int k
, scale
, total
, symbol
, low
, high
;
221 scale
= rc
->range
/ total
;
222 symbol
= rc
->value
/ scale
+ 1;
223 symbol
= total
- FFMIN(symbol
, total
);
225 for (k
= 0; cdf
[k
] <= symbol
; k
++);
227 low
= k
? cdf
[k
-1] : 0;
229 opus_rc_update(rc
, scale
, low
, high
, total
);
234 static av_always_inline
unsigned int opus_rc_p2model(OpusRangeCoder
*rc
, unsigned int bits
)
236 unsigned int k
, scale
;
237 scale
= rc
->range
>> bits
; // in this case, scale = symbol
239 if (rc
->value
>= scale
) {
247 opus_rc_normalize(rc
);
252 * CELT: estimate bits of entropy that have thus far been consumed for the
253 * current CELT frame, to integer and fractional (1/8th bit) precision
255 static av_always_inline
unsigned int opus_rc_tell(const OpusRangeCoder
*rc
)
257 return rc
->total_read_bits
- av_log2(rc
->range
) - 1;
260 static av_always_inline
unsigned int opus_rc_tell_frac(const OpusRangeCoder
*rc
)
262 unsigned int i
, total_bits
, rcbuffer
, range
;
264 total_bits
= rc
->total_read_bits
<< 3;
265 rcbuffer
= av_log2(rc
->range
) + 1;
266 range
= rc
->range
>> (rcbuffer
-16);
268 for (i
= 0; i
< 3; i
++) {
270 range
= range
* range
>> 15;
272 rcbuffer
= rcbuffer
<< 1 | bit
;
276 return total_bits
- rcbuffer
;
280 * CELT: read 1-25 raw bits at the end of the frame, backwards byte-wise
282 static av_always_inline
unsigned int opus_getrawbits(OpusRangeCoder
*rc
, unsigned int count
)
284 unsigned int value
= 0;
286 while (rc
->rb
.bytes
&& rc
->rb
.cachelen
< count
) {
287 rc
->rb
.cacheval
|= *--rc
->rb
.position
<< rc
->rb
.cachelen
;
288 rc
->rb
.cachelen
+= 8;
292 value
= rc
->rb
.cacheval
& ((1<<count
)-1);
293 rc
->rb
.cacheval
>>= count
;
294 rc
->rb
.cachelen
-= count
;
295 rc
->total_read_bits
+= count
;
301 * CELT: read a uniform distribution
303 static av_always_inline
unsigned int opus_rc_unimodel(OpusRangeCoder
*rc
, unsigned int size
)
305 unsigned int bits
, k
, scale
, total
;
307 bits
= opus_ilog(size
- 1);
308 total
= (bits
> 8) ? ((size
- 1) >> (bits
- 8)) + 1 : size
;
310 scale
= rc
->range
/ total
;
311 k
= rc
->value
/ scale
+ 1;
312 k
= total
- FFMIN(k
, total
);
313 opus_rc_update(rc
, scale
, k
, k
+ 1, total
);
316 k
= k
<< (bits
- 8) | opus_getrawbits(rc
, bits
- 8);
317 return FFMIN(k
, size
- 1);
322 static av_always_inline
int opus_rc_laplace(OpusRangeCoder
*rc
, unsigned int symbol
, int decay
)
324 /* extends the range coder to model a Laplace distribution */
326 unsigned int scale
, low
= 0, center
;
328 scale
= rc
->range
>> 15;
329 center
= rc
->value
/ scale
+ 1;
330 center
= (1 << 15) - FFMIN(center
, 1 << 15);
332 if (center
>= symbol
) {
335 symbol
= 1 + ((32768 - 32 - symbol
) * (16384-decay
) >> 15);
337 while (symbol
> 1 && center
>= low
+ 2 * symbol
) {
341 symbol
= (((symbol
- 2) * decay
) >> 15) + 1;
345 int distance
= (center
- low
) >> 1;
350 if (center
< low
+ symbol
)
356 opus_rc_update(rc
, scale
, low
, FFMIN(low
+ symbol
, 32768), 32768);
361 static av_always_inline
unsigned int opus_rc_stepmodel(OpusRangeCoder
*rc
, int k0
)
363 /* Use a probability of 3 up to itheta=8192 and then use 1 after */
364 unsigned int k
, scale
, symbol
, total
= (k0
+1)*3 + k0
;
365 scale
= rc
->range
/ total
;
366 symbol
= rc
->value
/ scale
+ 1;
367 symbol
= total
- FFMIN(symbol
, total
);
369 k
= (symbol
< (k0
+1)*3) ? symbol
/3 : symbol
- (k0
+1)*2;
371 opus_rc_update(rc
, scale
, (k
<= k0
) ? 3*(k
+0) : (k
-1-k0
) + 3*(k0
+1),
372 (k
<= k0
) ? 3*(k
+1) : (k
-0-k0
) + 3*(k0
+1), total
);
376 static av_always_inline
unsigned int opus_rc_trimodel(OpusRangeCoder
*rc
, int qn
)
378 unsigned int k
, scale
, symbol
, total
, low
, center
;
380 total
= ((qn
>>1) + 1) * ((qn
>>1) + 1);
381 scale
= rc
->range
/ total
;
382 center
= rc
->value
/ scale
+ 1;
383 center
= total
- FFMIN(center
, total
);
385 if (center
< total
>> 1) {
386 k
= (ff_sqrt(8 * center
+ 1) - 1) >> 1;
387 low
= k
* (k
+ 1) >> 1;
390 k
= (2*(qn
+ 1) - ff_sqrt(8*(total
- center
- 1) + 1)) >> 1;
391 low
= total
- ((qn
+ 1 - k
) * (qn
+ 2 - k
) >> 1);
395 opus_rc_update(rc
, scale
, low
, low
+ symbol
, total
);
400 int ff_opus_parse_packet(OpusPacket
*pkt
, const uint8_t *buf
, int buf_size
,
403 int ff_opus_parse_extradata(AVCodecContext
*avctx
, OpusContext
*s
);
405 int ff_silk_init(AVCodecContext
*avctx
, SilkContext
**ps
, int output_channels
);
406 void ff_silk_free(SilkContext
**ps
);
407 void ff_silk_flush(SilkContext
*s
);
410 * Decode the LP layer of one Opus frame (which may correspond to several SILK
413 int ff_silk_decode_superframe(SilkContext
*s
, OpusRangeCoder
*rc
,
415 enum OpusBandwidth bandwidth
, int coded_channels
,
418 int ff_celt_init(AVCodecContext
*avctx
, CeltContext
**s
, int output_channels
);
420 void ff_celt_free(CeltContext
**s
);
422 void ff_celt_flush(CeltContext
*s
);
424 int ff_celt_decode_frame(CeltContext
*s
, OpusRangeCoder
*rc
,
425 float **output
, int coded_channels
, int frame_size
,
426 int startband
, int endband
);
428 extern const float ff_celt_window2
[120];
430 #endif /* AVCODEC_OPUS_H */