avfilter/vf_convolve: split input/output operations from fft
authorPaul B Mahol <onemda@gmail.com>
Mon, 25 Dec 2017 10:05:26 +0000 (11:05 +0100)
committerPaul B Mahol <onemda@gmail.com>
Mon, 25 Dec 2017 10:05:26 +0000 (11:05 +0100)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavfilter/vf_convolve.c

index b1577ef..e3d0c5f 100644 (file)
@@ -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);