Commit 75df2edb authored by Reimar Döffinger's avatar Reimar Döffinger

Add support for hardcoded ff_sin_* tables.

Originally committed as revision 20244 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 4ee726b6
...@@ -31,7 +31,8 @@ FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o ...@@ -31,7 +31,8 @@ FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o
OBJS-$(CONFIG_FFT) += fft.o $(FFT-OBJS-yes) OBJS-$(CONFIG_FFT) += fft.o $(FFT-OBJS-yes)
OBJS-$(CONFIG_GOLOMB) += golomb.o OBJS-$(CONFIG_GOLOMB) += golomb.o
OBJS-$(CONFIG_MDCT) += mdct.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_VAAPI) += vaapi.o
OBJS-$(CONFIG_VDPAU) += vdpau.o OBJS-$(CONFIG_VDPAU) += vdpau.o
...@@ -583,3 +584,6 @@ $(SUBDIR)costablegen$(HOSTEXESUF): $(SUBDIR)costablegen.c ...@@ -583,3 +584,6 @@ $(SUBDIR)costablegen$(HOSTEXESUF): $(SUBDIR)costablegen.c
$(SUBDIR)cos_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF) $(SUBDIR)cos_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
./$< > $@ ./$< > $@
$(SUBDIR)sin_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
./$< sin > $@
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <math.h> #include <math.h>
#ifndef M_PI #ifndef M_PI
...@@ -29,22 +30,27 @@ ...@@ -29,22 +30,27 @@
#define BITS 16 #define BITS 16
#define FLOATFMT "%.18e" #define FLOATFMT "%.18e"
int main(void) int main(int argc, char *argv[])
{ {
int i, j; 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("/* This file was generated by libavcodec/costablegen */\n");
printf("#include \"dsputil.h\"\n"); printf("#include \"dsputil.h\"\n");
for (i = 4; i <= BITS; i++) { for (i = 4; i <= BITS; i++) {
int m = 1 << i; int m = 1 << i;
double freq = 2*M_PI/m; 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++) { for (j = 0; j < m/2 - 1; j++) {
int idx = j > m/4 ? m/2 - j : 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) if ((j & 3) == 3)
printf("\n "); printf("\n ");
} }
printf(" "FLOATFMT"\n};\n", cos(freq)); printf(" "FLOATFMT"\n};\n", func(do_sin ? -(m/4 - 1)*freq : freq));
} }
return 0; return 0;
} }
...@@ -744,14 +744,16 @@ typedef struct FFTContext { ...@@ -744,14 +744,16 @@ typedef struct FFTContext {
#if CONFIG_HARDCODED_TABLES #if CONFIG_HARDCODED_TABLES
#define COSTABLE_CONST const #define COSTABLE_CONST const
#define SINTABLE_CONST const
#else #else
#define COSTABLE_CONST #define COSTABLE_CONST
#define SINTABLE_CONST
#endif #endif
#define COSTABLE(size) \ #define COSTABLE(size) \
COSTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_cos_##size[size/2]) COSTABLE_CONST DECLARE_ALIGNED_16(FFTSample, ff_cos_##size[size/2])
#define SINTABLE(size) \ #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(16);
extern COSTABLE(32); extern COSTABLE(32);
extern COSTABLE(64); extern COSTABLE(64);
...@@ -874,7 +876,7 @@ typedef struct { ...@@ -874,7 +876,7 @@ typedef struct {
/* pre/post rotation tables */ /* pre/post rotation tables */
const FFTSample *tcos; const FFTSample *tcos;
FFTSample *tsin; SINTABLE_CONST FFTSample *tsin;
FFTContext fft; FFTContext fft;
} RDFTContext; } RDFTContext;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
*/ */
/* sin(2*pi*x/n) for 0<=x<n/4, followed by n/2<=x<3n/4 */ /* sin(2*pi*x/n) for 0<=x<n/4, followed by n/2<=x<3n/4 */
#if !CONFIG_HARDCODED_TABLES
SINTABLE(16); SINTABLE(16);
SINTABLE(32); SINTABLE(32);
SINTABLE(64); SINTABLE(64);
...@@ -40,7 +41,8 @@ SINTABLE(8192); ...@@ -40,7 +41,8 @@ SINTABLE(8192);
SINTABLE(16384); SINTABLE(16384);
SINTABLE(32768); SINTABLE(32768);
SINTABLE(65536); 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_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, 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) ...@@ -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->tcos = ff_cos_tabs[nbits-4];
s->tsin = ff_sin_tabs[nbits-4]+(trans == RDFT || trans == IRIDFT)*(n>>2); s->tsin = ff_sin_tabs[nbits-4]+(trans == RDFT || trans == IRIDFT)*(n>>2);
#if !CONFIG_HARDCODED_TABLES
for (i = 0; i < (n>>2); i++) { for (i = 0; i < (n>>2); i++) {
s->tsin[i] = sin(i*theta); s->tsin[i] = sin(i*theta);
} }
#endif
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment