Gloria Wang | 0f6f252 | 2010-02-04 13:58:20 -0800 | [diff] [blame^] | 1 | /******************************************************************** |
| 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 |
| 22 | extern "C" { |
| 23 | #endif |
| 24 | |
| 25 | #include "os_types.h" |
| 26 | |
| 27 | #ifndef ONLY_C |
| 28 | #define ARM_LITTLE_ENDIAN |
| 29 | #endif |
| 30 | |
| 31 | typedef 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 | |
| 38 | typedef 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 | |
| 49 | typedef struct ogg_reference { |
| 50 | ogg_buffer *buffer; |
| 51 | long begin; |
| 52 | long length; |
| 53 | |
| 54 | struct ogg_reference *next; |
| 55 | } ogg_reference; |
| 56 | |
| 57 | typedef 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 | |
| 75 | typedef 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 | |
| 84 | typedef 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 | |
| 100 | typedef 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 | |
| 131 | typedef 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 | |
| 144 | typedef 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 | |
| 153 | extern void oggpack_readinit(oggpack_buffer *b,ogg_reference *r); |
| 154 | extern long oggpack_look(oggpack_buffer *b,int bits); |
| 155 | extern void oggpack_adv(oggpack_buffer *b,int bits); |
| 156 | extern long oggpack_read(oggpack_buffer *b,int bits); |
| 157 | extern long oggpack_bytes(oggpack_buffer *b); |
| 158 | extern long oggpack_bits(oggpack_buffer *b); |
| 159 | extern 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 | |
| 166 | extern void ogg_sync_init(ogg_sync_state *oy); |
| 167 | extern ogg_sync_state *ogg_sync_create(void); |
| 168 | extern int ogg_sync_clear(ogg_sync_state *oy); |
| 169 | extern int ogg_sync_destroy(ogg_sync_state *oy); |
| 170 | extern int ogg_sync_reset(ogg_sync_state *oy); |
| 171 | |
| 172 | extern unsigned char *ogg_sync_bufferin(ogg_sync_state *oy, long size); |
| 173 | extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); |
| 174 | extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); |
| 175 | extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); |
| 176 | extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); |
| 177 | extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); |
| 178 | extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); |
| 179 | |
| 180 | /* Ogg BITSTREAM PRIMITIVES: general ***************************/ |
| 181 | |
| 182 | extern void ogg_stream_init(ogg_stream_state *os, int serialno); |
| 183 | extern ogg_stream_state *ogg_stream_create(int serialno); |
| 184 | extern int ogg_stream_destroy(ogg_stream_state *os); |
| 185 | extern int ogg_stream_clear(ogg_stream_state *os); |
| 186 | extern int ogg_stream_reset(ogg_stream_state *os); |
| 187 | extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); |
| 188 | extern int ogg_stream_eos(ogg_stream_state *os); |
| 189 | |
| 190 | extern int ogg_page_checksum_set(ogg_page *og); |
| 191 | |
| 192 | extern int ogg_page_version(ogg_page *og); |
| 193 | extern int ogg_page_continued(ogg_page *og); |
| 194 | extern int ogg_page_bos(ogg_page *og); |
| 195 | extern int ogg_page_eos(ogg_page *og); |
| 196 | extern ogg_int64_t ogg_page_granulepos(ogg_page *og); |
| 197 | extern ogg_uint32_t ogg_page_serialno(ogg_page *og); |
| 198 | extern ogg_uint32_t ogg_page_pageno(ogg_page *og); |
| 199 | extern int ogg_page_packets(ogg_page *og); |
| 200 | extern int ogg_page_getbuffer(ogg_page *og, unsigned char **buffer); |
| 201 | |
| 202 | extern int ogg_packet_release(ogg_packet *op); |
| 203 | extern int ogg_page_release(ogg_page *og); |
| 204 | |
| 205 | extern 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 */ |