diff options
author | Paul B Mahol <onemda@gmail.com> | 2023-07-30 13:16:46 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2023-07-30 18:14:15 +0200 |
commit | 4f8b0beeba22f4be0c070a7fda29edf350cae8e0 (patch) | |
tree | 7d81f8242c0d1aed5869d15fa8f97a13a406cc30 /libavfilter/avf_showcwt.c | |
parent | bf9f6a5e559c901453b484a606e27af54d7e93d5 (diff) | |
download | ffmpeg-4f8b0beeba22f4be0c070a7fda29edf350cae8e0.tar.gz |
avfilter/avf_showcwt: reduce excessive operations
Diffstat (limited to 'libavfilter/avf_showcwt.c')
-rw-r--r-- | libavfilter/avf_showcwt.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/libavfilter/avf_showcwt.c b/libavfilter/avf_showcwt.c index ba3ba1efc8..6ee5b0116d 100644 --- a/libavfilter/avf_showcwt.c +++ b/libavfilter/avf_showcwt.c @@ -655,8 +655,8 @@ static int compute_kernel(AVFilterContext *ctx) int *kernel_start = s->kernel_start; int *kernel_stop = s->kernel_stop; unsigned *index = s->index; - int kernel_min = INT_MAX; - int kernel_max = 0, ret = 0; + int range_min = INT_MAX; + int range_max = 0, ret = 0; float *tkernel; tkernel = av_malloc_array(size, sizeof(*tkernel)); @@ -670,58 +670,60 @@ static int compute_kernel(AVFilterContext *ctx) const float deviation = 1.f / (s->frequency_band[y*2+1] * output_sample_count * correction); const int range = 8.f*M_PI*sqrtf(1.f/deviation); + const int a = floorf(frequency-range); + const int b = ceilf(frequency+range); memset(tkernel, 0, size * sizeof(*tkernel)); - for (int n = -range; n < size-range; n++) { + for (int n = a; n < b; n++) { float ff, f = n+0.5f-frequency; ff = expf(-f*f*deviation); tkernel[n+range] = ff; } - for (int n = 0; n < size; n++) { - if (tkernel[n] != 0.f) { - if (tkernel[n] > FLT_MIN) + for (int n = a; n < b; n++) { + if (tkernel[n+range] != 0.f) { + if (tkernel[n+range] > FLT_MIN) av_log(ctx, AV_LOG_DEBUG, "out of range kernel\n"); start = n; - kernel_min = FFMIN(start, kernel_min); break; } } - for (int n = 0; n < size; n++) { - if (tkernel[size - n - 1] != 0.f) { - if (tkernel[size - n - 1] > FLT_MIN) + for (int n = b; n >= a; n--) { + if (tkernel[n+range] != 0.f) { + if (tkernel[n+range] > FLT_MIN) av_log(ctx, AV_LOG_DEBUG, "out of range kernel\n"); - stop = size - n - 1; - kernel_max = FFMAX(stop, kernel_max); + stop = n; break; } } - kernel_start[y] = start - range; - kernel_stop[y] = stop - range; + kernel_start[y] = start; + kernel_stop[y] = stop; - kernel = av_calloc(FFALIGN(stop - start + 1, 16), sizeof(*kernel)); + kernel = av_calloc(FFALIGN(stop - start + 1+range, 16), sizeof(*kernel)); if (!kernel) { ret = AVERROR(ENOMEM); break; } - for (int n = start; n <= stop; n++) { - kernel[n - start].re = tkernel[n]; - kernel[n - start].im = tkernel[n]; + for (int n = 0; n <= stop - start; n++) { + kernel[n].re = tkernel[n+range+start]; + kernel[n].im = tkernel[n+range+start]; } + range_min = FFMIN(range_min, stop+1-start); + range_max = FFMAX(range_max, stop+1-start); + s->kernel[y] = kernel; } for (int n = 0; n < size; n++) index[n] = n % s->output_padding_size; - av_log(ctx, AV_LOG_DEBUG, "kernel_min: %d\n", kernel_min); - av_log(ctx, AV_LOG_DEBUG, "kernel_max: %d\n", kernel_max); - av_log(ctx, AV_LOG_DEBUG, "kernel_range: %d\n", kernel_max - kernel_min); + av_log(ctx, AV_LOG_DEBUG, "range_min: %d\n", range_min); + av_log(ctx, AV_LOG_DEBUG, "range_max: %d\n", range_max); av_freep(&tkernel); |