[FFmpeg-devel] [PATCH] add ff_init_ff_cos_tabs function, fix rdft with non-hardcoded tables

Reimar Döffinger Reimar.Doeffinger
Wed Nov 4 18:45:46 CET 2009


Hello,
this patch adds a ff_init_ff_cos_tabs to simplify initialization of the
ff_cos_* tables (referenced by ff_cos_tabs).
It also fixes rdft again which I broke when I removed the duplicated
initialization of the cosine tables.
Compared to just reverting to the old code it still has the advantage
that always the same code is used for initialization, thus avoiding
the possibility of slightly different values due to different rounding,
and in general avoiding code duplication.
Obviously we do not have a QDM2 regression test, which is part of the
reason why this bug stayed so long, I guess this depends on the 1-off
method for FATE?
-------------- next part --------------
Index: libavcodec/fft.c
===================================================================
--- libavcodec/fft.c	(revision 20449)
+++ libavcodec/fft.c	(working copy)
@@ -61,6 +61,20 @@
     else                  return split_radix_permutation(i, m, inverse)*4 - 1;
 }
 
+av_cold void ff_init_ff_cos_tabs(int index)
+{
+#if !CONFIG_HARDCODED_TABLES
+    int i;
+    int m = 1<<index;
+    double freq = 2*M_PI/m;
+    FFTSample *tab = ff_cos_tabs[index];
+    for(i=0; i<=m/4; i++)
+        tab[i] = cos(i*freq);
+    for(i=1; i<m/4; i++)
+        tab[m/2-i] = tab[i];
+#endif
+}
+
 av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse)
 {
     int i, j, m, n;
@@ -96,17 +110,9 @@
     if (HAVE_MMX)     ff_fft_init_mmx(s);
 
     if (s->split_radix) {
-#if !CONFIG_HARDCODED_TABLES
         for(j=4; j<=nbits; j++) {
-            int m = 1<<j;
-            double freq = 2*M_PI/m;
-            FFTSample *tab = ff_cos_tabs[j];
-            for(i=0; i<=m/4; i++)
-                tab[i] = cos(i*freq);
-            for(i=1; i<m/4; i++)
-                tab[m/2-i] = tab[i];
+            ff_init_ff_cos_tabs(j);
         }
-#endif
         for(i=0; i<n; i++)
             s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = i;
         s->tmp_buf = av_malloc(n * sizeof(FFTComplex));
Index: libavcodec/rdft.c
===================================================================
--- libavcodec/rdft.c	(revision 20449)
+++ libavcodec/rdft.c	(working copy)
@@ -64,6 +64,7 @@
     if (ff_fft_init(&s->fft, nbits-1, trans == IRDFT || trans == RIDFT) < 0)
         return -1;
 
+    ff_init_ff_cos_tabs(nbits);
     s->tcos = ff_cos_tabs[nbits];
     s->tsin = ff_sin_tabs[nbits]+(trans == RDFT || trans == IRIDFT)*(n>>2);
 #if !CONFIG_HARDCODED_TABLES
Index: libavcodec/dsputil.h
===================================================================
--- libavcodec/dsputil.h	(revision 20449)
+++ libavcodec/dsputil.h	(working copy)
@@ -769,6 +769,12 @@
 extern COSTABLE(65536);
 extern COSTABLE_CONST FFTSample* const ff_cos_tabs[17];
 
+/**
+ * Initializes the cosine table in ff_cos_tabs[index]
+ * \param index index in ff_cos_tabs array of the table to initialize
+ */
+void ff_init_ff_cos_tabs(int index);
+
 extern SINTABLE(16);
 extern SINTABLE(32);
 extern SINTABLE(64);



More information about the ffmpeg-devel mailing list