annotate src/libmad-0.15.1b/frame.h @ 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.h,v 1.20 2004/01/23 09:41:32 rob Exp $
Chris@0 20 */
Chris@0 21
Chris@0 22 # ifndef LIBMAD_FRAME_H
Chris@0 23 # define LIBMAD_FRAME_H
Chris@0 24
Chris@0 25 # include "fixed.h"
Chris@0 26 # include "timer.h"
Chris@0 27 # include "stream.h"
Chris@0 28
Chris@0 29 enum mad_layer {
Chris@0 30 MAD_LAYER_I = 1, /* Layer I */
Chris@0 31 MAD_LAYER_II = 2, /* Layer II */
Chris@0 32 MAD_LAYER_III = 3 /* Layer III */
Chris@0 33 };
Chris@0 34
Chris@0 35 enum mad_mode {
Chris@0 36 MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */
Chris@0 37 MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */
Chris@0 38 MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */
Chris@0 39 MAD_MODE_STEREO = 3 /* normal LR stereo */
Chris@0 40 };
Chris@0 41
Chris@0 42 enum mad_emphasis {
Chris@0 43 MAD_EMPHASIS_NONE = 0, /* no emphasis */
Chris@0 44 MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */
Chris@0 45 MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */
Chris@0 46 MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */
Chris@0 47 };
Chris@0 48
Chris@0 49 struct mad_header {
Chris@0 50 enum mad_layer layer; /* audio layer (1, 2, or 3) */
Chris@0 51 enum mad_mode mode; /* channel mode (see above) */
Chris@0 52 int mode_extension; /* additional mode info */
Chris@0 53 enum mad_emphasis emphasis; /* de-emphasis to use (see above) */
Chris@0 54
Chris@0 55 unsigned long bitrate; /* stream bitrate (bps) */
Chris@0 56 unsigned int samplerate; /* sampling frequency (Hz) */
Chris@0 57
Chris@0 58 unsigned short crc_check; /* frame CRC accumulator */
Chris@0 59 unsigned short crc_target; /* final target CRC checksum */
Chris@0 60
Chris@0 61 int flags; /* flags (see below) */
Chris@0 62 int private_bits; /* private bits (see below) */
Chris@0 63
Chris@0 64 mad_timer_t duration; /* audio playing time of frame */
Chris@0 65 };
Chris@0 66
Chris@0 67 struct mad_frame {
Chris@0 68 struct mad_header header; /* MPEG audio header */
Chris@0 69
Chris@0 70 int options; /* decoding options (from stream) */
Chris@0 71
Chris@0 72 mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples */
Chris@0 73 mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */
Chris@0 74 };
Chris@0 75
Chris@0 76 # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1)
Chris@0 77 # define MAD_NSBSAMPLES(header) \
Chris@0 78 ((header)->layer == MAD_LAYER_I ? 12 : \
Chris@0 79 (((header)->layer == MAD_LAYER_III && \
Chris@0 80 ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36))
Chris@0 81
Chris@0 82 enum {
Chris@0 83 MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */
Chris@0 84 MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */
Chris@0 85
Chris@0 86 MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */
Chris@0 87 MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */
Chris@0 88 MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */
Chris@0 89 MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */
Chris@0 90
Chris@0 91 MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */
Chris@0 92 MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */
Chris@0 93 MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */
Chris@0 94
Chris@0 95 MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */
Chris@0 96 MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */
Chris@0 97 MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */
Chris@0 98 };
Chris@0 99
Chris@0 100 enum {
Chris@0 101 MAD_PRIVATE_HEADER = 0x0100, /* header private bit */
Chris@0 102 MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */
Chris@0 103 };
Chris@0 104
Chris@0 105 void mad_header_init(struct mad_header *);
Chris@0 106
Chris@0 107 # define mad_header_finish(header) /* nothing */
Chris@0 108
Chris@0 109 int mad_header_decode(struct mad_header *, struct mad_stream *);
Chris@0 110
Chris@0 111 void mad_frame_init(struct mad_frame *);
Chris@0 112 void mad_frame_finish(struct mad_frame *);
Chris@0 113
Chris@0 114 int mad_frame_decode(struct mad_frame *, struct mad_stream *);
Chris@0 115
Chris@0 116 void mad_frame_mute(struct mad_frame *);
Chris@0 117
Chris@0 118 # endif