[FFmpeg-cvslog] avfilter/vf_fftfilt: cache rdft contexts

Paul B Mahol git at videolan.org
Mon Sep 4 19:39:11 EEST 2017


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Sep  4 18:24:00 2017 +0200| [2726b2d7e8dcbd6e66ebb48224b3d85773c8064a] | committer: Paul B Mahol

avfilter/vf_fftfilt: cache rdft contexts

Signed-off-by: Paul B Mahol <onemda at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2726b2d7e8dcbd6e66ebb48224b3d85773c8064a
---

 libavfilter/vf_fftfilt.c | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/libavfilter/vf_fftfilt.c b/libavfilter/vf_fftfilt.c
index 8a47ed5be4..38dd50d6ae 100644
--- a/libavfilter/vf_fftfilt.c
+++ b/libavfilter/vf_fftfilt.c
@@ -36,7 +36,10 @@
 typedef struct FFTFILTContext {
     const AVClass *class;
 
-    RDFTContext *rdft;
+    RDFTContext *hrdft[MAX_PLANES];
+    RDFTContext *vrdft[MAX_PLANES];
+    RDFTContext *ihrdft[MAX_PLANES];
+    RDFTContext *ivrdft[MAX_PLANES];
     int rdft_hbits[MAX_PLANES];
     int rdft_vbits[MAX_PLANES];
     size_t rdft_hlen[MAX_PLANES];
@@ -96,7 +99,6 @@ static void copy_rev (FFTSample *dest, int w, int w2)
 static void rdft_horizontal(FFTFILTContext *s, AVFrame *in, int w, int h, int plane)
 {
     int i, j;
-    s->rdft = av_rdft_init(s->rdft_hbits[plane], DFT_R2C);
 
     for (i = 0; i < h; i++) {
         for (j = 0; j < w; j++)
@@ -106,16 +108,13 @@ static void rdft_horizontal(FFTFILTContext *s, AVFrame *in, int w, int h, int pl
     }
 
     for (i = 0; i < h; i++)
-        av_rdft_calc(s->rdft, s->rdft_hdata[plane] + i * s->rdft_hlen[plane]);
-
-    av_rdft_end(s->rdft);
+        av_rdft_calc(s->hrdft[plane], s->rdft_hdata[plane] + i * s->rdft_hlen[plane]);
 }
 
 /*Vertical pass - RDFT*/
 static void rdft_vertical(FFTFILTContext *s, int h, int plane)
 {
     int i, j;
-    s->rdft = av_rdft_init(s->rdft_vbits[plane], DFT_R2C);
 
     for (i = 0; i < s->rdft_hlen[plane]; i++) {
         for (j = 0; j < h; j++)
@@ -125,33 +124,29 @@ static void rdft_vertical(FFTFILTContext *s, int h, int plane)
     }
 
     for (i = 0; i < s->rdft_hlen[plane]; i++)
-        av_rdft_calc(s->rdft, s->rdft_vdata[plane] + i * s->rdft_vlen[plane]);
-
-    av_rdft_end(s->rdft);
+        av_rdft_calc(s->vrdft[plane], s->rdft_vdata[plane] + i * s->rdft_vlen[plane]);
 }
 /*Vertical pass - IRDFT*/
 static void irdft_vertical(FFTFILTContext *s, int h, int plane)
 {
     int i, j;
-    s->rdft = av_rdft_init(s->rdft_vbits[plane], IDFT_C2R);
+
     for (i = 0; i < s->rdft_hlen[plane]; i++)
-        av_rdft_calc(s->rdft, s->rdft_vdata[plane] + i * s->rdft_vlen[plane]);
+        av_rdft_calc(s->ivrdft[plane], s->rdft_vdata[plane] + i * s->rdft_vlen[plane]);
 
     for (i = 0; i < s->rdft_hlen[plane]; i++)
         for (j = 0; j < h; j++)
             s->rdft_hdata[plane][j * s->rdft_hlen[plane] + i] =
             s->rdft_vdata[plane][i * s->rdft_vlen[plane] + j];
-
-    av_rdft_end(s->rdft);
 }
 
 /*Horizontal pass - IRDFT*/
 static void irdft_horizontal(FFTFILTContext *s, AVFrame *out, int w, int h, int plane)
 {
     int i, j;
-    s->rdft = av_rdft_init(s->rdft_hbits[plane], IDFT_C2R);
+
     for (i = 0; i < h; i++)
-        av_rdft_calc(s->rdft, s->rdft_hdata[plane] + i * s->rdft_hlen[plane]);
+        av_rdft_calc(s->ihrdft[plane], s->rdft_hdata[plane] + i * s->rdft_hlen[plane]);
 
     for (i = 0; i < h; i++)
         for (j = 0; j < w; j++)
@@ -159,8 +154,6 @@ static void irdft_horizontal(FFTFILTContext *s, AVFrame *out, int w, int h, int
                                                                          *s->rdft_hlen[plane] + j] * 4 /
                                                                          (s->rdft_hlen[plane] *
                                                                           s->rdft_vlen[plane]), 0, 255);
-
-    av_rdft_end(s->rdft);
 }
 
 static av_cold int initialize(AVFilterContext *ctx)
@@ -216,12 +209,22 @@ static int config_props(AVFilterLink *inlink)
         if (!(s->rdft_hdata[i] = av_malloc_array(h, s->rdft_hlen[i] * sizeof(FFTSample))))
             return AVERROR(ENOMEM);
 
+        if (!(s->hrdft[i] = av_rdft_init(s->rdft_hbits[i], DFT_R2C)))
+            return AVERROR(ENOMEM);
+        if (!(s->ihrdft[i] = av_rdft_init(s->rdft_hbits[i], IDFT_C2R)))
+            return AVERROR(ENOMEM);
+
         /* RDFT - Array initialization for Vertical pass*/
         for (rdft_vbits = 1; 1 << rdft_vbits < h*10/9; rdft_vbits++);
         s->rdft_vbits[i] = rdft_vbits;
         s->rdft_vlen[i] = 1 << rdft_vbits;
         if (!(s->rdft_vdata[i] = av_malloc_array(s->rdft_hlen[i], s->rdft_vlen[i] * sizeof(FFTSample))))
             return AVERROR(ENOMEM);
+
+        if (!(s->vrdft[i] = av_rdft_init(s->rdft_vbits[i], DFT_R2C)))
+            return AVERROR(ENOMEM);
+        if (!(s->ivrdft[i] = av_rdft_init(s->rdft_vbits[i], IDFT_C2R)))
+            return AVERROR(ENOMEM);
     }
 
     /*Luminance value - Array initialization*/
@@ -300,6 +303,10 @@ static av_cold void uninit(AVFilterContext *ctx)
         av_free(s->rdft_vdata[i]);
         av_expr_free(s->weight_expr[i]);
         av_free(s->weight[i]);
+        av_rdft_end(s->hrdft[i]);
+        av_rdft_end(s->ihrdft[i]);
+        av_rdft_end(s->vrdft[i]);
+        av_rdft_end(s->ivrdft[i]);
     }
 }
 



More information about the ffmpeg-cvslog mailing list