Originally committed as revision 20244 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -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 | |||||
| $(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 @@ | |||||
| */ | */ | ||||
| #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 @@ | |||||
| #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 { | |||||
| #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 { | |||||
| /* 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 @@ | |||||
| */ | */ | ||||
| /* 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); | |||||
| 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) | |||||
| 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; | ||||
| } | } | ||||