23 #ifndef AVCODEC_OPUS_H 24 #define AVCODEC_OPUS_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 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,
132 float silk_buf[2][960];
133 float *silk_output[2];
135 float *celt_output[2];
137 float redundancy_buf[2][960];
138 float *redundancy_output[2];
198 while (rc->
range <= 1<<23) {
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);
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;
236 unsigned int k, scale;
239 if (rc->
value >= scale) {
262 unsigned int i, total_bits, rcbuffer, range;
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;
284 unsigned int value = 0;
305 unsigned int bits, k, scale, total;
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);
317 return FFMIN(k, size - 1);
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;
350 if (center < low + symbol)
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);
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);
425 float **output,
int coded_channels,
int frame_size,
426 int startband,
int endband);
AVAudioResampleContext * avr
void ff_celt_flush(CeltContext *s)
AVAudioFifo ** sync_buffers
int frame_count
configuration: tells the audio mode, bandwidth, and frame duration
static av_always_inline unsigned int opus_rc_getsymbol(OpusRangeCoder *rc, const uint16_t *cdf)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static const uint8_t frame_size[4]
#define DECLARE_ALIGNED(n, t, v)
static av_always_inline unsigned int opus_rc_p2model(OpusRangeCoder *rc, unsigned int bits)
int vbr
whether this packet is mono or stereo
int ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size, int self_delimited)
Parse Opus packet info from raw packet data.
unsigned int total_read_bits
void ff_celt_free(CeltContext **s)
bitstream reader API header.
const float ff_celt_window2[120]
ChannelMap * channel_maps
static const uint8_t opus_default_extradata[30]
int ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s)
static av_always_inline unsigned int opus_rc_tell_frac(const OpusRangeCoder *rc)
reference-counted frame API
Context for an Audio FIFO Buffer.
static float distance(float x, float y, int band)
int ff_celt_init(AVCodecContext *avctx, CeltContext **s, int output_channels)
int frame_duration
frame sizes
int out_dummy_allocated_size
Libavcodec external API header.
static av_always_inline unsigned int opus_rc_stepmodel(OpusRangeCoder *rc, int k0)
static av_const unsigned int ff_sqrt(unsigned int a)
void ff_silk_flush(SilkContext *s)
main external API structure.
static av_always_inline void opus_rc_update(OpusRangeCoder *rc, unsigned int scale, unsigned int low, unsigned int high, unsigned int total)
int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels)
void ff_silk_free(SilkContext **ps)
int stereo
packet code: specifies the frame layout
static av_always_inline unsigned int opus_rc_trimodel(OpusRangeCoder *rc, int qn)
static av_always_inline unsigned int opus_getrawbits(OpusRangeCoder *rc, unsigned int count)
CELT: read 1-25 raw bits at the end of the frame, backwards byte-wise.
static av_always_inline void opus_rc_normalize(OpusRangeCoder *rc)
int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc, float *output[2], enum OpusBandwidth bandwidth, int coded_channels, int duration_ms)
Decode the LP layer of one Opus frame (which may correspond to several SILK frames).
static av_always_inline unsigned int opus_rc_unimodel(OpusRangeCoder *rc, unsigned int size)
CELT: read a uniform distribution.
int ff_celt_decode_frame(CeltContext *s, OpusRangeCoder *rc, float **output, int coded_channels, int frame_size, int startband, int endband)
OpusStreamContext * streams
OpusRangeCoder redundancy_rc
static av_always_inline unsigned int opus_rc_tell(const OpusRangeCoder *rc)
CELT: estimate bits of entropy that have thus far been consumed for the current CELT frame...
static av_always_inline int opus_rc_laplace(OpusRangeCoder *rc, unsigned int symbol, int decay)
int code
size of the useful data – packet size - padding