summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmad/layer3.c
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/libmad/layer3.c') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmad/layer3.c150
1 files changed, 80 insertions, 70 deletions
diff --git a/core/multimedia/opieplayer/libmad/layer3.c b/core/multimedia/opieplayer/libmad/layer3.c
index 194fc7e..03f13fe 100644
--- a/core/multimedia/opieplayer/libmad/layer3.c
+++ b/core/multimedia/opieplayer/libmad/layer3.c
@@ -1,6 +1,6 @@
/*
- * mad - MPEG audio decoder
+ * libmad - MPEG audio decoder library
* Copyright (C) 2000-2001 Robert Leslie
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -26,9 +26,12 @@
# include "libmad_global.h"
# include <stdlib.h>
# include <string.h>
-# include <assert.h>
+
+# ifdef HAVE_ASSERT_H
+# include <assert.h>
+# endif
# ifdef HAVE_LIMITS_H
# include <limits.h>
# else
@@ -50,8 +53,13 @@ enum {
preflag = 0x04,
mixed_block_flag = 0x08
};
+enum {
+ I_STEREO = 0x1,
+ MS_STEREO = 0x2
+};
+
struct sideinfo {
unsigned int main_data_begin;
unsigned int private_bits;
@@ -502,9 +510,9 @@ enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
unsigned int *data_bitlen,
unsigned int *priv_bitlen)
{
unsigned int ngr, gr, ch, i;
- enum mad_error result = 0;
+ enum mad_error result = MAD_ERROR_NONE;
*data_bitlen = 0;
*priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
@@ -601,9 +609,9 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
scalefac_compress = channel->scalefac_compress;
index = (channel->block_type == 2) ?
((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
- if (!((mode_extension & 0x1) && gr1ch)) {
+ if (!((mode_extension & I_STEREO) && gr1ch)) {
if (scalefac_compress < 400) {
slen[0] = (scalefac_compress >> 4) / 5;
slen[1] = (scalefac_compress >> 4) % 5;
slen[2] = (scalefac_compress % 16) >> 2;
@@ -642,9 +650,9 @@ unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
while (n < 39)
channel->scalefac[n++] = 0;
}
- else { /* (mode_extension & 0x1) && gr1ch (i.e. ch == 1) */
+ else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
scalefac_compress >>= 1;
if (scalefac_compress < 180) {
slen[0] = scalefac_compress / 36;
@@ -774,8 +782,30 @@ unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
return mad_bit_length(&start, ptr);
}
/*
+ * The Layer III formula for requantization and scaling is defined by
+ * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
+ *
+ * long blocks:
+ * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
+ * 2^((1/4) * (global_gain - 210)) *
+ * 2^-(scalefac_multiplier *
+ * (scalefac_l[sfb] + preflag * pretab[sfb]))
+ *
+ * short blocks:
+ * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
+ * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
+ * 2^-(scalefac_multiplier * scalefac_s[sfb][w])
+ *
+ * where:
+ * scalefac_multiplier = (scalefac_scale + 1) / 2
+ *
+ * The routines III_exponents() and III_requantize() facilitate this
+ * calculation.
+ */
+
+/*
* NAME: III_exponents()
* DESCRIPTION: calculate scalefactor exponents
*/
static
@@ -855,25 +885,9 @@ mad_fixed_t III_requantize(unsigned int value, signed int exp)
mad_fixed_t requantized;
signed int frac;
struct fixedfloat const *power;
- /*
- * long blocks:
- * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
- * 2^((1/4) * (global_gain - 210)) *
- * 2^-(scalefac_multiplier *
- * (scalefac_l[sfb] + preflag * pretab[sfb]))
- *
- * short blocks:
- * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
- * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
- * 2^-(scalefac_multiplier * scalefac_s[sfb][w])
- *
- * where:
- * scalefac_multiplier = (scalefac_scale + 1) / 2
- */
-
- frac = exp % 4;
+ frac = exp % 4; /* assumes sign(frac) == sign(exp) */
exp /= 4;
power = &rq_table[value];
requantized = power->mantissa;
@@ -883,10 +897,12 @@ mad_fixed_t III_requantize(unsigned int value, signed int exp)
if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
/* underflow */
requantized = 0;
}
- else
+ else {
+ requantized += 1L << (-exp - 1);
requantized >>= -exp;
+ }
}
else {
if (exp >= 5) {
/* overflow */
@@ -1250,9 +1266,9 @@ enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
xrptr += 2;
}
- return 0;
+ return MAD_ERROR_NONE;
}
# undef MASK
# undef MASK1BIT
@@ -1265,39 +1281,41 @@ static
void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
unsigned char const sfbwidth[39])
{
mad_fixed_t tmp[32][3][6];
- unsigned int sb, l, sfbi, f, w, sbw[3], sw[3];
+ unsigned int sb, l, f, w, sbw[3], sw[3];
/* this is probably wrong for 8000 Hz mixed blocks */
- if (channel->flags & mixed_block_flag)
- sb = 2, sfbi = 3 * 3;
- else
- sb = 0, sfbi = 0;
+ sb = 0;
+ if (channel->flags & mixed_block_flag) {
+ sb = 2;
+
+ l = 0;
+ while (l < 36)
+ l += *sfbwidth++;
+ }
for (w = 0; w < 3; ++w) {
sbw[w] = sb;
sw[w] = 0;
}
- f = sfbwidth[sfbi];
+ f = *sfbwidth++;
w = 0;
for (l = 18 * sb; l < 576; ++l) {
+ if (f-- == 0) {
+ f = *sfbwidth++ - 1;
+ w = (w + 1) % 3;
+ }
+
tmp[sbw[w]][w][sw[w]++] = xr[l];
if (sw[w] == 6) {
sw[w] = 0;
++sbw[w];
}
-
- if (--f == 0) {
- if (++w == 3)
- w = 0;
-
- f = sfbwidth[++sfbi];
- }
}
memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
}
@@ -1314,13 +1332,8 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
{
short modes[39];
unsigned int sfbi, l, n, i;
- enum {
- i_stereo = 0x1,
- ms_stereo = 0x2
- };
-
if (granule->ch[0].block_type !=
granule->ch[1].block_type ||
(granule->ch[0].flags & mixed_block_flag) !=
(granule->ch[1].flags & mixed_block_flag))
@@ -1330,9 +1343,9 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
modes[i] = header->mode_extension;
/* intensity stereo */
- if (header->mode_extension & i_stereo) {
+ if (header->mode_extension & I_STEREO) {
struct channel const *right_ch = &granule->ch[1];
mad_fixed_t const *right_xr = xr[1];
unsigned int is_pos;
@@ -1386,16 +1399,16 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
/* long blocks */
for (i = 0; i < lower; ++i)
- modes[i] = header->mode_extension & ~i_stereo;
+ modes[i] = header->mode_extension & ~I_STEREO;
/* short blocks */
w = 0;
for (i = start; i < max; ++i) {
if (i < bound[w])
- modes[i] = header->mode_extension & ~i_stereo;
+ modes[i] = header->mode_extension & ~I_STEREO;
w = (w + 1) % 3;
}
}
@@ -1416,9 +1429,9 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
right_xr += n;
}
for (i = 0; i < bound; ++i)
- modes[i] = header->mode_extension & ~i_stereo;
+ modes[i] = header->mode_extension & ~I_STEREO;
}
/* now do the actual processing */
@@ -1431,13 +1444,13 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
n = sfbwidth[sfbi];
- if (!(modes[sfbi] & i_stereo))
+ if (!(modes[sfbi] & I_STEREO))
continue;
if (illegal_pos[sfbi]) {
- modes[sfbi] &= ~i_stereo;
+ modes[sfbi] &= ~I_STEREO;
continue;
}
is_pos = right_ch->scalefac[sfbi];
@@ -1467,15 +1480,15 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
n = sfbwidth[sfbi];
- if (!(modes[sfbi] & i_stereo))
+ if (!(modes[sfbi] & I_STEREO))
continue;
is_pos = right_ch->scalefac[sfbi];
if (is_pos >= 7) { /* illegal intensity position */
- modes[sfbi] &= ~i_stereo;
+ modes[sfbi] &= ~I_STEREO;
continue;
}
for (i = 0; i < n; ++i) {
@@ -1491,9 +1504,9 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
}
/* middle/side stereo */
- if (header->mode_extension & ms_stereo) {
+ if (header->mode_extension & MS_STEREO) {
register mad_fixed_t invsqrt2;
header->flags |= MAD_FLAG_MS_STEREO;
@@ -1501,9 +1514,9 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
n = sfbwidth[sfbi];
- if (modes[sfbi] != ms_stereo)
+ if (modes[sfbi] != MS_STEREO)
continue;
for (i = 0; i < n; ++i) {
register mad_fixed_t m, s;
@@ -1516,9 +1529,9 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576],
}
}
}
- return 0;
+ return MAD_ERROR_NONE;
}
/*
* NAME: III_aliasreduce()
@@ -1532,30 +1545,27 @@ void III_aliasreduce(mad_fixed_t xr[576], int lines)
bound = &xr[lines];
for (xr += 18; xr < bound; xr += 18) {
for (i = 0; i < 8; ++i) {
- register mad_fixed_t *aptr, *bptr, a, b;
+ register mad_fixed_t a, b;
register mad_fixed64hi_t hi;
register mad_fixed64lo_t lo;
- aptr = &xr[-1 - i];
- bptr = &xr[ i];
-
- a = *aptr;
- b = *bptr;
+ a = xr[-1 - i];
+ b = xr[ i];
# if defined(ASO_ZEROCHECK)
if (a | b) {
# endif
MAD_F_ML0(hi, lo, a, cs[i]);
MAD_F_MLA(hi, lo, -b, ca[i]);
- *aptr = MAD_F_MLZ(hi, lo);
+ xr[-1 - i] = MAD_F_MLZ(hi, lo);
MAD_F_ML0(hi, lo, b, cs[i]);
MAD_F_MLA(hi, lo, a, ca[i]);
- *bptr = MAD_F_MLZ(hi, lo);
+ xr[ i] = MAD_F_MLZ(hi, lo);
# if defined(ASO_ZEROCHECK)
}
# endif
}
@@ -2140,10 +2150,10 @@ void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
* NAME: III_decode()
* DESCRIPTION: decode frame main_data
*/
static
-int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
- struct sideinfo *si, unsigned int nch)
+enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
+ struct sideinfo *si, unsigned int nch)
{
struct mad_header *header = &frame->header;
unsigned int sfreqi, ngr, gr;
@@ -2168,20 +2178,20 @@ int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
for (gr = 0; gr < ngr; ++gr) {
struct granule *granule = &si->gr[gr];
- unsigned char const *sfbwidth = 0;
+ unsigned char const *sfbwidth[2];
mad_fixed_t xr[2][576];
unsigned int ch;
enum mad_error error;
for (ch = 0; ch < nch; ++ch) {
struct channel *channel = &granule->ch[ch];
unsigned int part2_length;
- sfbwidth = sfbwidth_table[sfreqi].l;
+ sfbwidth[ch] = sfbwidth_table[sfreqi].l;
if (channel->block_type == 2) {
- sfbwidth = (channel->flags & mixed_block_flag) ?
+ sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
}
if (header->flags & MAD_FLAG_LSF_EXT) {
@@ -2193,17 +2203,17 @@ int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
gr == 0 ? 0 : si->scfsi[ch]);
}
- error = III_huffdecode(ptr, xr[ch], channel, sfbwidth, part2_length);
+ error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
if (error)
return error;
}
/* joint stereo processing */
if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
- error = III_stereo(xr, granule, header, sfbwidth);
+ error = III_stereo(xr, granule, header, sfbwidth[0]);
if (error)
return error;
}
@@ -2215,9 +2225,9 @@ int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
unsigned int sb, l, i, sblimit;
mad_fixed_t output[36];
if (channel->block_type == 2) {
- III_reorder(xr[ch], channel, sfbwidth_table[sfreqi].s);
+ III_reorder(xr[ch], channel, sfbwidth[ch]);
# if !defined(OPT_STRICT)
/*
* According to ISO/IEC 11172-3, "Alias reduction is not applied for
@@ -2299,9 +2309,9 @@ int III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
}
}
}
- return 0;
+ return MAD_ERROR_NONE;
}
/*
* NAME: layer->III()