"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSSoundLib/Src/Ogg/LSSOgg.h

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 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator