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
41extern "C" {
42#endif
43
44#include "os_types.h"
45
46#ifndef ONLY_C
47#define ARM_LITTLE_ENDIAN
48#endif
49
50typedef 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
57typedef 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
68typedef struct ogg_reference {
69  ogg_buffer    *buffer;
70  long           begin;
71  long           length;
72
73  struct ogg_reference *next;
74} ogg_reference;
75
76typedef 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
94typedef 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
103typedef 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
119typedef 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
150typedef 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
163typedef 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
172extern void  oggpack_readinit(oggpack_buffer *b,ogg_reference *r);
173extern long  oggpack_look(oggpack_buffer *b,int bits);
174extern void  oggpack_adv(oggpack_buffer *b,int bits);
175extern long  oggpack_read(oggpack_buffer *b,int bits);
176extern long  oggpack_bytes(oggpack_buffer *b);
177extern long  oggpack_bits(oggpack_buffer *b);
178extern 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
185extern void     ogg_sync_init(ogg_sync_state *oy);
186extern ogg_sync_state *ogg_sync_create(void);
187extern int      ogg_sync_clear(ogg_sync_state *oy);
188extern int      ogg_sync_destroy(ogg_sync_state *oy);
189extern int      ogg_sync_reset(ogg_sync_state *oy);
190
191extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size);
192extern int      ogg_sync_wrote(ogg_sync_state *oy, long bytes);
193extern long     ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
194extern int      ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
195extern int      ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
196extern int      ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
197extern int      ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
198
199/* Ogg BITSTREAM PRIMITIVES: general ***************************/
200
201extern void     ogg_stream_init(ogg_stream_state *os, int serialno);
202extern ogg_stream_state *ogg_stream_create(int serialno);
203extern int      ogg_stream_destroy(ogg_stream_state *os);
204extern int      ogg_stream_clear(ogg_stream_state *os);
205extern int      ogg_stream_reset(ogg_stream_state *os);
206extern int      ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);
207extern int      ogg_stream_eos(ogg_stream_state *os);
208
209extern int      ogg_page_checksum_set(ogg_page *og);
210
211extern int      ogg_page_version(ogg_page *og);
212extern int      ogg_page_continued(ogg_page *og);
213extern int      ogg_page_bos(ogg_page *og);
214extern int      ogg_page_eos(ogg_page *og);
215extern ogg_int64_t  ogg_page_granulepos(ogg_page *og);
216extern ogg_uint32_t ogg_page_serialno(ogg_page *og);
217extern ogg_uint32_t ogg_page_pageno(ogg_page *og);
218extern int      ogg_page_packets(ogg_page *og);
219extern int      ogg_page_getbuffer(ogg_page *og, unsigned char **buffer);
220
221extern int      ogg_packet_release(ogg_packet *op);
222extern int      ogg_page_release(ogg_page *og);
223
224extern 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