"L. Spiro Engine"
|
00001 /******************************************************************** 00002 * * 00003 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 00004 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 00005 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 00006 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 00007 * * 00008 * THE OggVorbis SOURCE CODE IS ( C) COPYRIGHT 1994-2007 * 00009 * by the Xiph.Org Foundation http://www.xiph.org/ * 00010 * * 00011 ******************************************************************** 00012 00013 function: toplevel libogg include 00014 last mod: $Id: ogg.h 17571 2010-10-27 13:28:20Z xiphmont $ 00015 00016 ********************************************************************/ 00017 00018 00019 #ifndef __LSS_OGG_H__ 00020 #define __LSS_OGG_H__ 00021 00022 #include "../LSSSoundLib.h" 00023 00024 namespace lss { 00025 00032 class COgg { 00033 public : 00034 // == Types. 00038 typedef struct ogg_iovec_t { 00039 LSVOID * iov_base; 00040 LSUINTPTR iov_len; 00041 } * LPogg_iovec_t, * const LPCogg_iovec_t; 00042 00046 typedef struct oggpack_buffer { 00047 LSINT32 endbyte; 00048 LSINT32 endbit; 00049 00050 LSUINT8 * buffer; 00051 LSUINT8 * ptr; 00052 LSINT32 storage; 00053 } * LPoggpack_buffer, * const LPCoggpack_buffer; 00054 00058 typedef struct ogg_page { 00059 LSUINT8 * header; 00060 LSINT32 header_len; 00061 LSUINT8 * body; 00062 LSINT32 body_len; 00063 } * LPogg_page, * const LPCogg_page; 00064 00065 typedef struct ogg_stream_state { 00066 LSUINT8 * body_data; // Bytes from packet bodies. 00067 LSINT32 body_storage; // Storage elements allocated. 00068 LSINT32 body_fill; // Elements stored; fill mark. 00069 LSINT32 body_returned; // Elements of fill returned. 00070 00071 00072 LSINT32 * lacing_vals; // The values that will go to the segment table. 00073 LSINT64 * granule_vals; // Granulepos values for headers. Not compact 00074 // this way, but it is simple coupled to the 00075 // lacing FIFO. 00076 LSINT32 lacing_storage; 00077 LSINT32 lacing_fill; 00078 LSINT32 lacing_packet; 00079 LSINT32 lacing_returned; 00080 00081 LSUINT8 header[282]; // Working space for header encode. 00082 LSINT32 header_fill; 00083 00084 LSINT32 e_o_s; // Set when we have buffered the last packet in the 00085 // logical bitstream. 00086 LSINT32 b_o_s; // Set after we've written the initial page 00087 // of a logical bitstream. 00088 LSINT32 serialno; 00089 LSINT32 pageno; 00090 LSINT64 packetno; // Sequence number for decode; the framing 00091 // knows where there's a hole in the data, 00092 // but we need coupling so that the codec 00093 // (which is in a separate abstraction 00094 // layer) also knows about the gap. 00095 LSINT64 granulepos; 00096 00097 } * LPogg_stream_state, * const LPCogg_stream_state; 00098 00103 typedef struct ogg_packet { 00104 LSUINT8 * packet; 00105 LSINT32 bytes; 00106 LSINT32 b_o_s; 00107 LSINT32 e_o_s; 00108 00109 LSINT64 granulepos; 00110 00111 LSINT64 packetno; // Sequence number for decode; the framing 00112 // knows where there's a hole in the data, 00113 // but we need coupling so that the codec 00114 // (which is in a separate abstraction 00115 // layer) also knows about the gap. 00116 } * LPogg_packet, * const LPCogg_packet; 00117 00121 typedef struct ogg_sync_state { 00122 LSUINT8 * data; 00123 LSINT32 storage; 00124 LSINT32 fill; 00125 LSINT32 returned; 00126 00127 LSINT32 unsynced; 00128 LSINT32 headerbytes; 00129 LSINT32 bodybytes; 00130 } * LPogg_sync_state, * const LPCogg_sync_state; 00131 00132 00133 // == Functions. 00134 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00135 // BIT STREAM 00136 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00142 static LSVOID LSE_CALL oggpack_writeinit( oggpack_buffer * _ppbBuffer ); 00143 00150 static LSINT32 LSE_CALL oggpack_writecheck( oggpack_buffer * _ppbBuffer ); 00151 00158 static LSVOID LSE_CALL oggpack_writetrunc( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00159 00165 static LSVOID LSE_CALL oggpack_writealign( oggpack_buffer * _ppbBuffer ); 00166 00173 static LSVOID LSE_CALL oggpack_writecopy( oggpack_buffer * _ppbBuffer, LSVOID * _pvSource, LSINT32 _i32Bits ); 00174 00180 static LSVOID LSE_CALL oggpack_reset( oggpack_buffer * _ppbBuffer ); 00181 00187 static LSVOID LSE_CALL oggpack_writeclear( oggpack_buffer * _ppbBuffer ); 00188 00196 static LSVOID LSE_CALL oggpack_readinit( oggpack_buffer * _ppbBuffer, LSUINT8 * _pui8Buf, LSINT32 _i32Bytes ); 00197 00205 static LSVOID LSE_CALL oggpack_write( oggpack_buffer * _ppbBuffer, LSUINT32 _ui32Value, LSINT32 _i32Bits ); 00206 00214 static LSINT32 LSE_CALL oggpack_look( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00215 00222 static LSINT32 LSE_CALL oggpack_look1( oggpack_buffer * _ppbBuffer ); 00223 00230 static LSVOID LSE_CALL oggpack_adv( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00231 00237 static LSVOID LSE_CALL oggpack_adv1( oggpack_buffer * _ppbBuffer ); 00238 00246 static LSINT32 LSE_CALL oggpack_read( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00247 00254 static LSINT32 LSE_CALL oggpack_read1( oggpack_buffer * _ppbBuffer ); 00255 00262 static LSINT32 LSE_CALL oggpack_bytes( oggpack_buffer * _ppbBuffer ); 00263 00270 static LSINT32 LSE_CALL oggpack_bits( oggpack_buffer * _ppbBuffer ); 00271 00278 static LSUINT8 * oggpack_get_buffer( oggpack_buffer * _ppbBuffer ); 00279 00285 static LSVOID LSE_CALL oggpackB_writeinit( oggpack_buffer * _ppbBuffer ); 00286 00293 static LSINT32 LSE_CALL oggpackB_writecheck( oggpack_buffer * _ppbBuffer ); 00294 00301 static LSVOID LSE_CALL oggpackB_writetrunc( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00302 00308 static LSVOID LSE_CALL oggpackB_writealign( oggpack_buffer * _ppbBuffer ); 00309 00317 static LSVOID LSE_CALL oggpackB_writecopy( oggpack_buffer * _ppbBuffer, LSVOID * _pvSource, LSINT32 _i32Bits ); 00318 00324 static LSVOID LSE_CALL oggpackB_reset( oggpack_buffer * _ppbBuffer ); 00325 00331 static LSVOID LSE_CALL oggpackB_writeclear( oggpack_buffer * _ppbBuffer ); 00332 00340 static LSVOID LSE_CALL oggpackB_readinit( oggpack_buffer * _ppbBuffer, LSUINT8 * _pui8Buf, LSINT32 _i32Bytes ); 00341 00349 static LSVOID LSE_CALL oggpackB_write( oggpack_buffer * _ppbBuffer, LSUINT32 _ui32Value, LSINT32 _i32Bits ); 00350 00358 static LSINT32 LSE_CALL oggpackB_look( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00359 00366 static LSINT32 LSE_CALL oggpackB_look1( oggpack_buffer * _ppbBuffer ); 00367 00374 static LSVOID LSE_CALL oggpackB_adv( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00375 00381 static LSVOID LSE_CALL oggpackB_adv1( oggpack_buffer * _ppbBuffer ); 00382 00390 static LSINT32 LSE_CALL oggpackB_read( oggpack_buffer * _ppbBuffer, LSINT32 _i32Bits ); 00391 00398 static LSINT32 LSE_CALL oggpackB_read1( oggpack_buffer * _ppbBuffer ); 00399 00406 static LSINT32 LSE_CALL oggpackB_bytes( oggpack_buffer * _ppbBuffer ); 00407 00414 static LSINT32 LSE_CALL oggpackB_bits( oggpack_buffer * _ppbBuffer ); 00415 00422 static LSUINT8 * LSE_CALL oggpackB_get_buffer( oggpack_buffer * _ppbBuffer ); 00423 00424 00425 00426 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00427 // ENCODING 00428 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00436 static LSINT32 LSE_CALL ogg_stream_packetin( ogg_stream_state * _possOs, ogg_packet * _popOp ); 00437 00448 static LSINT32 LSE_CALL ogg_stream_iovecin( ogg_stream_state * _possOs, ogg_iovec_t * _poiIov, 00449 LSINT32 _i32Count, LSINT32 _i32Eos, LSINT64 _i64GranulePos ); 00450 00458 static LSINT32 LSE_CALL ogg_stream_pageout( ogg_stream_state * _possOs, ogg_page * _popOg ); 00459 00468 static LSINT32 LSE_CALL ogg_stream_pageout_fill( ogg_stream_state * _possOs, ogg_page * _popOg, LSINT32 _i32NFill ); 00469 00477 static LSINT32 LSE_CALL ogg_stream_flush( ogg_stream_state * _possOs, ogg_page * _popOg ); 00478 00479 00480 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00481 // DECODING 00482 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00489 static LSINT32 LSE_CALL ogg_sync_init( ogg_sync_state * _pssOy ); 00490 00497 static LSINT32 LSE_CALL ogg_sync_clear( ogg_sync_state * _pssOy ); 00498 00505 static LSINT32 LSE_CALL ogg_sync_reset( ogg_sync_state * _pssOy ); 00506 00513 static LSINT32 LSE_CALL ogg_sync_destroy( ogg_sync_state * _pssOy ); 00514 00521 static LSINT32 LSE_CALL ogg_sync_check( ogg_sync_state * _pssOy ); 00522 00530 static LSINT8 * LSE_CALL ogg_sync_buffer( ogg_sync_state * _pssOy, LSINT32 _i32Size ); 00531 00539 static LSINT32 LSE_CALL ogg_sync_wrote( ogg_sync_state * _pssOy, LSINT32 _i32Bytes ); 00540 00548 static LSINT32 LSE_CALL ogg_sync_pageseek( ogg_sync_state * _pssOy, ogg_page * _ppOg ); 00549 00557 static LSINT32 LSE_CALL ogg_sync_pageout( ogg_sync_state * _pssOy, ogg_page * _ppOg ); 00558 00566 static LSINT32 LSE_CALL ogg_stream_pagein( ogg_stream_state * _pssOs, ogg_page * _ppOg ); 00567 00575 static LSINT32 LSE_CALL ogg_stream_packetout( ogg_stream_state * _pssOs, ogg_packet * _ppOp ); 00576 00584 static LSINT32 LSE_CALL ogg_stream_packetpeek( ogg_stream_state * _pssOs, ogg_packet * _ppOp ); 00585 00586 00587 00588 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00589 // GENERAL 00590 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00598 static LSINT32 LSE_CALL ogg_stream_init( ogg_stream_state * _pssOs, LSINT32 _i32SerialNo ); 00599 00606 static LSINT32 LSE_CALL ogg_stream_clear( ogg_stream_state * _pssOs ); 00607 00614 static LSINT32 LSE_CALL ogg_stream_reset( ogg_stream_state * _pssOs ); 00615 00623 static LSINT32 LSE_CALL ogg_stream_reset_serialno( ogg_stream_state * _pssOs, LSINT32 _i32SerialNo ); 00624 00631 static LSINT32 LSE_CALL ogg_stream_destroy( ogg_stream_state * _pssOs ); 00632 00639 static LSINT32 LSE_CALL ogg_stream_check( ogg_stream_state * _pssOs ); 00640 00647 static LSINT32 LSE_CALL ogg_stream_eos( ogg_stream_state * _pssOs ); 00648 00654 static LSVOID LSE_CALL ogg_page_checksum_set( ogg_page * _ppOg ); 00655 00662 static LSINT32 LSE_CALL ogg_page_version( const ogg_page * _ppOg ); 00663 00670 static LSINT32 LSE_CALL ogg_page_continued( const ogg_page * _ppOg ); 00671 00678 static LSINT32 LSE_CALL ogg_page_bos( const ogg_page * _ppOg ); 00679 00686 static LSINT32 LSE_CALL ogg_page_eos( const ogg_page * _ppOg ); 00687 00694 static LSINT64 LSE_CALL ogg_page_granulepos( const ogg_page * _ppOg ); 00695 00702 static LSINT32 LSE_CALL ogg_page_serialno( const ogg_page * _ppOg ); 00703 00710 static LSINT32 LSE_CALL ogg_page_pageno( const ogg_page * _ppOg ); 00711 00718 static LSINT32 LSE_CALL ogg_page_packets( const ogg_page * _ppOg ); 00719 00726 static LSVOID LSE_CALL ogg_packet_clear( ogg_packet * _ppOp ); 00727 00728 00729 protected : 00730 // == Members. 00734 static LSUINT32 m_ui32Mask[]; 00735 00739 static LSUINT32 m_ui32Mask8B[]; 00740 00744 static LSUINT32 crc_lookup[256]; 00745 00746 // == Functions. 00755 static LSVOID LSE_CALL oggpack_writecopy_helper( oggpack_buffer * _ppbBuffer, 00756 LSVOID * _pvSource, 00757 LSINT32 _i32Bits, 00758 LSVOID (LSE_CALL * PfFunc)( oggpack_buffer *, 00759 LSUINT32, 00760 LSINT32 ), 00761 LSINT32 _i32Msb ); 00762 00770 static LSINT32 LSE_CALL _os_lacing_expand( ogg_stream_state * _pssOs, LSINT32 _i32Needed ); 00771 00779 static LSINT32 LSE_CALL _os_body_expand( ogg_stream_state * _pssOs, LSINT32 _i32Needed ); 00780 00789 static LSINT32 LSE_CALL _packetout( ogg_stream_state * _pssOs, ogg_packet * _ppOp, LSINT32 _i32Adv ); 00790 00800 static LSINT32 LSE_CALL ogg_stream_flush_i( ogg_stream_state * _pssOs, ogg_page * _popOg, LSINT32 _i32Force, LSINT32 _i32NFill ); 00801 00802 }; 00803 00804 } // namespace lss 00805 00806 #endif // __LSS_OGG_H__ 00807