summaryrefslogtreecommitdiff
path: root/libavcodec/opus.h (plain)
blob: c3cbaec35d60b67937eecf1dfa82042708d9fc26
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
32#include "libswresample/swresample.h"
33
34#include "avcodec.h"
35#include "opus_rc.h"
36
37#define MAX_FRAME_SIZE 1275
38#define MAX_FRAMES 48
39#define MAX_PACKET_DUR 5760
40
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
47#define SILK_HISTORY 322
48#define SILK_MAX_LPC 16
49
50#define ROUND_MULL(a,b,s) (((MUL64(a, b) >> ((s) - 1)) + 1) >> 1)
51#define ROUND_MUL16(a,b) ((MUL16(a, b) + 16384) >> 15)
52
53#define OPUS_TS_HEADER 0x7FE0 // 0x3ff (11 bits)
54#define OPUS_TS_MASK 0xFFE0 // top 11 bits
55
56static const uint8_t opus_default_extradata[30] = {
57 'O', 'p', 'u', 's', 'H', 'e', 'a', 'd',
58 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60};
61
62enum OpusMode {
63 OPUS_MODE_SILK,
64 OPUS_MODE_HYBRID,
65 OPUS_MODE_CELT,
66
67 OPUS_MODE_NB
68};
69
70enum OpusBandwidth {
71 OPUS_BANDWIDTH_NARROWBAND,
72 OPUS_BANDWIDTH_MEDIUMBAND,
73 OPUS_BANDWIDTH_WIDEBAND,
74 OPUS_BANDWIDTH_SUPERWIDEBAND,
75 OPUS_BANDWIDTH_FULLBAND,
76
77 OPUS_BANDWITH_NB
78};
79
80typedef struct SilkContext SilkContext;
81
82typedef struct CeltFrame CeltFrame;
83
84typedef struct OpusPacket {
85 int packet_size; /**< packet size */
86 int data_size; /**< size of the useful data -- packet size - padding */
87 int code; /**< packet code: specifies the frame layout */
88 int stereo; /**< whether this packet is mono or stereo */
89 int vbr; /**< vbr flag */
90 int config; /**< configuration: tells the audio mode,
91 ** bandwidth, and frame duration */
92 int frame_count; /**< frame count */
93 int frame_offset[MAX_FRAMES]; /**< frame offsets */
94 int frame_size[MAX_FRAMES]; /**< frame sizes */
95 int frame_duration; /**< frame duration, in samples @ 48kHz */
96 enum OpusMode mode; /**< mode */
97 enum OpusBandwidth bandwidth; /**< bandwidth */
98} OpusPacket;
99
100typedef struct OpusStreamContext {
101 AVCodecContext *avctx;
102 int output_channels;
103
104 OpusRangeCoder rc;
105 OpusRangeCoder redundancy_rc;
106 SilkContext *silk;
107 CeltFrame *celt;
108 AVFloatDSPContext *fdsp;
109
110 float silk_buf[2][960];
111 float *silk_output[2];
112 DECLARE_ALIGNED(32, float, celt_buf)[2][960];
113 float *celt_output[2];
114
115 float redundancy_buf[2][960];
116 float *redundancy_output[2];
117
118 /* data buffers for the final output data */
119 float *out[2];
120 int out_size;
121
122 float *out_dummy;
123 int out_dummy_allocated_size;
124
125 SwrContext *swr;
126 AVAudioFifo *celt_delay;
127 int silk_samplerate;
128 /* number of samples we still want to get from the resampler */
129 int delayed_samples;
130
131 OpusPacket packet;
132
133 int redundancy_idx;
134} OpusStreamContext;
135
136// a mapping between an opus stream and an output channel
137typedef struct ChannelMap {
138 int stream_idx;
139 int channel_idx;
140
141 // when a single decoded channel is mapped to multiple output channels, we
142 // write to the first output directly and copy from it to the others
143 // this field is set to 1 for those copied output channels
144 int copy;
145 // this is the index of the output channel to copy from
146 int copy_idx;
147
148 // this channel is silent
149 int silence;
150} ChannelMap;
151
152typedef struct OpusContext {
153 OpusStreamContext *streams;
154
155 /* current output buffers for each streams */
156 float **out;
157 int *out_size;
158 /* Buffers for synchronizing the streams when they have different
159 * resampling delays */
160 AVAudioFifo **sync_buffers;
161 /* number of decoded samples for each stream */
162 int *decoded_samples;
163
164 int nb_streams;
165 int nb_stereo_streams;
166
167 AVFloatDSPContext *fdsp;
168 int16_t gain_i;
169 float gain;
170
171 ChannelMap *channel_maps;
172} OpusContext;
173
174int ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size,
175 int self_delimited);
176
177int ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s);
178
179int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels);
180void ff_silk_free(SilkContext **ps);
181void ff_silk_flush(SilkContext *s);
182
183/**
184 * Decode the LP layer of one Opus frame (which may correspond to several SILK
185 * frames).
186 */
187int ff_silk_decode_superframe(SilkContext *s, OpusRangeCoder *rc,
188 float *output[2],
189 enum OpusBandwidth bandwidth, int coded_channels,
190 int duration_ms);
191
192#endif /* AVCODEC_OPUS_H */
193