summaryrefslogtreecommitdiff
path: root/src/libfaad/sbr_fbt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libfaad/sbr_fbt.c')
-rw-r--r--src/libfaad/sbr_fbt.c71
1 files changed, 46 insertions, 25 deletions
diff --git a/src/libfaad/sbr_fbt.c b/src/libfaad/sbr_fbt.c
index ef7dd7185..511235863 100644
--- a/src/libfaad/sbr_fbt.c
+++ b/src/libfaad/sbr_fbt.c
@@ -22,7 +22,7 @@
** Commercial non-GPL licensing of this software is possible.
** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
**
-** $Id: sbr_fbt.c,v 1.4 2004/12/03 01:15:30 tmattern Exp $
+** $Id: sbr_fbt.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $
**/
/* Calculate frequency band tables */
@@ -197,7 +197,7 @@ uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2,
if (k2 <= k0)
{
sbr->N_master = 0;
- return 0;
+ return 1;
}
dk = bs_alter_scale ? 2 : 1;
@@ -224,7 +224,7 @@ uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2,
if (k2Diff)
{
incr = (k2Diff > 0) ? -1 : 1;
- k = (k2Diff > 0) ? (nrBands-1) : 0;
+ k = (uint8_t) ((k2Diff > 0) ? (nrBands-1) : 0);
while (k2Diff != 0)
{
@@ -236,10 +236,10 @@ uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2,
sbr->f_master[0] = k0;
for (k = 1; k <= nrBands; k++)
- sbr->f_master[k] = sbr->f_master[k-1] + vDk[k-1];
+ sbr->f_master[k] = (uint8_t)(sbr->f_master[k-1] + vDk[k-1]);
- sbr->N_master = nrBands;
- sbr->N_master = min(sbr->N_master, 64);
+ sbr->N_master = (uint8_t)nrBands;
+ sbr->N_master = (min(sbr->N_master, 64));
#if 0
printf("f_master[%d]: ", nrBands);
@@ -355,18 +355,23 @@ uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2,
uint8_t temp1[] = { 6, 5, 4 };
real_t q, qk;
int32_t A_1;
+#ifdef FIXED_POINT
+ real_t rk2, rk0;
+#endif
/* mft only defined for k2 > k0 */
if (k2 <= k0)
{
sbr->N_master = 0;
- return 0;
+ return 1;
}
bands = temp1[bs_freq_scale-1];
#ifdef FIXED_POINT
- if (REAL_CONST(k2) > MUL_R(REAL_CONST(k0),REAL_CONST(2.2449)))
+ rk0 = (real_t)k0 << REAL_BITS;
+ rk2 = (real_t)k2 << REAL_BITS;
+ if (rk2 > MUL_C(rk0, COEF_CONST(2.2449)))
#else
if ((float)k2/(float)k0 > 2.2449)
#endif
@@ -378,16 +383,18 @@ uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2,
k1 = k2;
}
- nrBand0 = 2 * find_bands(0, bands, k0, k1);
+ nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1));
nrBand0 = min(nrBand0, 63);
if (nrBand0 <= 0)
return 1;
q = find_initial_power(nrBand0, k0, k1);
- qk = REAL_CONST(k0);
#ifdef FIXED_POINT
- A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
+ qk = (real_t)k0 << REAL_BITS;
+ //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
+ A_1 = k0;
#else
+ qk = REAL_CONST(k0);
A_1 = (int32_t)(qk + .5);
#endif
for (k = 0; k <= nrBand0; k++)
@@ -417,21 +424,23 @@ uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2,
if (!twoRegions)
{
for (k = 0; k <= nrBand0; k++)
- sbr->f_master[k] = vk0[k];
+ sbr->f_master[k] = (uint8_t) vk0[k];
sbr->N_master = nrBand0;
sbr->N_master = min(sbr->N_master, 64);
return 0;
}
- nrBand1 = 2 * find_bands(1 /* warped */, bands, k1, k2);
+ nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2));
nrBand1 = min(nrBand1, 63);
q = find_initial_power(nrBand1, k1, k2);
- qk = REAL_CONST(k1);
#ifdef FIXED_POINT
- A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
+ qk = (real_t)k1 << REAL_BITS;
+ //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS);
+ A_1 = k1;
#else
+ qk = REAL_CONST(k1);
A_1 = (int32_t)(qk + .5);
#endif
for (k = 0; k <= nrBand1 - 1; k++)
@@ -472,11 +481,11 @@ uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2,
sbr->N_master = min(sbr->N_master, 64);
for (k = 0; k <= nrBand0; k++)
{
- sbr->f_master[k] = vk0[k];
+ sbr->f_master[k] = (uint8_t) vk0[k];
}
for (k = nrBand0 + 1; k <= sbr->N_master; k++)
{
- sbr->f_master[k] = vk1[k - nrBand0];
+ sbr->f_master[k] = (uint8_t) vk1[k - nrBand0];
}
#if 0
@@ -527,11 +536,13 @@ uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band,
if (k == 0)
i = 0;
else
- i = 2*k - minus;
+ i = (uint8_t)(2*k - minus);
sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i];
}
#if 0
+ printf("bs_freq_scale: %d\n", sbr->bs_freq_scale);
+ printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands);
printf("f_table_res[HI_RES][%d]: ", sbr->N_high);
for (k = 0; k <= sbr->N_high; k++)
{
@@ -556,7 +567,7 @@ uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band,
#if 0
sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5));
#else
- sbr->N_Q = max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2));
+ sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2)));
#endif
sbr->N_Q = min(5, sbr->N_Q);
}
@@ -592,7 +603,7 @@ uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band,
printf("f_table_noise[%d]: ", sbr->N_Q);
for (k = 0; k <= sbr->N_Q; k++)
{
- printf("%d ", sbr->f_table_noise[k]);
+ printf("%d ", sbr->f_table_noise[k] - sbr->kx);
}
printf("\n");
#endif
@@ -611,8 +622,8 @@ void limiter_frequency_table(sbr_info *sbr)
static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2),
REAL_CONST(2), REAL_CONST(3) };
#else
- static const real_t limiterBandsCompare[] = { REAL_CONST(1.328125),
- REAL_CONST(1.1875), REAL_CONST(1.125) };
+ static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152),
+ REAL_CONST(1.185093), REAL_CONST(1.119872) };
#endif
uint8_t k, s;
int8_t nrLim;
@@ -624,6 +635,15 @@ void limiter_frequency_table(sbr_info *sbr)
sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx;
sbr->N_L[0] = 1;
+#if 0
+ printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]);
+ for (k = 0; k <= sbr->N_L[0]; k++)
+ {
+ printf("%d ", sbr->f_table_lim[0][k]);
+ }
+ printf("\n");
+#endif
+
for (s = 1; s < 4; s++)
{
int32_t limTable[100 /*TODO*/] = {0};
@@ -664,17 +684,18 @@ restart:
if (limTable[k-1] != 0)
#if 0
nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0));
-#endif
+#else
#ifdef FIXED_POINT
- nOctaves = SBR_DIV(REAL_CONST(limTable[k]),REAL_CONST(limTable[k-1]));
+ nOctaves = DIV_R((limTable[k]<<REAL_BITS),REAL_CONST(limTable[k-1]));
#else
nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1];
#endif
+#endif
else
nOctaves = 0;
#if 0
- if ((MUL(nOctaves,limBands)) < REAL_CONST(0.49))
+ if ((MUL_R(nOctaves,limBands)) < REAL_CONST(0.49))
#else
if (nOctaves < limiterBandsCompare[s - 1])
#endif