summaryrefslogtreecommitdiff
path: root/apps/codecs/liba52
diff options
context:
space:
mode:
authorDave Hooper <dave@beermex.com>2010-02-17 00:49:53 +0000
committerDave Hooper <dave@beermex.com>2010-02-17 00:49:53 +0000
commit42774d3128b91d5a37344cb40d56d3c4d147e5f2 (patch)
treebf336b407992ec9a5e454556f3351e3f8a0d10de /apps/codecs/liba52
parent62257ebc38bc0a3095b25dd0f58c4c8215edf602 (diff)
downloadrockbox-42774d3128b91d5a37344cb40d56d3c4d147e5f2.tar.gz
rockbox-42774d3128b91d5a37344cb40d56d3c4d147e5f2.zip
Merge from branches/mdctexp - faster ifft+imdct in codec lib
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24712 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/liba52')
-rw-r--r--apps/codecs/liba52/a52_internal.h8
-rw-r--r--apps/codecs/liba52/downmix.c76
-rw-r--r--apps/codecs/liba52/imdct.c133
-rw-r--r--apps/codecs/liba52/parse.c20
4 files changed, 121 insertions, 116 deletions
diff --git a/apps/codecs/liba52/a52_internal.h b/apps/codecs/liba52/a52_internal.h
index 0db16a8bcf..1e3b4a7edf 100644
--- a/apps/codecs/liba52/a52_internal.h
+++ b/apps/codecs/liba52/a52_internal.h
@@ -111,13 +111,13 @@ int a52_downmix_init (int input, int flags, level_t * level,
111 level_t clev, level_t slev); 111 level_t clev, level_t slev);
112int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, 112int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
113 level_t clev, level_t slev); 113 level_t clev, level_t slev);
114void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, 114void a52_downmix (sample_t * samples, int acmod, int output,
115 level_t clev, level_t slev); 115 level_t clev, level_t slev);
116void a52_upmix (sample_t * samples, int acmod, int output); 116void a52_upmix (sample_t * samples, int acmod, int output);
117 117
118void a52_imdct_init (uint32_t mm_accel); 118void a52_imdct_init (uint32_t mm_accel);
119void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias); 119void a52_imdct_256 (sample_t * data, sample_t * delay);
120void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias); 120void a52_imdct_512 (sample_t * data, sample_t * delay);
121 121
122#define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5))) 122#define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5)))
123 123
@@ -210,6 +210,6 @@ typedef int16_t quantizer_t;
210 210
211#define MUL_C(a,b) MUL_L (a, LEVEL (b)) 211#define MUL_C(a,b) MUL_L (a, LEVEL (b))
212#define DIV(a,b) ((((int64_t)LEVEL (a)) << 26) / (b)) 212#define DIV(a,b) ((((int64_t)LEVEL (a)) << 26) / (b))
213#define BIAS(x) ((x) + (bias*0)) 213#define BIAS(x) ((x))
214 214
215#endif 215#endif
diff --git a/apps/codecs/liba52/downmix.c b/apps/codecs/liba52/downmix.c
index 7bbf3793f0..2e8567bceb 100644
--- a/apps/codecs/liba52/downmix.c
+++ b/apps/codecs/liba52/downmix.c
@@ -329,7 +329,7 @@ int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
329 return -1; /* NOTREACHED */ 329 return -1; /* NOTREACHED */
330} 330}
331 331
332static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias) 332static void mix2to1 (sample_t * dest, sample_t * src)
333{ 333{
334 int i; 334 int i;
335 335
@@ -337,7 +337,7 @@ static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias)
337 dest[i] += BIAS (src[i]); 337 dest[i] += BIAS (src[i]);
338} 338}
339 339
340static void mix3to1 (sample_t * samples, sample_t bias) 340static void mix3to1 (sample_t * samples)
341{ 341{
342 int i; 342 int i;
343 343
@@ -345,7 +345,7 @@ static void mix3to1 (sample_t * samples, sample_t bias)
345 samples[i] += BIAS (samples[i + 256] + samples[i + 512]); 345 samples[i] += BIAS (samples[i + 256] + samples[i + 512]);
346} 346}
347 347
348static void mix4to1 (sample_t * samples, sample_t bias) 348static void mix4to1 (sample_t * samples)
349{ 349{
350 int i; 350 int i;
351 351
@@ -354,7 +354,7 @@ static void mix4to1 (sample_t * samples, sample_t bias)
354 samples[i + 768]); 354 samples[i + 768]);
355} 355}
356 356
357static void mix5to1 (sample_t * samples, sample_t bias) 357static void mix5to1 (sample_t * samples)
358{ 358{
359 int i; 359 int i;
360 360
@@ -363,7 +363,7 @@ static void mix5to1 (sample_t * samples, sample_t bias)
363 samples[i + 768] + samples[i + 1024]); 363 samples[i + 768] + samples[i + 1024]);
364} 364}
365 365
366static void mix3to2 (sample_t * samples, sample_t bias) 366static void mix3to2 (sample_t * samples)
367{ 367{
368 int i; 368 int i;
369 sample_t common; 369 sample_t common;
@@ -375,7 +375,7 @@ static void mix3to2 (sample_t * samples, sample_t bias)
375 } 375 }
376} 376}
377 377
378static void mix21to2 (sample_t * left, sample_t * right, sample_t bias) 378static void mix21to2 (sample_t * left, sample_t * right)
379{ 379{
380 int i; 380 int i;
381 sample_t common; 381 sample_t common;
@@ -387,7 +387,7 @@ static void mix21to2 (sample_t * left, sample_t * right, sample_t bias)
387 } 387 }
388} 388}
389 389
390static void mix21toS (sample_t * samples, sample_t bias) 390static void mix21toS (sample_t * samples)
391{ 391{
392 int i; 392 int i;
393 sample_t surround; 393 sample_t surround;
@@ -399,7 +399,7 @@ static void mix21toS (sample_t * samples, sample_t bias)
399 } 399 }
400} 400}
401 401
402static void mix31to2 (sample_t * samples, sample_t bias) 402static void mix31to2 (sample_t * samples)
403{ 403{
404 int i; 404 int i;
405 sample_t common; 405 sample_t common;
@@ -411,7 +411,7 @@ static void mix31to2 (sample_t * samples, sample_t bias)
411 } 411 }
412} 412}
413 413
414static void mix31toS (sample_t * samples, sample_t bias) 414static void mix31toS (sample_t * samples)
415{ 415{
416 int i; 416 int i;
417 sample_t common, surround; 417 sample_t common, surround;
@@ -424,7 +424,7 @@ static void mix31toS (sample_t * samples, sample_t bias)
424 } 424 }
425} 425}
426 426
427static void mix22toS (sample_t * samples, sample_t bias) 427static void mix22toS (sample_t * samples)
428{ 428{
429 int i; 429 int i;
430 sample_t surround; 430 sample_t surround;
@@ -436,7 +436,7 @@ static void mix22toS (sample_t * samples, sample_t bias)
436 } 436 }
437} 437}
438 438
439static void mix32to2 (sample_t * samples, sample_t bias) 439static void mix32to2 (sample_t * samples)
440{ 440{
441 int i; 441 int i;
442 sample_t common; 442 sample_t common;
@@ -448,7 +448,7 @@ static void mix32to2 (sample_t * samples, sample_t bias)
448 } 448 }
449} 449}
450 450
451static void mix32toS (sample_t * samples, sample_t bias) 451static void mix32toS (sample_t * samples)
452{ 452{
453 int i; 453 int i;
454 sample_t common, surround; 454 sample_t common, surround;
@@ -461,7 +461,7 @@ static void mix32toS (sample_t * samples, sample_t bias)
461 } 461 }
462} 462}
463 463
464static void move2to1 (sample_t * src, sample_t * dest, sample_t bias) 464static void move2to1 (sample_t * src, sample_t * dest)
465{ 465{
466 int i; 466 int i;
467 467
@@ -477,7 +477,7 @@ static void zero (sample_t * samples)
477 samples[i] = 0; 477 samples[i] = 0;
478} 478}
479 479
480void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, 480void a52_downmix (sample_t * samples, int acmod, int output,
481 level_t clev, level_t slev) 481 level_t clev, level_t slev)
482{ 482{
483 /* avoid compiler warning */ 483 /* avoid compiler warning */
@@ -492,7 +492,7 @@ void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
492 case CONVERT (A52_CHANNEL, A52_MONO): 492 case CONVERT (A52_CHANNEL, A52_MONO):
493 case CONVERT (A52_STEREO, A52_MONO): 493 case CONVERT (A52_STEREO, A52_MONO):
494 mix_2to1: 494 mix_2to1:
495 mix2to1 (samples, samples + 256, bias); 495 mix2to1 (samples, samples + 256);
496 break; 496 break;
497 497
498 case CONVERT (A52_2F1R, A52_MONO): 498 case CONVERT (A52_2F1R, A52_MONO):
@@ -500,7 +500,7 @@ void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
500 goto mix_2to1; 500 goto mix_2to1;
501 case CONVERT (A52_3F, A52_MONO): 501 case CONVERT (A52_3F, A52_MONO):
502 mix_3to1: 502 mix_3to1:
503 mix3to1 (samples, bias); 503 mix3to1 (samples);
504 break; 504 break;
505 505
506 case CONVERT (A52_3F1R, A52_MONO): 506 case CONVERT (A52_3F1R, A52_MONO):
@@ -509,13 +509,13 @@ void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
509 case CONVERT (A52_2F2R, A52_MONO): 509 case CONVERT (A52_2F2R, A52_MONO):
510 if (slev == 0) 510 if (slev == 0)
511 goto mix_2to1; 511 goto mix_2to1;
512 mix4to1 (samples, bias); 512 mix4to1 (samples);
513 break; 513 break;
514 514
515 case CONVERT (A52_3F2R, A52_MONO): 515 case CONVERT (A52_3F2R, A52_MONO):
516 if (slev == 0) 516 if (slev == 0)
517 goto mix_3to1; 517 goto mix_3to1;
518 mix5to1 (samples, bias); 518 mix5to1 (samples);
519 break; 519 break;
520 520
521 case CONVERT (A52_MONO, A52_DOLBY): 521 case CONVERT (A52_MONO, A52_DOLBY):
@@ -525,79 +525,79 @@ void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
525 case CONVERT (A52_3F, A52_STEREO): 525 case CONVERT (A52_3F, A52_STEREO):
526 case CONVERT (A52_3F, A52_DOLBY): 526 case CONVERT (A52_3F, A52_DOLBY):
527 mix_3to2: 527 mix_3to2:
528 mix3to2 (samples, bias); 528 mix3to2 (samples);
529 break; 529 break;
530 530
531 case CONVERT (A52_2F1R, A52_STEREO): 531 case CONVERT (A52_2F1R, A52_STEREO):
532 if (slev == 0) 532 if (slev == 0)
533 break; 533 break;
534 mix21to2 (samples, samples + 256, bias); 534 mix21to2 (samples, samples + 256);
535 break; 535 break;
536 536
537 case CONVERT (A52_2F1R, A52_DOLBY): 537 case CONVERT (A52_2F1R, A52_DOLBY):
538 mix21toS (samples, bias); 538 mix21toS (samples);
539 break; 539 break;
540 540
541 case CONVERT (A52_3F1R, A52_STEREO): 541 case CONVERT (A52_3F1R, A52_STEREO):
542 if (slev == 0) 542 if (slev == 0)
543 goto mix_3to2; 543 goto mix_3to2;
544 mix31to2 (samples, bias); 544 mix31to2 (samples);
545 break; 545 break;
546 546
547 case CONVERT (A52_3F1R, A52_DOLBY): 547 case CONVERT (A52_3F1R, A52_DOLBY):
548 mix31toS (samples, bias); 548 mix31toS (samples);
549 break; 549 break;
550 550
551 case CONVERT (A52_2F2R, A52_STEREO): 551 case CONVERT (A52_2F2R, A52_STEREO):
552 if (slev == 0) 552 if (slev == 0)
553 break; 553 break;
554 mix2to1 (samples, samples + 512, bias); 554 mix2to1 (samples, samples + 512);
555 mix2to1 (samples + 256, samples + 768, bias); 555 mix2to1 (samples + 256, samples + 768);
556 break; 556 break;
557 557
558 case CONVERT (A52_2F2R, A52_DOLBY): 558 case CONVERT (A52_2F2R, A52_DOLBY):
559 mix22toS (samples, bias); 559 mix22toS (samples);
560 break; 560 break;
561 561
562 case CONVERT (A52_3F2R, A52_STEREO): 562 case CONVERT (A52_3F2R, A52_STEREO):
563 if (slev == 0) 563 if (slev == 0)
564 goto mix_3to2; 564 goto mix_3to2;
565 mix32to2 (samples, bias); 565 mix32to2 (samples);
566 break; 566 break;
567 567
568 case CONVERT (A52_3F2R, A52_DOLBY): 568 case CONVERT (A52_3F2R, A52_DOLBY):
569 mix32toS (samples, bias); 569 mix32toS (samples);
570 break; 570 break;
571 571
572 case CONVERT (A52_3F1R, A52_3F): 572 case CONVERT (A52_3F1R, A52_3F):
573 if (slev == 0) 573 if (slev == 0)
574 break; 574 break;
575 mix21to2 (samples, samples + 512, bias); 575 mix21to2 (samples, samples + 512);
576 break; 576 break;
577 577
578 case CONVERT (A52_3F2R, A52_3F): 578 case CONVERT (A52_3F2R, A52_3F):
579 if (slev == 0) 579 if (slev == 0)
580 break; 580 break;
581 mix2to1 (samples, samples + 768, bias); 581 mix2to1 (samples, samples + 768);
582 mix2to1 (samples + 512, samples + 1024, bias); 582 mix2to1 (samples + 512, samples + 1024);
583 break; 583 break;
584 584
585 case CONVERT (A52_3F1R, A52_2F1R): 585 case CONVERT (A52_3F1R, A52_2F1R):
586 mix3to2 (samples, bias); 586 mix3to2 (samples);
587 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 587 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
588 break; 588 break;
589 589
590 case CONVERT (A52_2F2R, A52_2F1R): 590 case CONVERT (A52_2F2R, A52_2F1R):
591 mix2to1 (samples + 512, samples + 768, bias); 591 mix2to1 (samples + 512, samples + 768);
592 break; 592 break;
593 593
594 case CONVERT (A52_3F2R, A52_2F1R): 594 case CONVERT (A52_3F2R, A52_2F1R):
595 mix3to2 (samples, bias); 595 mix3to2 (samples);
596 move2to1 (samples + 768, samples + 512, bias); 596 move2to1 (samples + 768, samples + 512);
597 break; 597 break;
598 598
599 case CONVERT (A52_3F2R, A52_3F1R): 599 case CONVERT (A52_3F2R, A52_3F1R):
600 mix2to1 (samples + 768, samples + 1024, bias); 600 mix2to1 (samples + 768, samples + 1024);
601 break; 601 break;
602 602
603 case CONVERT (A52_2F1R, A52_2F2R): 603 case CONVERT (A52_2F1R, A52_2F2R):
@@ -605,12 +605,12 @@ void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
605 break; 605 break;
606 606
607 case CONVERT (A52_3F1R, A52_2F2R): 607 case CONVERT (A52_3F1R, A52_2F2R):
608 mix3to2 (samples, bias); 608 mix3to2 (samples);
609 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 609 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
610 break; 610 break;
611 611
612 case CONVERT (A52_3F2R, A52_2F2R): 612 case CONVERT (A52_3F2R, A52_2F2R):
613 mix3to2 (samples, bias); 613 mix3to2 (samples);
614 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 614 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
615 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t)); 615 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
616 break; 616 break;
diff --git a/apps/codecs/liba52/imdct.c b/apps/codecs/liba52/imdct.c
index d1035030fd..4483bd0667 100644
--- a/apps/codecs/liba52/imdct.c
+++ b/apps/codecs/liba52/imdct.c
@@ -72,6 +72,8 @@ static const uint8_t fftorder[] = {
72//static sample_t a52_imdct_window[256]; 72//static sample_t a52_imdct_window[256];
73#include "imdct_lookups.h" 73#include "imdct_lookups.h"
74 74
75
76/*
75static void (* ifft128) (complex_t * buf); 77static void (* ifft128) (complex_t * buf);
76static void (* ifft64) (complex_t * buf); 78static void (* ifft64) (complex_t * buf);
77 79
@@ -109,7 +111,7 @@ static inline void ifft4 (complex_t * buf)
109 buf[3].real = tmp5 - tmp7; 111 buf[3].real = tmp5 - tmp7;
110 buf[3].imag = tmp6 - tmp8; 112 buf[3].imag = tmp6 - tmp8;
111} 113}
112 114*/
113/* basic radix-2 ifft butterfly */ 115/* basic radix-2 ifft butterfly */
114 116
115#define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \ 117#define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \
@@ -161,7 +163,7 @@ static inline void ifft4 (complex_t * buf)
161} while (0) 163} while (0)
162 164
163/* split-radix ifft butterfly, specialized for wr=wi */ 165/* split-radix ifft butterfly, specialized for wr=wi */
164 166/*
165#define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \ 167#define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \
166 tmp5 = MUL (a2.real + a2.imag, w); \ 168 tmp5 = MUL (a2.real + a2.imag, w); \
167 tmp6 = MUL (a2.imag - a2.real, w); \ 169 tmp6 = MUL (a2.imag - a2.real, w); \
@@ -255,93 +257,96 @@ static void ifft128_c (complex_t * buf)
255 ifft32 (buf + 96); 257 ifft32 (buf + 96);
256 ifft_pass (buf, roots128, 32); 258 ifft_pass (buf, roots128, 32);
257} 259}
258 260*/
259void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias) 261void a52_imdct_512 (sample_t * data, sample_t * delay)
260{ 262{
261 int i, k; 263 int i, k;
262 sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2; 264 sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2;
263 const sample_t * window = a52_imdct_window; 265 const sample_t * window = a52_imdct_window;
264 complex_t buf[128]; 266 FFTComplex buf[128];
265 267
266 for (i = 0; i < 128; i++) { 268 for (i = 0; i < 128; i++) {
267 k = fftorder[i]; 269 k = fftorder[i];
268 t_r = pre1[i].real; 270 t_r = pre1[i].real;
269 t_i = pre1[i].imag; 271 t_i = pre1[i].imag;
270 BUTTERFLY_0 (buf[i].real, buf[i].imag, t_r, t_i, data[k], data[255-k]); 272 BUTTERFLY_0 (buf[i].re, buf[i].im, t_r, t_i, data[k], data[255-k]);
271 } 273 }
272 274
273 ifft128 (buf); 275 //ifft128 (buf);
276 ff_fft_calc_c(7, (FFTComplex *)&buf);
274 277
275 /* Post IFFT complex multiply plus IFFT complex conjugate*/ 278 /* Post IFFT complex multiply plus IFFT complex conjugate*/
276 /* Window and convert to real valued signal */ 279 /* Window and convert to real valued signal */
277 for (i = 0; i < 64; i++) { 280 for (i = 0; i < 64; i++) {
278 /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */ 281 /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */
279 t_r = post1[i].real; 282 t_r = post1[i].real;
280 t_i = post1[i].imag; 283 t_i = post1[i].imag;
281 BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf[i].imag, buf[i].real); 284 BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf[i].im, buf[i].re);
282 BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf[127-i].imag, buf[127-i].real); 285 BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf[127-i].im, buf[127-i].re);
283 286
284 w_1 = window[2*i]; 287 w_1 = window[2*i];
285 w_2 = window[255-2*i]; 288 w_2 = window[255-2*i];
286 BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); 289 BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]);
287 delay[2*i] = a_i; 290 delay[2*i] = a_i;
288 291
289 w_1 = window[2*i+1]; 292 w_1 = window[2*i+1];
290 w_2 = window[254-2*i]; 293 w_2 = window[254-2*i];
291 BUTTERFLY_B (data[2*i+1], data[254-2*i], w_1, w_2, b_r, delay[2*i+1]); 294 BUTTERFLY_B (data[2*i+1], data[254-2*i], w_1, w_2, b_r, delay[2*i+1]);
292 delay[2*i+1] = b_i; 295 delay[2*i+1] = b_i;
293 } 296 }
294} 297}
295 298
296void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias) 299void a52_imdct_256 (sample_t * data, sample_t * delay)
297{ 300{
298 int i, k; 301 int i, k;
299 sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2; 302 sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2;
300 const sample_t * window = a52_imdct_window; 303 const sample_t * window = a52_imdct_window;
301 complex_t buf1[64], buf2[64]; 304 FFTComplex buf1[64], buf2[64];
302 305
303 /* Pre IFFT complex multiply plus IFFT cmplx conjugate */ 306 /* Pre IFFT complex multiply plus IFFT cmplx conjugate */
304 for (i = 0; i < 64; i++) { 307 for (i = 0; i < 64; i++) {
305 k = fftorder[i]; 308 k = fftorder[i];
306 t_r = pre2[i].real; 309 t_r = pre2[i].real;
307 t_i = pre2[i].imag; 310 t_i = pre2[i].imag;
308 BUTTERFLY_0 (buf1[i].real, buf1[i].imag, t_r, t_i, data[k], data[254-k]); 311 BUTTERFLY_0 (buf1[i].re, buf1[i].im, t_r, t_i, data[k], data[254-k]);
309 BUTTERFLY_0 (buf2[i].real, buf2[i].imag, t_r, t_i, data[k+1], data[255-k]); 312 BUTTERFLY_0 (buf2[i].re, buf2[i].im, t_r, t_i, data[k+1], data[255-k]);
310 } 313 }
311 314
312 ifft64 (buf1); 315 //ifft64 (buf1);
313 ifft64 (buf2); 316 //ifft64 (buf2);
317 ff_fft_calc_c(6, (FFTComplex *)&buf1);
318 ff_fft_calc_c(6, (FFTComplex *)&buf2);
314 319
315 /* Post IFFT complex multiply */ 320 /* Post IFFT complex multiply */
316 /* Window and convert to real valued signal */ 321 /* Window and convert to real valued signal */
317 for (i = 0; i < 32; i++) { 322 for (i = 0; i < 32; i++) {
318 /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ 323 /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */
319 t_r = post2[i].real; 324 t_r = post2[i].real;
320 t_i = post2[i].imag; 325 t_i = post2[i].imag;
321 BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf1[i].imag, buf1[i].real); 326 BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf1[i].im, buf1[i].re);
322 BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf1[63-i].imag, buf1[63-i].real); 327 BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf1[63-i].im, buf1[63-i].re);
323 BUTTERFLY_0 (c_r, c_i, t_i, t_r, buf2[i].imag, buf2[i].real); 328 BUTTERFLY_0 (c_r, c_i, t_i, t_r, buf2[i].im, buf2[i].re);
324 BUTTERFLY_0 (d_r, d_i, t_r, t_i, buf2[63-i].imag, buf2[63-i].real); 329 BUTTERFLY_0 (d_r, d_i, t_r, t_i, buf2[63-i].im, buf2[63-i].re);
325 330
326 w_1 = window[2*i]; 331 w_1 = window[2*i];
327 w_2 = window[255-2*i]; 332 w_2 = window[255-2*i];
328 BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); 333 BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]);
329 delay[2*i] = c_i; 334 delay[2*i] = c_i;
330 335
331 w_1 = window[128+2*i]; 336 w_1 = window[128+2*i];
332 w_2 = window[127-2*i]; 337 w_2 = window[127-2*i];
333 BUTTERFLY_B (data[128+2*i], data[127-2*i], w_1, w_2, a_i, delay[127-2*i]); 338 BUTTERFLY_B (data[128+2*i], data[127-2*i], w_1, w_2, a_i, delay[127-2*i]);
334 delay[127-2*i] = c_r; 339 delay[127-2*i] = c_r;
335 340
336 w_1 = window[2*i+1]; 341 w_1 = window[2*i+1];
337 w_2 = window[254-2*i]; 342 w_2 = window[254-2*i];
338 BUTTERFLY_B (data[254-2*i], data[2*i+1], w_2, w_1, b_i, delay[2*i+1]); 343 BUTTERFLY_B (data[254-2*i], data[2*i+1], w_2, w_1, b_i, delay[2*i+1]);
339 delay[2*i+1] = d_r; 344 delay[2*i+1] = d_r;
340 345
341 w_1 = window[129+2*i]; 346 w_1 = window[129+2*i];
342 w_2 = window[126-2*i]; 347 w_2 = window[126-2*i];
343 BUTTERFLY_B (data[129+2*i], data[126-2*i], w_1, w_2, b_r, delay[126-2*i]); 348 BUTTERFLY_B (data[129+2*i], data[126-2*i], w_1, w_2, b_r, delay[126-2*i]);
344 delay[126-2*i] = d_i; 349 delay[126-2*i] = d_i;
345 } 350 }
346} 351}
347 352
@@ -361,6 +366,9 @@ static double besselI0 (double x)
361void a52_imdct_init (uint32_t mm_accel) 366void a52_imdct_init (uint32_t mm_accel)
362{ 367{
363 (void)mm_accel; 368 (void)mm_accel;
369 //ff_fft_init(&s128, 7, 1);
370 //ff_fft_init(&s64, 6, 1);
371
364/* int i, k; 372/* int i, k;
365 double sum; 373 double sum;
366 double local_imdct_window[256];*/ 374 double local_imdct_window[256];*/
@@ -457,7 +465,7 @@ void a52_imdct_init (uint32_t mm_accel)
457 printf("static complex_t post2[32]={"); 465 printf("static complex_t post2[32]={");
458 for (i=0;i<32;i++) { printf("{%d,%d}%s",post2[i].real,post2[i].imag,(i < 31 ? "," : "")); } 466 for (i=0;i<32;i++) { printf("{%d,%d}%s",post2[i].real,post2[i].imag,(i < 31 ? "," : "")); }
459 printf("};\n"); 467 printf("};\n");
460 */ 468
461 469
462#ifdef LIBA52_DJBFFT 470#ifdef LIBA52_DJBFFT
463 if (mm_accel & MM_ACCEL_DJBFFT) { 471 if (mm_accel & MM_ACCEL_DJBFFT) {
@@ -474,4 +482,5 @@ void a52_imdct_init (uint32_t mm_accel)
474 ifft128 = ifft128_c; 482 ifft128 = ifft128_c;
475 ifft64 = ifft64_c; 483 ifft64 = ifft64_c;
476 } 484 }
485 */
477} 486}
diff --git a/apps/codecs/liba52/parse.c b/apps/codecs/liba52/parse.c
index 2a065b4fc4..f2b0ce4f6d 100644
--- a/apps/codecs/liba52/parse.c
+++ b/apps/codecs/liba52/parse.c
@@ -881,7 +881,7 @@ int a52_block (a52_state_t * state)
881 state->dynrng, 0, 7); 881 state->dynrng, 0, 7);
882 for (i = 7; i < 256; i++) 882 for (i = 7; i < 256; i++)
883 (samples-256)[i] = 0; 883 (samples-256)[i] = 0;
884 a52_imdct_512 (samples - 256, samples + 1536 - 256, state->bias); 884 a52_imdct_512 (samples - 256, samples + 1536 - 256);
885 } else { 885 } else {
886 /* just skip the LFE coefficients */ 886 /* just skip the LFE coefficients */
887 coeff_get (state, samples + 1280, &state->lfe_expbap, &quant, 887 coeff_get (state, samples + 1280, &state->lfe_expbap, &quant,
@@ -910,11 +910,9 @@ int a52_block (a52_state_t * state)
910 910
911 if (coeff[i]) { 911 if (coeff[i]) {
912 if (blksw[i]) 912 if (blksw[i])
913 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i, 913 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i);
914 bias);
915 else 914 else
916 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i, 915 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i);
917 bias);
918 } else { 916 } else {
919 int j; 917 int j;
920 918
@@ -923,28 +921,26 @@ int a52_block (a52_state_t * state)
923 } 921 }
924 } 922 }
925 923
926 a52_downmix (samples, state->acmod, state->output, state->bias, 924 a52_downmix (samples, state->acmod, state->output,
927 state->clev, state->slev); 925 state->clev, state->slev);
928 } else { 926 } else {
929 nfchans = nfchans_tbl[state->output & A52_CHANNEL_MASK]; 927 nfchans = nfchans_tbl[state->output & A52_CHANNEL_MASK];
930 928
931 a52_downmix (samples, state->acmod, state->output, 0, 929 a52_downmix (samples, state->acmod, state->output,
932 state->clev, state->slev); 930 state->clev, state->slev);
933 931
934 if (!state->downmixed) { 932 if (!state->downmixed) {
935 state->downmixed = 1; 933 state->downmixed = 1;
936 a52_downmix (samples + 1536, state->acmod, state->output, 0, 934 a52_downmix (samples + 1536, state->acmod, state->output,
937 state->clev, state->slev); 935 state->clev, state->slev);
938 } 936 }
939 937
940 if (blksw[0]) 938 if (blksw[0])
941 for (i = 0; i < nfchans; i++) 939 for (i = 0; i < nfchans; i++)
942 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i, 940 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i);
943 state->bias);
944 else 941 else
945 for (i = 0; i < nfchans; i++) 942 for (i = 0; i < nfchans; i++)
946 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i, 943 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i);
947 state->bias);
948 } 944 }
949 945
950 return 0; 946 return 0;