mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/vf_convolve: split input/output operations from fft
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
86e3eebfb7
commit
f9f1b2a927
@ -153,6 +153,17 @@ static int config_input_impulse(AVFilterLink *inlink)
|
||||
}
|
||||
|
||||
static void fft_horizontal(ConvolveContext *s, FFTComplex *fft_hdata,
|
||||
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;
|
||||
@ -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,7 +269,18 @@ 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)
|
||||
{
|
||||
FFTComplex *input = s->fft_hdata[plane];
|
||||
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];
|
||||
@ -273,11 +290,6 @@ static void ifft_horizontal(ConvolveContext *s, AVFrame *out,
|
||||
const int hw = w / 2;
|
||||
int y, x;
|
||||
|
||||
for (y = 0; y < n; y++) {
|
||||
av_fft_permute(s->ifft[plane], input + y * n);
|
||||
av_fft_calc(s->ifft[plane], input + y * n);
|
||||
}
|
||||
|
||||
if (s->depth == 8) {
|
||||
for (y = 0; y < hh; y++) {
|
||||
uint8_t *dst = out->data[plane] + (y + hh) * out->linesize[plane] + hw;
|
||||
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user