swresample_internal.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011-2013 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 SWR_INTERNAL_H
22 #define SWR_INTERNAL_H
23 
24 #include "swresample.h"
26 #include "config.h"
27 
28 #define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */
29 
30 #define NS_TAPS 20
31 
32 #if ARCH_X86_64
33 typedef int64_t integer;
34 #else
35 typedef int integer;
36 #endif
37 
38 typedef void (mix_1_1_func_type)(void *out, const void *in, void *coeffp, integer index, integer len);
39 typedef void (mix_2_1_func_type)(void *out, const void *in1, const void *in2, void *coeffp, integer index1, integer index2, integer len);
40 
41 typedef void (mix_any_func_type)(uint8_t **out, const uint8_t **in1, void *coeffp, integer len);
42 
43 typedef struct AudioData{
44  uint8_t *ch[SWR_CH_MAX]; ///< samples buffer per channel
45  uint8_t *data; ///< samples buffer
46  int ch_count; ///< number of channels
47  int bps; ///< bytes per sample
48  int count; ///< number of samples
49  int planar; ///< 1 if planar audio, 0 otherwise
50  enum AVSampleFormat fmt; ///< sample format
51 } AudioData;
52 
53 struct DitherContext {
54  enum SwrDitherType method;
55  int noise_pos;
56  float scale;
57  float noise_scale; ///< Noise scale
58  int ns_taps; ///< Noise shaping dither taps
59  float ns_scale; ///< Noise shaping dither scale
60  float ns_scale_1; ///< Noise shaping dither scale^-1
61  int ns_pos; ///< Noise shaping dither position
62  float ns_coeffs[NS_TAPS]; ///< Noise shaping filter coefficients
63  float ns_errors[SWR_CH_MAX][2*NS_TAPS];
64  AudioData noise; ///< noise used for dithering
65  AudioData temp; ///< temporary storage when writing into the input buffer isnt possible
66  int output_sample_bits; ///< the number of used output bits, needed to scale dither correctly
67 };
68 
69 struct SwrContext {
70  const AVClass *av_class; ///< AVClass used for AVOption and av_log()
71  int log_level_offset; ///< logging level offset
72  void *log_ctx; ///< parent logging context
73  enum AVSampleFormat in_sample_fmt; ///< input sample format
74  enum AVSampleFormat int_sample_fmt; ///< internal sample format (AV_SAMPLE_FMT_FLTP or AV_SAMPLE_FMT_S16P)
75  enum AVSampleFormat out_sample_fmt; ///< output sample format
76  int64_t in_ch_layout; ///< input channel layout
77  int64_t out_ch_layout; ///< output channel layout
78  int in_sample_rate; ///< input sample rate
79  int out_sample_rate; ///< output sample rate
80  int flags; ///< miscellaneous flags such as SWR_FLAG_RESAMPLE
81  float slev; ///< surround mixing level
82  float clev; ///< center mixing level
83  float lfe_mix_level; ///< LFE mixing level
84  float rematrix_volume; ///< rematrixing volume coefficient
85  enum AVMatrixEncoding matrix_encoding; /**< matrixed stereo encoding */
86  const int *channel_map; ///< channel index (or -1 if muted channel) map
87  int used_ch_count; ///< number of used input channels (mapped channel count if channel_map, otherwise in.ch_count)
88  enum SwrEngine engine;
89 
90  struct DitherContext dither;
91 
92  int filter_size; /**< length of each FIR filter in the resampling filterbank relative to the cutoff frequency */
93  int phase_shift; /**< log2 of the number of entries in the resampling polyphase filterbank */
94  int linear_interp; /**< if 1 then the resampling FIR filter will be linearly interpolated */
95  double cutoff; /**< resampling cutoff frequency (swr: 6dB point; soxr: 0dB point). 1.0 corresponds to half the output sample rate */
96  enum SwrFilterType filter_type; /**< swr resampling filter type */
97  int kaiser_beta; /**< swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) */
98  double precision; /**< soxr resampling precision (in bits) */
99  int cheby; /**< soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision will be higher */
100 
101  float min_compensation; ///< swr minimum below which no compensation will happen
102  float min_hard_compensation; ///< swr minimum below which no silence inject / sample drop will happen
103  float soft_compensation_duration; ///< swr duration over which soft compensation is applied
104  float max_soft_compensation; ///< swr maximum soft compensation in seconds over soft_compensation_duration
105  float async; ///< swr simple 1 parameter async, similar to ffmpegs -async
106  int64_t firstpts_in_samples; ///< swr first pts in samples
107 
108  int resample_first; ///< 1 if resampling must come first, 0 if rematrixing
109  int rematrix; ///< flag to indicate if rematrixing is needed (basically if input and output layouts mismatch)
110  int rematrix_custom; ///< flag to indicate that a custom matrix has been defined
111 
112  AudioData in; ///< input audio data
113  AudioData postin; ///< post-input audio data: used for rematrix/resample
114  AudioData midbuf; ///< intermediate audio data (postin/preout)
115  AudioData preout; ///< pre-output audio data: used for rematrix/resample
116  AudioData out; ///< converted output audio data
117  AudioData in_buffer; ///< cached audio data (convert and resample purpose)
118  AudioData silence; ///< temporary with silence
119  AudioData drop_temp; ///< temporary used to discard output
120  int in_buffer_index; ///< cached buffer position
121  int in_buffer_count; ///< cached buffer length
122  int resample_in_constraint; ///< 1 if the input end was reach before the output end, 0 otherwise
123  int flushed; ///< 1 if data is to be flushed and no further input is expected
124  int64_t outpts; ///< output PTS
125  int64_t firstpts; ///< first PTS
126  int drop_output; ///< number of output samples to drop
127 
128  struct AudioConvert *in_convert; ///< input conversion context
129  struct AudioConvert *out_convert; ///< output conversion context
130  struct AudioConvert *full_convert; ///< full conversion context (single conversion for input and output)
131  struct ResampleContext *resample; ///< resampling context
132  struct Resampler const *resampler; ///< resampler virtual function table
133 
134  float matrix[SWR_CH_MAX][SWR_CH_MAX]; ///< floating point rematrixing coefficients
138  int32_t matrix32[SWR_CH_MAX][SWR_CH_MAX]; ///< 17.15 fixed point rematrixing coefficients
139  uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1]; ///< Lists of input channels per output channel that have non zero rematrixing coefficients
142 
145 
147 
148  /* TODO: callbacks for ASM optimizations */
149 };
150 
151 typedef struct ResampleContext * (* resample_init_func)(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear,
152  double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby);
153 typedef void (* resample_free_func)(struct ResampleContext **c);
154 typedef int (* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed);
155 typedef int (* resample_flush_func)(struct SwrContext *c);
156 typedef int (* set_compensation_func)(struct ResampleContext *c, int sample_delta, int compensation_distance);
157 typedef int64_t (* get_delay_func)(struct SwrContext *s, int64_t base);
158 
159 struct Resampler {
166 };
167 
168 extern struct Resampler const swri_resampler;
169 
171 int swri_resample_int16(struct ResampleContext *c, int16_t *dst, const int16_t *src, int *consumed, int src_size, int dst_size, int update_ctx);
172 int swri_resample_int32(struct ResampleContext *c, int32_t *dst, const int32_t *src, int *consumed, int src_size, int dst_size, int update_ctx);
173 int swri_resample_float(struct ResampleContext *c, float *dst, const float *src, int *consumed, int src_size, int dst_size, int update_ctx);
174 int swri_resample_double(struct ResampleContext *c,double *dst, const double *src, int *consumed, int src_size, int dst_size, int update_ctx);
175 
176 void swri_noise_shaping_int16 (SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count);
177 void swri_noise_shaping_int32 (SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count);
178 void swri_noise_shaping_float (SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count);
179 void swri_noise_shaping_double(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count);
180 
183 int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy);
184 void swri_rematrix_init_x86(struct SwrContext *s);
185 
186 void swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat noise_fmt);
187 int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt);
188 
190  enum AVSampleFormat out_fmt,
191  enum AVSampleFormat in_fmt,
192  int channels);
194  enum AVSampleFormat out_fmt,
195  enum AVSampleFormat in_fmt,
196  int channels);
197 #endif
struct AudioConvert * in_convert
input conversion context
struct AudioData AudioData
const AVClass * av_class
AVClass used for AVOption and av_log()
struct AudioConvert * full_convert
full conversion context (single conversion for input and output)
const char * s
Definition: avisynth_c.h:668
int64_t(* get_delay_func)(struct SwrContext *s, int64_t base)
AudioData temp
temporary storage when writing into the input buffer isnt possible
int out_sample_rate
output sample rate
Audio buffer used for intermediate storage between conversion phases.
Definition: oss_audio.c:46
multiple_resample_func multiple_resample
struct Resampler const swri_resampler
int count
number of samples
int swri_realloc_audio(AudioData *a, int count)
Definition: swresample.c:444
int ch_count
number of channels
int swri_resample_float(struct ResampleContext *c, float *dst, const float *src, int *consumed, int src_size, int dst_size, int update_ctx)
float soft_compensation_duration
swr duration over which soft compensation is applied
int swri_rematrix_init(SwrContext *s)
Definition: rematrix.c:327
int rematrix_custom
flag to indicate that a custom matrix has been defined
SwrFilterType
Resampling Filter Types.
Definition: swresample.h:134
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
int in_buffer_index
cached buffer position
AudioData in_buffer
cached audio data (convert and resample purpose)
int resample_in_constraint
1 if the input end was reach before the output end, 0 otherwise
struct ResampleContext * resample
resampling context
float ns_scale
Noise shaping dither scale.
float async
swr simple 1 parameter async, similar to ffmpegs -async
const int * channel_map
channel index (or -1 if muted channel) map
void( mix_2_1_func_type)(void *out, const void *in1, const void *in2, void *coeffp, integer index1, integer index2, integer len)
int log_level_offset
logging level offset
struct Resampler const * resampler
resampler virtual function table
void(* resample_free_func)(struct ResampleContext **c)
uint8_t
float max_soft_compensation
swr maximum soft compensation in seconds over soft_compensation_duration
enum AVSampleFormat fmt
sample format
#define NS_TAPS
SwrDitherType
Definition: swresample.h:109
void * log_ctx
parent logging context
void swri_rematrix_free(SwrContext *s)
Definition: rematrix.c:387
void swri_audio_convert_init_arm(struct AudioConvert *ac, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels)
AudioData out
converted output audio data
int phase_shift
log2 of the number of entries in the resampling polyphase filterbank
int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt)
AudioData in
input audio data
int swri_resample_double(struct ResampleContext *c, double *dst, const double *src, int *consumed, int src_size, int dst_size, int update_ctx)
float min_hard_compensation
swr minimum below which no silence inject / sample drop will happen
enum AVResampleFilterType filter_type
end end ac
int in_buffer_count
cached buffer length
SwrEngine
Resampling Engines.
Definition: swresample.h:127
libswresample public header
AudioData postin
post-input audio data: used for rematrix/resample
float slev
surround mixing level
int output_sample_bits
the number of used output bits, needed to scale dither correctly
int channels
channel count
Definition: oss_audio.c:50
double cutoff
resampling cutoff frequency (swr: 6dB point; soxr: 0dB point).
struct ResampleContext *(* resample_init_func)(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby)
float clev
center mixing level
void swri_audio_convert_init_x86(struct AudioConvert *ac, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels)
void( mix_any_func_type)(uint8_t **out, const uint8_t **in1, void *coeffp, integer len)
mix_2_1_func_type * mix_2_1_simd
resample_flush_func flush
int64_t firstpts
first PTS
AudioData preout
pre-output audio data: used for rematrix/resample
AudioData midbuf
intermediate audio data (postin/preout)
int(* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed)
int(* resample_flush_func)(struct SwrContext *c)
resample_free_func free
void swri_rematrix_init_x86(struct SwrContext *s)
audio channel layout utility functions
int flags
miscellaneous flags such as SWR_FLAG_RESAMPLE
int drop_output
number of output samples to drop
int linear_interp
if 1 then the resampling FIR filter will be linearly interpolated
mix_1_1_func_type * mix_1_1_f
void swri_noise_shaping_int32(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
double precision
soxr resampling precision (in bits)
mix_1_1_func_type * mix_1_1_simd
AudioData noise
noise used for dithering
int32_t
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
int64_t out_ch_layout
output channel layout
int in_sample_rate
input sample rate
int bps
bytes per sample
int rematrix
flag to indicate if rematrixing is needed (basically if input and output layouts mismatch) ...
mix_any_func_type * mix_any_f
uint8_t * native_matrix
set_compensation_func set_compensation
float ns_scale_1
Noise shaping dither scale^-1.
float noise_scale
Noise scale.
void swri_noise_shaping_double(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int64_t outpts
output PTS
AVS_Value src
Definition: avisynth_c.h:523
typedef void(RENAME(mix_any_func_type))
int filter_size
length of each FIR filter in the resampling filterbank relative to the cutoff frequency ...
int swri_resample_int32(struct ResampleContext *c, int32_t *dst, const int32_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
uint8_t * data[AVRESAMPLE_MAX_CHANNELS]
data plane pointers
Definition: audio_data.h:37
static unsigned int seed
Definition: videogen.c:78
float min_compensation
swr minimum below which no compensation will happen
int ns_pos
Noise shaping dither position.
Describe the class of an AVClass context structure.
Definition: log.h:50
int index
Definition: gxfenc.c:89
void swri_noise_shaping_float(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy)
Definition: rematrix.c:393
uint8_t * native_one
int flushed
1 if data is to be flushed and no further input is expected
void( mix_1_1_func_type)(void *out, const void *in, void *coeffp, integer index, integer len)
int64_t in_ch_layout
input channel layout
void swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat noise_fmt)
uint8_t * native_simd_matrix
static double c[64]
#define SWR_CH_MAX
Maximum number of channels.
Definition: swresample.h:102
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
int cheby
soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision ...
get_delay_func get_delay
float lfe_mix_level
LFE mixing level.
void swri_noise_shaping_int16(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int len
struct AudioConvert * out_convert
output conversion context
float rematrix_volume
rematrixing volume coefficient
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int kaiser_beta
swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) ...
int(* set_compensation_func)(struct ResampleContext *c, int sample_delta, int compensation_distance)
mix_2_1_func_type * mix_2_1_f
int64_t firstpts_in_samples
swr first pts in samples
int integer
int planar
1 if planar audio, 0 otherwise
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
AVMatrixEncoding
AudioData drop_temp
temporary used to discard output
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
int swri_resample_int16(struct ResampleContext *c, int16_t *dst, const int16_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
int used_ch_count
number of used input channels (mapped channel count if channel_map, otherwise in.ch_count) ...
resample_init_func init
AudioData silence
temporary with silence
int resample_first
1 if resampling must come first, 0 if rematrixing
int ns_taps
Noise shaping dither taps.