rev |
line source |
nuclear@0
|
1 /********************************************************************
|
nuclear@0
|
2 * *
|
nuclear@0
|
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
nuclear@0
|
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
nuclear@0
|
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
nuclear@0
|
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
nuclear@0
|
7 * *
|
nuclear@0
|
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 *
|
nuclear@0
|
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
|
nuclear@0
|
10
|
nuclear@0
|
11 ********************************************************************
|
nuclear@0
|
12
|
nuclear@0
|
13 function: libvorbis codec headers
|
nuclear@0
|
14 last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $
|
nuclear@0
|
15
|
nuclear@0
|
16 ********************************************************************/
|
nuclear@0
|
17
|
nuclear@0
|
18 #ifndef _vorbis_codec_h_
|
nuclear@0
|
19 #define _vorbis_codec_h_
|
nuclear@0
|
20
|
nuclear@0
|
21 #ifdef __cplusplus
|
nuclear@0
|
22 extern "C"
|
nuclear@0
|
23 {
|
nuclear@0
|
24 #endif /* __cplusplus */
|
nuclear@0
|
25
|
nuclear@0
|
26 #include <ogg/ogg.h>
|
nuclear@0
|
27
|
nuclear@0
|
28 typedef struct vorbis_info{
|
nuclear@0
|
29 int version;
|
nuclear@0
|
30 int channels;
|
nuclear@0
|
31 long rate;
|
nuclear@0
|
32
|
nuclear@0
|
33 /* The below bitrate declarations are *hints*.
|
nuclear@0
|
34 Combinations of the three values carry the following implications:
|
nuclear@0
|
35
|
nuclear@0
|
36 all three set to the same value:
|
nuclear@0
|
37 implies a fixed rate bitstream
|
nuclear@0
|
38 only nominal set:
|
nuclear@0
|
39 implies a VBR stream that averages the nominal bitrate. No hard
|
nuclear@0
|
40 upper/lower limit
|
nuclear@0
|
41 upper and or lower set:
|
nuclear@0
|
42 implies a VBR bitstream that obeys the bitrate limits. nominal
|
nuclear@0
|
43 may also be set to give a nominal rate.
|
nuclear@0
|
44 none set:
|
nuclear@0
|
45 the coder does not care to speculate.
|
nuclear@0
|
46 */
|
nuclear@0
|
47
|
nuclear@0
|
48 long bitrate_upper;
|
nuclear@0
|
49 long bitrate_nominal;
|
nuclear@0
|
50 long bitrate_lower;
|
nuclear@0
|
51 long bitrate_window;
|
nuclear@0
|
52
|
nuclear@0
|
53 void *codec_setup;
|
nuclear@0
|
54 } vorbis_info;
|
nuclear@0
|
55
|
nuclear@0
|
56 /* vorbis_dsp_state buffers the current vorbis audio
|
nuclear@0
|
57 analysis/synthesis state. The DSP state belongs to a specific
|
nuclear@0
|
58 logical bitstream ****************************************************/
|
nuclear@0
|
59 typedef struct vorbis_dsp_state{
|
nuclear@0
|
60 int analysisp;
|
nuclear@0
|
61 vorbis_info *vi;
|
nuclear@0
|
62
|
nuclear@0
|
63 float **pcm;
|
nuclear@0
|
64 float **pcmret;
|
nuclear@0
|
65 int pcm_storage;
|
nuclear@0
|
66 int pcm_current;
|
nuclear@0
|
67 int pcm_returned;
|
nuclear@0
|
68
|
nuclear@0
|
69 int preextrapolate;
|
nuclear@0
|
70 int eofflag;
|
nuclear@0
|
71
|
nuclear@0
|
72 long lW;
|
nuclear@0
|
73 long W;
|
nuclear@0
|
74 long nW;
|
nuclear@0
|
75 long centerW;
|
nuclear@0
|
76
|
nuclear@0
|
77 ogg_int64_t granulepos;
|
nuclear@0
|
78 ogg_int64_t sequence;
|
nuclear@0
|
79
|
nuclear@0
|
80 ogg_int64_t glue_bits;
|
nuclear@0
|
81 ogg_int64_t time_bits;
|
nuclear@0
|
82 ogg_int64_t floor_bits;
|
nuclear@0
|
83 ogg_int64_t res_bits;
|
nuclear@0
|
84
|
nuclear@0
|
85 void *backend_state;
|
nuclear@0
|
86 } vorbis_dsp_state;
|
nuclear@0
|
87
|
nuclear@0
|
88 typedef struct vorbis_block{
|
nuclear@0
|
89 /* necessary stream state for linking to the framing abstraction */
|
nuclear@0
|
90 float **pcm; /* this is a pointer into local storage */
|
nuclear@0
|
91 oggpack_buffer opb;
|
nuclear@0
|
92
|
nuclear@0
|
93 long lW;
|
nuclear@0
|
94 long W;
|
nuclear@0
|
95 long nW;
|
nuclear@0
|
96 int pcmend;
|
nuclear@0
|
97 int mode;
|
nuclear@0
|
98
|
nuclear@0
|
99 int eofflag;
|
nuclear@0
|
100 ogg_int64_t granulepos;
|
nuclear@0
|
101 ogg_int64_t sequence;
|
nuclear@0
|
102 vorbis_dsp_state *vd; /* For read-only access of configuration */
|
nuclear@0
|
103
|
nuclear@0
|
104 /* local storage to avoid remallocing; it's up to the mapping to
|
nuclear@0
|
105 structure it */
|
nuclear@0
|
106 void *localstore;
|
nuclear@0
|
107 long localtop;
|
nuclear@0
|
108 long localalloc;
|
nuclear@0
|
109 long totaluse;
|
nuclear@0
|
110 struct alloc_chain *reap;
|
nuclear@0
|
111
|
nuclear@0
|
112 /* bitmetrics for the frame */
|
nuclear@0
|
113 long glue_bits;
|
nuclear@0
|
114 long time_bits;
|
nuclear@0
|
115 long floor_bits;
|
nuclear@0
|
116 long res_bits;
|
nuclear@0
|
117
|
nuclear@0
|
118 void *internal;
|
nuclear@0
|
119
|
nuclear@0
|
120 } vorbis_block;
|
nuclear@0
|
121
|
nuclear@0
|
122 /* vorbis_block is a single block of data to be processed as part of
|
nuclear@0
|
123 the analysis/synthesis stream; it belongs to a specific logical
|
nuclear@0
|
124 bitstream, but is independent from other vorbis_blocks belonging to
|
nuclear@0
|
125 that logical bitstream. *************************************************/
|
nuclear@0
|
126
|
nuclear@0
|
127 struct alloc_chain{
|
nuclear@0
|
128 void *ptr;
|
nuclear@0
|
129 struct alloc_chain *next;
|
nuclear@0
|
130 };
|
nuclear@0
|
131
|
nuclear@0
|
132 /* vorbis_info contains all the setup information specific to the
|
nuclear@0
|
133 specific compression/decompression mode in progress (eg,
|
nuclear@0
|
134 psychoacoustic settings, channel setup, options, codebook
|
nuclear@0
|
135 etc). vorbis_info and substructures are in backends.h.
|
nuclear@0
|
136 *********************************************************************/
|
nuclear@0
|
137
|
nuclear@0
|
138 /* the comments are not part of vorbis_info so that vorbis_info can be
|
nuclear@0
|
139 static storage */
|
nuclear@0
|
140 typedef struct vorbis_comment{
|
nuclear@0
|
141 /* unlimited user comment fields. libvorbis writes 'libvorbis'
|
nuclear@0
|
142 whatever vendor is set to in encode */
|
nuclear@0
|
143 char **user_comments;
|
nuclear@0
|
144 int *comment_lengths;
|
nuclear@0
|
145 int comments;
|
nuclear@0
|
146 char *vendor;
|
nuclear@0
|
147
|
nuclear@0
|
148 } vorbis_comment;
|
nuclear@0
|
149
|
nuclear@0
|
150
|
nuclear@0
|
151 /* libvorbis encodes in two abstraction layers; first we perform DSP
|
nuclear@0
|
152 and produce a packet (see docs/analysis.txt). The packet is then
|
nuclear@0
|
153 coded into a framed OggSquish bitstream by the second layer (see
|
nuclear@0
|
154 docs/framing.txt). Decode is the reverse process; we sync/frame
|
nuclear@0
|
155 the bitstream and extract individual packets, then decode the
|
nuclear@0
|
156 packet back into PCM audio.
|
nuclear@0
|
157
|
nuclear@0
|
158 The extra framing/packetizing is used in streaming formats, such as
|
nuclear@0
|
159 files. Over the net (such as with UDP), the framing and
|
nuclear@0
|
160 packetization aren't necessary as they're provided by the transport
|
nuclear@0
|
161 and the streaming layer is not used */
|
nuclear@0
|
162
|
nuclear@0
|
163 /* Vorbis PRIMITIVES: general ***************************************/
|
nuclear@0
|
164
|
nuclear@0
|
165 extern void vorbis_info_init(vorbis_info *vi);
|
nuclear@0
|
166 extern void vorbis_info_clear(vorbis_info *vi);
|
nuclear@0
|
167 extern int vorbis_info_blocksize(vorbis_info *vi,int zo);
|
nuclear@0
|
168 extern void vorbis_comment_init(vorbis_comment *vc);
|
nuclear@0
|
169 extern void vorbis_comment_add(vorbis_comment *vc, const char *comment);
|
nuclear@0
|
170 extern void vorbis_comment_add_tag(vorbis_comment *vc,
|
nuclear@0
|
171 const char *tag, const char *contents);
|
nuclear@0
|
172 extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count);
|
nuclear@0
|
173 extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag);
|
nuclear@0
|
174 extern void vorbis_comment_clear(vorbis_comment *vc);
|
nuclear@0
|
175
|
nuclear@0
|
176 extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb);
|
nuclear@0
|
177 extern int vorbis_block_clear(vorbis_block *vb);
|
nuclear@0
|
178 extern void vorbis_dsp_clear(vorbis_dsp_state *v);
|
nuclear@0
|
179 extern double vorbis_granule_time(vorbis_dsp_state *v,
|
nuclear@0
|
180 ogg_int64_t granulepos);
|
nuclear@0
|
181
|
nuclear@0
|
182 extern const char *vorbis_version_string(void);
|
nuclear@0
|
183
|
nuclear@0
|
184 /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/
|
nuclear@0
|
185
|
nuclear@0
|
186 extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi);
|
nuclear@0
|
187 extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op);
|
nuclear@0
|
188 extern int vorbis_analysis_headerout(vorbis_dsp_state *v,
|
nuclear@0
|
189 vorbis_comment *vc,
|
nuclear@0
|
190 ogg_packet *op,
|
nuclear@0
|
191 ogg_packet *op_comm,
|
nuclear@0
|
192 ogg_packet *op_code);
|
nuclear@0
|
193 extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals);
|
nuclear@0
|
194 extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals);
|
nuclear@0
|
195 extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb);
|
nuclear@0
|
196 extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op);
|
nuclear@0
|
197
|
nuclear@0
|
198 extern int vorbis_bitrate_addblock(vorbis_block *vb);
|
nuclear@0
|
199 extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,
|
nuclear@0
|
200 ogg_packet *op);
|
nuclear@0
|
201
|
nuclear@0
|
202 /* Vorbis PRIMITIVES: synthesis layer *******************************/
|
nuclear@0
|
203 extern int vorbis_synthesis_idheader(ogg_packet *op);
|
nuclear@0
|
204 extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,
|
nuclear@0
|
205 ogg_packet *op);
|
nuclear@0
|
206
|
nuclear@0
|
207 extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi);
|
nuclear@0
|
208 extern int vorbis_synthesis_restart(vorbis_dsp_state *v);
|
nuclear@0
|
209 extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op);
|
nuclear@0
|
210 extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op);
|
nuclear@0
|
211 extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb);
|
nuclear@0
|
212 extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm);
|
nuclear@0
|
213 extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm);
|
nuclear@0
|
214 extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples);
|
nuclear@0
|
215 extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op);
|
nuclear@0
|
216
|
nuclear@0
|
217 extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag);
|
nuclear@0
|
218 extern int vorbis_synthesis_halfrate_p(vorbis_info *v);
|
nuclear@0
|
219
|
nuclear@0
|
220 /* Vorbis ERRORS and return codes ***********************************/
|
nuclear@0
|
221
|
nuclear@0
|
222 #define OV_FALSE -1
|
nuclear@0
|
223 #define OV_EOF -2
|
nuclear@0
|
224 #define OV_HOLE -3
|
nuclear@0
|
225
|
nuclear@0
|
226 #define OV_EREAD -128
|
nuclear@0
|
227 #define OV_EFAULT -129
|
nuclear@0
|
228 #define OV_EIMPL -130
|
nuclear@0
|
229 #define OV_EINVAL -131
|
nuclear@0
|
230 #define OV_ENOTVORBIS -132
|
nuclear@0
|
231 #define OV_EBADHEADER -133
|
nuclear@0
|
232 #define OV_EVERSION -134
|
nuclear@0
|
233 #define OV_ENOTAUDIO -135
|
nuclear@0
|
234 #define OV_EBADPACKET -136
|
nuclear@0
|
235 #define OV_EBADLINK -137
|
nuclear@0
|
236 #define OV_ENOSEEK -138
|
nuclear@0
|
237
|
nuclear@0
|
238 #ifdef __cplusplus
|
nuclear@0
|
239 }
|
nuclear@0
|
240 #endif /* __cplusplus */
|
nuclear@0
|
241
|
nuclear@0
|
242 #endif
|
nuclear@0
|
243
|