]> 4ch.mooo.com Git - 16.git/blob - src/lib/dl/ext/libmad/stream.c
cleaned up the repo from debugging watcom2 ^^
[16.git] / src / lib / dl / ext / libmad / stream.c
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 }