Mercurial > hg > sv-dependency-builds
comparison src/libmad-0.15.1b/stream.c @ 0:c7265573341e
Import initial set of sources
author | Chris Cannam |
---|---|
date | Mon, 18 Mar 2013 14:12:14 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c7265573341e |
---|---|
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 if (end - ptr < MAD_BUFFER_GUARD) | |
118 return -1; | |
119 | |
120 mad_bit_init(&stream->ptr, ptr); | |
121 | |
122 return 0; | |
123 } | |
124 | |
125 /* | |
126 * NAME: stream->errorstr() | |
127 * DESCRIPTION: return a string description of the current error condition | |
128 */ | |
129 char const *mad_stream_errorstr(struct mad_stream const *stream) | |
130 { | |
131 switch (stream->error) { | |
132 case MAD_ERROR_NONE: return "no error"; | |
133 | |
134 case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)"; | |
135 case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer"; | |
136 | |
137 case MAD_ERROR_NOMEM: return "not enough memory"; | |
138 | |
139 case MAD_ERROR_LOSTSYNC: return "lost synchronization"; | |
140 case MAD_ERROR_BADLAYER: return "reserved header layer value"; | |
141 case MAD_ERROR_BADBITRATE: return "forbidden bitrate value"; | |
142 case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value"; | |
143 case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value"; | |
144 | |
145 case MAD_ERROR_BADCRC: return "CRC check failed"; | |
146 case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value"; | |
147 case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index"; | |
148 case MAD_ERROR_BADMODE: return "bad bitrate/mode combination"; | |
149 case MAD_ERROR_BADFRAMELEN: return "bad frame length"; | |
150 case MAD_ERROR_BADBIGVALUES: return "bad big_values count"; | |
151 case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type"; | |
152 case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info"; | |
153 case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer"; | |
154 case MAD_ERROR_BADPART3LEN: return "bad audio data length"; | |
155 case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select"; | |
156 case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun"; | |
157 case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS"; | |
158 } | |
159 | |
160 return 0; | |
161 } |