diff options
author | Paul B Mahol <onemda@gmail.com> | 2017-12-25 11:05:26 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-12-25 11:05:26 +0100 |
commit | f9f1b2a9274f1c58e1695fcf584646e2c6e9f756 (patch) | |
tree | 40ffb66786c169bafe4c455237a6e7deaf1d6492 | |
parent | 86e3eebfb763855e9be873cc71b8569f6dd2b52f (diff) | |
download | ffmpeg-f9f1b2a9274f1c58e1695fcf584646e2c6e9f756.tar.gz |
avfilter/vf_convolve: split input/output operations from fft
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavfilter/vf_convolve.c | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/libavfilter/vf_convolve.c b/libavfilter/vf_convolve.c index b1577ef5ae..e3d0c5fa2a 100644 --- a/libavfilter/vf_convolve.c +++ b/libavfilter/vf_convolve.c @@ -153,7 +153,18 @@ static int config_input_impulse(AVFilterLink *inlink) } static void fft_horizontal(ConvolveContext *s, FFTComplex *fft_hdata, - AVFrame *in, int w, int h, int n, int plane, float scale) + int n, int plane) +{ + int y; + + for (y = 0; y < n; y++) { + av_fft_permute(s->fft[plane], fft_hdata + y * n); + av_fft_calc(s->fft[plane], fft_hdata + y * n); + } +} + +static void get_input(ConvolveContext *s, FFTComplex *fft_hdata, + AVFrame *in, int w, int h, int n, int plane, float scale) { const int iw = (n - w) / 2, ih = (n - h) / 2; int y, x; @@ -225,11 +236,6 @@ static void fft_horizontal(ConvolveContext *s, FFTComplex *fft_hdata, } } } - - for (y = 0; y < n; y++) { - av_fft_permute(s->fft[plane], fft_hdata + y * n); - av_fft_calc(s->fft[plane], fft_hdata + y * n); - } } static void fft_vertical(ConvolveContext *s, FFTComplex *fft_hdata, FFTComplex *fft_vdata, @@ -263,20 +269,26 @@ static void ifft_vertical(ConvolveContext *s, int n, int plane) } } -static void ifft_horizontal(ConvolveContext *s, AVFrame *out, - int w, int h, int n, int plane) +static void ifft_horizontal(ConvolveContext *s, int n, int plane) { FFTComplex *input = s->fft_hdata[plane]; - const float scale = 1.f / (n * n); - const int max = (1 << s->depth) - 1; - const int hh = h / 2; - const int hw = w / 2; - int y, x; + int y; for (y = 0; y < n; y++) { av_fft_permute(s->ifft[plane], input + y * n); av_fft_calc(s->ifft[plane], input + y * n); } +} + +static void get_output(ConvolveContext *s, AVFrame *out, + int w, int h, int n, int plane) +{ + FFTComplex *input = s->fft_hdata[plane]; + const float scale = 1.f / (n * n); + const int max = (1 << s->depth) - 1; + const int hh = h / 2; + const int hw = w / 2; + int y, x; if (s->depth == 8) { for (y = 0; y < hh; y++) { @@ -349,7 +361,8 @@ static int do_convolve(FFFrameSync *fs) continue; } - fft_horizontal(s, s->fft_hdata[plane], mainpic, w, h, n, plane, 1.f); + get_input(s, s->fft_hdata[plane], mainpic, w, h, n, plane, 1.f); + fft_horizontal(s, s->fft_hdata[plane], n, plane); fft_vertical(s, s->fft_hdata[plane], s->fft_vdata[plane], n, plane); @@ -371,7 +384,8 @@ static int do_convolve(FFFrameSync *fs) } total = FFMAX(1, total); - fft_horizontal(s, s->fft_hdata_impulse[plane], impulsepic, w, h, n, plane, 1 / total); + get_input(s, s->fft_hdata_impulse[plane], impulsepic, w, h, n, plane, 1 / total); + fft_horizontal(s, s->fft_hdata_impulse[plane], n, plane); fft_vertical(s, s->fft_hdata_impulse[plane], s->fft_vdata_impulse[plane], n, plane); @@ -395,7 +409,8 @@ static int do_convolve(FFFrameSync *fs) } ifft_vertical(s, n, plane); - ifft_horizontal(s, mainpic, w, h, n, plane); + ifft_horizontal(s, n, plane); + get_output(s, mainpic, w, h, n, plane); } return ff_filter_frame(outlink, mainpic); |