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 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
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"
31 #include "libavutil/mem_internal.h"
33 #include "libswresample/swresample.h"
38 #define MAX_FRAME_SIZE 1275
40 #define MAX_PACKET_DUR 5760
42 #define CELT_SHORT_BLOCKSIZE 120
43 #define CELT_OVERLAP CELT_SHORT_BLOCKSIZE
44 #define CELT_MAX_LOG_BLOCKS 3
45 #define CELT_MAX_FRAME_SIZE (CELT_SHORT_BLOCKSIZE * (1 << CELT_MAX_LOG_BLOCKS))
46 #define CELT_MAX_BANDS 21
48 #define SILK_HISTORY 322
49 #define SILK_MAX_LPC 16
51 #define ROUND_MULL(a,b,s) (((MUL64(a, b) >> ((s) - 1)) + 1) >> 1)
52 #define ROUND_MUL16(a,b) ((MUL16(a, b) + 16384) >> 15)
54 #define OPUS_TS_HEADER 0x7FE0 // 0x3ff (11 bits)
55 #define OPUS_TS_MASK 0xFFE0 // top 11 bits
57 static const uint8_t opus_default_extradata[30] = {
58 'O', 'p', 'u', 's', 'H', 'e', 'a', 'd',
59 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72 OPUS_BANDWIDTH_NARROWBAND,
73 OPUS_BANDWIDTH_MEDIUMBAND,
74 OPUS_BANDWIDTH_WIDEBAND,
75 OPUS_BANDWIDTH_SUPERWIDEBAND,
76 OPUS_BANDWIDTH_FULLBAND,
81 typedef struct SilkContext SilkContext;
83 typedef struct CeltFrame CeltFrame;
85 typedef struct OpusPacket {
86 int packet_size; /**< packet size */
87 int data_size; /**< size of the useful data -- packet size - padding */
88 int code; /**< packet code: specifies the frame layout */
89 int stereo; /**< whether this packet is mono or stereo */
90 int vbr; /**< vbr flag */
91 int config; /**< configuration: tells the audio mode,
92 ** bandwidth, and frame duration */
93 int frame_count; /**< frame count */
94 int frame_offset[MAX_FRAMES]; /**< frame offsets */
95 int frame_size[MAX_FRAMES]; /**< frame sizes */
96 int frame_duration; /**< frame duration, in samples @ 48kHz */
97 enum OpusMode mode; /**< mode */
98 enum OpusBandwidth bandwidth; /**< bandwidth */
101 typedef struct OpusStreamContext {
102 AVCodecContext *avctx;
105 /* number of decoded samples for this stream */
107 /* current output buffers for this stream */
110 /* Buffer with samples from this stream for synchronizing
111 * the streams when they have different resampling delays */
112 AVAudioFifo *sync_buffer;
115 OpusRangeCoder redundancy_rc;
118 AVFloatDSPContext *fdsp;
120 float silk_buf[2][960];
121 float *silk_output[2];
122 DECLARE_ALIGNED(32, float, celt_buf)[2][960];
123 float *celt_output[2];
125 DECLARE_ALIGNED(32, float, redundancy_buf)[2][960];
126 float *redundancy_output[2];
128 /* buffers for the next samples to be decoded */
130 int remaining_out_size;
133 int out_dummy_allocated_size;
136 AVAudioFifo *celt_delay;
138 /* number of samples we still want to get from the resampler */
146 // a mapping between an opus stream and an output channel
147 typedef struct ChannelMap {
151 // when a single decoded channel is mapped to multiple output channels, we
152 // write to the first output directly and copy from it to the others
153 // this field is set to 1 for those copied output channels
155 // this is the index of the output channel to copy from
158 // this channel is silent
162 typedef struct OpusContext {
164 OpusStreamContext *streams;
168 int nb_stereo_streams;
170 AVFloatDSPContext *fdsp;
174 ChannelMap *channel_maps;
177 int ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size,
180 int ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s);
182 int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels);
183 void ff_silk_free(SilkContext **ps);
184 void ff_silk_flush(SilkContext *s);
187 * Decode the LP layer of one Opus frame (which may correspond to several SILK
190 int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc,
192 enum OpusBandwidth bandwidth, int coded_channels,
195 /* Encode or decode CELT bands */
196 void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc);
198 /* Encode or decode CELT bitallocation */
199 void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode);
201 #endif /* AVCODEC_OPUS_H */