29#define INTERPOLATION_LINEAR 0
30#define INTERPOLATION_QUADRATIC 1
52#define OFFSET(x) offsetof(FlangerContext, x)
53#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
58 {
"regen",
"percentage regeneration (delayed signal feedback)",
OFFSET(feedback_gain),
AV_OPT_TYPE_DOUBLE, {.dbl=0}, -95, 95,
A },
59 {
"width",
"percentage of delayed signal mixed with original",
OFFSET(delay_gain),
AV_OPT_TYPE_DOUBLE, {.dbl=71}, 0, 100,
A },
66 {
"phase",
"swept wave percentage phase-shift for multi-channel",
OFFSET(channel_phase),
AV_OPT_TYPE_DOUBLE, {.dbl=25}, 0, 100,
A },
79 s->feedback_gain /= 100;
81 s->channel_phase /= 100;
83 s->delay_depth /= 1000;
84 s->in_gain = 1 / (1 +
s->delay_gain);
85 s->delay_gain /= 1 +
s->delay_gain;
86 s->delay_gain *= 1 -
fabs(
s->feedback_gain);
96 s->max_samples = (
s->delay_min +
s->delay_depth) * inlink->
sample_rate + 2.5;
100 if (!
s->lfo || !
s->delay_last)
105 s->max_samples - 2., 3 *
M_PI_2);
130 for (
i = 0;
i <
frame->nb_samples;
i++) {
132 s->delay_buf_pos = (
s->delay_buf_pos +
s->max_samples - 1) %
s->max_samples;
135 double *
src = (
double *)
frame->extended_data[chan];
137 double delayed_0, delayed_1;
140 int channel_phase = chan *
s->lfo_length *
s->channel_phase + .5;
141 double delay =
s->lfo[(
s->lfo_pos + channel_phase) %
s->lfo_length];
142 int int_delay = (int)delay;
143 double frac_delay = modf(delay, &delay);
144 double *delay_buffer = (
double *)
s->delay_buffer[chan];
147 delay_buffer[
s->delay_buf_pos] = in +
s->delay_last[chan] *
149 delayed_0 = delay_buffer[(
s->delay_buf_pos + int_delay++) %
s->max_samples];
150 delayed_1 = delay_buffer[(
s->delay_buf_pos + int_delay++) %
s->max_samples];
153 delayed = delayed_0 + (delayed_1 - delayed_0) * frac_delay;
156 double delayed_2 = delay_buffer[(
s->delay_buf_pos + int_delay++) %
s->max_samples];
157 delayed_2 -= delayed_0;
158 delayed_1 -= delayed_0;
159 a = delayed_2 * .5 - delayed_1;
160 b = delayed_1 * 2 - delayed_2 *.5;
161 delayed = delayed_0 + (
a * frac_delay +
b) * frac_delay;
164 s->delay_last[chan] = delayed;
165 out = in *
s->in_gain + delayed *
s->delay_gain;
168 s->lfo_pos = (
s->lfo_pos + 1) %
s->lfo_length;
171 if (
frame != out_frame)
201 .p.priv_class = &flanger_class,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static int config_input(AVFilterLink *inlink)
static int interpolation(DeclickChannel *c, const double *src, int ar_order, double *acoefficients, int *index, int nb_errors, double *auxiliary, double *interpolated)
static const AVOption flanger_options[]
#define INTERPOLATION_LINEAR
#define INTERPOLATION_QUADRATIC
static int config_input(AVFilterLink *inlink)
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
static const AVFilterPad flanger_inputs[]
static av_cold void uninit(AVFilterContext *ctx)
const FFFilter ff_af_flanger
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
static __device__ float fabs(float a)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
int(* init)(AVBSFContext *ctx)
void ff_generate_wave_table(enum WaveType wave_type, enum AVSampleFormat sample_fmt, void *table, int table_size, double min, double max, double phase)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
@ AV_SAMPLE_FMT_DBLP
double, planar
int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Allocate a data pointers array, samples buffer for nb_samples samples, and fill data pointers and lin...
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_SINGLE_SAMPLEFMT(sample_fmt_)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
A link between two filters.
int sample_rate
samples per second
AVChannelLayout ch_layout
channel layout of current buffer (see libavutil/channel_layout.h)
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t ** extended_data
pointers to the data planes/channels.
static AVFormatContext * ctx