Apparently SVN won't let me rename makefile to Makefile, but if I do it myself
[xiph/unicode.git] / ogg2 / src / ogginternal.h
blob65bad0d13ef33f554f09d46396d5a229d8ddef6f
1 /********************************************************************
2 * *
3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
7 * *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2003 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
10 * *
11 ********************************************************************
13 function: internal/hidden data representation structures
14 last mod: $Id: ogginternal.h,v 1.1.2.14 2003/03/28 22:37:16 xiphmont Exp $
16 ********************************************************************/
18 #ifndef _OGGI_H
19 #define _OGGI_H
21 #include <ogg2/ogg.h>
22 #include "mutex.h"
24 struct ogg_buffer_state{
25 ogg_buffer *unused_buffers;
26 ogg_reference *unused_references;
27 int outstanding;
29 ogg_mutex_t mutex;
30 int shutdown;
33 struct ogg_buffer {
34 unsigned char *data;
35 long size;
36 int refcount;
38 union {
39 ogg_buffer_state *owner;
40 ogg_buffer *next;
41 } ptr;
44 struct ogg_reference {
45 struct ogg_buffer *buffer;
46 long begin;
47 long length;
49 struct ogg_reference *next;
50 #ifdef OGGBUFFER_DEBUG
51 int used;
52 #endif
55 struct oggpack_buffer {
56 int headbit;
57 unsigned char *headptr;
58 long headend;
60 /* memory management */
61 ogg_reference *head;
62 ogg_reference *tail;
64 /* render the byte/bit counter API constant time */
65 long count; /* doesn't count the tail */
66 ogg_buffer_state *owner; /* useful on encode side */
69 typedef struct oggbyte_buffer {
70 ogg_reference *baseref;
72 ogg_reference *ref;
73 unsigned char *ptr;
74 long pos;
75 long end;
77 ogg_buffer_state *owner; /* if it's to be extensible; encode side */
78 int external; /* did baseref come from outside? */
79 } oggbyte_buffer;
81 struct ogg_sync_state {
82 /* decode memory management pool */
83 ogg_buffer_state *bufferpool;
85 /* stream buffers */
86 ogg_reference *fifo_head;
87 ogg_reference *fifo_tail;
88 long fifo_fill;
90 /* stream sync management */
91 int unsynced;
92 int headerbytes;
93 int bodybytes;
97 struct ogg_stream_state {
98 /* encode memory management pool */
99 ogg_buffer_state *bufferpool;
101 ogg_reference *header_head;
102 ogg_reference *header_tail;
103 ogg_reference *body_head;
104 ogg_reference *body_tail;
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;
119 int lacing_fill;
120 ogg_uint32_t body_fill;
122 /* encode-side header build */
123 unsigned int watermark;
124 oggbyte_buffer header_build;
125 int continued;
127 /* decode-side state data */
128 int holeflag;
129 int spanflag;
130 int clearflag;
131 int laceptr;
132 ogg_uint32_t body_fill_next;
136 extern ogg_buffer_state *ogg_buffer_create(void);
137 extern void ogg_buffer_destroy(ogg_buffer_state *bs);
138 extern ogg_reference *ogg_buffer_alloc(ogg_buffer_state *bs,long bytes);
139 extern void ogg_buffer_realloc(ogg_reference *or,long bytes);
140 extern ogg_reference *ogg_buffer_sub(ogg_reference *or,long begin,long length);
141 extern ogg_reference *ogg_buffer_dup(ogg_reference *or);
142 extern ogg_reference *ogg_buffer_extend(ogg_reference *or,long bytes);
143 extern void ogg_buffer_mark(ogg_reference *or);
144 extern void ogg_buffer_release(ogg_reference *or);
145 extern void ogg_buffer_release_one(ogg_reference *or);
146 extern ogg_reference *ogg_buffer_pretruncate(ogg_reference *or,long pos);
147 extern void ogg_buffer_posttruncate(ogg_reference *or,long pos);
148 extern ogg_reference *ogg_buffer_cat(ogg_reference *tail, ogg_reference *head);
149 extern ogg_reference *ogg_buffer_walk(ogg_reference *or);
150 extern long ogg_buffer_length(ogg_reference *or);
151 extern ogg_reference *ogg_buffer_split(ogg_reference **tail,
152 ogg_reference **head,long pos);
153 extern void ogg_buffer_outstanding(ogg_buffer_state *bs);
155 extern int oggbyte_init(oggbyte_buffer *b,ogg_reference *or,
156 ogg_buffer_state *bs);
157 extern void oggbyte_clear(oggbyte_buffer *b);
158 extern ogg_reference *oggbyte_return_and_reset(oggbyte_buffer *b);
159 extern void oggbyte_set1(oggbyte_buffer *b,unsigned char val,
160 int pos);
161 extern void oggbyte_set2(oggbyte_buffer *b,int val,int pos);
162 extern void oggbyte_set4(oggbyte_buffer *b,ogg_uint32_t val,int pos);
163 extern void oggbyte_set8(oggbyte_buffer *b,ogg_int64_t val,int pos);
164 extern unsigned char oggbyte_read1(oggbyte_buffer *b,int pos);
165 extern int oggbyte_read2(oggbyte_buffer *b,int pos);
166 extern ogg_uint32_t oggbyte_read4(oggbyte_buffer *b,int pos);
167 extern ogg_int64_t oggbyte_read8(oggbyte_buffer *b,int pos);
169 #ifdef _V_SELFTEST
170 #define OGGPACK_CHUNKSIZE 3
171 #define OGGPACK_MINCHUNKSIZE 1
172 #else
173 #define OGGPACK_CHUNKSIZE 128
174 #define OGGPACK_MINCHUNKSIZE 16
175 #endif
177 #endif