00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00025 # ifndef LIBMAD_FRAME_H
00026 # define LIBMAD_FRAME_H
00027
00028 # include "fixed.h"
00029 # include "timer.h"
00030 # include "stream.h"
00031
00032 enum mad_layer {
00033 MAD_LAYER_I = 1,
00034 MAD_LAYER_II = 2,
00035 MAD_LAYER_III = 3
00036 };
00037
00038 enum mad_mode {
00039 MAD_MODE_SINGLE_CHANNEL = 0,
00040 MAD_MODE_DUAL_CHANNEL = 1,
00041 MAD_MODE_JOINT_STEREO = 2,
00042 MAD_MODE_STEREO = 3
00043 };
00044
00045 enum mad_emphasis {
00046 MAD_EMPHASIS_NONE = 0,
00047 MAD_EMPHASIS_50_15_US = 1,
00048 MAD_EMPHASIS_CCITT_J_17 = 3,
00049 MAD_EMPHASIS_RESERVED = 2
00050 };
00051
00055 struct mad_header {
00056 enum mad_layer layer;
00057 enum mad_mode mode;
00058 int mode_extension;
00059 enum mad_emphasis emphasis;
00061 unsigned long bitrate;
00062 unsigned int samplerate;
00064 unsigned short crc_check;
00065 unsigned short crc_target;
00067 int flags;
00068 int private_bits;
00070 mad_timer_t duration;
00071 };
00072
00076 struct mad_frame {
00077 struct mad_header header;
00079 int options;
00081 mad_fixed_t sbsample[2][36][32];
00082 mad_fixed_t (*overlap)[2][32][18];
00083 };
00084
00085 # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1)
00086 # define MAD_NSBSAMPLES(header) \
00087 ((header)->layer == MAD_LAYER_I ? 12 : \
00088 (((header)->layer == MAD_LAYER_III && \
00089 ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36))
00090
00091 enum {
00092 MAD_FLAG_NPRIVATE_III = 0x0007,
00093 MAD_FLAG_INCOMPLETE = 0x0008,
00095 MAD_FLAG_PROTECTION = 0x0010,
00096 MAD_FLAG_COPYRIGHT = 0x0020,
00097 MAD_FLAG_ORIGINAL = 0x0040,
00098 MAD_FLAG_PADDING = 0x0080,
00100 MAD_FLAG_I_STEREO = 0x0100,
00101 MAD_FLAG_MS_STEREO = 0x0200,
00102 MAD_FLAG_FREEFORMAT = 0x0400,
00104 MAD_FLAG_LSF_EXT = 0x1000,
00105 MAD_FLAG_MC_EXT = 0x2000,
00106 MAD_FLAG_MPEG_2_5_EXT = 0x4000
00107 };
00108
00109 enum {
00110 MAD_PRIVATE_HEADER = 0x0100,
00111 MAD_PRIVATE_III = 0x001f
00112 };
00113
00114 void mad_header_init(struct mad_header *);
00115
00119 # define mad_header_finish(header)
00121 int mad_header_decode(struct mad_header *, struct mad_stream *);
00122
00123 void mad_frame_init(struct mad_frame *);
00124 void mad_frame_finish(struct mad_frame *);
00125
00126 int mad_frame_decode(struct mad_frame *, struct mad_stream *);
00127
00128 void mad_frame_mute(struct mad_frame *);
00129
00130 # endif