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 FFmpeg.
5
*
6
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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_get_out_samples(avr, in_samples);
80
*
81
* av_samples_alloc(&output, &out_linesize, 2, out_samples,
82
* AV_SAMPLE_FMT_S16, 0);
83
* out_samples = avresample_convert(avr, &output, out_linesize, out_samples,
84
* input, in_linesize, in_samples);
85
* handle_output(output, out_linesize, out_samples);
86
* av_freep(&output);
87
* }
88
* @endcode
89
*
90
* When the conversion is finished and the FIFOs are flushed if required, the
91
* conversion context and everything associated with it must be freed with
92
* avresample_free().
93
*/
94
95
#include "
libavutil/avutil.h
"
96
#include "
libavutil/channel_layout.h
"
97
#include "
libavutil/dict.h
"
98
#include "
libavutil/frame.h
"
99
#include "
libavutil/log.h
"
100
#include "
libavutil/mathematics.h
"
101
102
#include "
libavresample/version.h
"
103
104
#define AVRESAMPLE_MAX_CHANNELS 32
105
106
typedef
struct
AVAudioResampleContext
AVAudioResampleContext
;
107
108
/** Mixing Coefficient Types */
109
enum
AVMixCoeffType
{
110
AV_MIX_COEFF_TYPE_Q8
,
/** 16-bit 8.8 fixed-point */
111
AV_MIX_COEFF_TYPE_Q15
,
/** 32-bit 17.15 fixed-point */
112
AV_MIX_COEFF_TYPE_FLT
,
/** floating-point */
113
AV_MIX_COEFF_TYPE_NB
,
/** Number of coeff types. Not part of ABI */
114
};
115
116
/** Resampling Filter Types */
117
enum
AVResampleFilterType
{
118
AV_RESAMPLE_FILTER_TYPE_CUBIC
,
/**< Cubic */
119
AV_RESAMPLE_FILTER_TYPE_BLACKMAN_NUTTALL
,
/**< Blackman Nuttall Windowed Sinc */
120
AV_RESAMPLE_FILTER_TYPE_KAISER
,
/**< Kaiser Windowed Sinc */
121
};
122
123
enum
AVResampleDitherMethod
{
124
AV_RESAMPLE_DITHER_NONE
,
/**< Do not use dithering */
125
AV_RESAMPLE_DITHER_RECTANGULAR
,
/**< Rectangular Dither */
126
AV_RESAMPLE_DITHER_TRIANGULAR
,
/**< Triangular Dither*/
127
AV_RESAMPLE_DITHER_TRIANGULAR_HP
,
/**< Triangular Dither with High Pass */
128
AV_RESAMPLE_DITHER_TRIANGULAR_NS
,
/**< Triangular Dither with Noise Shaping */
129
AV_RESAMPLE_DITHER_NB
,
/**< Number of dither types. Not part of ABI. */
130
};
131
132
/**
133
* Return the LIBAVRESAMPLE_VERSION_INT constant.
134
*/
135
unsigned
avresample_version
(
void
);
136
137
/**
138
* Return the libavresample build-time configuration.
139
* @return configure string
140
*/
141
const
char
*
avresample_configuration
(
void
);
142
143
/**
144
* Return the libavresample license.
145
*/
146
const
char
*
avresample_license
(
void
);
147
148
/**
149
* Get the AVClass for AVAudioResampleContext.
150
*
151
* Can be used in combination with AV_OPT_SEARCH_FAKE_OBJ for examining options
152
* without allocating a context.
153
*
154
* @see av_opt_find().
155
*
156
* @return AVClass for AVAudioResampleContext
157
*/
158
const
AVClass
*
avresample_get_class
(
void
);
159
160
/**
161
* Allocate AVAudioResampleContext and set options.
162
*
163
* @return allocated audio resample context, or NULL on failure
164
*/
165
AVAudioResampleContext
*
avresample_alloc_context
(
void
);
166
167
/**
168
* Initialize AVAudioResampleContext.
169
* @note The context must be configured using the AVOption API.
170
*
171
* @see av_opt_set_int()
172
* @see av_opt_set_dict()
173
*
174
* @param avr audio resample context
175
* @return 0 on success, negative AVERROR code on failure
176
*/
177
int
avresample_open
(
AVAudioResampleContext
*avr);
178
179
/**
180
* Check whether an AVAudioResampleContext is open or closed.
181
*
182
* @param avr AVAudioResampleContext to check
183
* @return 1 if avr is open, 0 if avr is closed.
184
*/
185
int
avresample_is_open
(
AVAudioResampleContext
*avr);
186
187
/**
188
* Close AVAudioResampleContext.
189
*
190
* This closes the context, but it does not change the parameters. The context
191
* can be reopened with avresample_open(). It does, however, clear the output
192
* FIFO and any remaining leftover samples in the resampling delay buffer. If
193
* there was a custom matrix being used, that is also cleared.
194
*
195
* @see avresample_convert()
196
* @see avresample_set_matrix()
197
*
198
* @param avr audio resample context
199
*/
200
void
avresample_close
(
AVAudioResampleContext
*avr);
201
202
/**
203
* Free AVAudioResampleContext and associated AVOption values.
204
*
205
* This also calls avresample_close() before freeing.
206
*
207
* @param avr audio resample context
208
*/
209
void
avresample_free
(
AVAudioResampleContext
**avr);
210
211
/**
212
* Generate a channel mixing matrix.
213
*
214
* This function is the one used internally by libavresample for building the
215
* default mixing matrix. It is made public just as a utility function for
216
* building custom matrices.
217
*
218
* @param in_layout input channel layout
219
* @param out_layout output channel layout
220
* @param center_mix_level mix level for the center channel
221
* @param surround_mix_level mix level for the surround channel(s)
222
* @param lfe_mix_level mix level for the low-frequency effects channel
223
* @param normalize if 1, coefficients will be normalized to prevent
224
* overflow. if 0, coefficients will not be
225
* normalized.
226
* @param[out] matrix mixing coefficients; matrix[i + stride * o] is
227
* the weight of input channel i in output channel o.
228
* @param stride distance between adjacent input channels in the
229
* matrix array
230
* @param matrix_encoding matrixed stereo downmix mode (e.g. dplii)
231
* @return 0 on success, negative AVERROR code on failure
232
*/
233
int
avresample_build_matrix
(uint64_t in_layout, uint64_t out_layout,
234
double
center_mix_level
,
double
surround_mix_level
,
235
double
lfe_mix_level
,
int
normalize,
double
*matrix,
236
int
stride
,
enum
AVMatrixEncoding
matrix_encoding
);
237
238
/**
239
* Get the current channel mixing matrix.
240
*
241
* If no custom matrix has been previously set or the AVAudioResampleContext is
242
* not open, an error is returned.
243
*
244
* @param avr audio resample context
245
* @param matrix mixing coefficients; matrix[i + stride * o] is the weight of
246
* input channel i in output channel o.
247
* @param stride distance between adjacent input channels in the matrix array
248
* @return 0 on success, negative AVERROR code on failure
249
*/
250
int
avresample_get_matrix
(
AVAudioResampleContext
*avr,
double
*matrix,
251
int
stride
);
252
253
/**
254
* Set channel mixing matrix.
255
*
256
* Allows for setting a custom mixing matrix, overriding the default matrix
257
* generated internally during avresample_open(). This function can be called
258
* anytime on an allocated context, either before or after calling
259
* avresample_open(), as long as the channel layouts have been set.
260
* avresample_convert() always uses the current matrix.
261
* Calling avresample_close() on the context will clear the current matrix.
262
*
263
* @see avresample_close()
264
*
265
* @param avr audio resample context
266
* @param matrix mixing coefficients; matrix[i + stride * o] is the weight of
267
* input channel i in output channel o.
268
* @param stride distance between adjacent input channels in the matrix array
269
* @return 0 on success, negative AVERROR code on failure
270
*/
271
int
avresample_set_matrix
(
AVAudioResampleContext
*avr,
const
double
*matrix,
272
int
stride
);
273
274
/**
275
* Set a customized input channel mapping.
276
*
277
* This function can only be called when the allocated context is not open.
278
* Also, the input channel layout must have already been set.
279
*
280
* Calling avresample_close() on the context will clear the channel mapping.
281
*
282
* The map for each input channel specifies the channel index in the source to
283
* use for that particular channel, or -1 to mute the channel. Source channels
284
* can be duplicated by using the same index for multiple input channels.
285
*
286
* Examples:
287
*
288
* Reordering 5.1 AAC order (C,L,R,Ls,Rs,LFE) to FFmpeg order (L,R,C,LFE,Ls,Rs):
289
* { 1, 2, 0, 5, 3, 4 }
290
*
291
* Muting the 3rd channel in 4-channel input:
292
* { 0, 1, -1, 3 }
293
*
294
* Duplicating the left channel of stereo input:
295
* { 0, 0 }
296
*
297
* @param avr audio resample context
298
* @param channel_map customized input channel mapping
299
* @return 0 on success, negative AVERROR code on failure
300
*/
301
int
avresample_set_channel_mapping
(
AVAudioResampleContext
*avr,
302
const
int
*channel_map);
303
304
/**
305
* Set compensation for resampling.
306
*
307
* This can be called anytime after avresample_open(). If resampling is not
308
* automatically enabled because of a sample rate conversion, the
309
* "force_resampling" option must have been set to 1 when opening the context
310
* in order to use resampling compensation.
311
*
312
* @param avr audio resample context
313
* @param sample_delta compensation delta, in samples
314
* @param compensation_distance compensation distance, in samples
315
* @return 0 on success, negative AVERROR code on failure
316
*/
317
int
avresample_set_compensation
(
AVAudioResampleContext
*avr,
int
sample_delta,
318
int
compensation_distance);
319
320
/**
321
* Provide the upper bound on the number of samples the configured
322
* conversion would output.
323
*
324
* @param avr audio resample context
325
* @param in_nb_samples number of input samples
326
*
327
* @return number of samples or AVERROR(EINVAL) if the value
328
* would exceed INT_MAX
329
*/
330
331
int
avresample_get_out_samples
(
AVAudioResampleContext
*avr,
int
in_nb_samples);
332
333
/**
334
* Convert input samples and write them to the output FIFO.
335
*
336
* The upper bound on the number of output samples can be obtained through
337
* avresample_get_out_samples().
338
*
339
* The output data can be NULL or have fewer allocated samples than required.
340
* In this case, any remaining samples not written to the output will be added
341
* to an internal FIFO buffer, to be returned at the next call to this function
342
* or to avresample_read().
343
*
344
* If converting sample rate, there may be data remaining in the internal
345
* resampling delay buffer. avresample_get_delay() tells the number of remaining
346
* samples. To get this data as output, call avresample_convert() with NULL
347
* input.
348
*
349
* At the end of the conversion process, there may be data remaining in the
350
* internal FIFO buffer. avresample_available() tells the number of remaining
351
* samples. To get this data as output, either call avresample_convert() with
352
* NULL input or call avresample_read().
353
*
354
* @see avresample_get_out_samples()
355
* @see avresample_read()
356
* @see avresample_get_delay()
357
*
358
* @param avr audio resample context
359
* @param output output data pointers
360
* @param out_plane_size output plane size, in bytes.
361
* This can be 0 if unknown, but that will lead to
362
* optimized functions not being used directly on the
363
* output, which could slow down some conversions.
364
* @param out_samples maximum number of samples that the output buffer can hold
365
* @param input input data pointers
366
* @param in_plane_size input plane size, in bytes
367
* This can be 0 if unknown, but that will lead to
368
* optimized functions not being used directly on the
369
* input, which could slow down some conversions.
370
* @param in_samples number of input samples to convert
371
* @return number of samples written to the output buffer,
372
* not including converted samples added to the internal
373
* output FIFO
374
*/
375
int
avresample_convert
(
AVAudioResampleContext
*avr,
uint8_t
**output,
376
int
out_plane_size,
int
out_samples,
uint8_t
**input,
377
int
in_plane_size,
int
in_samples);
378
379
/**
380
* Return the number of samples currently in the resampling delay buffer.
381
*
382
* When resampling, there may be a delay between the input and output. Any
383
* unconverted samples in each call are stored internally in a delay buffer.
384
* This function allows the user to determine the current number of samples in
385
* the delay buffer, which can be useful for synchronization.
386
*
387
* @see avresample_convert()
388
*
389
* @param avr audio resample context
390
* @return number of samples currently in the resampling delay buffer
391
*/
392
int
avresample_get_delay
(
AVAudioResampleContext
*avr);
393
394
/**
395
* Return the number of available samples in the output FIFO.
396
*
397
* During conversion, if the user does not specify an output buffer or
398
* specifies an output buffer that is smaller than what is needed, remaining
399
* samples that are not written to the output are stored to an internal FIFO
400
* buffer. The samples in the FIFO can be read with avresample_read() or
401
* avresample_convert().
402
*
403
* @see avresample_read()
404
* @see avresample_convert()
405
*
406
* @param avr audio resample context
407
* @return number of samples available for reading
408
*/
409
int
avresample_available
(
AVAudioResampleContext
*avr);
410
411
/**
412
* Read samples from the output FIFO.
413
*
414
* During conversion, if the user does not specify an output buffer or
415
* specifies an output buffer that is smaller than what is needed, remaining
416
* samples that are not written to the output are stored to an internal FIFO
417
* buffer. This function can be used to read samples from that internal FIFO.
418
*
419
* @see avresample_available()
420
* @see avresample_convert()
421
*
422
* @param avr audio resample context
423
* @param output output data pointers. May be NULL, in which case
424
* nb_samples of data is discarded from output FIFO.
425
* @param nb_samples number of samples to read from the FIFO
426
* @return the number of samples written to output
427
*/
428
int
avresample_read
(
AVAudioResampleContext
*avr,
uint8_t
**output,
int
nb_samples);
429
430
/**
431
* Convert the samples in the input AVFrame and write them to the output AVFrame.
432
*
433
* Input and output AVFrames must have channel_layout, sample_rate and format set.
434
*
435
* The upper bound on the number of output samples is obtained through
436
* avresample_get_out_samples().
437
*
438
* If the output AVFrame does not have the data pointers allocated the nb_samples
439
* field will be set using avresample_get_out_samples() and av_frame_get_buffer()
440
* is called to allocate the frame.
441
*
442
* The output AVFrame can be NULL or have fewer allocated samples than required.
443
* In this case, any remaining samples not written to the output will be added
444
* to an internal FIFO buffer, to be returned at the next call to this function
445
* or to avresample_convert() or to avresample_read().
446
*
447
* If converting sample rate, there may be data remaining in the internal
448
* resampling delay buffer. avresample_get_delay() tells the number of
449
* remaining samples. To get this data as output, call this function or
450
* avresample_convert() with NULL input.
451
*
452
* At the end of the conversion process, there may be data remaining in the
453
* internal FIFO buffer. avresample_available() tells the number of remaining
454
* samples. To get this data as output, either call this function or
455
* avresample_convert() with NULL input or call avresample_read().
456
*
457
* If the AVAudioResampleContext configuration does not match the output and
458
* input AVFrame settings the conversion does not take place and depending on
459
* which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED
460
* or AVERROR_OUTPUT_CHANGED|AVERROR_INPUT_CHANGED is returned.
461
*
462
* @see avresample_get_out_samples()
463
* @see avresample_available()
464
* @see avresample_convert()
465
* @see avresample_read()
466
* @see avresample_get_delay()
467
*
468
* @param avr audio resample context
469
* @param output output AVFrame
470
* @param input input AVFrame
471
* @return 0 on success, AVERROR on failure or nonmatching
472
* configuration.
473
*/
474
int
avresample_convert_frame
(
AVAudioResampleContext
*avr,
475
AVFrame
*output,
AVFrame
*input);
476
477
/**
478
* Configure or reconfigure the AVAudioResampleContext using the information
479
* provided by the AVFrames.
480
*
481
* The original resampling context is reset even on failure.
482
* The function calls avresample_close() internally if the context is open.
483
*
484
* @see avresample_open();
485
* @see avresample_close();
486
*
487
* @param avr audio resample context
488
* @param output output AVFrame
489
* @param input input AVFrame
490
* @return 0 on success, AVERROR on failure.
491
*/
492
int
avresample_config
(
AVAudioResampleContext
*avr,
AVFrame
*
out
,
AVFrame
*
in
);
493
494
/**
495
* @}
496
*/
497
498
#endif
/* AVRESAMPLE_AVRESAMPLE_H */
Generated on Sun Mar 8 2015 02:35:13 for FFmpeg by
1.8.2