[FFmpeg-cvslog] avfilter/avf_showcqt: switch to TX FFT from avutil

Paul B Mahol git at videolan.org
Tue Jul 27 22:21:28 EEST 2021


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Tue Jul 27 21:16:28 2021 +0200| [0068b3d0f0bc06b2b083eb729bf84f1a3196a2a9] | committer: Paul B Mahol

avfilter/avf_showcqt: switch to TX FFT from avutil

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0068b3d0f0bc06b2b083eb729bf84f1a3196a2a9
---

 configure                          |  5 ++---
 libavfilter/avf_showcqt.c          | 33 +++++++++++++++++----------------
 libavfilter/avf_showcqt.h          | 16 +++++++++-------
 libavfilter/x86/avf_showcqt_init.c |  2 +-
 4 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/configure b/configure
index d0da55fbd0..b61a189b07 100755
--- a/configure
+++ b/configure
@@ -3652,9 +3652,8 @@ scale_qsv_filter_deps="libmfx"
 scdet_filter_select="scene_sad"
 select_filter_select="scene_sad"
 sharpness_vaapi_filter_deps="vaapi"
-showcqt_filter_deps="avcodec avformat swscale"
+showcqt_filter_deps="avformat swscale"
 showcqt_filter_suggest="libfontconfig libfreetype"
-showcqt_filter_select="fft"
 showfreqs_filter_deps="avcodec"
 showfreqs_filter_select="fft"
 showspatial_filter_deps="avcodec"
@@ -7281,7 +7280,7 @@ enabled removelogo_filter   && prepend avfilter_deps "avformat avcodec swscale"
 enabled sab_filter          && prepend avfilter_deps "swscale"
 enabled scale_filter    && prepend avfilter_deps "swscale"
 enabled scale2ref_filter    && prepend avfilter_deps "swscale"
-enabled showcqt_filter      && prepend avfilter_deps "avformat avcodec swscale"
+enabled showcqt_filter      && prepend avfilter_deps "avformat swscale"
 enabled showfreqs_filter    && prepend avfilter_deps "avcodec"
 enabled signature_filter    && prepend avfilter_deps "avcodec avformat"
 enabled smartblur_filter    && prepend avfilter_deps "swscale"
diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c
index f1d8f16b32..aa9900ebe0 100644
--- a/libavfilter/avf_showcqt.c
+++ b/libavfilter/avf_showcqt.c
@@ -19,7 +19,7 @@
  */
 
 #include "config.h"
-#include "libavcodec/avfft.h"
+#include "libavutil/tx.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/opt.h"
 #include "libavutil/xga_font_data.h"
@@ -144,13 +144,13 @@ static void common_uninit(ShowCQTContext *s)
 
     av_frame_free(&s->axis_frame);
     av_frame_free(&s->sono_frame);
-    av_fft_end(s->fft_ctx);
-    s->fft_ctx = NULL;
+    av_tx_uninit(&s->fft_ctx);
     if (s->coeffs)
         for (k = 0; k < s->cqt_len; k++)
             av_freep(&s->coeffs[k].val);
     av_freep(&s->coeffs);
     av_freep(&s->fft_data);
+    av_freep(&s->fft_input);
     av_freep(&s->fft_result);
     av_freep(&s->cqt_result);
     av_freep(&s->attack_data);
@@ -267,15 +267,15 @@ error:
     return ret;
 }
 
