Go to the documentation of this file.
21 #ifndef SWRESAMPLE_SWRESAMPLE_INTERNAL_H
22 #define SWRESAMPLE_SWRESAMPLE_INTERNAL_H
30 #define SQRT3_2 1.22474487139158904909
double matrix[SWR_CH_MAX][SWR_CH_MAX]
floating point rematrixing coefficients
resample_flush_func flush
void() mix_any_func_type(uint8_t **out, const uint8_t **in1, void *coeffp, integer len)
mix_2_1_func_type * mix_2_1_f
int(* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed)
int64_t out_ch_layout
output channel layout
int linear_interp
if 1 then the resampling FIR filter will be linearly interpolated
void swri_noise_shaping_int16(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int in_sample_rate
input sample rate
int64_t(* get_out_samples_func)(struct SwrContext *s, int in_samples)
double delayed_samples_fixup
soxr 0.1.1: needed to fixup delayed_samples after flush has been called.
int user_in_ch_count
User set input channel count.
uint8_t * data[AVRESAMPLE_MAX_CHANNELS]
data plane pointers
void swri_rematrix_free(SwrContext *s)
set_compensation_func set_compensation
static float kaiser_beta(float att, float tr_bw)
int out_sample_rate
output sample rate
uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1]
Lists of input channels per output channel that have non zero rematrixing coefficients.
static int linear(InterplayACMContext *s, unsigned ind, unsigned col)
void(* resample_free_func)(struct ResampleContext **c)
int swri_rematrix_init_x86(struct SwrContext *s)
int drop_output
number of output samples to drop
get_out_samples_func get_out_samples
int(* resample_flush_func)(struct SwrContext *c)
float slev
surround mixing level
int user_used_ch_count
User set used channel count.
int matrix_encoding
matrixed stereo encoding
int used_ch_count
number of used input channels (mapped channel count if channel_map, otherwise in.ch_count)
double cutoff
resampling cutoff frequency (swr: 6dB point; soxr: 0dB point).
int in_buffer_index
cached buffer position
float min_hard_compensation
swr minimum below which no silence inject / sample drop will happen
void swri_noise_shaping_float(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
const AVClass * av_class
AVClass used for AVOption and av_log()
int resample_first
1 if resampling must come first, 0 if rematrixing
struct AudioConvert * full_convert
full conversion context (single conversion for input and output)
uint8_t * native_simd_one
Audio buffer used for intermediate storage between conversion phases.
enum AVSampleFormat out_sample_fmt
output sample format
void swri_audio_convert_init_x86(struct AudioConvert *ac, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels)
int64_t firstpts
first PTS
struct Resampler const * resampler
resampler virtual function table
float async
swr simple 1 parameter async, similar to ffmpegs -async
struct ResampleContext * resample
resampling context
av_warn_unused_result int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt)
int64_t user_out_ch_layout
User set output channel layout.
int ns_pos
Noise shaping dither position.
AudioData postin
post-input audio data: used for rematrix/resample
float clev
center mixing level
mix_1_1_func_type * mix_1_1_simd
av_warn_unused_result int swri_realloc_audio(AudioData *a, int count)
void swri_audio_convert_init_arm(struct AudioConvert *ac, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels)
int cheby
soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision ...
float lfe_mix_level
LFE mixing level.
int32_t matrix32[SWR_CH_MAX][SWR_CH_MAX]
17.15 fixed point rematrixing coefficients
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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
int user_out_ch_count
User set output channel count.
int(* set_compensation_func)(struct ResampleContext *c, int sample_delta, int compensation_distance)
enum AVSampleFormat int_sample_fmt
internal sample format (AV_SAMPLE_FMT_FLTP or AV_SAMPLE_FMT_S16P)
int planar
1 if planar audio, 0 otherwise
struct AudioConvert * in_convert
input conversion context
int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy)
The libswresample context.
const int * channel_map
channel index (or -1 if muted channel) map
mix_1_1_func_type * mix_1_1_f
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
void swri_noise_shaping_int32(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
AudioData midbuf
intermediate audio data (postin/preout)
float noise_scale
Noise scale.
AudioData drop_temp
temporary used to discard output
int in_buffer_count
cached buffer length
Describe the class of an AVClass context structure.
SwrFilterType
Resampling Filter Types.
int64_t(* get_delay_func)(struct SwrContext *s, int64_t base)
int phase_shift
log2 of the number of entries in the resampling polyphase filterbank
int log_level_offset
logging level offset
void * log_ctx
parent logging context
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int count
number of samples
int ch_count
number of channels
void() mix_2_1_func_type(void *out, const void *in1, const void *in2, void *coeffp, integer index1, integer index2, integer len)
int filter_size
length of each FIR filter in the resampling filterbank relative to the cutoff frequency
double kaiser_beta
swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER)
av_warn_unused_result int swri_rematrix_init(SwrContext *s)
AudioData preout
pre-output audio data: used for rematrix/resample
float ns_coeffs[NS_TAPS]
Noise shaping filter coefficients.
int flushed
1 if data is to be flushed and no further input is expected
int exact_rational
if 1 then enable non power of 2 phase_count
av_warn_unused_result int swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat noise_fmt)
enum AVSampleFormat user_int_sample_fmt
User set internal sample format.
uint8_t * native_simd_matrix
double precision
soxr resampling precision (in bits)
multiple_resample_func multiple_resample
void swri_audio_convert_init_aarch64(struct AudioConvert *ac, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels)
float matrix_flt[SWR_CH_MAX][SWR_CH_MAX]
single precision floating point rematrixing coefficients
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
mix_2_1_func_type * mix_2_1_simd
#define av_warn_unused_result
int rematrix
flag to indicate if rematrixing is needed (basically if input and output layouts mismatch)
void() mix_1_1_func_type(void *out, const void *in, void *coeffp, integer index, integer len)
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=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);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_AARCH64) ff_audio_convert_init_aarch64(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_log(ac->avr, AV_LOG_TRACE, "%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-> in
AudioData in_buffer
cached audio data (convert and resample purpose)
float min_compensation
swr minimum below which no compensation will happen
float soft_compensation_duration
swr duration over which soft compensation is applied
AVSampleFormat
Audio sample formats.
float max_soft_compensation
swr maximum soft compensation in seconds over soft_compensation_duration
int filter_type
swr resampling filter type
void swri_noise_shaping_double(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
mix_any_func_type * mix_any_f
enum AVResampleFilterType filter_type
float rematrix_volume
rematrixing volume coefficient
enum AVSampleFormat in_sample_fmt
input sample format
AudioData temp
temporary storage when writing into the input buffer isn't possible
int output_sample_bits
the number of used output bits, needed to scale dither correctly
int resample_in_constraint
1 if the input end was reach before the output end, 0 otherwise
struct Resampler const swri_resampler
enum AVSampleFormat fmt
sample format
int compensation_distance
AudioData noise
noise used for dithering
int ns_taps
Noise shaping dither taps.
int(* invert_initial_buffer_func)(struct ResampleContext *c, AudioData *dst, const AudioData *src, int src_size, int *dst_idx, int *dst_count)
struct AudioConvert * out_convert
output conversion context
float rematrix_maxval
maximum value for rematrixing output
int64_t firstpts_in_samples
swr first pts in samples
struct DitherContext dither
int64_t user_in_ch_layout
User set input channel layout.
AudioData out
converted output audio data
int64_t in_ch_layout
input channel layout
AudioData in
input audio data
int rematrix_custom
flag to indicate that a custom matrix has been defined
int user_dither_method
User set dither method.
struct Resampler const swri_soxr_resampler
float ns_scale
Noise shaping dither scale.
invert_initial_buffer_func invert_initial_buffer
float ns_errors[SWR_CH_MAX][2 *NS_TAPS]
AudioData silence
temporary with silence
float ns_scale_1
Noise shaping dither scale^-1.
int flags
miscellaneous flags such as SWR_FLAG_RESAMPLE