annotate src/libmad-0.15.1b/frame.c @ 23:619f715526df sv_v2.1

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