| @@ -19,7 +19,7 @@ · 18 unmodified lines |
| 19 | 19 | */ |
| 20 | 20 | |
| 21 | 21 | #include "config.h" |
| 22 | | −#include "libavcodec/avfft.h" |
| 22 | +#include "libavutil/tx.h" |
| 23 | 23 | #include "libavutil/channel_layout.h" |
| 24 | 24 | #include "libavutil/opt.h" |
| 25 | 25 | #include "libavutil/xga_font_data.h" |
| @@ -144,13 +144,13 @@ static void common_uninit(ShowCQTContext *s) · 118 unmodified lines |
| 144 | 144 | |
| 145 | 145 | av_frame_free(&s->axis_frame); |
| 146 | 146 | av_frame_free(&s->sono_frame); |
| 147 | | − av_fft_end(s->fft_ctx); |
| 148 | | − s->fft_ctx = NULL; |
| 147 | + av_tx_uninit(&s->fft_ctx); |
| 149 | 148 | if (s->coeffs) |
| 150 | 149 | for (k = 0; k < s->cqt_len; k++) |
| 151 | 150 | av_freep(&s->coeffs[k].val); |
| 152 | 151 | av_freep(&s->coeffs); |
| 153 | 152 | av_freep(&s->fft_data); |
| 153 | + av_freep(&s->fft_input); |
| 154 | 154 | av_freep(&s->fft_result); |
| 155 | 155 | av_freep(&s->cqt_result); |
| 156 | 156 | av_freep(&s->attack_data); |
| @@ -267,15 +267,15 @@ error: · 110 unmodified lines |
| 267 | 267 | return ret; |
| 268 | 268 | } |
| 269 | 269 | |
| 270 | | −static void cqt_calc(FFTComplex *dst, const FFTComplex *src, const Coeffs *coeffs, |
| 270 | +static void cqt_calc(AVComplexFloat *dst, const AVComplexFloat *src, const Coeffs *coeffs, |
| 271 | 271 | int len, int fft_len) |
| 272 | 272 | { |
| 273 | 273 | int k, x, i, j; |
| 274 | 274 | for (k = 0; k < len; k++) { |
| 275 | | − FFTComplex l, r, a = {0,0}, b = {0,0}; |
| 275 | + AVComplexFloat l, r, a = {0,0}, b = {0,0}; |
| 276 | 276 | |
| 277 | 277 | for (x = 0; x < coeffs[k].len; x++) { |
| 278 | | − FFTSample u = coeffs[k].val[x]; |
| 278 | + float u = coeffs[k].val[x]; |
| 279 | 279 | i = coeffs[k].start + x; |
| 280 | 280 | j = fft_len - i; |
| 281 | 281 | a.re += u * src[i].re; |
| @@ -730,7 +730,7 @@ static float calculate_gamma(float v, float g) · 448 unmodified lines |
| 730 | 730 | return expf(logf(v) / g); |
| 731 | 731 | } |
| 732 | 732 | |
| 733 | | −static void rgb_from_cqt(ColorFloat *c, const FFTComplex *v, float g, int len, float cscheme[6]) |
| 733 | +static void rgb_from_cqt(ColorFloat *c, const AVComplexFloat *v, float g, int len, float cscheme[6]) |
| 734 | 734 | { |
| 735 | 735 | int x; |
| 736 | 736 | 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 · 3 unmodified lines |
| 740 | 740 | } |
| 741 | 741 | } |
| 742 | 742 | |
| 743 | | −static void yuv_from_cqt(ColorFloat *c, const FFTComplex *v, float gamma, int len, float cm[3][3], float cscheme[6]) |
| 743 | +static void yuv_from_cqt(ColorFloat *c, const AVComplexFloat *v, float gamma, int len, float cm[3][3], float cscheme[6]) |
| 744 | 744 | { |
| 745 | 745 | int x; |
| 746 | 746 | for (x = 0; x < len; x++) { |
| @@ -1110,7 +1110,7 @@ static void process_cqt(ShowCQTContext *s) · 363 unmodified lines |
| 1110 | 1110 | if (s->fcount > 1) { |
| 1111 | 1111 | float rcp_fcount = 1.0f / s->fcount; |
| 1112 | 1112 | for (x = 0; x < s->width; x++) { |
| 1113 | | − FFTComplex result = {0.0f, 0.0f}; |
| 1113 | + AVComplexFloat result = {0.0f, 0.0f}; |
| 1114 | 1114 | for (i = 0; i < s->fcount; i++) { |
| 1115 | 1115 | result.re += s->cqt_result[s->fcount * x + i].re; |
| 1116 | 1116 | result.im += s->cqt_result[s->fcount * x + i].im; |
| @@ -1139,17 +1139,16 @@ static int plot_cqt(AVFilterContext *ctx, AVFrame **frameout) · 22 unmodified lines |
| 1139 | 1139 | |
| 1140 | 1140 | last_time = av_gettime_relative(); |
| 1141 | 1141 | |
| 1142 | | − memcpy(s->fft_result, s->fft_data, s->fft_len * sizeof(*s->fft_data)); |
| 1142 | + memcpy(s->fft_input, s->fft_data, s->fft_len * sizeof(*s->fft_data)); |
| 1143 | 1143 | if (s->attack_data) { |
| 1144 | 1144 | int k; |
| 1145 | 1145 | for (k = 0; k < s->remaining_fill_max; k++) { |
| 1146 | | − s->fft_result[s->fft_len/2+k].re *= s->attack_data[k]; |
| 1147 | | − s->fft_result[s->fft_len/2+k].im *= s->attack_data[k]; |
| 1146 | + s->fft_input[s->fft_len/2+k].re *= s->attack_data[k]; |
| 1147 | + s->fft_input[s->fft_len/2+k].im *= s->attack_data[k]; |
| 1148 | 1148 | } |
| 1149 | 1149 | } |
| 1150 | 1150 | |
| 1151 | | − av_fft_permute(s->fft_ctx, s->fft_result); |
| 1152 | | − av_fft_calc(s->fft_ctx, s->fft_result); |
| 1151 | + s->tx_fn(s->fft_ctx, s->fft_result, s->fft_input, sizeof(float)); |
| 1153 | 1152 | s->fft_result[s->fft_len] = s->fft_result[0]; |
| 1154 | 1153 | UPDATE_TIME(s->fft_time); |
| 1155 | 1154 | |
| @@ -1355,6 +1354,7 @@ static int config_output(AVFilterLink *outlink) · 199 unmodified lines |
| 1355 | 1354 | AVFilterContext *ctx = outlink->src; |
| 1356 | 1355 | AVFilterLink *inlink = ctx->inputs[0]; |
| 1357 | 1356 | ShowCQTContext *s = ctx->priv; |
| 1357 | + float scale; |
| 1358 | 1358 | int ret; |
| 1359 | 1359 | |
| 1360 | 1360 | common_uninit(s); |
| @@ -1380,9 +1380,10 @@ static int config_output(AVFilterLink *outlink) · 19 unmodified lines |
| 1380 | 1380 | s->fft_len = 1 << s->fft_bits; |
| 1381 | 1381 | av_log(ctx, AV_LOG_INFO, "fft_len = %d, cqt_len = %d.\n", s->fft_len, s->cqt_len); |
| 1382 | 1382 | |
| 1383 | | − s->fft_ctx = av_fft_init(s->fft_bits, 0); |
| 1383 | + ret = av_tx_init(&s->fft_ctx, &s->tx_fn, AV_TX_FLOAT_FFT, 0, s->fft_len, &scale, 0); |
| 1384 | 1384 | s->fft_data = av_calloc(s->fft_len, sizeof(*s->fft_data)); |
| 1385 | | − s->fft_result = av_calloc(s->fft_len + 64, sizeof(*s->fft_result)); |
| 1385 | + s->fft_input = av_calloc(FFALIGN(s->fft_len + 64, 256), sizeof(*s->fft_input)); |
| 1386 | + s->fft_result = av_calloc(FFALIGN(s->fft_len + 64, 256), sizeof(*s->fft_result)); |
| 1386 | 1387 | s->cqt_result = av_malloc_array(s->cqt_len, sizeof(*s->cqt_result)); |
| 1387 | 1388 | if (!s->fft_ctx || !s->fft_data || !s->fft_result || !s->cqt_result) |
| 1388 | 1389 | return AVERROR(ENOMEM); |