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 | |
56 | static 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 | |
62 | enum OpusMode { |
63 | OPUS_MODE_SILK, |
64 | OPUS_MODE_HYBRID, |
65 | OPUS_MODE_CELT, |
66 | |
67 | OPUS_MODE_NB |
68 | }; |
69 | |
70 | enum 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 | |
80 | typedef struct SilkContext SilkContext; |
81 | |
82 | typedef struct CeltFrame CeltFrame; |
83 | |
84 | typedef 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 | |
100 | typedef 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 |
137 | typedef 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 | |
152 | typedef 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 | |
174 | int ff_opus_parse_packet(OpusPacket *pkt, const uint8_t *buf, int buf_size, |
175 | int self_delimited); |
176 | |
177 | int ff_opus_parse_extradata(AVCodecContext *avctx, OpusContext *s); |
178 | |
179 | int ff_silk_init(AVCodecContext *avctx, SilkContext **ps, int output_channels); |
180 | void ff_silk_free(SilkContext **ps); |
181 | void 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 | */ |
187 | int 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 |