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 }