blob: c5c31068cc472a455a8d3f15da17dc6b2ebb18a9 [file] [log] [blame]
Gloria Wang0f6f2522010-02-04 13:58:20 -08001/********************************************************************
2 * *
3 * THIS FILE IS PART OF THE Theorarm SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7 * *
8 * THE Theora/Tremor SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
9 * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
10 * Modifications/Additions Copyright (C) 2009 Robin Watts for *
11 * Pinknoise Productions Ltd. *
12 * *
13 ********************************************************************
14
15 function: subsumed libogg includes
16
17 ********************************************************************/
18#ifndef _OGG_H
19#define _OGG_H
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25#include "os_types.h"
26
27#ifndef ONLY_C
28#define ARM_LITTLE_ENDIAN
29#endif
30
31typedef struct ogg_buffer_state{
32 struct ogg_buffer *unused_buffers;
33 struct ogg_reference *unused_references;
34 int outstanding;
35 int shutdown;
36} ogg_buffer_state;
37
38typedef struct ogg_buffer {
39 unsigned char *data;
40 long size;
41 int refcount;
42
43 union {
44 ogg_buffer_state *owner;
45 struct ogg_buffer *next;
46 } ptr;
47} ogg_buffer;
48
49typedef struct ogg_reference {
50 ogg_buffer *buffer;
51 long begin;
52 long length;
53
54 struct ogg_reference *next;
55} ogg_reference;
56
57typedef struct oggpack_buffer {
58#ifdef ARM_LITTLE_ENDIAN
59 int bitsLeftInSegment;
60 ogg_uint32_t *ptr;
61 long bitsLeftInWord;
62#else
63 int headbit;
64 unsigned char *headptr;
65 long headend;
66#endif /* ARM_LITTLE_ENDIAN */
67 /* memory management */
68 ogg_reference *head;
69 ogg_reference *tail;
70
71 /* render the byte/bit counter API constant time */
72 long count; /* doesn't count the tail */
73} oggpack_buffer;
74
75typedef struct oggbyte_buffer {
76 ogg_reference *baseref;
77
78 ogg_reference *ref;
79 unsigned char *ptr;
80 long pos;
81 long end;
82} oggbyte_buffer;
83
84typedef struct ogg_sync_state {
85 /* decode memory management pool */
86 ogg_buffer_state *bufferpool;
87
88 /* stream buffers */
89 ogg_reference *fifo_head;
90 ogg_reference *fifo_tail;
91 long fifo_fill;
92
93 /* stream sync management */
94 int unsynced;
95 int headerbytes;
96 int bodybytes;
97
98} ogg_sync_state;
99
100typedef struct ogg_stream_state {
101 ogg_reference *header_head;
102 ogg_reference *header_tail;
103 ogg_reference *body_head;
104 ogg_reference *body_tail;
105
106 int e_o_s; /* set when we have buffered the last
107 packet in the logical bitstream */
108 int b_o_s; /* set after we've written the initial page
109 of a logical bitstream */
110 long serialno;
111 long pageno;
112 ogg_int64_t packetno; /* sequence number for decode; the framing
113 knows where there's a hole in the data,
114 but we need coupling so that the codec
115 (which is in a seperate abstraction
116 layer) also knows about the gap */
117 ogg_int64_t granulepos;
118
119 int lacing_fill;
120 ogg_uint32_t body_fill;
121
122 /* decode-side state data */
123 int holeflag;
124 int spanflag;
125 int clearflag;
126 int laceptr;
127 ogg_uint32_t body_fill_next;
128
129} ogg_stream_state;
130
131typedef struct {
132 ogg_reference *packet;
133 long bytes;
134 long b_o_s;
135 long e_o_s;
136 ogg_int64_t granulepos;
137 ogg_int64_t packetno; /* sequence number for decode; the framing
138 knows where there's a hole in the data,
139 but we need coupling so that the codec
140 (which is in a seperate abstraction
141 layer) also knows about the gap */
142} ogg_packet;
143
144typedef struct {
145 ogg_reference *header;
146 int header_len;
147 ogg_reference *body;
148 long body_len;
149} ogg_page;
150
151/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/
152
153extern void oggpack_readinit(oggpack_buffer *b,ogg_reference *r);
154extern long oggpack_look(oggpack_buffer *b,int bits);
155extern void oggpack_adv(oggpack_buffer *b,int bits);
156extern long oggpack_read(oggpack_buffer *b,int bits);
157extern long oggpack_bytes(oggpack_buffer *b);
158extern long oggpack_bits(oggpack_buffer *b);
159extern int oggpack_eop(oggpack_buffer *b);
160
161// Quick hack
162#define oggpack_bytesleft(B) (((B)->bitsLeftInSegment+7)/8)
163
164/* Ogg BITSTREAM PRIMITIVES: decoding **************************/
165
166extern void ogg_sync_init(ogg_sync_state *oy);
167extern ogg_sync_state *ogg_sync_create(void);
168extern int ogg_sync_clear(ogg_sync_state *oy);
169extern int ogg_sync_destroy(ogg_sync_state *oy);
170extern int ogg_sync_reset(ogg_sync_state *oy);
171
172extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size);
173extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes);
174extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);
175extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
176extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
177extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
178extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
179
180/* Ogg BITSTREAM PRIMITIVES: general ***************************/
181
182extern void ogg_stream_init(ogg_stream_state *os, int serialno);
183extern ogg_stream_state *ogg_stream_create(int serialno);
184extern int ogg_stream_destroy(ogg_stream_state *os);
185extern int ogg_stream_clear(ogg_stream_state *os);
186extern int ogg_stream_reset(ogg_stream_state *os);
187extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);
188extern int ogg_stream_eos(ogg_stream_state *os);
189
190extern int ogg_page_checksum_set(ogg_page *og);
191
192extern int ogg_page_version(ogg_page *og);
193extern int ogg_page_continued(ogg_page *og);
194extern int ogg_page_bos(ogg_page *og);
195extern int ogg_page_eos(ogg_page *og);
196extern ogg_int64_t ogg_page_granulepos(ogg_page *og);
197extern ogg_uint32_t ogg_page_serialno(ogg_page *og);
198extern ogg_uint32_t ogg_page_pageno(ogg_page *og);
199extern int ogg_page_packets(ogg_page *og);
200extern int ogg_page_getbuffer(ogg_page *og, unsigned char **buffer);
201
202extern int ogg_packet_release(ogg_packet *op);
203extern int ogg_page_release(ogg_page *og);
204
205extern void ogg_page_dup(ogg_page *d, ogg_page *s);
206
207/* Ogg BITSTREAM PRIMITIVES: return codes ***************************/
208
209#define OGG_SUCCESS 0
210
211#define OGG_HOLE -10
212#define OGG_SPAN -11
213#define OGG_EVERSION -12
214#define OGG_ESERIAL -13
215#define OGG_EINVAL -14
216#define OGG_EEOS -15
217
218
219#ifdef __cplusplus
220}
221#endif
222
223#endif /* _OGG_H */