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