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-2003    *
10  * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
11  *                                                                  *
12  ********************************************************************
13 
14  function: subsumed libogg includes
15 
16  ********************************************************************/
17 #ifndef _OGG_H
18 #define _OGG_H
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #include "os_types.h"
25 
26 typedef struct ogg_buffer_state{
27   struct ogg_buffer    *unused_buffers;
28   struct ogg_reference *unused_references;
29   int                   outstanding;
30   int                   shutdown;
31 } ogg_buffer_state;
32 
33 typedef struct ogg_buffer {
34   unsigned char      *data;
35   long                size;
36   int                 refcount;
37 
38   union {
39     ogg_buffer_state  *owner;
40     struct ogg_buffer *next;
41   } ptr;
42 } ogg_buffer;
43 
44 typedef struct ogg_reference {
45   ogg_buffer    *buffer;
46   long           begin;
47   long           length;
48 
49   struct ogg_reference *next;
50 } ogg_reference;
51 
52 typedef struct oggpack_buffer {
53   int            headbit;
54   unsigned char *headptr;
55   long           headend;
56 
57   /* memory management */
58   ogg_reference *head;
59   ogg_reference *tail;
60 
61   /* render the byte/bit counter API constant time */
62   long              count; /* doesn't count the tail */
63 } oggpack_buffer;
64 
65 typedef struct oggbyte_buffer {
66   ogg_reference *baseref;
67 
68   ogg_reference *ref;
69   unsigned char *ptr;
70   long           pos;
71   long           end;
72 } oggbyte_buffer;
73 
74 typedef struct ogg_sync_state {
75   /* decode memory management pool */
76   ogg_buffer_state *bufferpool;
77 
78   /* stream buffers */
79   ogg_reference    *fifo_head;
80   ogg_reference    *fifo_tail;
81   long              fifo_fill;
82 
83   /* stream sync management */
84   int               unsynced;
85   int               headerbytes;
86   int               bodybytes;
87 
88 } ogg_sync_state;
89 
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;
95 
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 */
100   long           serialno;
101   long           pageno;
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;
108 
109   int            lacing_fill;
110   ogg_uint32_t   body_fill;
111 
112   /* decode-side state data */
113   int            holeflag;
114   int            spanflag;
115   int            clearflag;
116   int            laceptr;
117   ogg_uint32_t   body_fill_next;
118 
119 } ogg_stream_state;
120 
121 typedef struct {
122   ogg_reference *packet;
123   long           bytes;
124   long           b_o_s;
125   long           e_o_s;
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 */
132 } ogg_packet;
133 
134 typedef struct {
135   ogg_reference *header;
136   int            header_len;
137   ogg_reference *body;
138   long           body_len;
139 } ogg_page;
140 
141 /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
142 
143 extern void  oggpack_readinit(oggpack_buffer *b,ogg_reference *r);
144 extern long  oggpack_look(oggpack_buffer *b,int bits);
145 extern void  oggpack_adv(oggpack_buffer *b,int bits);
146 extern long  oggpack_read(oggpack_buffer *b,int bits);
147 extern long  oggpack_bytes(oggpack_buffer *b);
148 extern long  oggpack_bits(oggpack_buffer *b);
149 extern int   oggpack_eop(oggpack_buffer *b);
150 
151 /* Ogg BITSTREAM PRIMITIVES: decoding **************************/
152 
153 extern ogg_sync_state *ogg_sync_create(void);
154 extern int      ogg_sync_destroy(ogg_sync_state *oy);
155 extern int      ogg_sync_reset(ogg_sync_state *oy);
156 
157 extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size);
158 extern int      ogg_sync_wrote(ogg_sync_state *oy, long bytes);
159 extern long     ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
160 extern int      ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
161 extern int      ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
162 extern int      ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
163 extern int      ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
164 
165 /* Ogg BITSTREAM PRIMITIVES: general ***************************/
166 
167 extern ogg_stream_state *ogg_stream_create(int serialno);
168 extern int      ogg_stream_destroy(ogg_stream_state *os);
169 extern int      ogg_stream_reset(ogg_stream_state *os);
170 extern int      ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);
171 extern int      ogg_stream_eos(ogg_stream_state *os);
172 
173 extern int      ogg_page_checksum_set(ogg_page *og);
174 
175 extern int      ogg_page_version(ogg_page *og);
176 extern int      ogg_page_continued(ogg_page *og);
177 extern int      ogg_page_bos(ogg_page *og);
178 extern int      ogg_page_eos(ogg_page *og);
179 extern ogg_int64_t  ogg_page_granulepos(ogg_page *og);
180 extern ogg_uint32_t ogg_page_serialno(ogg_page *og);
181 extern ogg_uint32_t ogg_page_pageno(ogg_page *og);
182 extern int      ogg_page_packets(ogg_page *og);
183 extern int      ogg_page_getbuffer(ogg_page *og, unsigned char **buffer);
184 
185 extern int      ogg_packet_release(ogg_packet *op);
186 extern int      ogg_page_release(ogg_page *og);
187 
188 extern void     ogg_page_dup(ogg_page *d, ogg_page *s);
189 
190 /* Ogg BITSTREAM PRIMITIVES: return codes ***************************/
191 
192 #define  OGG_SUCCESS   0
193 
194 #define  OGG_HOLE     -10
195 #define  OGG_SPAN     -11
196 #define  OGG_EVERSION -12
197 #define  OGG_ESERIAL  -13
198 #define  OGG_EINVAL   -14
199 #define  OGG_EEOS     -15
200 
201 
202 #ifdef __cplusplus
203 }
204 #endif
205 
206 #endif  /* _OGG_H */
207