Commit f9f1b2a9 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/vf_convolve: split input/output operations from fft

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 86e3eebf
...@@ -153,7 +153,18 @@ static int config_input_impulse(AVFilterLink *inlink) ...@@ -153,7 +153,18 @@ static int config_input_impulse(AVFilterLink *inlink)
} }
static void fft_horizontal(ConvolveContext *s, FFTComplex *fft_hdata, 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; const int iw = (n - w) / 2, ih = (n - h) / 2;
int y, x; int y, x;
...@@ -225,11 +236,6 @@ static void fft_horizontal(ConvolveContext *s, FFTComplex *fft_hdata, ...@@ -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, 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) ...@@ -263,20 +269,26 @@ static void ifft_vertical(ConvolveContext *s, int n, int plane)
} }
} }
static void ifft_horizontal(ConvolveContext *s, AVFrame *out, static void ifft_horizontal(ConvolveContext *s, int n, int plane)
int w, int h, int n, int plane)
{ {
FFTComplex *input = s->fft_hdata[plane]; FFTComplex *input = s->fft_hdata[plane];
const float scale = 1.f / (n * n); int y;
const int max = (1 << s->depth) - 1;
const int hh = h / 2;
const int hw = w / 2;
int y, x;
for (y = 0; y < n; y++) { for (y = 0; y < n; y++) {
av_fft_permute(s->ifft[plane], input + y * n); av_fft_permute(s->ifft[plane], input + y * n);
av_fft_calc(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) { if (s->depth == 8) {
for (y = 0; y < hh; y++) { for (y = 0; y < hh; y++) {
...@@ -349,7 +361,8 @@ static int do_convolve(FFFrameSync *fs) ...@@ -349,7 +361,8 @@ static int do_convolve(FFFrameSync *fs)
continue; 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], fft_vertical(s, s->fft_hdata[plane], s->fft_vdata[plane],
n, plane); n, plane);
...@@ -371,7 +384,8 @@ static int do_convolve(FFFrameSync *fs) ...@@ -371,7 +384,8 @@ static int do_convolve(FFFrameSync *fs)
} }
total = FFMAX(1, total); 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], fft_vertical(s, s->fft_hdata_impulse[plane], s->fft_vdata_impulse[plane],
n, plane); n, plane);
...@@ -395,7 +409,8 @@ static int do_convolve(FFFrameSync *fs) ...@@ -395,7 +409,8 @@ static int do_convolve(FFFrameSync *fs)
} }
ifft_vertical(s, n, plane); 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); return ff_filter_frame(outlink, mainpic);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment