aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2017-12-25 11:05:26 +0100
committerPaul B Mahol <onemda@gmail.com>2017-12-25 11:05:26 +0100
commitf9f1b2a9274f1c58e1695fcf584646e2c6e9f756 (patch)
tree40ffb66786c169bafe4c455237a6e7deaf1d6492
parent86e3eebfb763855e9be873cc71b8569f6dd2b52f (diff)
downloadffmpeg-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.c47
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);