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