summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/mdct.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/Tremor/mdct.c')
-rw-r--r--apps/codecs/Tremor/mdct.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/apps/codecs/Tremor/mdct.c b/apps/codecs/Tremor/mdct.c
index cc201b2106..2d2564f196 100644
--- a/apps/codecs/Tremor/mdct.c
+++ b/apps/codecs/Tremor/mdct.c
@@ -94,7 +94,7 @@ STIN void mdct_butterfly_16(DATA_TYPE *x){
94} 94}
95 95
96/* 32 point butterfly (in place, 4 register) */ 96/* 32 point butterfly (in place, 4 register) */
97STIN void mdct_butterfly_32(DATA_TYPE *x){ 97STIN void mdct_butterfly_32(DATA_TYPE *x){
98 98
99 REG_TYPE r0, r1; 99 REG_TYPE r0, r1;
100 100
@@ -152,7 +152,7 @@ STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){
152 DATA_TYPE *x2 = x + (points>>1) - 8; 152 DATA_TYPE *x2 = x + (points>>1) - 8;
153 REG_TYPE r0; 153 REG_TYPE r0;
154 REG_TYPE r1; 154 REG_TYPE r1;
155 155
156 do{ 156 do{
157 r0 = x1[6] - x2[6]; x1[6] += x2[6]; 157 r0 = x1[6] - x2[6]; x1[6] += x2[6];
158 r1 = x2[7] - x1[7]; x1[7] += x2[7]; 158 r1 = x2[7] - x1[7]; x1[7] += x2[7];
@@ -180,7 +180,7 @@ STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){
180 r0 = x1[4] - x2[4]; x1[4] += x2[4]; 180 r0 = x1[4] - x2[4]; x1[4] += x2[4];
181 r1 = x1[5] - x2[5]; x1[5] += x2[5]; 181 r1 = x1[5] - x2[5]; x1[5] += x2[5];
182 XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step; 182 XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step;
183 183
184 r0 = x1[2] - x2[2]; x1[2] += x2[2]; 184 r0 = x1[2] - x2[2]; x1[2] += x2[2];
185 r1 = x1[3] - x2[3]; x1[3] += x2[3]; 185 r1 = x1[3] - x2[3]; x1[3] += x2[3];
186 XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step; 186 XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step;
@@ -231,7 +231,7 @@ STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){
231 }while(T>sincos_lookup0); 231 }while(T>sincos_lookup0);
232} 232}
233 233
234STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ 234STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift) {
235 235
236 int stages=8-shift; 236 int stages=8-shift;
237 int i,j; 237 int i,j;
@@ -243,33 +243,34 @@ STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){
243 243
244 for(j=0;j<points;j+=32) 244 for(j=0;j<points;j+=32)
245 mdct_butterfly_32(x+j); 245 mdct_butterfly_32(x+j);
246
247} 246}
248 247
249static unsigned char bitrev[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; 248
249static const unsigned char bitrev[16]
250 IDATA_ATTR = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
250 251
251STIN int bitrev12(int x){ 252STIN int bitrev12(int x){
252 return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); 253 return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8);
253} 254}
254 255
255STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ 256STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift) {
256 257
257 int bit = 0; 258 int bit = 0;
258 DATA_TYPE *w0 = x; 259 DATA_TYPE *w0 = x;
259 DATA_TYPE *w1 = x = w0+(n>>1); 260 DATA_TYPE *w1 = x = w0+(n>>1);
260 LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; 261 LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1;
261 LOOKUP_T *Ttop = T+1024; 262 LOOKUP_T *Ttop = T+1024;
262 DATA_TYPE r2; 263 REG_TYPE r2;
263 264
264 do{ 265 do{
265 DATA_TYPE r3 = bitrev12(bit++); 266 REG_TYPE r3 = bitrev12(bit++);
266 DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; 267 DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1;
267 DATA_TYPE *x1 = x + (r3>>shift); 268 DATA_TYPE *x1 = x + (r3>>shift);
268 269
269 REG_TYPE r0 = x0[0] + x1[0]; 270 REG_TYPE r0 = x0[0] + x1[0];
270 REG_TYPE r1 = x1[1] - x0[1]; 271 REG_TYPE r1 = x1[1] - x0[1];
271 272
272 XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; 273 XPROD32( r0, r1, T[1], T[0], r2, r3 ); T+=step;
273 274
274 w1 -= 4; 275 w1 -= 4;
275 276
@@ -287,7 +288,7 @@ STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
287 r0 = x0[0] + x1[0]; 288 r0 = x0[0] + x1[0];
288 r1 = x1[1] - x0[1]; 289 r1 = x1[1] - x0[1];
289 290
290 XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; 291 XPROD32( r0, r1, T[1], T[0], r2, r3 ); T+=step;
291 292
292 r0 = (x0[1] + x1[1])>>1; 293 r0 = (x0[1] + x1[1])>>1;
293 r1 = (x0[0] - x1[0])>>1; 294 r1 = (x0[0] - x1[0])>>1;
@@ -299,14 +300,14 @@ STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
299 w0 += 4; 300 w0 += 4;
300 }while(T<Ttop); 301 }while(T<Ttop);
301 do{ 302 do{
302 DATA_TYPE r3 = bitrev12(bit++); 303 REG_TYPE r3 = bitrev12(bit++);
303 DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; 304 DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1;
304 DATA_TYPE *x1 = x + (r3>>shift); 305 DATA_TYPE *x1 = x + (r3>>shift);
305 306
306 REG_TYPE r0 = x0[0] + x1[0]; 307 REG_TYPE r0 = x0[0] + x1[0];
307 REG_TYPE r1 = x1[1] - x0[1]; 308 REG_TYPE r1 = x1[1] - x0[1];
308 309
309 T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); 310 T-=step; XPROD32( r0, r1, T[0], T[1], r2, r3 );
310 311
311 w1 -= 4; 312 w1 -= 4;
312 313
@@ -324,7 +325,7 @@ STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
324 r0 = x0[0] + x1[0]; 325 r0 = x0[0] + x1[0];
325 r1 = x1[1] - x0[1]; 326 r1 = x1[1] - x0[1];
326 327
327 T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); 328 T-=step; XPROD32( r0, r1, T[0], T[1], r2, r3 );
328 329
329 r0 = (x0[1] + x1[1])>>1; 330 r0 = (x0[1] + x1[1])>>1;
330 r1 = (x0[0] - x1[0])>>1; 331 r1 = (x0[0] - x1[0])>>1;
@@ -337,7 +338,8 @@ STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){
337 }while(w0<w1); 338 }while(w0<w1);
338} 339}
339 340
340void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){ 341
342void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out) {
341 int n2=n>>1; 343 int n2=n>>1;
342 int n4=n>>2; 344 int n4=n>>2;
343 DATA_TYPE *iX; 345 DATA_TYPE *iX;
@@ -347,6 +349,10 @@ void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){
347 int shift; 349 int shift;
348 int step; 350 int step;
349 351
352#if CONFIG_CPU == MCF5249
353 mcf5249_init_mac(); /* should be redundant */
354#endif
355
350 for (shift=6;!(n&(1<<shift));shift++); 356 for (shift=6;!(n&(1<<shift));shift++);
351 shift=13-shift; 357 shift=13-shift;
352 step=2<<shift; 358 step=2<<shift;
@@ -389,7 +395,6 @@ void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){
389 395
390 mdct_butterflies(out+n2,n2,shift); 396 mdct_butterflies(out+n2,n2,shift);
391 mdct_bitreverse(out,n,step,shift); 397 mdct_bitreverse(out,n,step,shift);
392
393 /* rotate + window */ 398 /* rotate + window */
394 399
395 step>>=2; 400 step>>=2;
@@ -507,4 +512,3 @@ void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){
507 }while(oX1>oX2); 512 }while(oX1>oX2);
508 } 513 }
509} 514}
510