| @@ -19,7 +19,7 @@ · 18 unmodified lines |
| 19 | */ | 19 | */ |
| 20 | | 20 | |
| 21 | #include "config.h" | 21 | #include "config.h" |
| 22 | #include "libavcodec/avfft.h" | 22 | #include "libavutil/tx.h" |
| 23 | #include "libavutil/channel_layout.h" | 23 | #include "libavutil/channel_layout.h" |
| 24 | #include "libavutil/opt.h" | 24 | #include "libavutil/opt.h" |
| 25 | #include "libavutil/xga_font_data.h" | 25 | #include "libavutil/xga_font_data.h" |
| @@ -144,13 +144,13 @@ static void common_uninit(ShowCQTContext *s) · 118 unmodified lines |
| 144 | | 144 | |
| 145 | av_frame_free(&s->axis_frame); | 145 | av_frame_free(&s->axis_frame); |
| 146 | av_frame_free(&s->sono_frame); | 146 | av_frame_free(&s->sono_frame); |
| 147 | av_fft_end(s->fft_ctx); | 147 | av_tx_uninit(&s->fft_ctx); |
| 148 | s->fft_ctx = NULL; | | |
| 149 | if (s->coeffs) | 148 | if (s->coeffs) |
| 150 | for (k = 0; k < s->cqt_len; k++) | 149 | for (k = 0; k < s->cqt_len; k++) |
| 151 | av_freep(&s->coeffs[k].val); | 150 | av_freep(&s->coeffs[k].val); |
| 152 | av_freep(&s->coeffs); | 151 | av_freep(&s->coeffs); |
| 153 | av_freep(&s->fft_data); | 152 | av_freep(&s->fft_data); |
| | 153 | av_freep(&s->fft_input); |
| 154 | av_freep(&s->fft_result); | 154 | av_freep(&s->fft_result); |
| 155 | av_freep(&s->cqt_result); | 155 | av_freep(&s->cqt_result); |
| 156 | av_freep(&s->attack_data); | 156 | av_freep(&s->attack_data); |
| @@ -267,15 +267,15 @@ error: · 110 unmodified lines |
| 267 | return ret; | 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 | int len, int fft_len) | 271 | int len, int fft_len) |
| 272 | { | 272 | { |
| 273 | int k, x, i, j; | 273 | int k, x, i, j; |
| 274 | for (k = 0; k < len; k++) { | 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 | for (x = 0; x < coeffs[k].len; x++) { | 277 | for (x = 0; x < coeffs[k].len; x++) { |
| 278 | FFTSample u = coeffs[k].val[x]; | 278 | float u = coeffs[k].val[x]; |
| 279 | i = coeffs[k].start + x; | 279 | i = coeffs[k].start + x; |
| 280 | j = fft_len - i; | 280 | j = fft_len - i; |
| 281 | a.re += u * src[i].re; | 281 | a.re += u * src[i].re; |
| @@ -730,7 +730,7 @@ static float calculate_gamma(float v, float g) · 448 unmodified lines |
| 730 | return expf(logf(v) / g); | 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 | int x; | 735 | int x; |
| 736 | for (x = 0; x < len; x++) { | 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 | int x; | 745 | int x; |
| 746 | for (x = 0; x < len; x++) { | 746 | for (x = 0; x < len; x++) { |
| @@ -1110,7 +1110,7 @@ static void process_cqt(ShowCQTContext *s) · 363 unmodified lines |
| 1110 | if (s->fcount > 1) { | 1110 | if (s->fcount > 1) { |
| 1111 | float rcp_fcount = 1.0f / s->fcount; | 1111 | float rcp_fcount = 1.0f / s->fcount; |
| 1112 | for (x = 0; x < s->width; x++) { | 1112 | for (x = 0; x < s->width; x++) { |
| 1113 | FFTComplex result = {0.0f, 0.0f}; | 1113 | AVComplexFloat result = {0.0f, 0.0f}; |
| 1114 | for (i = 0; i < s->fcount; i++) { | 1114 | for (i = 0; i < s->fcount; i++) { |
| 1115 | result.re += s->cqt_result[s->fcount * x + i].re; | 1115 | result.re += s->cqt_result[s->fcount * x + i].re; |
| 1116 | result.im += s->cqt_result[s->fcount * x + i].im; | 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 | last_time = av_gettime_relative(); | 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 | if (s->attack_data) { | 1143 | if (s->attack_data) { |
| 1144 | int k; | 1144 | int k; |
| 1145 | for (k = 0; k < s->remaining_fill_max; k++) { | 1145 | for (k = 0; k < s->remaining_fill_max; k++) { |
| 1146 | s->fft_result[s->fft_len/2+k].re *= s->attack_data[k]; | 1146 | s->fft_input[s->fft_len/2+k].re *= s->attack_data[k]; |
| 1147 | s->fft_result[s->fft_len/2+k].im *= 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); | 1151 | s->tx_fn(s->fft_ctx, s->fft_result, s->fft_input, sizeof(float)); |
| 1152 | av_fft_calc(s->fft_ctx, s->fft_result); | | |
| 1153 | s->fft_result[s->fft_len] = s->fft_result[0]; | 1152 | s->fft_result[s->fft_len] = s->fft_result[0]; |
| 1154 | UPDATE_TIME(s->fft_time); | 1153 | UPDATE_TIME(s->fft_time); |
| 1155 | | 1154 | |
| @@ -1355,6 +1354,7 @@ static int config_output(AVFilterLink *outlink) · 199 unmodified lines |
| 1355 | AVFilterContext *ctx = outlink->src; | 1354 | AVFilterContext *ctx = outlink->src; |
| 1356 | AVFilterLink *inlink = ctx->inputs[0]; | 1355 | AVFilterLink *inlink = ctx->inputs[0]; |
| 1357 | ShowCQTContext *s = ctx->priv; | 1356 | ShowCQTContext *s = ctx->priv; |
| | 1357 | float scale; |
| 1358 | int ret; | 1358 | int ret; |
| 1359 | | 1359 | |
| 1360 | common_uninit(s); | 1360 | common_uninit(s); |
| @@ -1380,9 +1380,10 @@ static int config_output(AVFilterLink *outlink) · 19 unmodified lines |
| 1380 | s->fft_len = 1 << s->fft_bits; | 1380 | s->fft_len = 1 << s->fft_bits; |
| 1381 | av_log(ctx, AV_LOG_INFO, "fft_len = %d, cqt_len = %d.\n", s->fft_len, s->cqt_len); | 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 | s->fft_data = av_calloc(s->fft_len, sizeof(*s->fft_data)); | 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 | s->cqt_result = av_malloc_array(s->cqt_len, sizeof(*s->cqt_result)); | 1387 | s->cqt_result = av_malloc_array(s->cqt_len, sizeof(*s->cqt_result)); |
| 1387 | if (!s->fft_ctx || !s->fft_data || !s->fft_result || !s->cqt_result) | 1388 | if (!s->fft_ctx || !s->fft_data || !s->fft_result || !s->cqt_result) |
| 1388 | return AVERROR(ENOMEM); | 1389 | return AVERROR(ENOMEM); |