diff options
author | Dave Hooper <dave@beermex.com> | 2010-02-17 00:49:53 +0000 |
---|---|---|
committer | Dave Hooper <dave@beermex.com> | 2010-02-17 00:49:53 +0000 |
commit | 42774d3128b91d5a37344cb40d56d3c4d147e5f2 (patch) | |
tree | bf336b407992ec9a5e454556f3351e3f8a0d10de /apps/codecs/liba52 | |
parent | 62257ebc38bc0a3095b25dd0f58c4c8215edf602 (diff) | |
download | rockbox-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.h | 8 | ||||
-rw-r--r-- | apps/codecs/liba52/downmix.c | 76 | ||||
-rw-r--r-- | apps/codecs/liba52/imdct.c | 133 | ||||
-rw-r--r-- | apps/codecs/liba52/parse.c | 20 |
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); |
112 | int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, | 112 | int 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); |
114 | void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, | 114 | void a52_downmix (sample_t * samples, int acmod, int output, |
115 | level_t clev, level_t slev); | 115 | level_t clev, level_t slev); |
116 | void a52_upmix (sample_t * samples, int acmod, int output); | 116 | void a52_upmix (sample_t * samples, int acmod, int output); |
117 | 117 | ||
118 | void a52_imdct_init (uint32_t mm_accel); | 118 | void a52_imdct_init (uint32_t mm_accel); |
119 | void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias); | 119 | void a52_imdct_256 (sample_t * data, sample_t * delay); |
120 | void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias); | 120 | void 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 | ||
332 | static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias) | 332 | static 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 | ||
340 | static void mix3to1 (sample_t * samples, sample_t bias) | 340 | static 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 | ||
348 | static void mix4to1 (sample_t * samples, sample_t bias) | 348 | static 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 | ||
357 | static void mix5to1 (sample_t * samples, sample_t bias) | 357 | static 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 | ||
366 | static void mix3to2 (sample_t * samples, sample_t bias) | 366 | static 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 | ||
378 | static void mix21to2 (sample_t * left, sample_t * right, sample_t bias) | 378 | static 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 | ||
390 | static void mix21toS (sample_t * samples, sample_t bias) | 390 | static 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 | ||
402 | static void mix31to2 (sample_t * samples, sample_t bias) | 402 | static 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 | ||
414 | static void mix31toS (sample_t * samples, sample_t bias) | 414 | static 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 | ||
427 | static void mix22toS (sample_t * samples, sample_t bias) | 427 | static 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 | ||
439 | static void mix32to2 (sample_t * samples, sample_t bias) | 439 | static 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 | ||
451 | static void mix32toS (sample_t * samples, sample_t bias) | 451 | static 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 | ||
464 | static void move2to1 (sample_t * src, sample_t * dest, sample_t bias) | 464 | static 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 | ||
480 | void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, | 480 | void 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 | /* | ||
75 | static void (* ifft128) (complex_t * buf); | 77 | static void (* ifft128) (complex_t * buf); |
76 | static void (* ifft64) (complex_t * buf); | 78 | static 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 | */ | |
259 | void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias) | 261 | void 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 | ||
296 | void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias) | 299 | void 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) | |||
361 | void a52_imdct_init (uint32_t mm_accel) | 366 | void 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; |