FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
af_afftfilt.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Paul B Mahol
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 2.1 of the License,
9  * or (at your option) any later version.
10  *
11  * FFmpeg 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 FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/audio_fifo.h"
22 #include "libavutil/avstring.h"
23 #include "libavfilter/internal.h"
24 #include "libavutil/common.h"
25 #include "libavutil/opt.h"
26 #include "libavcodec/avfft.h"
27 #include "libavutil/eval.h"
28 #include "audio.h"
29 #include "window_func.h"
30 
31 typedef struct AFFTFiltContext {
32  const AVClass *class;
33  char *real_str;
34  char *img_str;
35  int fft_bits;
36 
39  int nb_exprs;
44  int64_t pts;
45  int hop_size;
46  float overlap;
48  int start, end;
49  int win_func;
50  float win_scale;
53 
54 static const char *const var_names[] = { "sr", "b", "nb", "ch", "chs", "pts", NULL };
56 
57 #define OFFSET(x) offsetof(AFFTFiltContext, x)
58 #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
59 
60 static const AVOption afftfilt_options[] = {
61  { "real", "set channels real expressions", OFFSET(real_str), AV_OPT_TYPE_STRING, {.str = "1" }, 0, 0, A },
62  { "imag", "set channels imaginary expressions", OFFSET(img_str), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, A },
63  { "win_size", "set window size", OFFSET(fft_bits), AV_OPT_TYPE_INT, {.i64=12}, 4, 16, A, "fft" },
64  { "w16", 0, 0, AV_OPT_TYPE_CONST, {.i64=4}, 0, 0, A, "fft" },
65  { "w32", 0, 0, AV_OPT_TYPE_CONST, {.i64=5}, 0, 0, A, "fft" },
66  { "w64", 0, 0, AV_OPT_TYPE_CONST, {.i64=6}, 0, 0, A, "fft" },
67  { "w128", 0, 0, AV_OPT_TYPE_CONST, {.i64=7}, 0, 0, A, "fft" },
68  { "w256", 0, 0, AV_OPT_TYPE_CONST, {.i64=8}, 0, 0, A, "fft" },
69  { "w512", 0, 0, AV_OPT_TYPE_CONST, {.i64=9}, 0, 0, A, "fft" },
70  { "w1024", 0, 0, AV_OPT_TYPE_CONST, {.i64=10}, 0, 0, A, "fft" },
71  { "w2048", 0, 0, AV_OPT_TYPE_CONST, {.i64=11}, 0, 0, A, "fft" },
72  { "w4096", 0, 0, AV_OPT_TYPE_CONST, {.i64=12}, 0, 0, A, "fft" },
73  { "w8192", 0, 0, AV_OPT_TYPE_CONST, {.i64=13}, 0, 0, A, "fft" },
74  { "w16384", 0, 0, AV_OPT_TYPE_CONST, {.i64=14}, 0, 0, A, "fft" },
75  { "w32768", 0, 0, AV_OPT_TYPE_CONST, {.i64=15}, 0, 0, A, "fft" },
76  { "w65536", 0, 0, AV_OPT_TYPE_CONST, {.i64=16}, 0, 0, A, "fft" },
77  { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, A, "win_func" },
78  { "rect", "Rectangular", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT}, 0, 0, A, "win_func" },
79  { "bartlett", "Bartlett", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, A, "win_func" },
80  { "hann", "Hann", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING}, 0, 0, A, "win_func" },
81  { "hanning", "Hanning", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING}, 0, 0, A, "win_func" },
82  { "hamming", "Hamming", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HAMMING}, 0, 0, A, "win_func" },
83  { "sine", "Sine", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_SINE}, 0, 0, A, "win_func" },
84  { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, A },
85  { NULL },
86 };
87 
88 AVFILTER_DEFINE_CLASS(afftfilt);
89 
90 static int config_input(AVFilterLink *inlink)
91 {
92  AVFilterContext *ctx = inlink->dst;
93  AFFTFiltContext *s = ctx->priv;
94  char *saveptr = NULL;
95  int ret = 0, ch, i;
96  float overlap;
97  char *args;
98  const char *last_expr = "1";
99 
100  s->fft = av_fft_init(s->fft_bits, 0);
101  s->ifft = av_fft_init(s->fft_bits, 1);
102  if (!s->fft || !s->ifft)
103  return AVERROR(ENOMEM);
104 
105  s->window_size = 1 << s->fft_bits;
106 
107  s->fft_data = av_calloc(inlink->channels, sizeof(*s->fft_data));
108  if (!s->fft_data)
109  return AVERROR(ENOMEM);
110 
111  for (ch = 0; ch < inlink->channels; ch++) {
112  s->fft_data[ch] = av_calloc(s->window_size, sizeof(**s->fft_data));
113  if (!s->fft_data[ch])
114  return AVERROR(ENOMEM);
115  }
116 
117  s->real = av_calloc(inlink->channels, sizeof(*s->real));
118  if (!s->real)
119  return AVERROR(ENOMEM);
120 
121  s->imag = av_calloc(inlink->channels, sizeof(*s->imag));
122  if (!s->imag)
123  return AVERROR(ENOMEM);
124 
125  args = av_strdup(s->real_str);
126  if (!args)
127  return AVERROR(ENOMEM);
128 
129  for (ch = 0; ch < inlink->channels; ch++) {
130  char *arg = av_strtok(ch == 0 ? args : NULL, "|", &saveptr);
131 
132  ret = av_expr_parse(&s->real[ch], arg ? arg : last_expr, var_names,
133  NULL, NULL, NULL, NULL, 0, ctx);
134  if (ret < 0)
135  break;
136  if (arg)
137  last_expr = arg;
138  s->nb_exprs++;
139  }
140 
141  av_free(args);
142 
143  args = av_strdup(s->img_str ? s->img_str : s->real_str);
144  if (!args)
145  return AVERROR(ENOMEM);
146 
147  for (ch = 0; ch < inlink->channels; ch++) {
148  char *arg = av_strtok(ch == 0 ? args : NULL, "|", &saveptr);
149 
150  ret = av_expr_parse(&s->imag[ch], arg ? arg : last_expr, var_names,
151  NULL, NULL, NULL, NULL, 0, ctx);
152  if (ret < 0)
153  break;
154  if (arg)
155  last_expr = arg;
156  }
157 
158  av_free(args);
159 
160  s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->window_size);
161  if (!s->fifo)
162  return AVERROR(ENOMEM);
163 
165  sizeof(*s->window_func_lut));
166  if (!s->window_func_lut)
167  return AVERROR(ENOMEM);
169  if (s->overlap == 1)
170  s->overlap = overlap;
171 
172  for (s->win_scale = 0, i = 0; i < s->window_size; i++) {
173  s->win_scale += s->window_func_lut[i] * s->window_func_lut[i];
174  }
175 
176  s->hop_size = s->window_size * (1 - s->overlap);
177  if (s->hop_size <= 0)
178  return AVERROR(EINVAL);
179 
180  s->buffer = ff_get_audio_buffer(inlink, s->window_size * 2);
181  if (!s->buffer)
182  return AVERROR(ENOMEM);
183 
184  return ret;
185 }
186 
187 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
188 {
189  AVFilterContext *ctx = inlink->dst;
190  AVFilterLink *outlink = ctx->outputs[0];
191  AFFTFiltContext *s = ctx->priv;
192  const int window_size = s->window_size;
193  const float f = 1. / s->win_scale;
194  double values[VAR_VARS_NB];
195  AVFrame *out, *in = NULL;
196  int ch, n, ret, i, j, k;
197  int start = s->start, end = s->end;
198 
199  av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
200  av_frame_free(&frame);
201 
202  while (av_audio_fifo_size(s->fifo) >= window_size) {
203  if (!in) {
204  in = ff_get_audio_buffer(outlink, window_size);
205  if (!in)
206  return AVERROR(ENOMEM);
207  }
208 
209  ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, window_size);
210  if (ret < 0)
211  break;
212 
213  for (ch = 0; ch < inlink->channels; ch++) {
214  const float *src = (float *)in->extended_data[ch];
215  FFTComplex *fft_data = s->fft_data[ch];
216 
217  for (n = 0; n < in->nb_samples; n++) {
218  fft_data[n].re = src[n] * s->window_func_lut[n];
219  fft_data[n].im = 0;
220  }
221 
222  for (; n < window_size; n++) {
223  fft_data[n].re = 0;
224  fft_data[n].im = 0;
225  }
226  }
227 
228  values[VAR_PTS] = s->pts;
229  values[VAR_SAMPLE_RATE] = inlink->sample_rate;
230  values[VAR_NBBINS] = window_size / 2;
231  values[VAR_CHANNELS] = inlink->channels;
232 
233  for (ch = 0; ch < inlink->channels; ch++) {
234  FFTComplex *fft_data = s->fft_data[ch];
235  float *buf = (float *)s->buffer->extended_data[ch];
236  int x;
237 
238  values[VAR_CHANNEL] = ch;
239 
240  av_fft_permute(s->fft, fft_data);
241  av_fft_calc(s->fft, fft_data);
242 
243  for (n = 0; n < window_size / 2; n++) {
244  float fr, fi;
245 
246  values[VAR_BIN] = n;
247 
248  fr = av_expr_eval(s->real[ch], values, s);
249  fi = av_expr_eval(s->imag[ch], values, s);
250 
251  fft_data[n].re *= fr;
252  fft_data[n].im *= fi;
253  }
254 
255  for (n = window_size / 2 + 1, x = window_size / 2 - 1; n < window_size; n++, x--) {
256  fft_data[n].re = fft_data[x].re;
257  fft_data[n].im = -fft_data[x].im;
258  }
259 
260  av_fft_permute(s->ifft, fft_data);
261  av_fft_calc(s->ifft, fft_data);
262 
263  start = s->start;
264  end = s->end;
265  k = end;
266  for (i = 0, j = start; j < k && i < window_size; i++, j++) {
267  buf[j] += s->fft_data[ch][i].re * f;
268  }
269 
270  for (; i < window_size; i++, j++) {
271  buf[j] = s->fft_data[ch][i].re * f;
272  }
273 
274  start += s->hop_size;
275  end = j;
276  }
277 
278  s->start = start;
279  s->end = end;
280 
281  if (start >= window_size) {
282  float *dst, *buf;
283 
284  start -= window_size;
285  end -= window_size;
286 
287  s->start = start;
288  s->end = end;
289 
290  out = ff_get_audio_buffer(outlink, window_size);
291  if (!out) {
292  ret = AVERROR(ENOMEM);
293  break;
294  }
295 
296  out->pts = s->pts;
297  s->pts += window_size;
298 
299  for (ch = 0; ch < inlink->channels; ch++) {
300  dst = (float *)out->extended_data[ch];
301  buf = (float *)s->buffer->extended_data[ch];
302 
303  for (n = 0; n < window_size; n++) {
304  dst[n] = buf[n] * (1 - s->overlap);
305  }
306  memmove(buf, buf + window_size, window_size * 4);
307  }
308 
309  ret = ff_filter_frame(outlink, out);
310  if (ret < 0)
311  break;
312  }
313 
315  }
316 
317  av_frame_free(&in);
318  return ret;
319 }
320 
322 {
325  static const enum AVSampleFormat sample_fmts[] = {
328  };
329  int ret;
330 
331  layouts = ff_all_channel_counts();
332  if (!layouts)
333  return AVERROR(ENOMEM);
334  ret = ff_set_common_channel_layouts(ctx, layouts);
335  if (ret < 0)
336  return ret;
337 
338  formats = ff_make_format_list(sample_fmts);
339  if (!formats)
340  return AVERROR(ENOMEM);
341  ret = ff_set_common_formats(ctx, formats);
342  if (ret < 0)
343  return ret;
344 
345  formats = ff_all_samplerates();
346  if (!formats)
347  return AVERROR(ENOMEM);
348  return ff_set_common_samplerates(ctx, formats);
349 }
350 
352 {
353  AFFTFiltContext *s = ctx->priv;
354  int i;
355 
356  av_fft_end(s->fft);
357  av_fft_end(s->ifft);
358 
359  for (i = 0; i < s->nb_exprs; i++) {
360  if (s->fft_data)
361  av_freep(&s->fft_data[i]);
362  }
363  av_freep(&s->fft_data);
364 
365  for (i = 0; i < s->nb_exprs; i++) {
366  av_expr_free(s->real[i]);
367  av_expr_free(s->imag[i]);
368  }
369 
370  av_freep(&s->real);
371  av_freep(&s->imag);
372  av_frame_free(&s->buffer);
373 }
374 
375 static const AVFilterPad inputs[] = {
376  {
377  .name = "default",
378  .type = AVMEDIA_TYPE_AUDIO,
379  .config_props = config_input,
380  .filter_frame = filter_frame,
381  },
382  { NULL }
383 };
384 
385 static const AVFilterPad outputs[] = {
386  {
387  .name = "default",
388  .type = AVMEDIA_TYPE_AUDIO,
389  },
390  { NULL }
391 };
392 
394  .name = "afftfilt",
395  .description = NULL_IF_CONFIG_SMALL("Apply arbitrary expressions to samples in frequency domain."),
396  .priv_size = sizeof(AFFTFiltContext),
397  .priv_class = &afftfilt_class,
398  .inputs = inputs,
399  .outputs = outputs,
401  .uninit = uninit,
402 };
float, planar
Definition: samplefmt.h:70
#define NULL
Definition: coverity.c:32
int ff_set_common_channel_layouts(AVFilterContext *ctx, AVFilterChannelLayouts *layouts)
A helper for query_formats() which sets all links to the same list of channel layouts/sample rates...
Definition: formats.c:549
FFTContext * fft
Definition: af_afftfilt.c:37
const char * s
Definition: avisynth_c.h:631
AVAudioFifo * av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels, int nb_samples)
Allocate an AVAudioFifo.
Definition: audio_fifo.c:60
#define av_realloc_f(p, o, n)
This structure describes decoded (raw) audio or video data.
Definition: frame.h:181
AVOption.
Definition: opt.h:245
AVAudioFifo * fifo
Definition: af_afftfilt.c:43
av_cold void av_fft_end(FFTContext *s)
Definition: avfft.c:48
AVFormatContext * ctx
Definition: movenc-test.c:48
AVExpr ** real
Definition: af_afftfilt.c:41
static int config_input(AVFilterLink *inlink)
Definition: af_afftfilt.c:90
static const char *const var_names[]
Definition: af_afftfilt.c:54
#define OFFSET(x)
Definition: af_afftfilt.c:57
FFTSample re
Definition: avfft.h:38
void av_fft_permute(FFTContext *s, FFTComplex *z)
Do the permutation needed BEFORE calling ff_fft_calc().
Definition: avfft.c:38
static enum AVSampleFormat formats[]
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition: eval.c:657
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:283
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_afftfilt.c:351
const char * name
Pad name.
Definition: internal.h:59
AVFilter ff_af_afftfilt
Definition: af_afftfilt.c:393
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1163
FFTComplex ** fft_data
Definition: af_afftfilt.c:38
#define av_cold
Definition: attributes.h:82
AVOptions.
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:262
Definition: eval.c:148
#define A
Definition: af_afftfilt.c:58
static AVFrame * frame
A filter pad used for either input or output.
Definition: internal.h:53
AVS_FilterInfo ** fi
Definition: avisynth_c.h:594
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:568
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition: audio.c:65
#define AVERROR(e)
Definition: error.h:43
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:154
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:176
void * priv
private data for use by the filter
Definition: avfilter.h:319
const char * arg
Definition: jacosubdec.c:66
FFTContext * av_fft_init(int nbits, int inverse)
Set up a complex FFT.
Definition: avfft.c:28
Context for an Audio FIFO Buffer.
Definition: audio_fifo.c:34
int av_audio_fifo_size(AVAudioFifo *af)
Get the current number of samples in the AVAudioFifo available for reading.
Definition: audio_fifo.c:205
Definition: fft.h:88
static int query_formats(AVFilterContext *ctx)
Definition: af_afftfilt.c:321
AVS_Value args
Definition: avisynth_c.h:562
int n
Definition: avisynth_c.h:547
static const AVFilterPad outputs[]
Definition: af_afftfilt.c:385
#define src
Definition: vp9dsp.c:530
A list of supported channel layouts.
Definition: formats.h:85
FILE * out
Definition: movenc-test.c:54
static const AVFilterPad inputs[]
Definition: af_afftfilt.c:375
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:59
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition: eval.c:317
char * av_strdup(const char *s)
Duplicate the string s.
Definition: mem.c:267
FFT functions.
float * window_func_lut
Definition: af_afftfilt.c:51
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;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);returnNULL;}returnac;}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;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->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);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
void * buf
Definition: avisynth_c.h:553
AVExpr ** imag
Definition: af_afftfilt.c:42
Describe the class of an AVClass context structure.
Definition: log.h:67
Filter definition.
Definition: avfilter.h:141
void ff_generate_window_func(float *lut, int N, int win_func, float *overlap)
Definition: window_func.c:26
FFTContext * ifft
Definition: af_afftfilt.c:37
static const AVOption afftfilt_options[]
Definition: af_afftfilt.c:60
const char * name
Filter name.
Definition: avfilter.h:145
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:316
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:434
AVFilterFormats * ff_all_samplerates(void)
Definition: formats.c:395
AVFrame * buffer
Definition: af_afftfilt.c:47
void * av_calloc(size_t nmemb, size_t size)
Allocate a block of nmemb * size bytes with alignment suitable for all memory accesses (including vec...
Definition: mem.c:260
int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples)
Write data to an AVAudioFifo.
Definition: audio_fifo.c:113
int av_audio_fifo_drain(AVAudioFifo *af, int nb_samples)
Drain data from an AVAudioFifo.
Definition: audio_fifo.c:178
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
Definition: avstring.c:184
FFTSample im
Definition: avfft.h:38
common internal and external API header
AVFILTER_DEFINE_CLASS(afftfilt)
#define av_free(p)
Audio FIFO Buffer.
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:712
A list of supported formats for one end of a filter link.
Definition: formats.h:64
int av_audio_fifo_peek(AVAudioFifo *af, void **data, int nb_samples)
Peek data from an AVAudioFifo.
Definition: audio_fifo.c:139
An instance of a filter.
Definition: avfilter.h:304
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:701
#define av_freep(p)
void INT64 start
Definition: avisynth_c.h:553
internal API functions
AVFilterChannelLayouts * ff_all_channel_counts(void)
Construct an AVFilterChannelLayouts coding for any channel layout, with known or unknown disposition...
Definition: formats.c:410
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:225
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: af_afftfilt.c:187
void av_fft_calc(FFTContext *s, FFTComplex *z)
Do a complex FFT with the parameters defined in av_fft_init().
Definition: avfft.c:43
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:235
for(j=16;j >0;--j)
int ff_set_common_samplerates(AVFilterContext *ctx, AVFilterFormats *samplerates)
Definition: formats.c:556
simple arithmetic expression evaluator