comparison libfaad2/sbr_fbt.c @ 13453:6d50ef45a058

Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12. patch by adland <adland123 at yahoo dot com>
author diego
date Fri, 24 Sep 2004 17:31:36 +0000
parents d81145997036
children 2ae5ab4331ca
comparison
equal deleted inserted replaced
13452:c364b7c13dd8 13453:6d50ef45a058
21 ** 21 **
22 ** Commercial non-GPL licensing of this software is possible. 22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. 23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24 ** 24 **
25 ** Initially modified for use with MPlayer by Arpad Gereöffy on 2003/08/30 25 ** Initially modified for use with MPlayer by Arpad Gereöffy on 2003/08/30
26 ** $Id: sbr_fbt.c,v 1.3 2004/06/02 22:59:03 diego Exp $ 26 ** $Id: sbr_fbt.c,v 1.4 2004/06/23 13:50:51 diego Exp $
27 ** detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ 27 ** detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
28 **/ 28 **/
29 29
30 /* Calculate frequency band tables */ 30 /* Calculate frequency band tables */
31 31
224 vDk[k] = dk; 224 vDk[k] = dk;
225 225
226 if (k2Diff) 226 if (k2Diff)
227 { 227 {
228 incr = (k2Diff > 0) ? -1 : 1; 228 incr = (k2Diff > 0) ? -1 : 1;
229 k = (k2Diff > 0) ? (nrBands-1) : 0; 229 k = (uint8_t) ((k2Diff > 0) ? (nrBands-1) : 0);
230 230
231 while (k2Diff != 0) 231 while (k2Diff != 0)
232 { 232 {
233 vDk[k] -= incr; 233 vDk[k] -= incr;
234 k += incr; 234 k += incr;
236 } 236 }
237 } 237 }
238 238
239 sbr->f_master[0] = k0; 239 sbr->f_master[0] = k0;
240 for (k = 1; k <= nrBands; k++) 240 for (k = 1; k <= nrBands; k++)
241 sbr->f_master[k] = sbr->f_master[k-1] + vDk[k-1]; 241 sbr->f_master[k] = (uint8_t)(sbr->f_master[k-1] + vDk[k-1]);
242 242
243 sbr->N_master = nrBands; 243 sbr->N_master = (uint8_t)nrBands;
244 sbr->N_master = min(sbr->N_master, 64); 244 sbr->N_master = (min(sbr->N_master, 64));
245 245
246 #if 0 246 #if 0
247 printf("f_master[%d]: ", nrBands); 247 printf("f_master[%d]: ", nrBands);
248 for (k = 0; k <= nrBands; k++) 248 for (k = 0; k <= nrBands; k++)
249 { 249 {
355 int32_t vDk0[64] = {0}, vDk1[64] = {0}; 355 int32_t vDk0[64] = {0}, vDk1[64] = {0};
356 int32_t vk0[64] = {0}, vk1[64] = {0}; 356 int32_t vk0[64] = {0}, vk1[64] = {0};
357 uint8_t temp1[] = { 6, 5, 4 }; 357 uint8_t temp1[] = { 6, 5, 4 };
358 real_t q, qk; 358 real_t q, qk;
359 int32_t A_1; 359 int32_t A_1;
360 #ifdef FIXED_POINT
361 real_t rk2, rk0;
362 #endif
360 363
361 /* mft only defined for k2 > k0 */ 364 /* mft only defined for k2 > k0 */
362 if (k2 <= k0) 365 if (k2 <= k0)
363 { 366 {
364 sbr->N_master = 0; 367 sbr->N_master = 0;
366 } 369 }
367 370
368 bands = temp1[bs_freq_scale-1]; 371 bands = temp1[bs_freq_scale-1];
369 372
370 #ifdef FIXED_POINT 373 #ifdef FIXED_POINT
371 if (REAL_CONST(k2) > MUL_R(REAL_CONST(k0),REAL_CONST(2.2449))) 374 rk0 = (real_t)k0 << REAL_BITS;
375 rk2 = (real_t)k2 << REAL_BITS;
376 if (rk2 > MUL_C(rk0, COEF_CONST(2.2449)))
372 #else 377 #else
373 if ((float)k2/(float)k0 > 2.2449) 378 if ((float)k2/(float)k0 > 2.2449)
374 #endif 379 #endif
375 { 380 {
376 twoRegions = 1; 381 twoRegions = 1;
378 } else { 383 } else {
379 twoRegions = 0; 384 twoRegions = 0;
380 k1 = k2; 385 k1 = k2;
381 } 386 }
382 387
383 nrBand0 = 2 * find_bands(0, bands, k0, k1); 388 nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1));
384 nrBand0 = min(nrBand0, 63); 389 nrBand0 = min(nrBand0, 63);
385 if (nrBand0 <= 0) 390 if (nrBand0 <= 0)
386 return 1; 391 return 1;
387 392
388 q = find_initial_power(nrBand0, k0, k1); 393 q = find_initial_power(nrBand0, k0, k1);
394 #ifdef FIXED_POINT
395 qk = (real_t)k0 << REAL_BITS;
396 //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
397 A_1 = k0;
398 #else
389 qk = REAL_CONST(k0); 399 qk = REAL_CONST(k0);
390 #ifdef FIXED_POINT
391 A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
392 #else
393 A_1 = (int32_t)(qk + .5); 400 A_1 = (int32_t)(qk + .5);
394 #endif 401 #endif
395 for (k = 0; k <= nrBand0; k++) 402 for (k = 0; k <= nrBand0; k++)
396 { 403 {
397 int32_t A_0 = A_1; 404 int32_t A_0 = A_1;
417 } 424 }
418 425
419 if (!twoRegions) 426 if (!twoRegions)
420 { 427 {
421 for (k = 0; k <= nrBand0; k++) 428 for (k = 0; k <= nrBand0; k++)
422 sbr->f_master[k] = vk0[k]; 429 sbr->f_master[k] = (uint8_t) vk0[k];
423 430
424 sbr->N_master = nrBand0; 431 sbr->N_master = nrBand0;
425 sbr->N_master = min(sbr->N_master, 64); 432 sbr->N_master = min(sbr->N_master, 64);
426 return 0; 433 return 0;
427 } 434 }
428 435
429 nrBand1 = 2 * find_bands(1 /* warped */, bands, k1, k2); 436 nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2));
430 nrBand1 = min(nrBand1, 63); 437 nrBand1 = min(nrBand1, 63);
431 438
432 q = find_initial_power(nrBand1, k1, k2); 439 q = find_initial_power(nrBand1, k1, k2);
440 #ifdef FIXED_POINT
441 qk = (real_t)k1 << REAL_BITS;
442 //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
443 A_1 = k1;
444 #else
433 qk = REAL_CONST(k1); 445 qk = REAL_CONST(k1);
434 #ifdef FIXED_POINT
435 A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
436 #else
437 A_1 = (int32_t)(qk + .5); 446 A_1 = (int32_t)(qk + .5);
438 #endif 447 #endif
439 for (k = 0; k <= nrBand1 - 1; k++) 448 for (k = 0; k <= nrBand1 - 1; k++)
440 { 449 {
441 int32_t A_0 = A_1; 450 int32_t A_0 = A_1;
472 481
473 sbr->N_master = nrBand0 + nrBand1; 482 sbr->N_master = nrBand0 + nrBand1;
474 sbr->N_master = min(sbr->N_master, 64); 483 sbr->N_master = min(sbr->N_master, 64);
475 for (k = 0; k <= nrBand0; k++) 484 for (k = 0; k <= nrBand0; k++)
476 { 485 {
477 sbr->f_master[k] = vk0[k]; 486 sbr->f_master[k] = (uint8_t) vk0[k];
478 } 487 }
479 for (k = nrBand0 + 1; k <= sbr->N_master; k++) 488 for (k = nrBand0 + 1; k <= sbr->N_master; k++)
480 { 489 {
481 sbr->f_master[k] = vk1[k - nrBand0]; 490 sbr->f_master[k] = (uint8_t) vk1[k - nrBand0];
482 } 491 }
483 492
484 #if 0 493 #if 0
485 printf("f_master[%d]: ", sbr->N_master); 494 printf("f_master[%d]: ", sbr->N_master);
486 for (k = 0; k <= sbr->N_master; k++) 495 for (k = 0; k <= sbr->N_master; k++)
527 for (k = 0; k <= sbr->N_low; k++) 536 for (k = 0; k <= sbr->N_low; k++)
528 { 537 {
529 if (k == 0) 538 if (k == 0)
530 i = 0; 539 i = 0;
531 else 540 else
532 i = 2*k - minus; 541 i = (uint8_t)(2*k - minus);
533 sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; 542 sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i];
534 } 543 }
535 544
536 #if 0 545 #if 0
546 printf("bs_freq_scale: %d\n", sbr->bs_freq_scale);
547 printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands);
537 printf("f_table_res[HI_RES][%d]: ", sbr->N_high); 548 printf("f_table_res[HI_RES][%d]: ", sbr->N_high);
538 for (k = 0; k <= sbr->N_high; k++) 549 for (k = 0; k <= sbr->N_high; k++)
539 { 550 {
540 printf("%d ", sbr->f_table_res[HI_RES][k]); 551 printf("%d ", sbr->f_table_res[HI_RES][k]);
541 } 552 }
556 sbr->N_Q = 1; 567 sbr->N_Q = 1;
557 } else { 568 } else {
558 #if 0 569 #if 0
559 sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); 570 sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5));
560 #else 571 #else
561 sbr->N_Q = max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2)); 572 sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2)));
562 #endif 573 #endif
563 sbr->N_Q = min(5, sbr->N_Q); 574 sbr->N_Q = min(5, sbr->N_Q);
564 } 575 }
565 576
566 for (k = 0; k <= sbr->N_Q; k++) 577 for (k = 0; k <= sbr->N_Q; k++)
592 603
593 #if 0 604 #if 0
594 printf("f_table_noise[%d]: ", sbr->N_Q); 605 printf("f_table_noise[%d]: ", sbr->N_Q);
595 for (k = 0; k <= sbr->N_Q; k++) 606 for (k = 0; k <= sbr->N_Q; k++)
596 { 607 {
597 printf("%d ", sbr->f_table_noise[k]); 608 printf("%d ", sbr->f_table_noise[k] - sbr->kx);
598 } 609 }
599 printf("\n"); 610 printf("\n");
600 #endif 611 #endif
601 612
602 return 0; 613 return 0;
611 { 622 {
612 #if 0 623 #if 0
613 static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), 624 static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2),
614 REAL_CONST(2), REAL_CONST(3) }; 625 REAL_CONST(2), REAL_CONST(3) };
615 #else 626 #else
616 static const real_t limiterBandsCompare[] = { REAL_CONST(1.328125), 627 static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152),
617 REAL_CONST(1.1875), REAL_CONST(1.125) }; 628 REAL_CONST(1.185093), REAL_CONST(1.119872) };
618 #endif 629 #endif
619 uint8_t k, s; 630 uint8_t k, s;
620 int8_t nrLim; 631 int8_t nrLim;
621 #if 0 632 #if 0
622 real_t limBands; 633 real_t limBands;
623 #endif 634 #endif
624 635
625 sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; 636 sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx;
626 sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; 637 sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx;
627 sbr->N_L[0] = 1; 638 sbr->N_L[0] = 1;
639
640 #if 0
641 printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]);
642 for (k = 0; k <= sbr->N_L[0]; k++)
643 {
644 printf("%d ", sbr->f_table_lim[0][k]);
645 }
646 printf("\n");
647 #endif
628 648
629 for (s = 1; s < 4; s++) 649 for (s = 1; s < 4; s++)
630 { 650 {
631 int32_t limTable[100 /*TODO*/] = {0}; 651 int32_t limTable[100 /*TODO*/] = {0};
632 uint8_t patchBorders[64/*??*/] = {0}; 652 uint8_t patchBorders[64/*??*/] = {0};
664 real_t nOctaves; 684 real_t nOctaves;
665 685
666 if (limTable[k-1] != 0) 686 if (limTable[k-1] != 0)
667 #if 0 687 #if 0
668 nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); 688 nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0));
669 #endif 689 #else
670 #ifdef FIXED_POINT 690 #ifdef FIXED_POINT
671 nOctaves = SBR_DIV(REAL_CONST(limTable[k]),REAL_CONST(limTable[k-1])); 691 nOctaves = DIV_R((limTable[k]<<REAL_BITS),REAL_CONST(limTable[k-1]));
672 #else 692 #else
673 nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1]; 693 nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1];
694 #endif
674 #endif 695 #endif
675 else 696 else
676 nOctaves = 0; 697 nOctaves = 0;
677 698
678 #if 0 699 #if 0
679 if ((MUL(nOctaves,limBands)) < REAL_CONST(0.49)) 700 if ((MUL_R(nOctaves,limBands)) < REAL_CONST(0.49))
680 #else 701 #else
681 if (nOctaves < limiterBandsCompare[s - 1]) 702 if (nOctaves < limiterBandsCompare[s - 1])
682 #endif 703 #endif
683 { 704 {
684 uint8_t i; 705 uint8_t i;