MP3 Player. You can change fwd/rev speed and skip. see: http://mbed.org/users/okini3939/notebook/lpc4088_madplayer/

Dependencies:   I2SSlave SDFileSystem TLV320 mbed

Committer:
okini3939
Date:
Tue Feb 18 00:22:50 2014 +0000
Revision:
0:8ba6230eefbd
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:8ba6230eefbd 1 /*
okini3939 0:8ba6230eefbd 2 * libmad - MPEG audio decoder library
okini3939 0:8ba6230eefbd 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
okini3939 0:8ba6230eefbd 4 *
okini3939 0:8ba6230eefbd 5 * This program is free software; you can redistribute it and/or modify
okini3939 0:8ba6230eefbd 6 * it under the terms of the GNU General Public License as published by
okini3939 0:8ba6230eefbd 7 * the Free Software Foundation; either version 2 of the License, or
okini3939 0:8ba6230eefbd 8 * (at your option) any later version.
okini3939 0:8ba6230eefbd 9 *
okini3939 0:8ba6230eefbd 10 * This program is distributed in the hope that it will be useful,
okini3939 0:8ba6230eefbd 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
okini3939 0:8ba6230eefbd 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
okini3939 0:8ba6230eefbd 13 * GNU General Public License for more details.
okini3939 0:8ba6230eefbd 14 *
okini3939 0:8ba6230eefbd 15 * You should have received a copy of the GNU General Public License
okini3939 0:8ba6230eefbd 16 * along with this program; if not, write to the Free Software
okini3939 0:8ba6230eefbd 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
okini3939 0:8ba6230eefbd 18 *
okini3939 0:8ba6230eefbd 19 * $Id: layer12.c,v 1.1 2010/11/23 20:12:57 andy Exp $
okini3939 0:8ba6230eefbd 20 */
okini3939 0:8ba6230eefbd 21
okini3939 0:8ba6230eefbd 22 # include "config.h"
okini3939 0:8ba6230eefbd 23
okini3939 0:8ba6230eefbd 24 # include "global.h"
okini3939 0:8ba6230eefbd 25
okini3939 0:8ba6230eefbd 26 # ifdef HAVE_LIMITS_H
okini3939 0:8ba6230eefbd 27 # include <limits.h>
okini3939 0:8ba6230eefbd 28 # else
okini3939 0:8ba6230eefbd 29 # define CHAR_BIT 8
okini3939 0:8ba6230eefbd 30 # endif
okini3939 0:8ba6230eefbd 31
okini3939 0:8ba6230eefbd 32 # include "fixed.h"
okini3939 0:8ba6230eefbd 33 # include "bit.h"
okini3939 0:8ba6230eefbd 34 # include "stream.h"
okini3939 0:8ba6230eefbd 35 # include "frame.h"
okini3939 0:8ba6230eefbd 36 # include "layer12.h"
okini3939 0:8ba6230eefbd 37
okini3939 0:8ba6230eefbd 38 /*
okini3939 0:8ba6230eefbd 39 * scalefactor table
okini3939 0:8ba6230eefbd 40 * used in both Layer I and Layer II decoding
okini3939 0:8ba6230eefbd 41 */
okini3939 0:8ba6230eefbd 42 # include "sf_table.h"
okini3939 0:8ba6230eefbd 43
okini3939 0:8ba6230eefbd 44 /* --- Layer I ------------------------------------------------------------- */
okini3939 0:8ba6230eefbd 45
okini3939 0:8ba6230eefbd 46 /* linear scaling table */
okini3939 0:8ba6230eefbd 47 static
okini3939 0:8ba6230eefbd 48 mad_fixed_t const linear_table[14] = {
okini3939 0:8ba6230eefbd 49 MAD_F(0x15555555), /* 2^2 / (2^2 - 1) == 1.33333333333333 */
okini3939 0:8ba6230eefbd 50 MAD_F(0x12492492), /* 2^3 / (2^3 - 1) == 1.14285714285714 */
okini3939 0:8ba6230eefbd 51 MAD_F(0x11111111), /* 2^4 / (2^4 - 1) == 1.06666666666667 */
okini3939 0:8ba6230eefbd 52 MAD_F(0x10842108), /* 2^5 / (2^5 - 1) == 1.03225806451613 */
okini3939 0:8ba6230eefbd 53 MAD_F(0x10410410), /* 2^6 / (2^6 - 1) == 1.01587301587302 */
okini3939 0:8ba6230eefbd 54 MAD_F(0x10204081), /* 2^7 / (2^7 - 1) == 1.00787401574803 */
okini3939 0:8ba6230eefbd 55 MAD_F(0x10101010), /* 2^8 / (2^8 - 1) == 1.00392156862745 */
okini3939 0:8ba6230eefbd 56 MAD_F(0x10080402), /* 2^9 / (2^9 - 1) == 1.00195694716243 */
okini3939 0:8ba6230eefbd 57 MAD_F(0x10040100), /* 2^10 / (2^10 - 1) == 1.00097751710655 */
okini3939 0:8ba6230eefbd 58 MAD_F(0x10020040), /* 2^11 / (2^11 - 1) == 1.00048851978505 */
okini3939 0:8ba6230eefbd 59 MAD_F(0x10010010), /* 2^12 / (2^12 - 1) == 1.00024420024420 */
okini3939 0:8ba6230eefbd 60 MAD_F(0x10008004), /* 2^13 / (2^13 - 1) == 1.00012208521548 */
okini3939 0:8ba6230eefbd 61 MAD_F(0x10004001), /* 2^14 / (2^14 - 1) == 1.00006103888177 */
okini3939 0:8ba6230eefbd 62 MAD_F(0x10002000) /* 2^15 / (2^15 - 1) == 1.00003051850948 */
okini3939 0:8ba6230eefbd 63 };
okini3939 0:8ba6230eefbd 64
okini3939 0:8ba6230eefbd 65 /*
okini3939 0:8ba6230eefbd 66 * NAME: I_sample()
okini3939 0:8ba6230eefbd 67 * DESCRIPTION: decode one requantized Layer I sample from a bitstream
okini3939 0:8ba6230eefbd 68 */
okini3939 0:8ba6230eefbd 69 static
okini3939 0:8ba6230eefbd 70 mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb)
okini3939 0:8ba6230eefbd 71 {
okini3939 0:8ba6230eefbd 72 mad_fixed_t sample;
okini3939 0:8ba6230eefbd 73
okini3939 0:8ba6230eefbd 74 sample = mad_bit_read(ptr, nb);
okini3939 0:8ba6230eefbd 75
okini3939 0:8ba6230eefbd 76 /* invert most significant bit, extend sign, then scale to fixed format */
okini3939 0:8ba6230eefbd 77
okini3939 0:8ba6230eefbd 78 sample ^= 1 << (nb - 1);
okini3939 0:8ba6230eefbd 79 sample |= -(sample & (1 << (nb - 1)));
okini3939 0:8ba6230eefbd 80
okini3939 0:8ba6230eefbd 81 sample <<= MAD_F_FRACBITS - (nb - 1);
okini3939 0:8ba6230eefbd 82
okini3939 0:8ba6230eefbd 83 /* requantize the sample */
okini3939 0:8ba6230eefbd 84
okini3939 0:8ba6230eefbd 85 /* s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) */
okini3939 0:8ba6230eefbd 86
okini3939 0:8ba6230eefbd 87 sample += MAD_F_ONE >> (nb - 1);
okini3939 0:8ba6230eefbd 88
okini3939 0:8ba6230eefbd 89 return mad_f_mul(sample, linear_table[nb - 2]);
okini3939 0:8ba6230eefbd 90
okini3939 0:8ba6230eefbd 91 /* s' = factor * s'' */
okini3939 0:8ba6230eefbd 92 /* (to be performed by caller) */
okini3939 0:8ba6230eefbd 93 }
okini3939 0:8ba6230eefbd 94
okini3939 0:8ba6230eefbd 95 /*
okini3939 0:8ba6230eefbd 96 * NAME: layer->I()
okini3939 0:8ba6230eefbd 97 * DESCRIPTION: decode a single Layer I frame
okini3939 0:8ba6230eefbd 98 */
okini3939 0:8ba6230eefbd 99 int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame)
okini3939 0:8ba6230eefbd 100 {
okini3939 0:8ba6230eefbd 101 struct mad_header *header = &frame->header;
okini3939 0:8ba6230eefbd 102 unsigned int nch, bound, ch, s, sb, nb;
okini3939 0:8ba6230eefbd 103 unsigned char allocation[2][32], scalefactor[2][32];
okini3939 0:8ba6230eefbd 104
okini3939 0:8ba6230eefbd 105 nch = MAD_NCHANNELS(header);
okini3939 0:8ba6230eefbd 106
okini3939 0:8ba6230eefbd 107 bound = 32;
okini3939 0:8ba6230eefbd 108 if (header->mode == MAD_MODE_JOINT_STEREO) {
okini3939 0:8ba6230eefbd 109 header->flags |= MAD_FLAG_I_STEREO;
okini3939 0:8ba6230eefbd 110 bound = 4 + header->mode_extension * 4;
okini3939 0:8ba6230eefbd 111 }
okini3939 0:8ba6230eefbd 112
okini3939 0:8ba6230eefbd 113 /* check CRC word */
okini3939 0:8ba6230eefbd 114
okini3939 0:8ba6230eefbd 115 if (header->flags & MAD_FLAG_PROTECTION) {
okini3939 0:8ba6230eefbd 116 header->crc_check =
okini3939 0:8ba6230eefbd 117 mad_bit_crc(stream->ptr, 4 * (bound * nch + (32 - bound)),
okini3939 0:8ba6230eefbd 118 header->crc_check);
okini3939 0:8ba6230eefbd 119
okini3939 0:8ba6230eefbd 120 if (header->crc_check != header->crc_target &&
okini3939 0:8ba6230eefbd 121 !(frame->options & MAD_OPTION_IGNORECRC)) {
okini3939 0:8ba6230eefbd 122 stream->error = MAD_ERROR_BADCRC;
okini3939 0:8ba6230eefbd 123 return -1;
okini3939 0:8ba6230eefbd 124 }
okini3939 0:8ba6230eefbd 125 }
okini3939 0:8ba6230eefbd 126
okini3939 0:8ba6230eefbd 127 /* decode bit allocations */
okini3939 0:8ba6230eefbd 128
okini3939 0:8ba6230eefbd 129 for (sb = 0; sb < bound; ++sb) {
okini3939 0:8ba6230eefbd 130 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 131 nb = mad_bit_read(&stream->ptr, 4);
okini3939 0:8ba6230eefbd 132
okini3939 0:8ba6230eefbd 133 if (nb == 15) {
okini3939 0:8ba6230eefbd 134 stream->error = MAD_ERROR_BADBITALLOC;
okini3939 0:8ba6230eefbd 135 return -1;
okini3939 0:8ba6230eefbd 136 }
okini3939 0:8ba6230eefbd 137
okini3939 0:8ba6230eefbd 138 allocation[ch][sb] = nb ? nb + 1 : 0;
okini3939 0:8ba6230eefbd 139 }
okini3939 0:8ba6230eefbd 140 }
okini3939 0:8ba6230eefbd 141
okini3939 0:8ba6230eefbd 142 for (sb = bound; sb < 32; ++sb) {
okini3939 0:8ba6230eefbd 143 nb = mad_bit_read(&stream->ptr, 4);
okini3939 0:8ba6230eefbd 144
okini3939 0:8ba6230eefbd 145 if (nb == 15) {
okini3939 0:8ba6230eefbd 146 stream->error = MAD_ERROR_BADBITALLOC;
okini3939 0:8ba6230eefbd 147 return -1;
okini3939 0:8ba6230eefbd 148 }
okini3939 0:8ba6230eefbd 149
okini3939 0:8ba6230eefbd 150 allocation[0][sb] =
okini3939 0:8ba6230eefbd 151 allocation[1][sb] = nb ? nb + 1 : 0;
okini3939 0:8ba6230eefbd 152 }
okini3939 0:8ba6230eefbd 153
okini3939 0:8ba6230eefbd 154 /* decode scalefactors */
okini3939 0:8ba6230eefbd 155
okini3939 0:8ba6230eefbd 156 for (sb = 0; sb < 32; ++sb) {
okini3939 0:8ba6230eefbd 157 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 158 if (allocation[ch][sb]) {
okini3939 0:8ba6230eefbd 159 scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6);
okini3939 0:8ba6230eefbd 160
okini3939 0:8ba6230eefbd 161 # if defined(OPT_STRICT)
okini3939 0:8ba6230eefbd 162 /*
okini3939 0:8ba6230eefbd 163 * Scalefactor index 63 does not appear in Table B.1 of
okini3939 0:8ba6230eefbd 164 * ISO/IEC 11172-3. Nonetheless, other implementations accept it,
okini3939 0:8ba6230eefbd 165 * so we only reject it if OPT_STRICT is defined.
okini3939 0:8ba6230eefbd 166 */
okini3939 0:8ba6230eefbd 167 if (scalefactor[ch][sb] == 63) {
okini3939 0:8ba6230eefbd 168 stream->error = MAD_ERROR_BADSCALEFACTOR;
okini3939 0:8ba6230eefbd 169 return -1;
okini3939 0:8ba6230eefbd 170 }
okini3939 0:8ba6230eefbd 171 # endif
okini3939 0:8ba6230eefbd 172 }
okini3939 0:8ba6230eefbd 173 }
okini3939 0:8ba6230eefbd 174 }
okini3939 0:8ba6230eefbd 175
okini3939 0:8ba6230eefbd 176 /* decode samples */
okini3939 0:8ba6230eefbd 177
okini3939 0:8ba6230eefbd 178 for (s = 0; s < 12; ++s) {
okini3939 0:8ba6230eefbd 179 for (sb = 0; sb < bound; ++sb) {
okini3939 0:8ba6230eefbd 180 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 181 nb = allocation[ch][sb];
okini3939 0:8ba6230eefbd 182 frame->sbsample[ch][s][sb] = nb ?
okini3939 0:8ba6230eefbd 183 mad_f_mul(I_sample(&stream->ptr, nb),
okini3939 0:8ba6230eefbd 184 sf_table[scalefactor[ch][sb]]) : 0;
okini3939 0:8ba6230eefbd 185 }
okini3939 0:8ba6230eefbd 186 }
okini3939 0:8ba6230eefbd 187
okini3939 0:8ba6230eefbd 188 for (sb = bound; sb < 32; ++sb) {
okini3939 0:8ba6230eefbd 189 if ((nb = allocation[0][sb]) != 0) {
okini3939 0:8ba6230eefbd 190 mad_fixed_t sample;
okini3939 0:8ba6230eefbd 191
okini3939 0:8ba6230eefbd 192 sample = I_sample(&stream->ptr, nb);
okini3939 0:8ba6230eefbd 193
okini3939 0:8ba6230eefbd 194 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 195 frame->sbsample[ch][s][sb] =
okini3939 0:8ba6230eefbd 196 mad_f_mul(sample, sf_table[scalefactor[ch][sb]]);
okini3939 0:8ba6230eefbd 197 }
okini3939 0:8ba6230eefbd 198 }
okini3939 0:8ba6230eefbd 199 else {
okini3939 0:8ba6230eefbd 200 for (ch = 0; ch < nch; ++ch)
okini3939 0:8ba6230eefbd 201 frame->sbsample[ch][s][sb] = 0;
okini3939 0:8ba6230eefbd 202 }
okini3939 0:8ba6230eefbd 203 }
okini3939 0:8ba6230eefbd 204 }
okini3939 0:8ba6230eefbd 205
okini3939 0:8ba6230eefbd 206 return 0;
okini3939 0:8ba6230eefbd 207 }
okini3939 0:8ba6230eefbd 208
okini3939 0:8ba6230eefbd 209 /* --- Layer II ------------------------------------------------------------ */
okini3939 0:8ba6230eefbd 210
okini3939 0:8ba6230eefbd 211 /* possible quantization per subband table */
okini3939 0:8ba6230eefbd 212 static
okini3939 0:8ba6230eefbd 213 const struct {
okini3939 0:8ba6230eefbd 214 unsigned int sblimit;
okini3939 0:8ba6230eefbd 215 unsigned char offsets[30];
okini3939 0:8ba6230eefbd 216 } sbquant_table[5] = {
okini3939 0:8ba6230eefbd 217 /* ISO/IEC 11172-3 Table B.2a */
okini3939 0:8ba6230eefbd 218 { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 0 */
okini3939 0:8ba6230eefbd 219 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } },
okini3939 0:8ba6230eefbd 220 /* ISO/IEC 11172-3 Table B.2b */
okini3939 0:8ba6230eefbd 221 { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 1 */
okini3939 0:8ba6230eefbd 222 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } },
okini3939 0:8ba6230eefbd 223 /* ISO/IEC 11172-3 Table B.2c */
okini3939 0:8ba6230eefbd 224 { 8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */
okini3939 0:8ba6230eefbd 225 /* ISO/IEC 11172-3 Table B.2d */
okini3939 0:8ba6230eefbd 226 { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */
okini3939 0:8ba6230eefbd 227 /* ISO/IEC 13818-3 Table B.1 */
okini3939 0:8ba6230eefbd 228 { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, /* 4 */
okini3939 0:8ba6230eefbd 229 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }
okini3939 0:8ba6230eefbd 230 };
okini3939 0:8ba6230eefbd 231
okini3939 0:8ba6230eefbd 232 /* bit allocation table */
okini3939 0:8ba6230eefbd 233 static
okini3939 0:8ba6230eefbd 234 struct {
okini3939 0:8ba6230eefbd 235 unsigned short nbal;
okini3939 0:8ba6230eefbd 236 unsigned short offset;
okini3939 0:8ba6230eefbd 237 } const bitalloc_table[8] = {
okini3939 0:8ba6230eefbd 238 { 2, 0 }, /* 0 */
okini3939 0:8ba6230eefbd 239 { 2, 3 }, /* 1 */
okini3939 0:8ba6230eefbd 240 { 3, 3 }, /* 2 */
okini3939 0:8ba6230eefbd 241 { 3, 1 }, /* 3 */
okini3939 0:8ba6230eefbd 242 { 4, 2 }, /* 4 */
okini3939 0:8ba6230eefbd 243 { 4, 3 }, /* 5 */
okini3939 0:8ba6230eefbd 244 { 4, 4 }, /* 6 */
okini3939 0:8ba6230eefbd 245 { 4, 5 } /* 7 */
okini3939 0:8ba6230eefbd 246 };
okini3939 0:8ba6230eefbd 247
okini3939 0:8ba6230eefbd 248 /* offsets into quantization class table */
okini3939 0:8ba6230eefbd 249 static
okini3939 0:8ba6230eefbd 250 unsigned char const offset_table[6][15] = {
okini3939 0:8ba6230eefbd 251 { 0, 1, 16 }, /* 0 */
okini3939 0:8ba6230eefbd 252 { 0, 1, 2, 3, 4, 5, 16 }, /* 1 */
okini3939 0:8ba6230eefbd 253 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, /* 2 */
okini3939 0:8ba6230eefbd 254 { 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* 3 */
okini3939 0:8ba6230eefbd 255 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }, /* 4 */
okini3939 0:8ba6230eefbd 256 { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } /* 5 */
okini3939 0:8ba6230eefbd 257 };
okini3939 0:8ba6230eefbd 258
okini3939 0:8ba6230eefbd 259 /* quantization class table */
okini3939 0:8ba6230eefbd 260 static
okini3939 0:8ba6230eefbd 261 struct quantclass {
okini3939 0:8ba6230eefbd 262 unsigned short nlevels;
okini3939 0:8ba6230eefbd 263 unsigned char group;
okini3939 0:8ba6230eefbd 264 unsigned char bits;
okini3939 0:8ba6230eefbd 265 mad_fixed_t C;
okini3939 0:8ba6230eefbd 266 mad_fixed_t D;
okini3939 0:8ba6230eefbd 267 } const qc_table[17] = {
okini3939 0:8ba6230eefbd 268 # include "qc_table.h"
okini3939 0:8ba6230eefbd 269 };
okini3939 0:8ba6230eefbd 270
okini3939 0:8ba6230eefbd 271 /*
okini3939 0:8ba6230eefbd 272 * NAME: II_samples()
okini3939 0:8ba6230eefbd 273 * DESCRIPTION: decode three requantized Layer II samples from a bitstream
okini3939 0:8ba6230eefbd 274 */
okini3939 0:8ba6230eefbd 275 static
okini3939 0:8ba6230eefbd 276 void II_samples(struct mad_bitptr *ptr,
okini3939 0:8ba6230eefbd 277 struct quantclass const *quantclass,
okini3939 0:8ba6230eefbd 278 mad_fixed_t output[3])
okini3939 0:8ba6230eefbd 279 {
okini3939 0:8ba6230eefbd 280 unsigned int nb, s, sample[3];
okini3939 0:8ba6230eefbd 281
okini3939 0:8ba6230eefbd 282 if ((nb = quantclass->group) != 0) {
okini3939 0:8ba6230eefbd 283 unsigned int c, nlevels;
okini3939 0:8ba6230eefbd 284
okini3939 0:8ba6230eefbd 285 /* degrouping */
okini3939 0:8ba6230eefbd 286 c = mad_bit_read(ptr, quantclass->bits);
okini3939 0:8ba6230eefbd 287 nlevels = quantclass->nlevels;
okini3939 0:8ba6230eefbd 288
okini3939 0:8ba6230eefbd 289 for (s = 0; s < 3; ++s) {
okini3939 0:8ba6230eefbd 290 sample[s] = c % nlevels;
okini3939 0:8ba6230eefbd 291 c /= nlevels;
okini3939 0:8ba6230eefbd 292 }
okini3939 0:8ba6230eefbd 293 }
okini3939 0:8ba6230eefbd 294 else {
okini3939 0:8ba6230eefbd 295 nb = quantclass->bits;
okini3939 0:8ba6230eefbd 296
okini3939 0:8ba6230eefbd 297 for (s = 0; s < 3; ++s)
okini3939 0:8ba6230eefbd 298 sample[s] = mad_bit_read(ptr, nb);
okini3939 0:8ba6230eefbd 299 }
okini3939 0:8ba6230eefbd 300
okini3939 0:8ba6230eefbd 301 for (s = 0; s < 3; ++s) {
okini3939 0:8ba6230eefbd 302 mad_fixed_t requantized;
okini3939 0:8ba6230eefbd 303
okini3939 0:8ba6230eefbd 304 /* invert most significant bit, extend sign, then scale to fixed format */
okini3939 0:8ba6230eefbd 305
okini3939 0:8ba6230eefbd 306 requantized = sample[s] ^ (1 << (nb - 1));
okini3939 0:8ba6230eefbd 307 requantized |= -(requantized & (1 << (nb - 1)));
okini3939 0:8ba6230eefbd 308
okini3939 0:8ba6230eefbd 309 requantized <<= MAD_F_FRACBITS - (nb - 1);
okini3939 0:8ba6230eefbd 310
okini3939 0:8ba6230eefbd 311 /* requantize the sample */
okini3939 0:8ba6230eefbd 312
okini3939 0:8ba6230eefbd 313 /* s'' = C * (s''' + D) */
okini3939 0:8ba6230eefbd 314
okini3939 0:8ba6230eefbd 315 output[s] = mad_f_mul(requantized + quantclass->D, quantclass->C);
okini3939 0:8ba6230eefbd 316
okini3939 0:8ba6230eefbd 317 /* s' = factor * s'' */
okini3939 0:8ba6230eefbd 318 /* (to be performed by caller) */
okini3939 0:8ba6230eefbd 319 }
okini3939 0:8ba6230eefbd 320 }
okini3939 0:8ba6230eefbd 321
okini3939 0:8ba6230eefbd 322 /*
okini3939 0:8ba6230eefbd 323 * NAME: layer->II()
okini3939 0:8ba6230eefbd 324 * DESCRIPTION: decode a single Layer II frame
okini3939 0:8ba6230eefbd 325 */
okini3939 0:8ba6230eefbd 326 int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
okini3939 0:8ba6230eefbd 327 {
okini3939 0:8ba6230eefbd 328 struct mad_header *header = &frame->header;
okini3939 0:8ba6230eefbd 329 struct mad_bitptr start;
okini3939 0:8ba6230eefbd 330 unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb;
okini3939 0:8ba6230eefbd 331 unsigned char const *offsets;
okini3939 0:8ba6230eefbd 332 unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3];
okini3939 0:8ba6230eefbd 333 mad_fixed_t samples[3];
okini3939 0:8ba6230eefbd 334
okini3939 0:8ba6230eefbd 335 nch = MAD_NCHANNELS(header);
okini3939 0:8ba6230eefbd 336
okini3939 0:8ba6230eefbd 337 if (header->flags & MAD_FLAG_LSF_EXT)
okini3939 0:8ba6230eefbd 338 index = 4;
okini3939 0:8ba6230eefbd 339 else if (header->flags & MAD_FLAG_FREEFORMAT)
okini3939 0:8ba6230eefbd 340 goto freeformat;
okini3939 0:8ba6230eefbd 341 else {
okini3939 0:8ba6230eefbd 342 unsigned long bitrate_per_channel;
okini3939 0:8ba6230eefbd 343
okini3939 0:8ba6230eefbd 344 bitrate_per_channel = header->bitrate;
okini3939 0:8ba6230eefbd 345 if (nch == 2) {
okini3939 0:8ba6230eefbd 346 bitrate_per_channel /= 2;
okini3939 0:8ba6230eefbd 347
okini3939 0:8ba6230eefbd 348 # if defined(OPT_STRICT)
okini3939 0:8ba6230eefbd 349 /*
okini3939 0:8ba6230eefbd 350 * ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and
okini3939 0:8ba6230eefbd 351 * 80 kbps bitrates in Layer II, but some encoders ignore this
okini3939 0:8ba6230eefbd 352 * restriction. We enforce it if OPT_STRICT is defined.
okini3939 0:8ba6230eefbd 353 */
okini3939 0:8ba6230eefbd 354 if (bitrate_per_channel <= 28000 || bitrate_per_channel == 40000) {
okini3939 0:8ba6230eefbd 355 stream->error = MAD_ERROR_BADMODE;
okini3939 0:8ba6230eefbd 356 return -1;
okini3939 0:8ba6230eefbd 357 }
okini3939 0:8ba6230eefbd 358 # endif
okini3939 0:8ba6230eefbd 359 }
okini3939 0:8ba6230eefbd 360 else { /* nch == 1 */
okini3939 0:8ba6230eefbd 361 if (bitrate_per_channel > 192000) {
okini3939 0:8ba6230eefbd 362 /*
okini3939 0:8ba6230eefbd 363 * ISO/IEC 11172-3 does not allow single channel mode for 224, 256,
okini3939 0:8ba6230eefbd 364 * 320, or 384 kbps bitrates in Layer II.
okini3939 0:8ba6230eefbd 365 */
okini3939 0:8ba6230eefbd 366 stream->error = MAD_ERROR_BADMODE;
okini3939 0:8ba6230eefbd 367 return -1;
okini3939 0:8ba6230eefbd 368 }
okini3939 0:8ba6230eefbd 369 }
okini3939 0:8ba6230eefbd 370
okini3939 0:8ba6230eefbd 371 if (bitrate_per_channel <= 48000)
okini3939 0:8ba6230eefbd 372 index = (header->samplerate == 32000) ? 3 : 2;
okini3939 0:8ba6230eefbd 373 else if (bitrate_per_channel <= 80000)
okini3939 0:8ba6230eefbd 374 index = 0;
okini3939 0:8ba6230eefbd 375 else {
okini3939 0:8ba6230eefbd 376 freeformat:
okini3939 0:8ba6230eefbd 377 index = (header->samplerate == 48000) ? 0 : 1;
okini3939 0:8ba6230eefbd 378 }
okini3939 0:8ba6230eefbd 379 }
okini3939 0:8ba6230eefbd 380
okini3939 0:8ba6230eefbd 381 sblimit = sbquant_table[index].sblimit;
okini3939 0:8ba6230eefbd 382 offsets = sbquant_table[index].offsets;
okini3939 0:8ba6230eefbd 383
okini3939 0:8ba6230eefbd 384 bound = 32;
okini3939 0:8ba6230eefbd 385 if (header->mode == MAD_MODE_JOINT_STEREO) {
okini3939 0:8ba6230eefbd 386 header->flags |= MAD_FLAG_I_STEREO;
okini3939 0:8ba6230eefbd 387 bound = 4 + header->mode_extension * 4;
okini3939 0:8ba6230eefbd 388 }
okini3939 0:8ba6230eefbd 389
okini3939 0:8ba6230eefbd 390 if (bound > sblimit)
okini3939 0:8ba6230eefbd 391 bound = sblimit;
okini3939 0:8ba6230eefbd 392
okini3939 0:8ba6230eefbd 393 start = stream->ptr;
okini3939 0:8ba6230eefbd 394
okini3939 0:8ba6230eefbd 395 /* decode bit allocations */
okini3939 0:8ba6230eefbd 396
okini3939 0:8ba6230eefbd 397 for (sb = 0; sb < bound; ++sb) {
okini3939 0:8ba6230eefbd 398 nbal = bitalloc_table[offsets[sb]].nbal;
okini3939 0:8ba6230eefbd 399
okini3939 0:8ba6230eefbd 400 for (ch = 0; ch < nch; ++ch)
okini3939 0:8ba6230eefbd 401 allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal);
okini3939 0:8ba6230eefbd 402 }
okini3939 0:8ba6230eefbd 403
okini3939 0:8ba6230eefbd 404 for (sb = bound; sb < sblimit; ++sb) {
okini3939 0:8ba6230eefbd 405 nbal = bitalloc_table[offsets[sb]].nbal;
okini3939 0:8ba6230eefbd 406
okini3939 0:8ba6230eefbd 407 allocation[0][sb] =
okini3939 0:8ba6230eefbd 408 allocation[1][sb] = mad_bit_read(&stream->ptr, nbal);
okini3939 0:8ba6230eefbd 409 }
okini3939 0:8ba6230eefbd 410
okini3939 0:8ba6230eefbd 411 /* decode scalefactor selection info */
okini3939 0:8ba6230eefbd 412
okini3939 0:8ba6230eefbd 413 for (sb = 0; sb < sblimit; ++sb) {
okini3939 0:8ba6230eefbd 414 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 415 if (allocation[ch][sb])
okini3939 0:8ba6230eefbd 416 scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2);
okini3939 0:8ba6230eefbd 417 }
okini3939 0:8ba6230eefbd 418 }
okini3939 0:8ba6230eefbd 419
okini3939 0:8ba6230eefbd 420 /* check CRC word */
okini3939 0:8ba6230eefbd 421
okini3939 0:8ba6230eefbd 422 if (header->flags & MAD_FLAG_PROTECTION) {
okini3939 0:8ba6230eefbd 423 header->crc_check =
okini3939 0:8ba6230eefbd 424 mad_bit_crc(start, mad_bit_length(&start, &stream->ptr),
okini3939 0:8ba6230eefbd 425 header->crc_check);
okini3939 0:8ba6230eefbd 426
okini3939 0:8ba6230eefbd 427 if (header->crc_check != header->crc_target &&
okini3939 0:8ba6230eefbd 428 !(frame->options & MAD_OPTION_IGNORECRC)) {
okini3939 0:8ba6230eefbd 429 stream->error = MAD_ERROR_BADCRC;
okini3939 0:8ba6230eefbd 430 return -1;
okini3939 0:8ba6230eefbd 431 }
okini3939 0:8ba6230eefbd 432 }
okini3939 0:8ba6230eefbd 433
okini3939 0:8ba6230eefbd 434 /* decode scalefactors */
okini3939 0:8ba6230eefbd 435
okini3939 0:8ba6230eefbd 436 for (sb = 0; sb < sblimit; ++sb) {
okini3939 0:8ba6230eefbd 437 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 438 if (allocation[ch][sb]) {
okini3939 0:8ba6230eefbd 439 scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6);
okini3939 0:8ba6230eefbd 440
okini3939 0:8ba6230eefbd 441 switch (scfsi[ch][sb]) {
okini3939 0:8ba6230eefbd 442 case 2:
okini3939 0:8ba6230eefbd 443 scalefactor[ch][sb][2] =
okini3939 0:8ba6230eefbd 444 scalefactor[ch][sb][1] =
okini3939 0:8ba6230eefbd 445 scalefactor[ch][sb][0];
okini3939 0:8ba6230eefbd 446 break;
okini3939 0:8ba6230eefbd 447
okini3939 0:8ba6230eefbd 448 case 0:
okini3939 0:8ba6230eefbd 449 scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6);
okini3939 0:8ba6230eefbd 450 /* fall through */
okini3939 0:8ba6230eefbd 451
okini3939 0:8ba6230eefbd 452 case 1:
okini3939 0:8ba6230eefbd 453 case 3:
okini3939 0:8ba6230eefbd 454 scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6);
okini3939 0:8ba6230eefbd 455 }
okini3939 0:8ba6230eefbd 456
okini3939 0:8ba6230eefbd 457 if (scfsi[ch][sb] & 1)
okini3939 0:8ba6230eefbd 458 scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1];
okini3939 0:8ba6230eefbd 459
okini3939 0:8ba6230eefbd 460 # if defined(OPT_STRICT)
okini3939 0:8ba6230eefbd 461 /*
okini3939 0:8ba6230eefbd 462 * Scalefactor index 63 does not appear in Table B.1 of
okini3939 0:8ba6230eefbd 463 * ISO/IEC 11172-3. Nonetheless, other implementations accept it,
okini3939 0:8ba6230eefbd 464 * so we only reject it if OPT_STRICT is defined.
okini3939 0:8ba6230eefbd 465 */
okini3939 0:8ba6230eefbd 466 if (scalefactor[ch][sb][0] == 63 ||
okini3939 0:8ba6230eefbd 467 scalefactor[ch][sb][1] == 63 ||
okini3939 0:8ba6230eefbd 468 scalefactor[ch][sb][2] == 63) {
okini3939 0:8ba6230eefbd 469 stream->error = MAD_ERROR_BADSCALEFACTOR;
okini3939 0:8ba6230eefbd 470 return -1;
okini3939 0:8ba6230eefbd 471 }
okini3939 0:8ba6230eefbd 472 # endif
okini3939 0:8ba6230eefbd 473 }
okini3939 0:8ba6230eefbd 474 }
okini3939 0:8ba6230eefbd 475 }
okini3939 0:8ba6230eefbd 476
okini3939 0:8ba6230eefbd 477 /* decode samples */
okini3939 0:8ba6230eefbd 478
okini3939 0:8ba6230eefbd 479 for (gr = 0; gr < 12; ++gr) {
okini3939 0:8ba6230eefbd 480 for (sb = 0; sb < bound; ++sb) {
okini3939 0:8ba6230eefbd 481 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 482 if ((index = allocation[ch][sb]) != 0) {
okini3939 0:8ba6230eefbd 483 index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1];
okini3939 0:8ba6230eefbd 484
okini3939 0:8ba6230eefbd 485 II_samples(&stream->ptr, &qc_table[index], samples);
okini3939 0:8ba6230eefbd 486
okini3939 0:8ba6230eefbd 487 for (s = 0; s < 3; ++s) {
okini3939 0:8ba6230eefbd 488 frame->sbsample[ch][3 * gr + s][sb] =
okini3939 0:8ba6230eefbd 489 mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]);
okini3939 0:8ba6230eefbd 490 }
okini3939 0:8ba6230eefbd 491 }
okini3939 0:8ba6230eefbd 492 else {
okini3939 0:8ba6230eefbd 493 for (s = 0; s < 3; ++s)
okini3939 0:8ba6230eefbd 494 frame->sbsample[ch][3 * gr + s][sb] = 0;
okini3939 0:8ba6230eefbd 495 }
okini3939 0:8ba6230eefbd 496 }
okini3939 0:8ba6230eefbd 497 }
okini3939 0:8ba6230eefbd 498
okini3939 0:8ba6230eefbd 499 for (sb = bound; sb < sblimit; ++sb) {
okini3939 0:8ba6230eefbd 500 if ((index = allocation[0][sb])!= 0) {
okini3939 0:8ba6230eefbd 501 index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1];
okini3939 0:8ba6230eefbd 502
okini3939 0:8ba6230eefbd 503 II_samples(&stream->ptr, &qc_table[index], samples);
okini3939 0:8ba6230eefbd 504
okini3939 0:8ba6230eefbd 505 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 506 for (s = 0; s < 3; ++s) {
okini3939 0:8ba6230eefbd 507 frame->sbsample[ch][3 * gr + s][sb] =
okini3939 0:8ba6230eefbd 508 mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]);
okini3939 0:8ba6230eefbd 509 }
okini3939 0:8ba6230eefbd 510 }
okini3939 0:8ba6230eefbd 511 }
okini3939 0:8ba6230eefbd 512 else {
okini3939 0:8ba6230eefbd 513 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 514 for (s = 0; s < 3; ++s)
okini3939 0:8ba6230eefbd 515 frame->sbsample[ch][3 * gr + s][sb] = 0;
okini3939 0:8ba6230eefbd 516 }
okini3939 0:8ba6230eefbd 517 }
okini3939 0:8ba6230eefbd 518 }
okini3939 0:8ba6230eefbd 519
okini3939 0:8ba6230eefbd 520 for (ch = 0; ch < nch; ++ch) {
okini3939 0:8ba6230eefbd 521 for (s = 0; s < 3; ++s) {
okini3939 0:8ba6230eefbd 522 for (sb = sblimit; sb < 32; ++sb)
okini3939 0:8ba6230eefbd 523 frame->sbsample[ch][3 * gr + s][sb] = 0;
okini3939 0:8ba6230eefbd 524 }
okini3939 0:8ba6230eefbd 525 }
okini3939 0:8ba6230eefbd 526 }
okini3939 0:8ba6230eefbd 527
okini3939 0:8ba6230eefbd 528 return 0;
okini3939 0:8ba6230eefbd 529 }