History

avfilter/avf_showfreqs: switch to TX FFT from avutil

Paul B Mahol committed 5 years ago

Commit ae948681 parent 74e43822 files · +30 −25Browse files

Showing the changes to libavfilter (1 of 2 files). Show all

Unified · Split

libavfilter/avf_showfreqs.c+30−22
@@ -21,7 +21,7 @@ · 20 unmodified lines
2121 #include <float.h>
2222 #include <math.h>
2323
24−#include "libavcodec/avfft.h"
24+#include "libavutil/tx.h"
2525 #include "libavutil/audio_fifo.h"
2626 #include "libavutil/avassert.h"
2727 #include "libavutil/avstring.h"
@@ -49,12 +49,13 @@ typedef struct ShowFreqsContext { · 21 unmodified lines
4949 int data_mode;
5050 int cmode;
5151 int fft_size;
52− int fft_bits;
5352 int ascale, fscale;
5453 int avg;
5554 int win_func;
56− FFTContext *fft;
57− FFTComplex **fft_data;
55+ AVTXContext *fft;
56+ av_tx_fn tx_fn;
57+ AVComplexFloat **fft_input;
58+ AVComplexFloat **fft_data;
5859 float **avg_data;
5960 float *window_func_lut;
6061 float overlap;
@@ -171,32 +172,36 @@ static int config_output(AVFilterLink *outlink) · 110 unmodified lines
171172 AVFilterContext *ctx = outlink->src;
172173 AVFilterLink *inlink = ctx->inputs[0];
173174 ShowFreqsContext *s = ctx->priv;
174− float overlap;
175− int i;
175+ float overlap, scale;
176+ int i, ret;
176177
177− s->fft_bits = av_log2(s->fft_size);
178− s->nb_freq = 1 << (s->fft_bits - 1);
179− s->win_size = s->nb_freq << 1;
178+ s->nb_freq = s->fft_size / 2;
179+ s->win_size = s->fft_size;
180180 av_audio_fifo_free(s->fifo);
181− av_fft_end(s->fft);
182− s->fft = av_fft_init(s->fft_bits, 0);
183− if (!s->fft) {
181+ av_tx_uninit(&s->fft);
182+ ret = av_tx_init(&s->fft, &s->tx_fn, AV_TX_FLOAT_FFT, 0, s->fft_size, &scale, 0);
183+ if (ret < 0) {
184184 av_log(ctx, AV_LOG_ERROR, "Unable to create FFT context. "
185185 "The window size might be too high.\n");
186− return AVERROR(ENOMEM);
186+ return ret;
187187 }
188188
189189 /* FFT buffers: x2 for each (display) channel buffer.
190190 * Note: we use free and malloc instead of a realloc-like function to
191191 * make sure the buffer is aligned in memory for the FFT functions. */
192192 for (i = 0; i < s->nb_channels; i++) {
193+ av_freep(&s->fft_input[i]);
193194 av_freep(&s->fft_data[i]);
194195 av_freep(&s->avg_data[i]);
195196 }
197+ av_freep(&s->fft_input);
196198 av_freep(&s->fft_data);
197199 av_freep(&s->avg_data);
198200 s->nb_channels = inlink->channels;
199201
202+ s->fft_input = av_calloc(s->nb_channels, sizeof(*s->fft_input));
203+ if (!s->fft_input)
204+ return AVERROR(ENOMEM);
200205 s->fft_data = av_calloc(s->nb_channels, sizeof(*s->fft_data));
201206 if (!s->fft_data)
202207 return AVERROR(ENOMEM);
@@ -204,9 +209,10 @@ static int config_output(AVFilterLink *outlink) · 1 unmodified line
204209 if (!s->avg_data)
205210 return AVERROR(ENOMEM);
206211 for (i = 0; i < s->nb_channels; i++) {
207− s->fft_data[i] = av_calloc(s->win_size, sizeof(**s->fft_data));
212+ s->fft_input[i] = av_calloc(FFALIGN(s->win_size, 512), sizeof(**s->fft_input));
213+ s->fft_data[i] = av_calloc(FFALIGN(s->win_size, 512), sizeof(**s->fft_data));
208214 s->avg_data[i] = av_calloc(s->nb_freq, sizeof(**s->avg_data));
209− if (!s->fft_data[i] || !s->avg_data[i])
215+ if (!s->fft_data[i] || !s->avg_data[i] || !s->fft_input[i])
210216 return AVERROR(ENOMEM);
211217 }
212218
@@ -385,19 +391,18 @@ static int plot_freqs(AVFilterLink *inlink, AVFrame *in) · 172 unmodified lines
385391 const float *p = (float *)in->extended_data[ch];
386392
387393 for (n = 0; n < in->nb_samples; n++) {
388− s->fft_data[ch][n].re = p[n] * s->window_func_lut[n];
389− s->fft_data[ch][n].im = 0;
394+ s->fft_input[ch][n].re = p[n] * s->window_func_lut[n];
395+ s->fft_input[ch][n].im = 0;
390396 }
391397 for (; n < win_size; n++) {
392− s->fft_data[ch][n].re = 0;
393− s->fft_data[ch][n].im = 0;
398+ s->fft_input[ch][n].re = 0;
399+ s->fft_input[ch][n].im = 0;
394400 }
395401 }
396402
397403 /* run FFT on each samples set */
398404 for (ch = 0; ch < s->nb_channels; ch++) {
399− av_fft_permute(s->fft, s->fft_data[ch]);
400− av_fft_calc(s->fft, s->fft_data[ch]);
405+ s->tx_fn(s->fft, s->fft_data[ch], s->fft_input[ch], sizeof(float));
401406 }
402407
403408 #define RE(x, ch) s->fft_data[ch][x].re
@@ -526,13 +531,16 @@ static av_cold void uninit(AVFilterContext *ctx) · 122 unmodified lines
526531 ShowFreqsContext *s = ctx->priv;
527532 int i;
528533
529− av_fft_end(s->fft);
534+ av_tx_uninit(&s->fft);
530535 for (i = 0; i < s->nb_channels; i++) {
536+ if (s->fft_input)
537+ av_freep(&s->fft_input[i]);
531538 if (s->fft_data)
532539 av_freep(&s->fft_data[i]);
533540 if (s->avg_data)
534541 av_freep(&s->avg_data[i]);
535542 }
543+ av_freep(&s->fft_input);
536544 av_freep(&s->fft_data);
537545 av_freep(&s->avg_data);
538546 av_freep(&s->window_func_lut);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t