[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