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