blob: fea06dac9bd623fbf93f8dab5d59051dbce5daf8
1 | /* |
2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * |
5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. |
9 | * |
10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. |
14 | * |
15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * |
19 | * $Id: stream.c,v 1.12 2004/02/05 09:02:39 rob Exp $ |
20 | */ |
21 | |
22 | # ifdef HAVE_CONFIG_H |
23 | # include "config.h" |
24 | # endif |
25 | |
26 | # include "global.h" |
27 | |
28 | # include <stdlib.h> |
29 | |
30 | # include "bit.h" |
31 | # include "stream.h" |
32 | |
33 | /* |
34 | * NAME: stream->init() |
35 | * DESCRIPTION: initialize stream struct |
36 | */ |
37 | void mad_stream_init(struct mad_stream *stream) |
38 | { |
39 | stream->buffer = 0; |
40 | stream->bufend = 0; |
41 | stream->skiplen = 0; |
42 | |
43 | stream->sync = 0; |
44 | stream->freerate = 0; |
45 | |
46 | stream->this_frame = 0; |
47 | stream->next_frame = 0; |
48 | mad_bit_init(&stream->ptr, 0); |
49 | |
50 | mad_bit_init(&stream->anc_ptr, 0); |
51 | stream->anc_bitlen = 0; |
52 | |
53 | stream->main_data = 0; |
54 | stream->md_len = 0; |
55 | |
56 | stream->options = 0; |
57 | stream->error = MAD_ERROR_NONE; |
58 | } |
59 | |
60 | /* |
61 | * NAME: stream->finish() |
62 | * DESCRIPTION: deallocate any dynamic memory associated with stream |
63 | */ |
64 | void mad_stream_finish(struct mad_stream *stream) |
65 | { |
66 | if (stream->main_data) { |
67 | free(stream->main_data); |
68 | stream->main_data = 0; |
69 | } |
70 | |
71 | mad_bit_finish(&stream->anc_ptr); |
72 | mad_bit_finish(&stream->ptr); |
73 | } |
74 | |
75 | /* |
76 | * NAME: stream->buffer() |
77 | * DESCRIPTION: set stream buffer pointers |
78 | */ |
79 | void mad_stream_buffer(struct mad_stream *stream, |
80 | unsigned char const *buffer, unsigned long length) |
81 | { |
82 | stream->buffer = buffer; |
83 | stream->bufend = buffer + length; |
84 | |
85 | stream->this_frame = buffer; |
86 | stream->next_frame = buffer; |
87 | |
88 | stream->sync = 1; |
89 | |
90 | mad_bit_init(&stream->ptr, buffer); |
91 | } |
92 | |
93 | /* |
94 | * NAME: stream->skip() |
95 | * DESCRIPTION: arrange to skip bytes before the next frame |
96 | */ |
97 | void mad_stream_skip(struct mad_stream *stream, unsigned long length) |
98 | { |
99 | stream->skiplen += length; |
100 | } |
101 | |
102 | /* |
103 | * NAME: stream->sync() |
104 | * DESCRIPTION: locate the next stream sync word |
105 | */ |
106 | int mad_stream_sync(struct mad_stream *stream) |
107 | { |
108 | register unsigned char const *ptr, *end; |
109 | |
110 | ptr = mad_bit_nextbyte(&stream->ptr); |
111 | end = stream->bufend; |
112 | |
113 | while (ptr < end - 1 && |
114 | !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { |
115 | ++ptr; |
116 | } |
117 | |
118 | if (end - ptr < MAD_BUFFER_GUARD) { |
119 | return -1; |
120 | } |
121 | |
122 | mad_bit_init(&stream->ptr, ptr); |
123 | |
124 | return 0; |
125 | } |
126 | |
127 | /* |
128 | * NAME: stream->errorstr() |
129 | * DESCRIPTION: return a string description of the current error condition |
130 | */ |
131 | char const *mad_stream_errorstr(struct mad_stream const *stream) |
132 | { |
133 | switch (stream->error) { |
134 | case MAD_ERROR_NONE: |
135 | return "no error"; |
136 | |
137 | case MAD_ERROR_BUFLEN: |
138 | return "input buffer too small (or EOF)"; |
139 | case MAD_ERROR_BUFPTR: |
140 | return "invalid (null) buffer pointer"; |
141 | |
142 | case MAD_ERROR_NOMEM: |
143 | return "not enough memory"; |
144 | |
145 | case MAD_ERROR_LOSTSYNC: |
146 | return "lost synchronization"; |
147 | case MAD_ERROR_BADLAYER: |
148 | return "reserved header layer value"; |
149 | case MAD_ERROR_BADBITRATE: |
150 | return "forbidden bitrate value"; |
151 | case MAD_ERROR_BADSAMPLERATE: |
152 | return "reserved sample frequency value"; |
153 | case MAD_ERROR_BADEMPHASIS: |
154 | return "reserved emphasis value"; |
155 | |
156 | case MAD_ERROR_BADCRC: |
157 | return "CRC check failed"; |
158 | case MAD_ERROR_BADBITALLOC: |
159 | return "forbidden bit allocation value"; |
160 | case MAD_ERROR_BADSCALEFACTOR: |
161 | return "bad scalefactor index"; |
162 | case MAD_ERROR_BADMODE: |
163 | return "bad bitrate/mode combination"; |
164 | case MAD_ERROR_BADFRAMELEN: |
165 | return "bad frame length"; |
166 | case MAD_ERROR_BADBIGVALUES: |
167 | return "bad big_values count"; |
168 | case MAD_ERROR_BADBLOCKTYPE: |
169 | return "reserved block_type"; |
170 | case MAD_ERROR_BADSCFSI: |
171 | return "bad scalefactor selection info"; |
172 | case MAD_ERROR_BADDATAPTR: |
173 | return "bad main_data_begin pointer"; |
174 | case MAD_ERROR_BADPART3LEN: |
175 | return "bad audio data length"; |
176 | case MAD_ERROR_BADHUFFTABLE: |
177 | return "bad Huffman table select"; |
178 | case MAD_ERROR_BADHUFFDATA: |
179 | return "Huffman data overrun"; |
180 | case MAD_ERROR_BADSTEREO: |
181 | return "incompatible block_type for JS"; |
182 | } |
183 | |
184 | return 0; |
185 | } |
186 |