1 /************************************************************************
2  * Copyright (C) 2002-2009, Xiph.org Foundation
3  * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  *     * Neither the names of the Xiph.org Foundation nor Pinknoise
17  * Productions Ltd nor the names of its contributors may be used to
18  * endorse or promote products derived from this software without
19  * specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  ************************************************************************
33 
34  function: subsumed libogg includes
35 
36  ************************************************************************/
37 #ifndef _OGG_H
38 #define _OGG_H
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 #include "os_types.h"
45 
46 #ifndef ONLY_C
47 #define ARM_LITTLE_ENDIAN
48 #endif
49 
50 typedef struct ogg_buffer_state{
51   struct ogg_buffer    *unused_buffers;
52   struct ogg_reference *unused_references;
53   int                   outstanding;
54   int                   shutdown;
55 } ogg_buffer_state;
56 
57 typedef struct ogg_buffer {
58   unsigned char      *data;
59   long                size;
60   int                 refcount;
61 
62   union {
63     ogg_buffer_state  *owner;
64     struct ogg_buffer *next;
65   } ptr;
66 } ogg_buffer;
67 
68 typedef struct ogg_reference {
69   ogg_buffer    *buffer;
70   long           begin;
71   long           length;
72 
73   struct ogg_reference *next;
74 } ogg_reference;
75 
76 typedef struct oggpack_buffer {
77 #ifdef ARM_LITTLE_ENDIAN
78   int            bitsLeftInSegment;
79   ogg_uint32_t  *ptr;
80   long           bitsLeftInWord;
81 #else
82   int            headbit;
83   unsigned char *headptr;
84   long           headend;
85 #endif /* ARM_LITTLE_ENDIAN */
86   /* memory management */
87   ogg_reference *head;
88   ogg_reference *tail;
89 
90   /* render the byte/bit counter API constant time */
91   long              count; /* doesn't count the tail */
92 } oggpack_buffer;
93 
94 typedef struct oggbyte_buffer {
95   ogg_reference *baseref;
96 
97   ogg_reference *ref;
98   unsigned char *ptr;
99   long           pos;
100   long           end;
101 } oggbyte_buffer;
102 
103 typedef struct ogg_sync_state {
104   /* decode memory management pool */
105   ogg_buffer_state *bufferpool;
106 
107   /* stream buffers */
108   ogg_reference    *fifo_head;
109   ogg_reference    *fifo_tail;
110   long              fifo_fill;
111 
112   /* stream sync management */
113   int               unsynced;
114   int               headerbytes;
115   int               bodybytes;
116 
117 } ogg_sync_state;
118 
119 typedef struct ogg_stream_state {
120   ogg_reference *header_head;
121   ogg_reference *header_tail;
122   ogg_reference *body_head;
123   ogg_reference *body_tail;
124 
125   int            e_o_s;    /* set when we have buffered the last
126                               packet in the logical bitstream */
127   int            b_o_s;    /* set after we've written the initial page
128                               of a logical bitstream */
129   long           serialno;
130   long           pageno;
131   ogg_int64_t    packetno; /* sequence number for decode; the framing
132                               knows where there's a hole in the data,
133                               but we need coupling so that the codec
134                               (which is in a seperate abstraction
135                               layer) also knows about the gap */
136   ogg_int64_t    granulepos;
137 
138   int            lacing_fill;
139   ogg_uint32_t   body_fill;
140 
141   /* decode-side state data */
142   int            holeflag;
143   int            spanflag;
144   int            clearflag;
145   int            laceptr;
146   ogg_uint32_t   body_fill_next;
147 
148 } ogg_stream_state;
149 
150 typedef struct {
151   ogg_reference *packet;
152   long           bytes;
153   long           b_o_s;
154   long           e_o_s;
155   ogg_int64_t    granulepos;
156   ogg_int64_t    packetno;     /* sequence number for decode; the framing
157                                   knows where there's a hole in the data,
158                                   but we need coupling so that the codec
159                                   (which is in a seperate abstraction
160                                   layer) also knows about the gap */
161 } ogg_packet;
162 
163 typedef struct {
164   ogg_reference *header;
165   int            header_len;
166   ogg_reference *body;
167   long           body_len;
168 } ogg_page;
169 
170 /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
171 
172 extern void  oggpack_readinit(oggpack_buffer *b,ogg_reference *r);
173 extern long  oggpack_look(oggpack_buffer *b,int bits);
174 extern void  oggpack_adv(oggpack_buffer *b,int bits);
175 extern long  oggpack_read(oggpack_buffer *b,int bits);
176 extern long  oggpack_bytes(oggpack_buffer *b);
177 extern long  oggpack_bits(oggpack_buffer *b);
178 extern int   oggpack_eop(oggpack_buffer *b);
179 
180 // Quick hack
181 #define oggpack_bytesleft(B)  (((B)->bitsLeftInSegment+7)/8)
182 
183 /* Ogg BITSTREAM PRIMITIVES: decoding **************************/
184 
185 extern void     ogg_sync_init(ogg_sync_state *oy);
186 extern ogg_sync_state *ogg_sync_create(void);
187 extern int      ogg_sync_clear(ogg_sync_state *oy);
188 extern int      ogg_sync_destroy(ogg_sync_state *oy);
189 extern int      ogg_sync_reset(ogg_sync_state *oy);
190 
191 extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size);
192 extern int      ogg_sync_wrote(ogg_sync_state *oy, long bytes);
193 extern long     ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
194 extern int      ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
195 extern int      ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
196 extern int      ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
197 extern int      ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
198 
199 /* Ogg BITSTREAM PRIMITIVES: general ***************************/
200 
201 extern void     ogg_stream_init(ogg_stream_state *os, int serialno);
202 extern ogg_stream_state *ogg_stream_create(int serialno);
203 extern int      ogg_stream_destroy(ogg_stream_state *os);
204 extern int      ogg_stream_clear(ogg_stream_state *os);
205 extern int      ogg_stream_reset(ogg_stream_state *os);
206 extern int      ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);
207 extern int      ogg_stream_eos(ogg_stream_state *os);
208 
209 extern int      ogg_page_checksum_set(ogg_page *og);
210 
211 extern int      ogg_page_version(ogg_page *og);
212 extern int      ogg_page_continued(ogg_page *og);
213 extern int      ogg_page_bos(ogg_page *og);
214 extern int      ogg_page_eos(ogg_page *og);
215 extern ogg_int64_t  ogg_page_granulepos(ogg_page *og);
216 extern ogg_uint32_t ogg_page_serialno(ogg_page *og);
217 extern ogg_uint32_t ogg_page_pageno(ogg_page *og);
218 extern int      ogg_page_packets(ogg_page *og);
219 extern int      ogg_page_getbuffer(ogg_page *og, unsigned char **buffer);
220 
221 extern int      ogg_packet_release(ogg_packet *op);
222 extern int      ogg_page_release(ogg_page *og);
223 
224 extern void     ogg_page_dup(ogg_page *d, ogg_page *s);
225 
226 /* Ogg BITSTREAM PRIMITIVES: return codes ***************************/
227 
228 #define  OGG_SUCCESS   0
229 
230 #define  OGG_HOLE     -10
231 #define  OGG_SPAN     -11
232 #define  OGG_EVERSION -12
233 #define  OGG_ESERIAL  -13
234 #define  OGG_EINVAL   -14
235 #define  OGG_EEOS     -15
236 
237 
238 #ifdef __cplusplus
239 }
240 #endif
241 
242 #endif  /* _OGG_H */
243