Add support for hardcoded ff_sin_* tables.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Thu, 15 Oct 2009 18:04:55 +0000 (18:04 +0000)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Thu, 15 Oct 2009 18:04:55 +0000 (18:04 +0000)
Originally committed as revision 20244 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/Makefile
libavcodec/costablegen.c
libavcodec/dsputil.h
libavcodec/rdft.c

index 390d11e..b00da20 100644 (file)
@@ -31,7 +31,8 @@ FFT-OBJS-$(CONFIG_HARDCODED_TABLES)    += cos_tables.o
 OBJS-$(CONFIG_FFT)                     += fft.o $(FFT-OBJS-yes)
 OBJS-$(CONFIG_GOLOMB)                  += golomb.o
 OBJS-$(CONFIG_MDCT)                    += mdct.o
-OBJS-$(CONFIG_RDFT)                    += rdft.o
+RDFT-OBJS-$(CONFIG_HARDCODED_TABLES)   += sin_tables.o
+OBJS-$(CONFIG_RDFT)                    += rdft.o $(RDFT-OBJS-yes)
 OBJS-$(CONFIG_VAAPI)                   += vaapi.o
 OBJS-$(CONFIG_VDPAU)                   += vdpau.o
 
@@ -583,3 +584,6 @@ $(SUBDIR)costablegen$(HOSTEXESUF): $(SUBDIR)costablegen.c
 
 $(SUBDIR)cos_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
        ./$< > $@
+
+$(SUBDIR)sin_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
+       ./$< sin > $@
index bb02666..8a33fd4 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #include <stdio.h>
+#include <string.h>
 #include <math.h>
 
 #ifndef M_PI
 #define BITS 16
 #define FLOATFMT "%.18e"
 
-int main(void)
+int main(int argc, char *argv[])
 {
     int i, j;
+    int do_sin = argc == 2 && !strcmp(argv[1], "sin");
+    double (*func)(double) = do_sin ? sin : cos;
+
     printf("/* This file was generated by libavcodec/costablegen */\n");
     printf("#include \"dsputil.h\"\n");
     for (i = 4; i <= BITS; i++) {
         int m = 1 << i;
         double freq = 2*M_PI/m;
-        printf("COSTABLE(%i) = {\n   ", m);
+        printf("%s(%i) = {\n   ", do_sin ? "SINTABLE" : "COSTABLE", m);
         for (j = 0; j < m/2 - 1; j++) {
             int idx = j > m/4 ? m/2 - j : j;
-            printf(" "FLOATFMT",", cos(idx*freq));
+            if (do_sin && j >= m/4)
+                idx = m/4 - j;
+            printf(" "FLOATFMT",", func(idx*freq));
             if ((j & 3) == 3)
                 printf("\n   ");
         }
-        printf(" "FLOATFMT"\n};\n", cos(freq));
+        printf(" "FLOATFMT"\n};\n", func(do_sin ? -(m/4 - 1)*freq : freq));
     }
     return 0;
 }
index cfa9bcf..b94c2f9 100644 (file)
@@ -744,14 +744,16 @@ typedef struct FFTContext {
 
 #if CONFIG_HARDCODED_TABLES
 #define COSTABLE_CONST const
+#define SINTABLE_CONST const
 #else
 #define COSTABLE_CONST
+#define SINTABLE_CONST
 #endif
 
 #define COSTABLE(size) \
     COSTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_cos_##size[size/2])
 #define SINTABLE(size) \
-    DECLARE_ALIGNED_16(FFTSample, ff_sin_##size[size/2])
+    SINTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_sin_##size[size/2])
 extern COSTABLE(16);
 extern COSTABLE(32);
 extern COSTABLE(64);
@@ -874,7 +876,7 @@ typedef struct {
 
     /* pre/post rotation tables */
     const FFTSample *tcos;
-    FFTSample *tsin;
+    SINTABLE_CONST FFTSample *tsin;
     FFTContext fft;
 } RDFTContext;
 
index 5d3a07c..01aef87 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 /* sin(2*pi*x/n) for 0<=x<n/4, followed by n/2<=x<3n/4 */
+#if !CONFIG_HARDCODED_TABLES
 SINTABLE(16);
 SINTABLE(32);
 SINTABLE(64);
@@ -40,7 +41,8 @@ SINTABLE(8192);
 SINTABLE(16384);
 SINTABLE(32768);
 SINTABLE(65536);
-FFTSample * const ff_sin_tabs[] = {
+#endif
+SINTABLE_CONST FFTSample * const ff_sin_tabs[] = {
     ff_sin_16, ff_sin_32, ff_sin_64, ff_sin_128, ff_sin_256, ff_sin_512, ff_sin_1024,
     ff_sin_2048, ff_sin_4096, ff_sin_8192, ff_sin_16384, ff_sin_32768, ff_sin_65536,
 };
@@ -63,9 +65,11 @@ av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
 
     s->tcos = ff_cos_tabs[nbits-4];
     s->tsin = ff_sin_tabs[nbits-4]+(trans == RDFT || trans == IRIDFT)*(n>>2);
+#if !CONFIG_HARDCODED_TABLES
     for (i = 0; i < (n>>2); i++) {
         s->tsin[i] = sin(i*theta);
     }
+#endif
     return 0;
 }