Mercurial > libavcodec.hg
comparison mdct.c @ 10204:db033d1fbf44 libavcodec
Allow arch-specific mdct code to request interleaving of cos/sin tables
author | mru |
---|---|
date | Mon, 21 Sep 2009 02:56:06 +0000 |
parents | 38ab367d4231 |
children | 3d011a01a6a0 |
comparison
equal
deleted
inserted
replaced
10203:0905f8eed0a9 | 10204:db033d1fbf44 |
---|---|
74 */ | 74 */ |
75 av_cold int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale) | 75 av_cold int ff_mdct_init(FFTContext *s, int nbits, int inverse, double scale) |
76 { | 76 { |
77 int n, n4, i; | 77 int n, n4, i; |
78 double alpha, theta; | 78 double alpha, theta; |
79 int tstep; | |
79 | 80 |
80 memset(s, 0, sizeof(*s)); | 81 memset(s, 0, sizeof(*s)); |
81 n = 1 << nbits; | 82 n = 1 << nbits; |
82 s->mdct_bits = nbits; | 83 s->mdct_bits = nbits; |
83 s->mdct_size = n; | 84 s->mdct_size = n; |
84 n4 = n >> 2; | 85 n4 = n >> 2; |
85 s->tcos = av_malloc(n4 * sizeof(FFTSample)); | 86 s->permutation = FF_MDCT_PERM_NONE; |
87 | |
88 if (ff_fft_init(s, s->mdct_bits - 2, inverse) < 0) | |
89 goto fail; | |
90 | |
91 s->tcos = av_malloc(n/2 * sizeof(FFTSample)); | |
86 if (!s->tcos) | 92 if (!s->tcos) |
87 goto fail; | 93 goto fail; |
88 s->tsin = av_malloc(n4 * sizeof(FFTSample)); | 94 |
89 if (!s->tsin) | 95 switch (s->permutation) { |
96 case FF_MDCT_PERM_NONE: | |
97 s->tsin = s->tcos + n4; | |
98 tstep = 1; | |
99 break; | |
100 case FF_MDCT_PERM_INTERLEAVE: | |
101 s->tsin = s->tcos + 1; | |
102 tstep = 2; | |
103 break; | |
104 default: | |
90 goto fail; | 105 goto fail; |
106 } | |
91 | 107 |
92 theta = 1.0 / 8.0 + (scale < 0 ? n4 : 0); | 108 theta = 1.0 / 8.0 + (scale < 0 ? n4 : 0); |
93 scale = sqrt(fabs(scale)); | 109 scale = sqrt(fabs(scale)); |
94 for(i=0;i<n4;i++) { | 110 for(i=0;i<n4;i++) { |
95 alpha = 2 * M_PI * (i + theta) / n; | 111 alpha = 2 * M_PI * (i + theta) / n; |
96 s->tcos[i] = -cos(alpha) * scale; | 112 s->tcos[i*tstep] = -cos(alpha) * scale; |
97 s->tsin[i] = -sin(alpha) * scale; | 113 s->tsin[i*tstep] = -sin(alpha) * scale; |
98 } | 114 } |
99 if (ff_fft_init(s, s->mdct_bits - 2, inverse) < 0) | |
100 goto fail; | |
101 return 0; | 115 return 0; |
102 fail: | 116 fail: |
103 av_freep(&s->tcos); | 117 ff_mdct_end(s); |
104 av_freep(&s->tsin); | |
105 return -1; | 118 return -1; |
106 } | 119 } |
107 | 120 |
108 /* complex multiplication: p = a * b */ | 121 /* complex multiplication: p = a * b */ |
109 #define CMUL(pre, pim, are, aim, bre, bim) \ | 122 #define CMUL(pre, pim, are, aim, bre, bim) \ |
227 } | 240 } |
228 | 241 |
229 av_cold void ff_mdct_end(FFTContext *s) | 242 av_cold void ff_mdct_end(FFTContext *s) |
230 { | 243 { |
231 av_freep(&s->tcos); | 244 av_freep(&s->tcos); |
232 av_freep(&s->tsin); | |
233 ff_fft_end(s); | 245 ff_fft_end(s); |
234 } | 246 } |