diff options
Diffstat (limited to 'apps/codecs/Tremor/mdct.c')
-rw-r--r-- | apps/codecs/Tremor/mdct.c | 38 |
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) */ |
97 | STIN void mdct_butterfly_32(DATA_TYPE *x){ | 97 | STIN 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 | ||
234 | STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ | 234 | STIN 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 | ||
249 | static unsigned char bitrev[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; | 248 | |
249 | static 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 | ||
251 | STIN int bitrev12(int x){ | 252 | STIN 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 | ||
255 | STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ | 256 | STIN 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 | ||
340 | void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out){ | 341 | |
342 | void 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 | |||