51 long bitrate_window; |
54 long bitrate_window; |
52 |
55 |
53 void *codec_setup; |
56 void *codec_setup; |
54 } vorbis_info; |
57 } vorbis_info; |
55 |
58 |
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{ |
59 typedef struct vorbis_comment{ |
128 /* unlimited user comment fields. libvorbis writes 'libvorbis' |
|
129 whatever vendor is set to in encode */ |
|
130 char **user_comments; |
60 char **user_comments; |
131 int *comment_lengths; |
61 int *comment_lengths; |
132 int comments; |
62 int comments; |
133 char *vendor; |
63 char *vendor; |
134 |
64 |
135 } vorbis_comment; |
65 } vorbis_comment; |
136 |
66 |
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 |
67 |
150 /* Vorbis PRIMITIVES: general ***************************************/ |
68 /* Vorbis PRIMITIVES: general ***************************************/ |
151 |
69 |
152 extern void vorbis_info_init(vorbis_info *vi); |
70 extern void vorbis_info_init(vorbis_info *vi); |
153 extern void vorbis_info_clear(vorbis_info *vi); |
71 extern void vorbis_info_clear(vorbis_info *vi); |
157 extern void vorbis_comment_add_tag(vorbis_comment *vc, |
75 extern void vorbis_comment_add_tag(vorbis_comment *vc, |
158 char *tag, char *contents); |
76 char *tag, char *contents); |
159 extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); |
77 extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); |
160 extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); |
78 extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); |
161 extern void vorbis_comment_clear(vorbis_comment *vc); |
79 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 |
80 |
179 /* Vorbis ERRORS and return codes ***********************************/ |
81 /* Vorbis ERRORS and return codes ***********************************/ |
180 |
82 |
181 #define OV_FALSE -1 |
83 #define OV_FALSE -1 |
182 #define OV_EOF -2 |
84 #define OV_EOF -2 |