xref: /third_party/ffmpeg/libavcodec/opus.h (revision cabdff1a)
1/*
2 * Opus decoder/demuxer common functions
3 * Copyright (c) 2012 Andrew D'Addesio
4 * Copyright (c) 2013-2014 Mozilla Corporation
5 *
6 * This file is part of FFmpeg.
7 *
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.
12 *
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.
17 *
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
21 */
22
23#ifndef AVCODEC_OPUS_H
24#define AVCODEC_OPUS_H
25
26#include <stdint.h>
27
28#include "libavutil/audio_fifo.h"
29#include "libavutil/float_dsp.h"
30#include "libavutil/frame.h"
31#include "libavutil/mem_internal.h"
32
33#include "libswresample/swresample.h"
34
35#include "avcodec.h"
36#include "opus_rc.h"
37
38#define MAX_FRAME_SIZE               1275
39#define MAX_FRAMES                   48
40#define MAX_PACKET_DUR               5760
41
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
47
48#define SILK_HISTORY                 322
49#define SILK_MAX_LPC                 16
50
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)
53
54#define OPUS_TS_HEADER     0x7FE0        // 0x3ff (11 bits)
55#define OPUS_TS_MASK       0xFFE0        // top 11 bits
56
57static 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,
61};
62
63enum OpusMode {
64    OPUS_MODE_SILK,
65    OPUS_MODE_HYBRID,
66    OPUS_MODE_CELT,
67
68    OPUS_MODE_NB
69};
70
71enum OpusBandwidth {
72    OPUS_BANDWIDTH_NARROWBAND,
73    OPUS_BANDWIDTH_MEDIUMBAND,
74    OPUS_BANDWIDTH_WIDEBAND,
75    OPUS_BANDWIDTH_SUPERWIDEBAND,
76    OPUS_BANDWIDTH_FULLBAND,
77
78    OPUS_BANDWITH_NB
79};
80
81typedef struct SilkContext SilkContext;
82
83typedef struct CeltFrame CeltFrame;
84
85typedef 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 */
99} OpusPacket;
100
101typedef struct OpusStreamContext {
102    AVCodecContext *avctx;
103    int output_channels;
104
105    /* number of decoded samples for this stream */
106    int decoded_samples;
107    /* current output buffers for this stream */
108    float *out[2];
109    int out_size;
110    /* Buffer with samples from this stream for synchronizing
111     * the streams when they have different resampling delays */
112    AVAudioFifo *sync_buffer;
113
114    OpusRangeCoder rc;
115    OpusRangeCoder redundancy_rc;
116    SilkContext *silk;
117    CeltFrame *celt;
118    AVFloatDSPContext *fdsp;
119
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];
124
125    DECLARE_ALIGNED(32, float, redundancy_buf)[2][960];
126    float *redundancy_output[2];
127
128    /* buffers for the next samples to be decoded */
129    float *cur_out[2];
130    int remaining_out_size;
131
132    float *out_dummy;
133    int    out_dummy_allocated_size;
134
135    SwrContext *swr;
136    AVAudioFifo *celt_delay;
137    int silk_samplerate;
138    /* number of samples we still want to get from the resampler */
139    int delayed_samples;
140
141    OpusPacket packet;
142
143    int redundancy_idx;
144} OpusStreamContext;
145
146// a mapping between an opus stream and an output channel
147typedef struct ChannelMap {
148    int stream_idx;
149    int channel_idx;
150
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
154    int copy;
155    // this is the index of the output channel to copy from
156    int copy_idx;
157
158    // this channel is silent
159    int silence;
160} ChannelMap;
161
162typedef struct OpusContext {
163    AVClass *av_class;
164    OpusStreamContext *streams;
165    int apply_phase_inv;
166
167    int             nb_streams;
168    int      nb_stereo_streams;
169
170    AVFloatDSPContext *fdsp;
171    int16_t gain_i;
172    float   gain;
173
174    ChannelMap *channel_maps;
175} OpusContext;
176
177int ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size,
178                         int self_delimited);
179
180int ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s);
181
182int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels);
183void ff_silk_free(SilkContext **ps);
184void ff_silk_flush(SilkContext *s);
185
186/**
187 * Decode the LP layer of one Opus frame (which may correspond to several SILK
188 * frames).
189 */
190int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc,
191                              float *output[2],
192                              enum OpusBandwidth bandwidth, int coded_channels,
193                              int duration_ms);
194
195/* Encode or decode CELT bands */
196void ff_celt_quant_bands(CeltFrame *f, OpusRangeCoder *rc);
197
198/* Encode or decode CELT bitallocation */
199void ff_celt_bitalloc(CeltFrame *f, OpusRangeCoder *rc, int encode);
200
201#endif /* AVCODEC_OPUS_H */
202