-static void cqt_calc(FFTComplex *dst, const FFTComplex *src, const Coeffs *coeffs,
+static void cqt_calc(AVComplexFloat *dst, const AVComplexFloat *src, const Coeffs *coeffs,
                      int len, int fft_len)
 {
     int k, x, i, j;
     for (k = 0; k < len; k++) {
-        FFTComplex l, r, a = {0,0}, b = {0,0};
+        AVComplexFloat l, r, a = {0,0}, b = {0,0};
 
         for (x = 0; x < coeffs[k].len; x++) {
-            FFTSample u = coeffs[k].val[x];
+            float u = coeffs[k].val[x];
             i = coeffs[k].start + x;
             j = fft_len - i;
             a.re += u * src[i].re;
@@ -730,7 +730,7 @@ static float calculate_gamma(float v, float g)
     return expf(logf(v) / g);
 }
 
-static void rgb_from_cqt(ColorFloat *c, const FFTComplex *v, float g, int len, float cscheme[6])
+static void rgb_from_cqt(ColorFloat *c, const AVComplexFloat *v, float g, int len, float cscheme[6])
 {
     int x;
     for (x = 0; x < len; x++) {
@@ -740,7 +740,7 @@ static void rgb_from_cqt(ColorFloat *c, const FFTComplex *v, float g, int len, f
     }
 }
 
-static void yuv_from_cqt(ColorFloat *c, const FFTComplex *v, float gamma, int len, float cm[3][3], float cscheme[6])
+static void yuv_from_cqt(ColorFloat *c, const AVComplexFloat *v, float gamma, int len, float cm[3][3], float cscheme[6])
 {
     int x;
     for (x = 0; x < len; x++) {
@@ -1110,7 +1110,7 @@ static void process_cqt(ShowCQTContext *s)
     if (s->fcount > 1) {
         float rcp_fcount = 1.0f / s->fcount;
         for (x = 0; x < s->width; x++) {
-            FFTComplex result = {0.0f, 0.0f};
+            AVComplexFloat result = {0.0f, 0.0f};
             for (i = 0; i < s->fcount; i++) {
                 result.re += s->cqt_result[s->fcount * x + i].re;
                 result.im += s->cqt_result[s->fcount * x + i].im;
@@ -1139,17 +1139,16 @@ static int plot_cqt(AVFilterContext *ctx, AVFrame **frameout)
 
     last_time = av_gettime_relative();
 
-    memcpy(s->fft_result, s->fft_data, s->fft_len * sizeof(*s->fft_data));
+    memcpy(s->fft_input, s->fft_data, s->fft_len * sizeof(*s->fft_data));
     if (s->attack_data) {
         int k;
         for (k = 0; k < s->remaining_fill_max; k++) {
-            s->fft_result[s->fft_len/2+k].re *= s->attack_data[k];
-            s->fft_result[s->fft_len/2+k].im *= s->attack_data[k];
+            s->fft_input[s->fft_len/2+k].re *= s->attack_data[k];
+            s->fft_input[s->fft_len/2+k].im *= s->attack_data[k];
         }
     }
 
-    av_fft_permute(s->fft_ctx, s->fft_result);
-    av_fft_calc(s->fft_ctx, s->fft_result);
+    s->tx_fn(s->fft_ctx, s->fft_result, s->fft_input, sizeof(float));
     s->fft_result[s->fft_len] = s->fft_result[0];
     UPDATE_TIME(s->fft_time);
 
@@ -1355,6 +1354,7 @@ static int config_output(AVFilterLink *outlink)
     AVFilterContext *ctx = outlink->src;
     AVFilterLink *inlink = ctx->inputs[0];
     ShowCQTContext *s = ctx->priv;
+    float scale;
     int ret;
 
     common_uninit(s);
@@ -1380,9 +1380,10 @@ static int config_output(AVFilterLink *outlink)
     s->fft_len = 1 << s->fft_bits;
     av_log(ctx, AV_LOG_INFO, "fft_len = %d, cqt_len = %d.\n", s->fft_len, s->cqt_len);
 
-    s->fft_ctx = av_fft_init(s->fft_bits, 0);
+    ret = av_tx_init(&s->fft_ctx, &s->tx_fn, AV_TX_FLOAT_FFT, 0, s->fft_len, &scale, 0);
     s->fft_data = av_calloc(s->fft_len, sizeof(*s->fft_data));
-    s->fft_result = av_calloc(s->fft_len + 64, sizeof(*s->fft_result));
+    s->fft_input = av_calloc(FFALIGN(s->fft_len + 64, 256), sizeof(*s->fft_input));
+    s->fft_result = av_calloc(FFALIGN(s->fft_len + 64, 256), sizeof(*s->fft_result));
     s->cqt_result = av_malloc_array(s->cqt_len, sizeof(*s->cqt_result));
     if (!s->fft_ctx || !s->fft_data || !s->fft_result || !s->cqt_result)
         return AVERROR(ENOMEM);
diff --git a/libavfilter/avf_showcqt.h b/libavfilter/avf_showcqt.h
index 0cef5a2003..b6c1e0e108 100644
--- a/libavfilter/avf_showcqt.h
+++ b/libavfilter/avf_showcqt.h
@@ -21,12 +21,12 @@
 #ifndef AVFILTER_SHOWCQT_H
 #define AVFILTER_SHOWCQT_H
 
-#include "libavcodec/avfft.h"
+#include "libavutil/tx.h"
 #include "avfilter.h"
 #include "internal.h"
 
 typedef struct Coeffs {
-    FFTSample *val;
+    float *val;
     int start, len;
 } Coeffs;
 
@@ -58,11 +58,13 @@ typedef struct ShowCQTContext {
     int                 remaining_fill_max;
     int64_t             next_pts;
     double              *freq;
-    FFTContext          *fft_ctx;
+    AVTXContext         *fft_ctx;
+    av_tx_fn            tx_fn;
     Coeffs              *coeffs;
-    FFTComplex          *fft_data;
-    FFTComplex          *fft_result;
-    FFTComplex          *cqt_result;
+    AVComplexFloat      *fft_data;
+    AVComplexFloat      *fft_input;
+    AVComplexFloat      *fft_result;
+    AVComplexFloat      *cqt_result;
     float               *attack_data;
     int                 fft_bits;
     int                 fft_len;
@@ -76,7 +78,7 @@ typedef struct ShowCQTContext {
     float               cmatrix[3][3];
     float               cscheme_v[6];
     /* callback */
-    void                (*cqt_calc)(FFTComplex *dst, const FFTComplex *src, const Coeffs *coeffs,
+    void                (*cqt_calc)(AVComplexFloat *dst, const AVComplexFloat *src, const Coeffs *coeffs,
                                     int len, int fft_len);
     void                (*permute_coeffs)(float *v, int len);
     void                (*draw_bar)(AVFrame *out, const float *h, const float *rcp_h,
diff --git a/libavfilter/x86/avf_showcqt_init.c b/libavfilter/x86/avf_showcqt_init.c
index 0cc164c352..2320b30239 100644
--- a/libavfilter/x86/avf_showcqt_init.c
+++ b/libavfilter/x86/avf_showcqt_init.c
@@ -24,7 +24,7 @@
 #include "libavfilter/avf_showcqt.h"
 
 #define DECLARE_CQT_CALC(type) \
-void ff_showcqt_cqt_calc_##type(FFTComplex *dst, const FFTComplex *src, \
+void ff_showcqt_cqt_calc_##type(AVComplexFloat *dst, const AVComplexFloat *src, \
                                 const Coeffs *coeffs, int len, int fft_len)
 
 DECLARE_CQT_CALC(sse);



More information about the ffmpeg-cvslog mailing list