1 /********************************************************************
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. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2003 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
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 ********************************************************************/
24 struct ogg_buffer_state
{
25 ogg_buffer
*unused_buffers
;
26 ogg_reference
*unused_references
;
39 ogg_buffer_state
*owner
;
44 struct ogg_reference
{
45 struct ogg_buffer
*buffer
;
49 struct ogg_reference
*next
;
50 #ifdef OGGBUFFER_DEBUG
55 struct oggpack_buffer
{
57 unsigned char *headptr
;
60 /* memory management */
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
;
77 ogg_buffer_state
*owner
; /* if it's to be extensible; encode side */
78 int external
; /* did baseref come from outside? */
81 struct ogg_sync_state
{
82 /* decode memory management pool */
83 ogg_buffer_state
*bufferpool
;
86 ogg_reference
*fifo_head
;
87 ogg_reference
*fifo_tail
;
90 /* stream sync management */
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 */
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
;
120 ogg_uint32_t body_fill
;
122 /* encode-side header build */
123 unsigned int watermark
;
124 oggbyte_buffer header_build
;
127 /* decode-side state data */
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
,
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
);
170 #define OGGPACK_CHUNKSIZE 3
171 #define OGGPACK_MINCHUNKSIZE 1
173 #define OGGPACK_CHUNKSIZE 128
174 #define OGGPACK_MINCHUNKSIZE 16