FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavresample
avresample.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
3
*
4
* This file is part of Libav.
5
*
6
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef AVRESAMPLE_AVRESAMPLE_H
22
#define AVRESAMPLE_AVRESAMPLE_H
23
24
/**
25
* @file
26
* @ingroup lavr
27
* external API header
28
*/
29
30
/**
31
* @defgroup lavr Libavresample
32
* @{
33
*
34
* Libavresample (lavr) is a library that handles audio resampling, sample
35
* format conversion and mixing.
36
*
37
* Interaction with lavr is done through AVAudioResampleContext, which is
38
* allocated with avresample_alloc_context(). 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
* AVAudioResampleContext *avr = avresample_alloc_context();
47
* av_opt_set_int(avr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0);
48
* av_opt_set_int(avr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
49
* av_opt_set_int(avr, "in_sample_rate", 48000, 0);
50
* av_opt_set_int(avr, "out_sample_rate", 44100, 0);
51
* av_opt_set_int(avr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
52
* av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
53
* @endcode
54
*
55
* Once the context is initialized, it must be opened with avresample_open(). If
56
* you need to change the conversion parameters, you must close the context with
57
* avresample_close(), change the parameters as described above, then reopen it
58
* again.
59
*
60
* The conversion itself is done by repeatedly calling avresample_convert().
61
* Note that the samples may get buffered in two places in lavr. The first one
62
* is the output FIFO, where the samples end up if the output buffer is not
63
* large enough. The data stored in there may be retrieved at any time with
64
* avresample_read(). The second place is the resampling delay buffer,
65
* applicable only when resampling is done. The samples in it require more input
66
* before they can be processed. Their current amount is returned by
67
* avresample_get_delay(). At the end of conversion the resampling buffer can be
68
* flushed by calling avresample_convert() with NULL input.
69
*
70
* The following code demonstrates the conversion loop assuming the parameters
71
* from above and caller-defined functions get_input() and handle_output():
72
* @code
73
* uint8_t **input;
74
* int in_linesize, in_samples;
75
*
76
* while (get_input(&input, &in_linesize, &in_samples)) {
77
* uint8_t *output
78
* int out_linesize;
79
* int out_samples = avresample_available(avr) +
80
* av_rescale_rnd(avresample_get_delay(avr) +
81
* in_samples, 44100, 48000, AV_ROUND_UP);
82
* av_samples_alloc(&output, &out_linesize, 2, out_samples,
83
* AV_SAMPLE_FMT_S16, 0);
84
* out_samples = avresample_convert(avr, &output, out_linesize, out_samples,
85
* input, in_linesize, in_samples);
86
* handle_output(output, out_linesize, out_samples);
87
* av_freep(&output);
88
* }
89
* @endcode
90
*
91
* When the conversion is finished and the FIFOs are flushed if required, the
92
* conversion context and everything associated with it must be freed with
93
* avresample_free().
94
*/
95
96
#include "
libavutil/avutil.h
"
97
#include "
libavutil/channel_layout.h
"
98
#include "
libavutil/dict.h
"
99
#include "
libavutil/log.h
"
100
101
#include "
libavresample/version.h
"
102
103
#define AVRESAMPLE_MAX_CHANNELS 32
104
105
typedef
struct
AVAudioResampleContext
AVAudioResampleContext
;
106
107
/** Mixing Coefficient Types */
108
enum
AVMixCoeffType
{
109
AV_MIX_COEFF_TYPE_Q8
,
/** 16-bit 8.8 fixed-point */
110
AV_MIX_COEFF_TYPE_Q15
,
/** 32-bit 17.15 fixed-point */
111
AV_MIX_COEFF_TYPE_FLT
,
/** floating-point */
112
AV_MIX_COEFF_TYPE_NB
,
/** Number of coeff types. Not part of ABI */
113
};
114
115
/** Resampling Filter Types */
116
enum
AVResampleFilterType
{
117
AV_RESAMPLE_FILTER_TYPE_CUBIC
,
/**< Cubic */
118
AV_RESAMPLE_FILTER_TYPE_BLACKMAN_NUTTALL
,
/**< Blackman Nuttall Windowed Sinc */
119
AV_RESAMPLE_FILTER_TYPE_KAISER
,
/**< Kaiser Windowed Sinc */
120
};
121
122
enum
AVResampleDitherMethod
{
123
AV_RESAMPLE_DITHER_NONE
,
/**< Do not use dithering */
124
AV_RESAMPLE_DITHER_RECTANGULAR
,
/**< Rectangular Dither */
125
AV_RESAMPLE_DITHER_TRIANGULAR
,
/**< Triangular Dither*/
126
AV_RESAMPLE_DITHER_TRIANGULAR_HP
,
/**< Triangular Dither with High Pass */
127
AV_RESAMPLE_DITHER_TRIANGULAR_NS
,
/**< Triangular Dither with Noise Shaping */
128
AV_RESAMPLE_DITHER_NB
,
/**< Number of dither types. Not part of ABI. */
129
};
130
131
/**
132
* Return the LIBAVRESAMPLE_VERSION_INT constant.
133
*/
134
unsigned
avresample_version
(
void
);
135
136
/**
137
* Return the libavresample build-time configuration.
138
* @return configure string
139
*/
140
const
char
*
avresample_configuration
(
void
);
141
142
/**
143
* Return the libavresample license.
144
*/
145
const
char
*
avresample_license
(
void
);
146
147
/**
148
* Get the AVClass for AVAudioResampleContext.
149
*
150
* Can be used in combination with AV_OPT_SEARCH_FAKE_OBJ for examining options
151
* without allocating a context.
152
*
153
* @see av_opt_find().
154
*
155
* @return AVClass for AVAudioResampleContext
156
*/
157
const
AVClass
*
avresample_get_class
(
void
);
158
159
/**
160
* Allocate AVAudioResampleContext and set options.
161
*
162
* @return allocated audio resample context, or NULL on failure
163
*/
164
AVAudioResampleContext
*
avresample_alloc_context
(
void
);
165
166
/**
167
* Initialize AVAudioResampleContext.
168
*
169
* @param avr audio resample context
170
* @return 0 on success, negative AVERROR code on failure
171
*/
172
int
avresample_open
(
AVAudioResampleContext
*avr);
173
174
/**
175
* Close AVAudioResampleContext.
176
*
177
* This closes the context, but it does not change the parameters. The context
178
* can be reopened with avresample_open(). It does, however, clear the output
179
* FIFO and any remaining leftover samples in the resampling delay buffer. If
180
* there was a custom matrix being used, that is also cleared.
181
*
182
* @see avresample_convert()
183
* @see avresample_set_matrix()
184
*
185
* @param avr audio resample context
186
*/
187
void
avresample_close
(
AVAudioResampleContext
*avr);
188
189
/**
190
* Free AVAudioResampleContext and associated AVOption values.
191
*
192
* This also calls avresample_close() before freeing.
193
*
194
* @param avr audio resample context
195
*/
196
void
avresample_free
(
AVAudioResampleContext
**avr);
197
198
/**
199
* Generate a channel mixing matrix.
200
*
201
* This function is the one used internally by libavresample for building the
202
* default mixing matrix. It is made public just as a utility function for
203
* building custom matrices.
204
*
205
* @param in_layout input channel layout
206
* @param out_layout output channel layout
207
* @param center_mix_level mix level for the center channel
208
* @param surround_mix_level mix level for the surround channel(s)
209
* @param lfe_mix_level mix level for the low-frequency effects channel
210
* @param normalize if 1, coefficients will be normalized to prevent
211
* overflow. if 0, coefficients will not be
212
* normalized.
213
* @param[out] matrix mixing coefficients; matrix[i + stride * o] is
214
* the weight of input channel i in output channel o.
215
* @param stride distance between adjacent input channels in the
216
* matrix array
217
* @param matrix_encoding matrixed stereo downmix mode (e.g. dplii)
218
* @return 0 on success, negative AVERROR code on failure
219
*/
220
int
avresample_build_matrix
(uint64_t in_layout, uint64_t out_layout,
221
double
center_mix_level
,
double
surround_mix_level
,
222
double
lfe_mix_level
,
int
normalize,
double
*matrix,
223
int
stride
,
enum
AVMatrixEncoding
matrix_encoding
);
224
225
/**
226
* Get the current channel mixing matrix.
227
*
228
* If no custom matrix has been previously set or the AVAudioResampleContext is
229
* not open, an error is returned.
230
*
231
* @param avr audio resample context
232
* @param matrix mixing coefficients; matrix[i + stride * o] is the weight of
233
* input channel i in output channel o.
234
* @param stride distance between adjacent input channels in the matrix array
235
* @return 0 on success, negative AVERROR code on failure
236
*/
237
int
avresample_get_matrix
(
AVAudioResampleContext
*avr,
double
*matrix,
238
int
stride
);
239
240
/**
241
* Set channel mixing matrix.
242
*
243
* Allows for setting a custom mixing matrix, overriding the default matrix
244
* generated internally during avresample_open(). This function can be called
245
* anytime on an allocated context, either before or after calling
246
* avresample_open(), as long as the channel layouts have been set.
247
* avresample_convert() always uses the current matrix.
248
* Calling avresample_close() on the context will clear the current matrix.
249
*
250
* @see avresample_close()
251
*
252
* @param avr audio resample context
253
* @param matrix mixing coefficients; matrix[i + stride * o] is the weight of
254
* input channel i in output channel o.
255
* @param stride distance between adjacent input channels in the matrix array
256
* @return 0 on success, negative AVERROR code on failure
257
*/
258
int
avresample_set_matrix
(
AVAudioResampleContext
*avr,
const
double
*matrix,
259
int
stride
);
260
261
/**
262
* Set a customized input channel mapping.
263
*
264
* This function can only be called when the allocated context is not open.
265
* Also, the input channel layout must have already been set.
266
*
267
* Calling avresample_close() on the context will clear the channel mapping.
268
*
269
* The map for each input channel specifies the channel index in the source to
270
* use for that particular channel, or -1 to mute the channel. Source channels
271
* can be duplicated by using the same index for multiple input channels.
272
*
273
* Examples:
274
*
275
* Reordering 5.1 AAC order (C,L,R,Ls,Rs,LFE) to Libav order (L,R,C,LFE,Ls,Rs):
276
* { 1, 2, 0, 5, 3, 4 }
277
*
278
* Muting the 3rd channel in 4-channel input:
279
* { 0, 1, -1, 3 }
280
*
281
* Duplicating the left channel of stereo input:
282
* { 0, 0 }
283
*
284
* @param avr audio resample context
285
* @param channel_map customized input channel mapping
286
* @return 0 on success, negative AVERROR code on failure
287
*/
288
int
avresample_set_channel_mapping
(
AVAudioResampleContext
*avr,
289
const
int
*channel_map);
290
291
/**
292
* Set compensation for resampling.
293
*
294
* This can be called anytime after avresample_open(). If resampling is not
295
* automatically enabled because of a sample rate conversion, the
296
* "force_resampling" option must have been set to 1 when opening the context
297
* in order to use resampling compensation.
298
*
299
* @param avr audio resample context
300
* @param sample_delta compensation delta, in samples
301
* @param compensation_distance compensation distance, in samples
302
* @return 0 on success, negative AVERROR code on failure
303
*/
304
int
avresample_set_compensation
(
AVAudioResampleContext
*avr,
int
sample_delta,
305
int
compensation_distance);
306
307
/**
308
* Convert input samples and write them to the output FIFO.
309
*
310
* The upper bound on the number of output samples is given by
311
* avresample_available() + (avresample_get_delay() + number of input samples) *
312
* output sample rate / input sample rate.
313
*
314
* The output data can be NULL or have fewer allocated samples than required.
315
* In this case, any remaining samples not written to the output will be added
316
* to an internal FIFO buffer, to be returned at the next call to this function
317
* or to avresample_read().
318
*
319
* If converting sample rate, there may be data remaining in the internal
320
* resampling delay buffer. avresample_get_delay() tells the number of remaining
321
* samples. To get this data as output, call avresample_convert() with NULL
322
* input.
323
*
324
* At the end of the conversion process, there may be data remaining in the
325
* internal FIFO buffer. avresample_available() tells the number of remaining
326
* samples. To get this data as output, either call avresample_convert() with
327
* NULL input or call avresample_read().
328
*
329
* @see avresample_available()
330
* @see avresample_read()
331
* @see avresample_get_delay()
332
*
333
* @param avr audio resample context
334
* @param output output data pointers
335
* @param out_plane_size output plane size, in bytes.
336
* This can be 0 if unknown, but that will lead to
337
* optimized functions not being used directly on the
338
* output, which could slow down some conversions.
339
* @param out_samples maximum number of samples that the output buffer can hold
340
* @param input input data pointers
341
* @param in_plane_size input plane size, in bytes
342
* This can be 0 if unknown, but that will lead to
343
* optimized functions not being used directly on the
344
* input, which could slow down some conversions.
345
* @param in_samples number of input samples to convert
346
* @return number of samples written to the output buffer,
347
* not including converted samples added to the internal
348
* output FIFO
349
*/
350
int
avresample_convert
(
AVAudioResampleContext
*avr,
uint8_t
**output,
351
int
out_plane_size,
int
out_samples,
uint8_t
**input,
352
int
in_plane_size,
int
in_samples);
353
354
/**
355
* Return the number of samples currently in the resampling delay buffer.
356
*
357
* When resampling, there may be a delay between the input and output. Any
358
* unconverted samples in each call are stored internally in a delay buffer.
359
* This function allows the user to determine the current number of samples in
360
* the delay buffer, which can be useful for synchronization.
361
*
362
* @see avresample_convert()
363
*
364
* @param avr audio resample context
365
* @return number of samples currently in the resampling delay buffer
366
*/
367
int
avresample_get_delay
(
AVAudioResampleContext
*avr);
368
369
/**
370
* Return the number of available samples in the output FIFO.
371
*
372
* During conversion, if the user does not specify an output buffer or
373
* specifies an output buffer that is smaller than what is needed, remaining
374
* samples that are not written to the output are stored to an internal FIFO
375
* buffer. The samples in the FIFO can be read with avresample_read() or
376
* avresample_convert().
377
*
378
* @see avresample_read()
379
* @see avresample_convert()
380
*
381
* @param avr audio resample context
382
* @return number of samples available for reading
383
*/
384
int
avresample_available
(
AVAudioResampleContext
*avr);
385
386
/**
387
* Read samples from the output FIFO.
388
*
389
* During conversion, if the user does not specify an output buffer or
390
* specifies an output buffer that is smaller than what is needed, remaining
391
* samples that are not written to the output are stored to an internal FIFO
392
* buffer. This function can be used to read samples from that internal FIFO.
393
*
394
* @see avresample_available()
395
* @see avresample_convert()
396
*
397
* @param avr audio resample context
398
* @param output output data pointers. May be NULL, in which case
399
* nb_samples of data is discarded from output FIFO.
400
* @param nb_samples number of samples to read from the FIFO
401
* @return the number of samples written to output
402
*/
403
int
avresample_read
(
AVAudioResampleContext
*avr,
uint8_t
**output,
int
nb_samples);
404
405
/**
406
* @}
407
*/
408
409
#endif
/* AVRESAMPLE_AVRESAMPLE_H */
Generated on Wed Jul 10 2013 23:48:15 for FFmpeg by
1.8.2