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: frame.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 # include <stdlib.h>
okini3939 0:8ba6230eefbd 27
okini3939 0:8ba6230eefbd 28 # include "bit.h"
okini3939 0:8ba6230eefbd 29 # include "stream.h"
okini3939 0:8ba6230eefbd 30 # include "frame.h"
okini3939 0:8ba6230eefbd 31 # include "timer.h"
okini3939 0:8ba6230eefbd 32 # include "layer12.h"
okini3939 0:8ba6230eefbd 33 # include "layer3.h"
okini3939 0:8ba6230eefbd 34
okini3939 0:8ba6230eefbd 35 static
okini3939 0:8ba6230eefbd 36 unsigned long const bitrate_table[5][15] = {
okini3939 0:8ba6230eefbd 37 /* MPEG-1 */
okini3939 0:8ba6230eefbd 38 { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */
okini3939 0:8ba6230eefbd 39 256000, 288000, 320000, 352000, 384000, 416000, 448000 },
okini3939 0:8ba6230eefbd 40 { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */
okini3939 0:8ba6230eefbd 41 128000, 160000, 192000, 224000, 256000, 320000, 384000 },
okini3939 0:8ba6230eefbd 42 { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */
okini3939 0:8ba6230eefbd 43 112000, 128000, 160000, 192000, 224000, 256000, 320000 },
okini3939 0:8ba6230eefbd 44
okini3939 0:8ba6230eefbd 45 /* MPEG-2 LSF */
okini3939 0:8ba6230eefbd 46 { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */
okini3939 0:8ba6230eefbd 47 128000, 144000, 160000, 176000, 192000, 224000, 256000 },
okini3939 0:8ba6230eefbd 48 { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */
okini3939 0:8ba6230eefbd 49 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */
okini3939 0:8ba6230eefbd 50 };
okini3939 0:8ba6230eefbd 51
okini3939 0:8ba6230eefbd 52 static
okini3939 0:8ba6230eefbd 53 unsigned int const samplerate_table[3] = { 44100, 48000, 32000 };
okini3939 0:8ba6230eefbd 54
okini3939 0:8ba6230eefbd 55 static
okini3939 0:8ba6230eefbd 56 int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = {
okini3939 0:8ba6230eefbd 57 mad_layer_I,
okini3939 0:8ba6230eefbd 58 mad_layer_II,
okini3939 0:8ba6230eefbd 59 mad_layer_III
okini3939 0:8ba6230eefbd 60 };
okini3939 0:8ba6230eefbd 61
okini3939 0:8ba6230eefbd 62 /*
okini3939 0:8ba6230eefbd 63 * NAME: header->init()
okini3939 0:8ba6230eefbd 64 * DESCRIPTION: initialize header struct
okini3939 0:8ba6230eefbd 65 */
okini3939 0:8ba6230eefbd 66 void mad_header_init(struct mad_header *header)
okini3939 0:8ba6230eefbd 67 {
okini3939 0:8ba6230eefbd 68 header->layer = (enum mad_layer)0;
okini3939 0:8ba6230eefbd 69 header->mode = (enum mad_mode)0;
okini3939 0:8ba6230eefbd 70 header->mode_extension = 0;
okini3939 0:8ba6230eefbd 71 header->emphasis = (enum mad_emphasis)0;
okini3939 0:8ba6230eefbd 72
okini3939 0:8ba6230eefbd 73 header->bitrate = 0;
okini3939 0:8ba6230eefbd 74 header->samplerate = 0;
okini3939 0:8ba6230eefbd 75
okini3939 0:8ba6230eefbd 76 header->crc_check = 0;
okini3939 0:8ba6230eefbd 77 header->crc_target = 0;
okini3939 0:8ba6230eefbd 78
okini3939 0:8ba6230eefbd 79 header->flags = 0;
okini3939 0:8ba6230eefbd 80 header->private_bits = 0;
okini3939 0:8ba6230eefbd 81
okini3939 0:8ba6230eefbd 82 header->duration = mad_timer_zero;
okini3939 0:8ba6230eefbd 83 }
okini3939 0:8ba6230eefbd 84
okini3939 0:8ba6230eefbd 85 /*
okini3939 0:8ba6230eefbd 86 * NAME: frame->init()
okini3939 0:8ba6230eefbd 87 * DESCRIPTION: initialize frame struct
okini3939 0:8ba6230eefbd 88 */
okini3939 0:8ba6230eefbd 89 void mad_frame_init(struct mad_frame *frame)
okini3939 0:8ba6230eefbd 90 {
okini3939 0:8ba6230eefbd 91 mad_header_init(&frame->header);
okini3939 0:8ba6230eefbd 92
okini3939 0:8ba6230eefbd 93 frame->options = 0;
okini3939 0:8ba6230eefbd 94
okini3939 0:8ba6230eefbd 95 //### frame->overlap = 0;
okini3939 0:8ba6230eefbd 96 mad_frame_mute(frame);
okini3939 0:8ba6230eefbd 97 }
okini3939 0:8ba6230eefbd 98
okini3939 0:8ba6230eefbd 99 /*
okini3939 0:8ba6230eefbd 100 * NAME: frame->finish()
okini3939 0:8ba6230eefbd 101 * DESCRIPTION: deallocate any dynamic memory associated with frame
okini3939 0:8ba6230eefbd 102 */
okini3939 0:8ba6230eefbd 103 void mad_frame_finish(struct mad_frame *frame)
okini3939 0:8ba6230eefbd 104 {
okini3939 0:8ba6230eefbd 105 mad_header_finish(&frame->header);
okini3939 0:8ba6230eefbd 106 /* ###
okini3939 0:8ba6230eefbd 107 if (frame->overlap) {
okini3939 0:8ba6230eefbd 108 free(frame->overlap);
okini3939 0:8ba6230eefbd 109 frame->overlap = 0;
okini3939 0:8ba6230eefbd 110 }
okini3939 0:8ba6230eefbd 111 */
okini3939 0:8ba6230eefbd 112 }
okini3939 0:8ba6230eefbd 113
okini3939 0:8ba6230eefbd 114 /*
okini3939 0:8ba6230eefbd 115 * NAME: decode_header()
okini3939 0:8ba6230eefbd 116 * DESCRIPTION: read header data and following CRC word
okini3939 0:8ba6230eefbd 117 */
okini3939 0:8ba6230eefbd 118 static
okini3939 0:8ba6230eefbd 119 int decode_header(struct mad_header *header, struct mad_stream *stream)
okini3939 0:8ba6230eefbd 120 {
okini3939 0:8ba6230eefbd 121 unsigned int index;
okini3939 0:8ba6230eefbd 122
okini3939 0:8ba6230eefbd 123 header->flags = 0;
okini3939 0:8ba6230eefbd 124 header->private_bits = 0;
okini3939 0:8ba6230eefbd 125
okini3939 0:8ba6230eefbd 126 /* header() */
okini3939 0:8ba6230eefbd 127
okini3939 0:8ba6230eefbd 128 /* syncword */
okini3939 0:8ba6230eefbd 129 mad_bit_skip(&stream->ptr, 11);
okini3939 0:8ba6230eefbd 130
okini3939 0:8ba6230eefbd 131 /* MPEG 2.5 indicator (really part of syncword) */
okini3939 0:8ba6230eefbd 132 if (mad_bit_read(&stream->ptr, 1) == 0)
okini3939 0:8ba6230eefbd 133 header->flags |= MAD_FLAG_MPEG_2_5_EXT;
okini3939 0:8ba6230eefbd 134
okini3939 0:8ba6230eefbd 135 /* ID */
okini3939 0:8ba6230eefbd 136 if (mad_bit_read(&stream->ptr, 1) == 0)
okini3939 0:8ba6230eefbd 137 header->flags |= MAD_FLAG_LSF_EXT;
okini3939 0:8ba6230eefbd 138 else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) {
okini3939 0:8ba6230eefbd 139 stream->error = MAD_ERROR_LOSTSYNC;
okini3939 0:8ba6230eefbd 140 return -1;
okini3939 0:8ba6230eefbd 141 }
okini3939 0:8ba6230eefbd 142
okini3939 0:8ba6230eefbd 143 /* layer */
okini3939 0:8ba6230eefbd 144 header->layer = (enum mad_layer)(4 - mad_bit_read(&stream->ptr, 2));
okini3939 0:8ba6230eefbd 145
okini3939 0:8ba6230eefbd 146 if (header->layer == 4) {
okini3939 0:8ba6230eefbd 147 stream->error = MAD_ERROR_BADLAYER;
okini3939 0:8ba6230eefbd 148 return -1;
okini3939 0:8ba6230eefbd 149 }
okini3939 0:8ba6230eefbd 150
okini3939 0:8ba6230eefbd 151 /* protection_bit */
okini3939 0:8ba6230eefbd 152 if (mad_bit_read(&stream->ptr, 1) == 0) {
okini3939 0:8ba6230eefbd 153 header->flags |= MAD_FLAG_PROTECTION;
okini3939 0:8ba6230eefbd 154 header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff);
okini3939 0:8ba6230eefbd 155 }
okini3939 0:8ba6230eefbd 156
okini3939 0:8ba6230eefbd 157 /* bitrate_index */
okini3939 0:8ba6230eefbd 158 index = mad_bit_read(&stream->ptr, 4);
okini3939 0:8ba6230eefbd 159
okini3939 0:8ba6230eefbd 160 if (index == 15) {
okini3939 0:8ba6230eefbd 161 stream->error = MAD_ERROR_BADBITRATE;
okini3939 0:8ba6230eefbd 162 return -1;
okini3939 0:8ba6230eefbd 163 }
okini3939 0:8ba6230eefbd 164
okini3939 0:8ba6230eefbd 165 if (header->flags & MAD_FLAG_LSF_EXT)
okini3939 0:8ba6230eefbd 166 header->bitrate = bitrate_table[3 + (header->layer >> 1)][index];
okini3939 0:8ba6230eefbd 167 else
okini3939 0:8ba6230eefbd 168 header->bitrate = bitrate_table[header->layer - 1][index];
okini3939 0:8ba6230eefbd 169
okini3939 0:8ba6230eefbd 170 /* sampling_frequency */
okini3939 0:8ba6230eefbd 171 index = mad_bit_read(&stream->ptr, 2);
okini3939 0:8ba6230eefbd 172
okini3939 0:8ba6230eefbd 173 if (index == 3) {
okini3939 0:8ba6230eefbd 174 stream->error = MAD_ERROR_BADSAMPLERATE;
okini3939 0:8ba6230eefbd 175 return -1;
okini3939 0:8ba6230eefbd 176 }
okini3939 0:8ba6230eefbd 177
okini3939 0:8ba6230eefbd 178 header->samplerate = samplerate_table[index];
okini3939 0:8ba6230eefbd 179
okini3939 0:8ba6230eefbd 180 if (header->flags & MAD_FLAG_LSF_EXT) {
okini3939 0:8ba6230eefbd 181 header->samplerate /= 2;
okini3939 0:8ba6230eefbd 182
okini3939 0:8ba6230eefbd 183 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
okini3939 0:8ba6230eefbd 184 header->samplerate /= 2;
okini3939 0:8ba6230eefbd 185 }
okini3939 0:8ba6230eefbd 186
okini3939 0:8ba6230eefbd 187 /* padding_bit */
okini3939 0:8ba6230eefbd 188 if (mad_bit_read(&stream->ptr, 1))
okini3939 0:8ba6230eefbd 189 header->flags |= MAD_FLAG_PADDING;
okini3939 0:8ba6230eefbd 190
okini3939 0:8ba6230eefbd 191 /* private_bit */
okini3939 0:8ba6230eefbd 192 if (mad_bit_read(&stream->ptr, 1))
okini3939 0:8ba6230eefbd 193 header->private_bits |= MAD_PRIVATE_HEADER;
okini3939 0:8ba6230eefbd 194
okini3939 0:8ba6230eefbd 195 /* mode */
okini3939 0:8ba6230eefbd 196 header->mode = (enum mad_mode)(3 - mad_bit_read(&stream->ptr, 2));
okini3939 0:8ba6230eefbd 197
okini3939 0:8ba6230eefbd 198 /* mode_extension */
okini3939 0:8ba6230eefbd 199 header->mode_extension = mad_bit_read(&stream->ptr, 2);
okini3939 0:8ba6230eefbd 200
okini3939 0:8ba6230eefbd 201 /* copyright */
okini3939 0:8ba6230eefbd 202 if (mad_bit_read(&stream->ptr, 1))
okini3939 0:8ba6230eefbd 203 header->flags |= MAD_FLAG_COPYRIGHT;
okini3939 0:8ba6230eefbd 204
okini3939 0:8ba6230eefbd 205 /* original/copy */
okini3939 0:8ba6230eefbd 206 if (mad_bit_read(&stream->ptr, 1))
okini3939 0:8ba6230eefbd 207 header->flags |= MAD_FLAG_ORIGINAL;
okini3939 0:8ba6230eefbd 208
okini3939 0:8ba6230eefbd 209 /* emphasis */
okini3939 0:8ba6230eefbd 210 header->emphasis = (enum mad_emphasis)mad_bit_read(&stream->ptr, 2);
okini3939 0:8ba6230eefbd 211
okini3939 0:8ba6230eefbd 212 # if defined(OPT_STRICT)
okini3939 0:8ba6230eefbd 213 /*
okini3939 0:8ba6230eefbd 214 * ISO/IEC 11172-3 says this is a reserved emphasis value, but
okini3939 0:8ba6230eefbd 215 * streams exist which use it anyway. Since the value is not important
okini3939 0:8ba6230eefbd 216 * to the decoder proper, we allow it unless OPT_STRICT is defined.
okini3939 0:8ba6230eefbd 217 */
okini3939 0:8ba6230eefbd 218 if (header->emphasis == MAD_EMPHASIS_RESERVED) {
okini3939 0:8ba6230eefbd 219 stream->error = MAD_ERROR_BADEMPHASIS;
okini3939 0:8ba6230eefbd 220 return -1;
okini3939 0:8ba6230eefbd 221 }
okini3939 0:8ba6230eefbd 222 # endif
okini3939 0:8ba6230eefbd 223
okini3939 0:8ba6230eefbd 224 /* error_check() */
okini3939 0:8ba6230eefbd 225
okini3939 0:8ba6230eefbd 226 /* crc_check */
okini3939 0:8ba6230eefbd 227 if (header->flags & MAD_FLAG_PROTECTION)
okini3939 0:8ba6230eefbd 228 header->crc_target = mad_bit_read(&stream->ptr, 16);
okini3939 0:8ba6230eefbd 229
okini3939 0:8ba6230eefbd 230 return 0;
okini3939 0:8ba6230eefbd 231 }
okini3939 0:8ba6230eefbd 232
okini3939 0:8ba6230eefbd 233 /*
okini3939 0:8ba6230eefbd 234 * NAME: free_bitrate()
okini3939 0:8ba6230eefbd 235 * DESCRIPTION: attempt to discover the bitstream's free bitrate
okini3939 0:8ba6230eefbd 236 */
okini3939 0:8ba6230eefbd 237 static
okini3939 0:8ba6230eefbd 238 int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
okini3939 0:8ba6230eefbd 239 {
okini3939 0:8ba6230eefbd 240 struct mad_bitptr keep_ptr;
okini3939 0:8ba6230eefbd 241 unsigned long rate = 0;
okini3939 0:8ba6230eefbd 242 unsigned int pad_slot, slots_per_frame;
okini3939 0:8ba6230eefbd 243 unsigned char const *ptr = 0;
okini3939 0:8ba6230eefbd 244
okini3939 0:8ba6230eefbd 245 keep_ptr = stream->ptr;
okini3939 0:8ba6230eefbd 246
okini3939 0:8ba6230eefbd 247 pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
okini3939 0:8ba6230eefbd 248 slots_per_frame = (header->layer == MAD_LAYER_III &&
okini3939 0:8ba6230eefbd 249 (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144;
okini3939 0:8ba6230eefbd 250
okini3939 0:8ba6230eefbd 251 while (mad_stream_sync(stream) == 0) {
okini3939 0:8ba6230eefbd 252 struct mad_stream peek_stream;
okini3939 0:8ba6230eefbd 253 struct mad_header peek_header;
okini3939 0:8ba6230eefbd 254
okini3939 0:8ba6230eefbd 255 peek_stream = *stream;
okini3939 0:8ba6230eefbd 256 peek_header = *header;
okini3939 0:8ba6230eefbd 257
okini3939 0:8ba6230eefbd 258 if (decode_header(&peek_header, &peek_stream) == 0 &&
okini3939 0:8ba6230eefbd 259 peek_header.layer == header->layer &&
okini3939 0:8ba6230eefbd 260 peek_header.samplerate == header->samplerate) {
okini3939 0:8ba6230eefbd 261 unsigned int N;
okini3939 0:8ba6230eefbd 262
okini3939 0:8ba6230eefbd 263 ptr = mad_bit_nextbyte(&stream->ptr);
okini3939 0:8ba6230eefbd 264
okini3939 0:8ba6230eefbd 265 N = ptr - stream->this_frame;
okini3939 0:8ba6230eefbd 266
okini3939 0:8ba6230eefbd 267 if (header->layer == MAD_LAYER_I) {
okini3939 0:8ba6230eefbd 268 rate = (unsigned long) header->samplerate *
okini3939 0:8ba6230eefbd 269 (N - 4 * pad_slot + 4) / 48 / 1000;
okini3939 0:8ba6230eefbd 270 }
okini3939 0:8ba6230eefbd 271 else {
okini3939 0:8ba6230eefbd 272 rate = (unsigned long) header->samplerate *
okini3939 0:8ba6230eefbd 273 (N - pad_slot + 1) / slots_per_frame / 1000;
okini3939 0:8ba6230eefbd 274 }
okini3939 0:8ba6230eefbd 275
okini3939 0:8ba6230eefbd 276 if (rate >= 8)
okini3939 0:8ba6230eefbd 277 break;
okini3939 0:8ba6230eefbd 278 }
okini3939 0:8ba6230eefbd 279
okini3939 0:8ba6230eefbd 280 mad_bit_skip(&stream->ptr, 8);
okini3939 0:8ba6230eefbd 281 }
okini3939 0:8ba6230eefbd 282
okini3939 0:8ba6230eefbd 283 stream->ptr = keep_ptr;
okini3939 0:8ba6230eefbd 284
okini3939 0:8ba6230eefbd 285 if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) {
okini3939 0:8ba6230eefbd 286 stream->error = MAD_ERROR_LOSTSYNC;
okini3939 0:8ba6230eefbd 287 return -1;
okini3939 0:8ba6230eefbd 288 }
okini3939 0:8ba6230eefbd 289
okini3939 0:8ba6230eefbd 290 stream->freerate = rate * 1000;
okini3939 0:8ba6230eefbd 291
okini3939 0:8ba6230eefbd 292 return 0;
okini3939 0:8ba6230eefbd 293 }
okini3939 0:8ba6230eefbd 294
okini3939 0:8ba6230eefbd 295 /*
okini3939 0:8ba6230eefbd 296 * NAME: header->decode()
okini3939 0:8ba6230eefbd 297 * DESCRIPTION: read the next frame header from the stream
okini3939 0:8ba6230eefbd 298 */
okini3939 0:8ba6230eefbd 299 int mad_header_decode(struct mad_header *header, struct mad_stream *stream)
okini3939 0:8ba6230eefbd 300 {
okini3939 0:8ba6230eefbd 301 register unsigned char const *ptr, *end;
okini3939 0:8ba6230eefbd 302 unsigned int pad_slot, N;
okini3939 0:8ba6230eefbd 303
okini3939 0:8ba6230eefbd 304 ptr = stream->next_frame;
okini3939 0:8ba6230eefbd 305 end = stream->bufend;
okini3939 0:8ba6230eefbd 306
okini3939 0:8ba6230eefbd 307 if (ptr == 0) {
okini3939 0:8ba6230eefbd 308 stream->error = MAD_ERROR_BUFPTR;
okini3939 0:8ba6230eefbd 309 goto fail;
okini3939 0:8ba6230eefbd 310 }
okini3939 0:8ba6230eefbd 311
okini3939 0:8ba6230eefbd 312 /* stream skip */
okini3939 0:8ba6230eefbd 313 if (stream->skiplen) {
okini3939 0:8ba6230eefbd 314 if (!stream->sync)
okini3939 0:8ba6230eefbd 315 ptr = stream->this_frame;
okini3939 0:8ba6230eefbd 316
okini3939 0:8ba6230eefbd 317 if (end - ptr < stream->skiplen) {
okini3939 0:8ba6230eefbd 318 stream->skiplen -= end - ptr;
okini3939 0:8ba6230eefbd 319 stream->next_frame = end;
okini3939 0:8ba6230eefbd 320
okini3939 0:8ba6230eefbd 321 stream->error = MAD_ERROR_BUFLEN;
okini3939 0:8ba6230eefbd 322 goto fail;
okini3939 0:8ba6230eefbd 323 }
okini3939 0:8ba6230eefbd 324
okini3939 0:8ba6230eefbd 325 ptr += stream->skiplen;
okini3939 0:8ba6230eefbd 326 stream->skiplen = 0;
okini3939 0:8ba6230eefbd 327
okini3939 0:8ba6230eefbd 328 stream->sync = 1;
okini3939 0:8ba6230eefbd 329 }
okini3939 0:8ba6230eefbd 330
okini3939 0:8ba6230eefbd 331 sync:
okini3939 0:8ba6230eefbd 332 /* synchronize */
okini3939 0:8ba6230eefbd 333 if (stream->sync) {
okini3939 0:8ba6230eefbd 334 if (end - ptr < MAD_BUFFER_GUARD) {
okini3939 0:8ba6230eefbd 335 stream->next_frame = ptr;
okini3939 0:8ba6230eefbd 336
okini3939 0:8ba6230eefbd 337 stream->error = MAD_ERROR_BUFLEN;
okini3939 0:8ba6230eefbd 338 goto fail;
okini3939 0:8ba6230eefbd 339 }
okini3939 0:8ba6230eefbd 340 else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) {
okini3939 0:8ba6230eefbd 341 /* mark point where frame sync word was expected */
okini3939 0:8ba6230eefbd 342 stream->this_frame = ptr;
okini3939 0:8ba6230eefbd 343 stream->next_frame = ptr + 1;
okini3939 0:8ba6230eefbd 344
okini3939 0:8ba6230eefbd 345 stream->error = MAD_ERROR_LOSTSYNC;
okini3939 0:8ba6230eefbd 346 goto fail;
okini3939 0:8ba6230eefbd 347 }
okini3939 0:8ba6230eefbd 348 }
okini3939 0:8ba6230eefbd 349 else {
okini3939 0:8ba6230eefbd 350 mad_bit_init(&stream->ptr, ptr);
okini3939 0:8ba6230eefbd 351
okini3939 0:8ba6230eefbd 352 if (mad_stream_sync(stream) == -1) {
okini3939 0:8ba6230eefbd 353 if (end - stream->next_frame >= MAD_BUFFER_GUARD)
okini3939 0:8ba6230eefbd 354 stream->next_frame = end - MAD_BUFFER_GUARD;
okini3939 0:8ba6230eefbd 355
okini3939 0:8ba6230eefbd 356 stream->error = MAD_ERROR_BUFLEN;
okini3939 0:8ba6230eefbd 357 goto fail;
okini3939 0:8ba6230eefbd 358 }
okini3939 0:8ba6230eefbd 359
okini3939 0:8ba6230eefbd 360 ptr = mad_bit_nextbyte(&stream->ptr);
okini3939 0:8ba6230eefbd 361 }
okini3939 0:8ba6230eefbd 362
okini3939 0:8ba6230eefbd 363 /* begin processing */
okini3939 0:8ba6230eefbd 364 stream->this_frame = ptr;
okini3939 0:8ba6230eefbd 365 stream->next_frame = ptr + 1; /* possibly bogus sync word */
okini3939 0:8ba6230eefbd 366
okini3939 0:8ba6230eefbd 367 mad_bit_init(&stream->ptr, stream->this_frame);
okini3939 0:8ba6230eefbd 368
okini3939 0:8ba6230eefbd 369 if (decode_header(header, stream) == -1)
okini3939 0:8ba6230eefbd 370 goto fail;
okini3939 0:8ba6230eefbd 371
okini3939 0:8ba6230eefbd 372 /* calculate frame duration */
okini3939 0:8ba6230eefbd 373 mad_timer_set(&header->duration, 0,
okini3939 0:8ba6230eefbd 374 32 * MAD_NSBSAMPLES(header), header->samplerate);
okini3939 0:8ba6230eefbd 375
okini3939 0:8ba6230eefbd 376 /* calculate free bit rate */
okini3939 0:8ba6230eefbd 377 if (header->bitrate == 0) {
okini3939 0:8ba6230eefbd 378 if ((stream->freerate == 0 || !stream->sync ||
okini3939 0:8ba6230eefbd 379 (header->layer == MAD_LAYER_III && stream->freerate > 640000)) &&
okini3939 0:8ba6230eefbd 380 free_bitrate(stream, header) == -1)
okini3939 0:8ba6230eefbd 381 goto fail;
okini3939 0:8ba6230eefbd 382
okini3939 0:8ba6230eefbd 383 header->bitrate = stream->freerate;
okini3939 0:8ba6230eefbd 384 header->flags |= MAD_FLAG_FREEFORMAT;
okini3939 0:8ba6230eefbd 385 }
okini3939 0:8ba6230eefbd 386
okini3939 0:8ba6230eefbd 387 /* calculate beginning of next frame */
okini3939 0:8ba6230eefbd 388 pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
okini3939 0:8ba6230eefbd 389
okini3939 0:8ba6230eefbd 390 if (header->layer == MAD_LAYER_I)
okini3939 0:8ba6230eefbd 391 N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4;
okini3939 0:8ba6230eefbd 392 else {
okini3939 0:8ba6230eefbd 393 unsigned int slots_per_frame;
okini3939 0:8ba6230eefbd 394
okini3939 0:8ba6230eefbd 395 slots_per_frame = (header->layer == MAD_LAYER_III &&
okini3939 0:8ba6230eefbd 396 (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144;
okini3939 0:8ba6230eefbd 397
okini3939 0:8ba6230eefbd 398 N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot;
okini3939 0:8ba6230eefbd 399 }
okini3939 0:8ba6230eefbd 400
okini3939 0:8ba6230eefbd 401 /* verify there is enough data left in buffer to decode this frame */
okini3939 0:8ba6230eefbd 402 if (N + MAD_BUFFER_GUARD > end - stream->this_frame) {
okini3939 0:8ba6230eefbd 403 stream->next_frame = stream->this_frame;
okini3939 0:8ba6230eefbd 404
okini3939 0:8ba6230eefbd 405 stream->error = MAD_ERROR_BUFLEN;
okini3939 0:8ba6230eefbd 406 goto fail;
okini3939 0:8ba6230eefbd 407 }
okini3939 0:8ba6230eefbd 408
okini3939 0:8ba6230eefbd 409 stream->next_frame = stream->this_frame + N;
okini3939 0:8ba6230eefbd 410
okini3939 0:8ba6230eefbd 411 if (!stream->sync) {
okini3939 0:8ba6230eefbd 412 /* check that a valid frame header follows this frame */
okini3939 0:8ba6230eefbd 413
okini3939 0:8ba6230eefbd 414 ptr = stream->next_frame;
okini3939 0:8ba6230eefbd 415 if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) {
okini3939 0:8ba6230eefbd 416 ptr = stream->next_frame = stream->this_frame + 1;
okini3939 0:8ba6230eefbd 417 goto sync;
okini3939 0:8ba6230eefbd 418 }
okini3939 0:8ba6230eefbd 419
okini3939 0:8ba6230eefbd 420 stream->sync = 1;
okini3939 0:8ba6230eefbd 421 }
okini3939 0:8ba6230eefbd 422
okini3939 0:8ba6230eefbd 423 header->flags |= MAD_FLAG_INCOMPLETE;
okini3939 0:8ba6230eefbd 424
okini3939 0:8ba6230eefbd 425 return 0;
okini3939 0:8ba6230eefbd 426
okini3939 0:8ba6230eefbd 427 fail:
okini3939 0:8ba6230eefbd 428 stream->sync = 0;
okini3939 0:8ba6230eefbd 429
okini3939 0:8ba6230eefbd 430 return -1;
okini3939 0:8ba6230eefbd 431 }
okini3939 0:8ba6230eefbd 432
okini3939 0:8ba6230eefbd 433 /*
okini3939 0:8ba6230eefbd 434 * NAME: frame->decode()
okini3939 0:8ba6230eefbd 435 * DESCRIPTION: decode a single frame from a bitstream
okini3939 0:8ba6230eefbd 436 */
okini3939 0:8ba6230eefbd 437 int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream)
okini3939 0:8ba6230eefbd 438 {
okini3939 0:8ba6230eefbd 439 frame->options = stream->options;
okini3939 0:8ba6230eefbd 440
okini3939 0:8ba6230eefbd 441 /* header() */
okini3939 0:8ba6230eefbd 442 /* error_check() */
okini3939 0:8ba6230eefbd 443
okini3939 0:8ba6230eefbd 444 if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) &&
okini3939 0:8ba6230eefbd 445 mad_header_decode(&frame->header, stream) == -1)
okini3939 0:8ba6230eefbd 446 goto fail;
okini3939 0:8ba6230eefbd 447
okini3939 0:8ba6230eefbd 448 /* audio_data() */
okini3939 0:8ba6230eefbd 449
okini3939 0:8ba6230eefbd 450 frame->header.flags &= ~MAD_FLAG_INCOMPLETE;
okini3939 0:8ba6230eefbd 451
okini3939 0:8ba6230eefbd 452 if (decoder_table[frame->header.layer - 1](stream, frame) == -1) {
okini3939 0:8ba6230eefbd 453 if (!MAD_RECOVERABLE(stream->error))
okini3939 0:8ba6230eefbd 454 stream->next_frame = stream->this_frame;
okini3939 0:8ba6230eefbd 455
okini3939 0:8ba6230eefbd 456 goto fail;
okini3939 0:8ba6230eefbd 457 }
okini3939 0:8ba6230eefbd 458
okini3939 0:8ba6230eefbd 459 /* ancillary_data() */
okini3939 0:8ba6230eefbd 460
okini3939 0:8ba6230eefbd 461 if (frame->header.layer != MAD_LAYER_III) {
okini3939 0:8ba6230eefbd 462 struct mad_bitptr next_frame;
okini3939 0:8ba6230eefbd 463
okini3939 0:8ba6230eefbd 464 mad_bit_init(&next_frame, stream->next_frame);
okini3939 0:8ba6230eefbd 465
okini3939 0:8ba6230eefbd 466 stream->anc_ptr = stream->ptr;
okini3939 0:8ba6230eefbd 467 stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame);
okini3939 0:8ba6230eefbd 468
okini3939 0:8ba6230eefbd 469 mad_bit_finish(&next_frame);
okini3939 0:8ba6230eefbd 470 }
okini3939 0:8ba6230eefbd 471
okini3939 0:8ba6230eefbd 472 return 0;
okini3939 0:8ba6230eefbd 473
okini3939 0:8ba6230eefbd 474 fail:
okini3939 0:8ba6230eefbd 475 stream->anc_bitlen = 0;
okini3939 0:8ba6230eefbd 476 return -1;
okini3939 0:8ba6230eefbd 477 }
okini3939 0:8ba6230eefbd 478
okini3939 0:8ba6230eefbd 479 /*
okini3939 0:8ba6230eefbd 480 * NAME: frame->mute()
okini3939 0:8ba6230eefbd 481 * DESCRIPTION: zero all subband values so the frame becomes silent
okini3939 0:8ba6230eefbd 482 */
okini3939 0:8ba6230eefbd 483 void mad_frame_mute(struct mad_frame *frame)
okini3939 0:8ba6230eefbd 484 {
okini3939 0:8ba6230eefbd 485 unsigned int s, sb;
okini3939 0:8ba6230eefbd 486
okini3939 0:8ba6230eefbd 487 for (s = 0; s < 36; ++s) {
okini3939 0:8ba6230eefbd 488 for (sb = 0; sb < 32; ++sb) {
okini3939 0:8ba6230eefbd 489 frame->sbsample[0][s][sb] =
okini3939 0:8ba6230eefbd 490 frame->sbsample[1][s][sb] = 0;
okini3939 0:8ba6230eefbd 491 }
okini3939 0:8ba6230eefbd 492 }
okini3939 0:8ba6230eefbd 493
okini3939 0:8ba6230eefbd 494 if (frame->overlap) {
okini3939 0:8ba6230eefbd 495 for (s = 0; s < 18; ++s) {
okini3939 0:8ba6230eefbd 496 for (sb = 0; sb < 32; ++sb) {
okini3939 0:8ba6230eefbd 497 (frame->overlap)[0][sb][s] =
okini3939 0:8ba6230eefbd 498 (frame->overlap)[1][sb][s] = 0;
okini3939 0:8ba6230eefbd 499 }
okini3939 0:8ba6230eefbd 500 }
okini3939 0:8ba6230eefbd 501 }
okini3939 0:8ba6230eefbd 502 }