1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
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. *
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 *
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
12 ********************************************************************
14 function: subsumed libogg includes
16 ********************************************************************/
26 typedef struct ogg_buffer_state
{
27 struct ogg_buffer
*unused_buffers
;
28 struct ogg_reference
*unused_references
;
33 typedef struct ogg_buffer
{
39 ogg_buffer_state
*owner
;
40 struct ogg_buffer
*next
;
44 typedef struct ogg_reference
{
49 struct ogg_reference
*next
;
52 typedef struct oggpack_buffer
{
54 unsigned char *headptr
;
57 /* memory management */
61 /* render the byte/bit counter API constant time */
62 long count
; /* doesn't count the tail */
65 typedef struct oggbyte_buffer
{
66 ogg_reference
*baseref
;
74 typedef struct ogg_sync_state
{
75 /* decode memory management pool */
76 ogg_buffer_state
*bufferpool
;
79 ogg_reference
*fifo_head
;
80 ogg_reference
*fifo_tail
;
83 /* stream sync management */
90 typedef struct ogg_stream_state
{
91 ogg_reference
*header_head
;
92 ogg_reference
*header_tail
;
93 ogg_reference
*body_head
;
94 ogg_reference
*body_tail
;
96 int e_o_s
; /* set when we have buffered the last
97 packet in the logical bitstream */
98 int b_o_s
; /* set after we've written the initial page
99 of a logical bitstream */
102 ogg_int64_t packetno
; /* sequence number for decode; the framing
103 knows where there's a hole in the data,
104 but we need coupling so that the codec
105 (which is in a seperate abstraction
106 layer) also knows about the gap */
107 ogg_int64_t granulepos
;
110 ogg_uint32_t body_fill
;
112 /* decode-side state data */
117 ogg_uint32_t body_fill_next
;
122 ogg_reference
*packet
;
126 ogg_int64_t granulepos
;
127 ogg_int64_t packetno
; /* sequence number for decode; the framing
128 knows where there's a hole in the data,
129 but we need coupling so that the codec
130 (which is in a seperate abstraction
131 layer) also knows about the gap */
135 ogg_reference
*header
;
141 /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
143 extern void oggpack_readinit(oggpack_buffer
*b
,ogg_reference
*r
);
144 extern long oggpack_look_full(oggpack_buffer
*b
,int bits
);
145 extern long oggpack_read(oggpack_buffer
*b
,register int bits
);
147 /* Inline a few, often called functions */
149 /* mark read process as having run off the end */
150 static inline void _adv_halt(oggpack_buffer
*b
){
151 b
->headptr
=b
->head
->buffer
->data
+b
->head
->begin
+b
->head
->length
;
156 /* spans forward, skipping as many bytes as headend is negative; if
157 headend is zero, simply finds next byte. If we're up to the end
158 of the buffer, leaves headend at zero. If we've read past the end,
159 halt the decode process. */
160 static inline void _span(oggpack_buffer
*b
){
163 b
->count
+=b
->head
->length
;
164 b
->head
=b
->head
->next
;
165 b
->headptr
=b
->head
->buffer
->data
+b
->head
->begin
-b
->headend
;
166 b
->headend
+=b
->head
->length
;
168 /* we've either met the end of decode, or gone past it. halt
169 only if we're past */
170 if(b
->headend
<0 || b
->headbit
)
171 /* read has fallen off the end */
179 /* limited to 32 at a time */
180 static inline void oggpack_adv(oggpack_buffer
*b
,int bits
){
184 if((b
->headend
-=((unsigned)bits
)/8)<1)_span(b
);
187 static inline long oggpack_look(oggpack_buffer
*b
, int bits
){
188 if(bits
+b
->headbit
< b
->headend
<<3){
189 extern const unsigned long oggpack_mask
[];
190 unsigned long m
=oggpack_mask
[bits
];
191 unsigned long ret
=-1;
194 ret
=b
->headptr
[0]>>b
->headbit
;
196 ret
|=b
->headptr
[1]<<(8-b
->headbit
);
198 ret
|=b
->headptr
[2]<<(16-b
->headbit
);
200 ret
|=b
->headptr
[3]<<(24-b
->headbit
);
201 if(bits
>32 && b
->headbit
)
202 ret
|=b
->headptr
[4]<<(32-b
->headbit
);
208 return oggpack_look_full(b
, bits
);
212 /* Ogg BITSTREAM PRIMITIVES: decoding **************************/
214 extern ogg_sync_state
*ogg_sync_create(void);
215 extern int ogg_sync_destroy(ogg_sync_state
*oy
);
216 extern int ogg_sync_reset(ogg_sync_state
*oy
);
218 extern unsigned char *ogg_sync_bufferin(ogg_sync_state
*oy
, long size
);
219 extern int ogg_sync_wrote(ogg_sync_state
*oy
, long bytes
);
220 extern long ogg_sync_pageseek(ogg_sync_state
*oy
,ogg_page
*og
);
221 extern int ogg_stream_pagein(ogg_stream_state
*os
, ogg_page
*og
);
222 extern int ogg_stream_packetout(ogg_stream_state
*os
,ogg_packet
*op
);
223 extern int ogg_stream_packetpeek(ogg_stream_state
*os
,ogg_packet
*op
);
225 /* Ogg BITSTREAM PRIMITIVES: general ***************************/
227 extern ogg_stream_state
*ogg_stream_create(int serialno
);
228 extern int ogg_stream_destroy(ogg_stream_state
*os
);
229 extern int ogg_stream_reset(ogg_stream_state
*os
);
230 extern int ogg_stream_reset_serialno(ogg_stream_state
*os
,int serialno
);
231 extern int ogg_stream_eos(ogg_stream_state
*os
);
233 extern int ogg_page_checksum_set(ogg_page
*og
);
235 extern int ogg_page_version(ogg_page
*og
);
236 extern int ogg_page_continued(ogg_page
*og
);
237 extern int ogg_page_bos(ogg_page
*og
);
238 extern int ogg_page_eos(ogg_page
*og
);
239 extern ogg_int64_t
ogg_page_granulepos(ogg_page
*og
);
240 extern ogg_uint32_t
ogg_page_serialno(ogg_page
*og
);
241 extern ogg_uint32_t
ogg_page_pageno(ogg_page
*og
);
242 extern int ogg_page_getbuffer(ogg_page
*og
, unsigned char **buffer
);
244 extern int ogg_packet_release(ogg_packet
*op
);
245 extern int ogg_page_release(ogg_page
*og
);
247 extern void ogg_page_dup(ogg_page
*d
, ogg_page
*s
);
249 /* Ogg BITSTREAM PRIMITIVES: return codes ***************************/
251 #define OGG_SUCCESS 0
255 #define OGG_EVERSION -12
256 #define OGG_ESERIAL -13
257 #define OGG_EINVAL -14