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"
98 #include "libavutil/dict.h"
99 #include "libavutil/log.h"
100 
101 #include "libavresample/version.h"
102 
103 #define AVRESAMPLE_MAX_CHANNELS 32
104 
106 
107 /** Mixing Coefficient Types */
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 */
118  AV_RESAMPLE_FILTER_TYPE_BLACKMAN_NUTTALL, /**< Blackman Nuttall Windowed Sinc */
119  AV_RESAMPLE_FILTER_TYPE_KAISER, /**< Kaiser Windowed Sinc */
120 };
121 
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  */
165 
166 /**
167  * Initialize AVAudioResampleContext.
168  *
169  * @param avr audio resample context
170  * @return 0 on success, negative AVERROR code on failure
171  */
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  */
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  */
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,
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  */
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  */
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  */
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  */
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 */
Kaiser Windowed Sinc.
Definition: avresample.h:119
Do not use dithering.
Definition: avresample.h:123
int avresample_read(AVAudioResampleContext *avr, uint8_t **output, int nb_samples)
Read samples from the output FIFO.
external API header
int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta, int compensation_distance)
Set compensation for resampling.
32-bit 17.15 fixed-point
Definition: avresample.h:111
int avresample_set_channel_mapping(AVAudioResampleContext *avr, const int *channel_map)
Set a customized input channel mapping.
int stride
Definition: mace.c:144
void avresample_free(AVAudioResampleContext **avr)
Free AVAudioResampleContext and associated AVOption values.
Triangular Dither with Noise Shaping.
Definition: avresample.h:127
double surround_mix_level
surround mix level
const AVClass * avresample_get_class(void)
Get the AVClass for AVAudioResampleContext.
Rectangular Dither.
Definition: avresample.h:124
Triangular Dither with High Pass.
Definition: avresample.h:126
Public dictionary API.
uint8_t
const char * avresample_license(void)
Return the libavresample license.
int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, double center_mix_level, double surround_mix_level, double lfe_mix_level, int normalize, double *matrix, int stride, enum AVMatrixEncoding matrix_encoding)
Generate a channel mixing matrix.
void avresample_close(AVAudioResampleContext *avr)
Close AVAudioResampleContext.
double center_mix_level
center mix level
AVResampleFilterType
Resampling Filter Types.
Definition: avresample.h:116
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an input
audio channel layout utility functions
int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, int stride)
Set channel mixing matrix.
Triangular Dither.
Definition: avresample.h:125
int avresample_get_delay(AVAudioResampleContext *avr)
Return the number of samples currently in the resampling delay buffer.
int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix, int stride)
Get the current channel mixing matrix.
int avresample_available(AVAudioResampleContext *avr)
Return the number of available samples in the output FIFO.
floating-point
Definition: avresample.h:112
const char * avresample_configuration(void)
Return the libavresample build-time configuration.
Describe the class of an AVClass context structure.
Definition: log.h:50
Blackman Nuttall Windowed Sinc.
Definition: avresample.h:118
int avresample_convert(AVAudioResampleContext *avr, uint8_t **output, int out_plane_size, int out_samples, uint8_t **input, int in_plane_size, int in_samples)
Convert input samples and write them to the output FIFO.
Number of dither types.
Definition: avresample.h:128
AVAudioResampleContext * avresample_alloc_context(void)
Allocate AVAudioResampleContext and set options.
enum AVMatrixEncoding matrix_encoding
matrixed stereo encoding
16-bit 8.8 fixed-point
Definition: avresample.h:110
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
AVMixCoeffType
Mixing Coefficient Types.
Definition: avresample.h:108
unsigned avresample_version(void)
Return the LIBAVRESAMPLE_VERSION_INT constant.
AVMatrixEncoding
double lfe_mix_level
lfe mix level
AVResampleDitherMethod
Definition: avresample.h:122
int avresample_open(AVAudioResampleContext *avr)
Initialize AVAudioResampleContext.