annotate src/libmad-0.15.1b/frame.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
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 }