Add support for hardcoded ff_sin_* tables.
Originally committed as revision 20244 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user