FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libswresample
swresample.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2011-2012 Michael Niedermayer (michaelni@gmx.at)
3
*
4
* This file is part of libswresample
5
*
6
* libswresample is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* libswresample is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with libswresample; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef SWRESAMPLE_SWRESAMPLE_H
22
#define SWRESAMPLE_SWRESAMPLE_H
23
24
/**
25
* @file
26
* @ingroup lswr
27
* libswresample public header
28
*/
29
30
/**
31
* @defgroup lswr Libswresample
32
* @{
33
*
34
* Libswresample (lswr) is a library that handles audio resampling, sample
35
* format conversion and mixing.
36
*
37
* Interaction with lswr is done through SwrContext, which is
38
* allocated with swr_alloc() or swr_alloc_set_opts(). It is opaque, so all parameters
39
* must be set with the @ref avoptions API.
40
*
41
* For example the following code will setup conversion from planar float sample
42
* format to interleaved signed 16-bit integer, downsampling from 48kHz to
43
* 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing
44
* matrix):
45
* @code
46
* SwrContext *swr = swr_alloc();
47
* av_opt_set_int(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0);
48
* av_opt_set_int(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
49
* av_opt_set_int(swr, "in_sample_rate", 48000, 0);
50
* av_opt_set_int(swr, "out_sample_rate", 44100, 0);
51
* av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
52
* av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
53
* @endcode
54
*
55
* Once all values have been set, it must be initialized with swr_init(). If
56
* you need to change the conversion parameters, you can change the parameters
57
* as described above, or by using swr_alloc_set_opts(), then call swr_init()
58
* again.
59
*
60
* The conversion itself is done by repeatedly calling swr_convert().
61
* Note that the samples may get buffered in swr if you provide insufficient
62
* output space or if sample rate conversion is done, which requires "future"
63
* samples. Samples that do not require future input can be retrieved at any
64
* time by using swr_convert() (in_count can be set to 0).
65
* At the end of conversion the resampling buffer can be flushed by calling
66
* swr_convert() with NULL in and 0 in_count.
67
*
68
* The delay between input and output, can at any time be found by using
69
* swr_get_delay().
70
*
71
* The following code demonstrates the conversion loop assuming the parameters
72
* from above and caller-defined functions get_input() and handle_output():
73
* @code
74
* uint8_t **input;
75
* int in_samples;
76
*
77
* while (get_input(&input, &in_samples)) {
78
* uint8_t *output;
79
* int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) +
80
* in_samples, 44100, 48000, AV_ROUND_UP);
81
* av_samples_alloc(&output, NULL, 2, out_samples,
82
* AV_SAMPLE_FMT_S16, 0);
83
* out_samples = swr_convert(swr, &output, out_samples,
84
* input, in_samples);
85
* handle_output(output, out_samples);
86
* av_freep(&output);
87
* }
88
* @endcode
89
*
90
* When the conversion is finished, the conversion
91
* context and everything associated with it must be freed with swr_free().
92
* There will be no memory leak if the data is not completely flushed before
93
* swr_free().
94
*/
95
96
#include <stdint.h>
97
#include "
libavutil/samplefmt.h
"
98
99
#include "
libswresample/version.h
"
100
101
#if LIBSWRESAMPLE_VERSION_MAJOR < 1
102
#define SWR_CH_MAX 32
///< Maximum number of channels
103
#endif
104
105
#define SWR_FLAG_RESAMPLE 1
///< Force resampling even if equal sample rate
106
//TODO use int resample ?
107
//long term TODO can we enable this dynamically?
108
109
enum
SwrDitherType
{
110
SWR_DITHER_NONE
= 0,
111
SWR_DITHER_RECTANGULAR
,
112
SWR_DITHER_TRIANGULAR
,
113
SWR_DITHER_TRIANGULAR_HIGHPASS
,
114
SWR_DITHER_NB
,
///< not part of API/ABI
115
};
116
117
/** Resampling Engines */
118
enum
SwrEngine
{
119
SWR_ENGINE_SWR
,
/**< SW Resampler */
120
SWR_ENGINE_SOXR
,
/**< SoX Resampler */
121
SWR_ENGINE_NB
,
///< not part of API/ABI
122
};
123
124
/** Resampling Filter Types */
125
enum
SwrFilterType
{
126
SWR_FILTER_TYPE_CUBIC
,
/**< Cubic */
127
SWR_FILTER_TYPE_BLACKMAN_NUTTALL
,
/**< Blackman Nuttall Windowed Sinc */
128
SWR_FILTER_TYPE_KAISER
,
/**< Kaiser Windowed Sinc */
129
};
130
131
typedef
struct
SwrContext
SwrContext
;
132
133
/**
134
* Get the AVClass for swrContext. It can be used in combination with
135
* AV_OPT_SEARCH_FAKE_OBJ for examining options.
136
*
137
* @see av_opt_find().
138
*/
139
const
AVClass
*
swr_get_class
(
void
);
140
141
/**
142
* Allocate SwrContext.
143
*
144
* If you use this function you will need to set the parameters (manually or
145
* with swr_alloc_set_opts()) before calling swr_init().
146
*
147
* @see swr_alloc_set_opts(), swr_init(), swr_free()
148
* @return NULL on error, allocated context otherwise
149
*/
150
struct
SwrContext
*
swr_alloc
(
void
);
151
152
/**
153
* Initialize context after user parameters have been set.
154
*
155
* @return AVERROR error code in case of failure.
156
*/
157
int
swr_init
(
struct
SwrContext
*s);
158
159
/**
160
* Allocate SwrContext if needed and set/reset common parameters.
161
*
162
* This function does not require s to be allocated with swr_alloc(). On the
163
* other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters
164
* on the allocated context.
165
*
166
* @param s Swr context, can be NULL
167
* @param out_ch_layout output channel layout (AV_CH_LAYOUT_*)
168
* @param out_sample_fmt output sample format (AV_SAMPLE_FMT_*).
169
* @param out_sample_rate output sample rate (frequency in Hz)
170
* @param in_ch_layout input channel layout (AV_CH_LAYOUT_*)
171
* @param in_sample_fmt input sample format (AV_SAMPLE_FMT_*).
172
* @param in_sample_rate input sample rate (frequency in Hz)
173
* @param log_offset logging level offset
174
* @param log_ctx parent logging context, can be NULL
175
*
176
* @see swr_init(), swr_free()
177
* @return NULL on error, allocated context otherwise
178
*/
179
struct
SwrContext
*
swr_alloc_set_opts
(
struct
SwrContext
*s,
180
int64_t
out_ch_layout
,
enum
AVSampleFormat
out_sample_fmt
,
int
out_sample_rate
,
181
int64_t
in_ch_layout
,
enum
AVSampleFormat
in_sample_fmt
,
int
in_sample_rate
,
182
int
log_offset,
void
*
log_ctx
);
183
184
/**
185
* Free the given SwrContext and set the pointer to NULL.
186
*/
187
void
swr_free
(
struct
SwrContext
**s);
188
189
/**
190
* Convert audio.
191
*
192
* in and in_count can be set to 0 to flush the last few samples out at the
193
* end.
194
*
195
* If more input is provided than output space then the input will be buffered.
196
* You can avoid this buffering by providing more output space than input.
197
* Convertion will run directly without copying whenever possible.
198
*
199
* @param s allocated Swr context, with parameters set
200
* @param out output buffers, only the first one need be set in case of packed audio
201
* @param out_count amount of space available for output in samples per channel
202
* @param in input buffers, only the first one need to be set in case of packed audio
203
* @param in_count number of input samples available in one channel
204
*
205
* @return number of samples output per channel, negative value on error
206
*/
207
int
swr_convert
(
struct
SwrContext
*s,
uint8_t
**
out
,
int
out_count,
208
const
uint8_t
**
in
,
int
in_count);
209
210
/**
211
* Convert the next timestamp from input to output
212
* timestamps are in 1/(in_sample_rate * out_sample_rate) units.
213
*
214
* @note There are 2 slightly differently behaving modes.
215
* First is when automatic timestamp compensation is not used, (min_compensation >= FLT_MAX)
216
* in this case timestamps will be passed through with delays compensated
217
* Second is when automatic timestamp compensation is used, (min_compensation < FLT_MAX)
218
* in this case the output timestamps will match output sample numbers
219
*
220
* @param pts timestamp for the next input sample, INT64_MIN if unknown
221
* @return the output timestamp for the next output sample
222
*/
223
int64_t
swr_next_pts
(
struct
SwrContext
*s, int64_t pts);
224
225
/**
226
* Activate resampling compensation.
227
*/
228
int
swr_set_compensation
(
struct
SwrContext
*s,
int
sample_delta,
int
compensation_distance);
229
230
/**
231
* Set a customized input channel mapping.
232
*
233
* @param s allocated Swr context, not yet initialized
234
* @param channel_map customized input channel mapping (array of channel
235
* indexes, -1 for a muted channel)
236
* @return AVERROR error code in case of failure.
237
*/
238
int
swr_set_channel_mapping
(
struct
SwrContext
*s,
const
int
*
channel_map
);
239
240
/**
241
* Set a customized remix matrix.
242
*
243
* @param s allocated Swr context, not yet initialized
244
* @param matrix remix coefficients; matrix[i + stride * o] is
245
* the weight of input channel i in output channel o
246
* @param stride offset between lines of the matrix
247
* @return AVERROR error code in case of failure.
248
*/
249
int
swr_set_matrix
(
struct
SwrContext
*s,
const
double
*
matrix
,
int
stride
);
250
251
/**
252
* Drops the specified number of output samples.
253
*/
254
int
swr_drop_output
(
struct
SwrContext
*s,
int
count);
255
256
/**
257
* Injects the specified number of silence samples.
258
*/
259
int
swr_inject_silence
(
struct
SwrContext
*s,
int
count);
260
261
/**
262
* Gets the delay the next input sample will experience relative to the next output sample.
263
*
264
* Swresample can buffer data if more input has been provided than available
265
* output space, also converting between sample rates needs a delay.
266
* This function returns the sum of all such delays.
267
* The exact delay is not necessarily an integer value in either input or
268
* output sample rate. Especially when downsampling by a large value, the
269
* output sample rate may be a poor choice to represent the delay, similarly
270
* for upsampling and the input sample rate.
271
*
272
* @param s swr context
273
* @param base timebase in which the returned delay will be
274
* if its set to 1 the returned delay is in seconds
275
* if its set to 1000 the returned delay is in milli seconds
276
* if its set to the input sample rate then the returned delay is in input samples
277
* if its set to the output sample rate then the returned delay is in output samples
278
* an exact rounding free delay can be found by using LCM(in_sample_rate, out_sample_rate)
279
* @returns the delay in 1/base units.
280
*/
281
int64_t
swr_get_delay
(
struct
SwrContext
*s, int64_t base);
282
283
/**
284
* Return the LIBSWRESAMPLE_VERSION_INT constant.
285
*/
286
unsigned
swresample_version
(
void
);
287
288
/**
289
* Return the swr build-time configuration.
290
*/
291
const
char
*
swresample_configuration
(
void
);
292
293
/**
294
* Return the swr license.
295
*/
296
const
char
*
swresample_license
(
void
);
297
298
/**
299
* @}
300
*/
301
302
#endif
/* SWRESAMPLE_SWRESAMPLE_H */
Generated on Sat May 25 2013 03:58:50 for FFmpeg by
1.8.2