2 * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
4 * This file is part of libswresample
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.
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.
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
21 #ifndef SWR_INTERNAL_H
22 #define SWR_INTERNAL_H
24 #include "swresample.h"
25 #include "libavutil/channel_layout.h"
30 #define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */
35 typedef int64_t integer
;
40 typedef void (mix_1_1_func_type
)(void *out
, const void *in
, void *coeffp
, integer index
, integer len
);
41 typedef void (mix_2_1_func_type
)(void *out
, const void *in1
, const void *in2
, void *coeffp
, integer index1
, integer index2
, integer len
);
43 typedef void (mix_any_func_type
)(uint8_t **out
, const uint8_t **in1
, void *coeffp
, integer len
);
45 typedef struct AudioData
{
46 uint8_t *ch
[SWR_CH_MAX
]; ///< samples buffer per channel
47 uint8_t *data
; ///< samples buffer
48 int ch_count
; ///< number of channels
49 int bps
; ///< bytes per sample
50 int count
; ///< number of samples
51 int planar
; ///< 1 if planar audio, 0 otherwise
52 enum AVSampleFormat fmt
; ///< sample format
55 struct DitherContext
{
56 enum SwrDitherType method
;
59 float noise_scale
; ///< Noise scale
60 int ns_taps
; ///< Noise shaping dither taps
61 float ns_scale
; ///< Noise shaping dither scale
62 float ns_scale_1
; ///< Noise shaping dither scale^-1
63 int ns_pos
; ///< Noise shaping dither position
64 float ns_coeffs
[NS_TAPS
]; ///< Noise shaping filter coefficients
65 float ns_errors
[SWR_CH_MAX
][2*NS_TAPS
];
66 AudioData noise
; ///< noise used for dithering
67 AudioData temp
; ///< temporary storage when writing into the input buffer isn't possible
68 int output_sample_bits
; ///< the number of used output bits, needed to scale dither correctly
72 const AVClass
*av_class
; ///< AVClass used for AVOption and av_log()
73 int log_level_offset
; ///< logging level offset
74 void *log_ctx
; ///< parent logging context
75 enum AVSampleFormat in_sample_fmt
; ///< input sample format
76 enum AVSampleFormat int_sample_fmt
; ///< internal sample format (AV_SAMPLE_FMT_FLTP or AV_SAMPLE_FMT_S16P)
77 enum AVSampleFormat out_sample_fmt
; ///< output sample format
78 int64_t in_ch_layout
; ///< input channel layout
79 int64_t out_ch_layout
; ///< output channel layout
80 int in_sample_rate
; ///< input sample rate
81 int out_sample_rate
; ///< output sample rate
82 int flags
; ///< miscellaneous flags such as SWR_FLAG_RESAMPLE
83 float slev
; ///< surround mixing level
84 float clev
; ///< center mixing level
85 float lfe_mix_level
; ///< LFE mixing level
86 float rematrix_volume
; ///< rematrixing volume coefficient
87 float rematrix_maxval
; ///< maximum value for rematrixing output
88 enum AVMatrixEncoding matrix_encoding
; /**< matrixed stereo encoding */
89 const int *channel_map
; ///< channel index (or -1 if muted channel) map
90 int used_ch_count
; ///< number of used input channels (mapped channel count if channel_map, otherwise in.ch_count)
91 enum SwrEngine engine
;
93 struct DitherContext dither
;
95 int filter_size
; /**< length of each FIR filter in the resampling filterbank relative to the cutoff frequency */
96 int phase_shift
; /**< log2 of the number of entries in the resampling polyphase filterbank */
97 int linear_interp
; /**< if 1 then the resampling FIR filter will be linearly interpolated */
98 double cutoff
; /**< resampling cutoff frequency (swr: 6dB point; soxr: 0dB point). 1.0 corresponds to half the output sample rate */
99 enum SwrFilterType filter_type
; /**< swr resampling filter type */
100 int kaiser_beta
; /**< swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) */
101 double precision
; /**< soxr resampling precision (in bits) */
102 int cheby
; /**< soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision will be higher */
104 float min_compensation
; ///< swr minimum below which no compensation will happen
105 float min_hard_compensation
; ///< swr minimum below which no silence inject / sample drop will happen
106 float soft_compensation_duration
; ///< swr duration over which soft compensation is applied
107 float max_soft_compensation
; ///< swr maximum soft compensation in seconds over soft_compensation_duration
108 float async
; ///< swr simple 1 parameter async, similar to ffmpegs -async
109 int64_t firstpts_in_samples
; ///< swr first pts in samples
111 int resample_first
; ///< 1 if resampling must come first, 0 if rematrixing
112 int rematrix
; ///< flag to indicate if rematrixing is needed (basically if input and output layouts mismatch)
113 int rematrix_custom
; ///< flag to indicate that a custom matrix has been defined
115 AudioData in
; ///< input audio data
116 AudioData postin
; ///< post-input audio data: used for rematrix/resample
117 AudioData midbuf
; ///< intermediate audio data (postin/preout)
118 AudioData preout
; ///< pre-output audio data: used for rematrix/resample
119 AudioData out
; ///< converted output audio data
120 AudioData in_buffer
; ///< cached audio data (convert and resample purpose)
121 AudioData silence
; ///< temporary with silence
122 AudioData drop_temp
; ///< temporary used to discard output
123 int in_buffer_index
; ///< cached buffer position
124 int in_buffer_count
; ///< cached buffer length
125 int resample_in_constraint
; ///< 1 if the input end was reach before the output end, 0 otherwise
126 int flushed
; ///< 1 if data is to be flushed and no further input is expected
127 int64_t outpts
; ///< output PTS
128 int64_t firstpts
; ///< first PTS
129 int drop_output
; ///< number of output samples to drop
131 struct AudioConvert
*in_convert
; ///< input conversion context
132 struct AudioConvert
*out_convert
; ///< output conversion context
133 struct AudioConvert
*full_convert
; ///< full conversion context (single conversion for input and output)
134 struct ResampleContext
*resample
; ///< resampling context
135 struct Resampler
const *resampler
; ///< resampler virtual function table
137 float matrix
[SWR_CH_MAX
][SWR_CH_MAX
]; ///< floating point rematrixing coefficients
138 uint8_t *native_matrix
;
140 uint8_t *native_simd_one
;
141 uint8_t *native_simd_matrix
;
142 int32_t matrix32
[SWR_CH_MAX
][SWR_CH_MAX
]; ///< 17.15 fixed point rematrixing coefficients
143 uint8_t matrix_ch
[SWR_CH_MAX
][SWR_CH_MAX
+1]; ///< Lists of input channels per output channel that have non zero rematrixing coefficients
144 mix_1_1_func_type
*mix_1_1_f
;
145 mix_1_1_func_type
*mix_1_1_simd
;
147 mix_2_1_func_type
*mix_2_1_f
;
148 mix_2_1_func_type
*mix_2_1_simd
;
150 mix_any_func_type
*mix_any_f
;
152 /* TODO: callbacks for ASM optimizations */
155 typedef struct ResampleContext
* (* resample_init_func
)(struct ResampleContext
*c
, int out_rate
, int in_rate
, int filter_size
, int phase_shift
, int linear
,
156 double cutoff
, enum AVSampleFormat format
, enum SwrFilterType filter_type
, int kaiser_beta
, double precision
, int cheby
);
157 typedef void (* resample_free_func
)(struct ResampleContext
**c
);
158 typedef int (* multiple_resample_func
)(struct ResampleContext
*c
, AudioData
*dst
, int dst_size
, AudioData
*src
, int src_size
, int *consumed
);
159 typedef int (* resample_flush_func
)(struct SwrContext
*c
);
160 typedef int (* set_compensation_func
)(struct ResampleContext
*c
, int sample_delta
, int compensation_distance
);
161 typedef int64_t (* get_delay_func
)(struct SwrContext
*s
, int64_t base
);
162 typedef int (* invert_initial_buffer_func
)(struct ResampleContext
*c
, AudioData
*dst
, const AudioData
*src
, int src_size
, int *dst_idx
, int *dst_count
);
165 resample_init_func init
;
166 resample_free_func free
;
167 multiple_resample_func multiple_resample
;
168 resample_flush_func flush
;
169 set_compensation_func set_compensation
;
170 get_delay_func get_delay
;
171 invert_initial_buffer_func invert_initial_buffer
;
174 extern struct Resampler
const swri_resampler
;
176 int swri_realloc_audio(AudioData
*a
, int count
);
178 void swri_noise_shaping_int16 (SwrContext
*s
, AudioData
*dsts
, const AudioData
*srcs
, const AudioData
*noises
, int count
);
179 void swri_noise_shaping_int32 (SwrContext
*s
, AudioData
*dsts
, const AudioData
*srcs
, const AudioData
*noises
, int count
);
180 void swri_noise_shaping_float (SwrContext
*s
, AudioData
*dsts
, const AudioData
*srcs
, const AudioData
*noises
, int count
);
181 void swri_noise_shaping_double(SwrContext
*s
, AudioData
*dsts
, const AudioData
*srcs
, const AudioData
*noises
, int count
);
183 int swri_rematrix_init(SwrContext
*s
);
184 void swri_rematrix_free(SwrContext
*s
);
185 int swri_rematrix(SwrContext
*s
, AudioData
*out
, AudioData
*in
, int len
, int mustcopy
);
186 void swri_rematrix_init_x86(struct SwrContext
*s
);
188 void swri_get_dither(SwrContext
*s
, void *dst
, int len
, unsigned seed
, enum AVSampleFormat noise_fmt
);
189 int swri_dither_init(SwrContext
*s
, enum AVSampleFormat out_fmt
, enum AVSampleFormat in_fmt
);
191 void swri_audio_convert_init_aarch64(struct AudioConvert
*ac
,
192 enum AVSampleFormat out_fmt
,
193 enum AVSampleFormat in_fmt
,
195 void swri_audio_convert_init_arm(struct AudioConvert
*ac
,
196 enum AVSampleFormat out_fmt
,
197 enum AVSampleFormat in_fmt
,
199 void swri_audio_convert_init_x86(struct AudioConvert
*ac
,
200 enum AVSampleFormat out_fmt
,
201 enum AVSampleFormat in_fmt
,