"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: stdio-based convenience library for opening/seeking/decoding 00014 last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $ 00015 00016 ********************************************************************/ 00017 00018 00019 #ifndef __LSE_VORBISFILE_H__ 00020 #define __LSE_VORBISFILE_H__ 00021 00022 #include "../LSSSoundLib.h" 00023 #include "Allocator/LSTLAllocator.h" 00024 #include "LSSOgg.h" 00025 #include "LSSVorbisCodec.h" 00026 00027 namespace lss { 00028 00035 class CVorbisFile { 00036 public : 00037 // == Types. 00042 typedef struct LSS_OV_CALLBACKS { 00046 LSUINTPTR (* PfReadFunc)( LSVOID * _pvPtr, LSUINTPTR _uiptrSize, LSUINTPTR _uiptrNMemb, LSVOID * _pvDataSource ); 00047 00051 LSINT32 (* PfSeekFunc)( LSVOID * _pvDataSource, LSINT64 _i64Offset, LSINT32 _i32Whence ); 00052 00056 LSINT32 (* PfCloseFunc)( LSVOID * _pvDataSource ); 00057 00061 LSINT64 (* PfTellFunc)( LSVOID * _pvDataSource ); 00062 } * LPLSS_OV_CALLBACKS, * const LPCLSS_OV_CALLBACKS; 00063 00067 typedef struct LSS_OV_FILE { 00068 LSVOID * datasource; // Pointer to a FILE *, etc. 00069 LSINT32 seekable; 00070 LSINT64 offset; 00071 LSINT64 end; 00072 COgg::ogg_sync_state oy; 00073 00074 // If the FILE handle isn't seekable (eg. a pipe), only the current stream appears. 00075 LSINT32 links; 00076 LSINT64 * offsets; 00077 LSINT64 * dataoffsets; 00078 LSINT32 * serialnos; 00079 LSINT64 * pcmlengths; // Overloaded to maintain binary 00080 // compatibility; x2 size, stores both 00081 // beginning and end values. 00082 CVorbisCodec::vorbis_info * vi; 00083 CVorbisCodec::vorbis_comment * vc; 00084 00085 // Decoding working state local storage. 00086 LSINT64 pcm_offset; 00087 LSINT32 ready_state; 00088 LSINT32 current_serialno; 00089 LSINT32 current_link; 00090 00091 LSDOUBLE bittrack; 00092 LSDOUBLE samptrack; 00093 00094 COgg::ogg_stream_state os; // Take physical pages, weld into a logical stream of packets. 00095 CVorbisCodec::vorbis_dsp_state vd; // Central working state for the packet->PCM decoder. 00096 CVorbisCodec::vorbis_block vb; // Local working space for packet->PCM decode. 00097 00098 LSS_OV_CALLBACKS callbacks; 00099 00100 } * LPLSS_OV_FILE, * const LPCLSS_OV_FILE; 00101 00102 00103 // == Functions. 00117 static LSBOOL LSE_CALL LoadOggFile( const LSCHAR * _pcFile, 00118 LSUINT8 * &_pui8Data, LSUINT32 &_ui32Length, 00119 LSUINT32 &_ui32Freq, LSUINT32 &_ui32Bits, LSUINT32 &_ui32Channels, CAllocator * _paAllocator ); 00120 00127 static LSUINT64 LSE_CALL GetPcmCount( LSS_OV_FILE &_ovfFile ); 00128 00136 static LSINT32 OvClear( LSS_OV_FILE * _povfFile ); 00137 00153 static LSINT32 OvFOpen( const LSCHAR * _pcPath, LSS_OV_FILE * _povfFile ); 00154 00174 //static LSINT32 OvOpen( FILE * _pfFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, LSINT32 _i32BytesI ); 00175 00193 static LSINT32 OvOpenCallbacks( LSVOID * _pvDataSource, LSS_OV_FILE * _povfFile, 00194 const LSCHAR * _pcInitial, LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks ); 00195 00211 //static LSINT32 OvTest( FILE * _pfFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, LSINT32 _i32BytesI ); 00212 00229 static LSINT32 OvTestCallbacks( LSVOID * _pvDataSource, LSS_OV_FILE * _povfFile, 00230 const LSCHAR * _pcInitial, LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks ); 00231 00243 static LSINT32 OvTestOpen( LSS_OV_FILE * _povfFile ); 00244 00255 static LSINT32 OvBitrate( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00256 00266 static LSINT32 OvBitrateInstant( LSS_OV_FILE * _povfFile ); 00267 00275 static LSINT32 OvStreams( LSS_OV_FILE * _povfFile ); 00276 00284 static LSINT32 OvSeekable( LSS_OV_FILE * _povfFile ); 00285 00294 static LSINT32 OvSerialNumber( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00295 00305 static LSINT64 OvRawTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00306 00316 static LSINT64 OvPcmTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00317 00327 static LSDOUBLE OvTimeTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00328 00343 static LSINT32 OvRawSeek( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00344 00358 static LSINT32 OvPcmSeek( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00359 00374 static LSINT32 OcPvmSeekPage( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00375 00388 static LSINT32 OvTimeSeek( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos ); 00389 00404 static LSINT32 OvTimeSeekPage( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos ); 00405 00422 static LSINT32 OvRawSeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00423 00439 static LSINT32 OvPcmSeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00440 00457 static LSINT32 OvPcmSeekPageLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos ); 00458 00474 static LSINT32 OvTimeSeekLap( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos ); 00475 00492 static LSINT32 OvTimeSeekPageLap( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos ); 00493 00502 static LSINT64 OvRawTell( LSS_OV_FILE * _povfFile ); 00503 00511 static LSINT64 OvPcmTell( LSS_OV_FILE * _povfFile ); 00512 00520 static LSDOUBLE OvTimeTell( LSS_OV_FILE * _povfFile ); 00521 00530 static CVorbisCodec::vorbis_info * OvInfo( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00531 00540 static CVorbisCodec::vorbis_comment * OvComment( LSS_OV_FILE * _povfFile, LSINT32 _i32I ); 00541 00556 static LSINT32 OvReadFloat( LSS_OV_FILE * _povfFile, LSFLOAT *** _pppfPcmChannels, LSINT32 _i32Samples, 00557 LSINT32 * _pi32BitStream ); 00558 00577 static LSINT32 OvReadFilter( LSS_OV_FILE * _povfFile, LSCHAR * _pcBuffer, LSINT32 _i32Length, 00578 LSINT32 _i32BigEndianP, LSINT32 _i32Word, LSINT32 _i32Signed, LSINT32 * _pi32BitStream, 00579 LSVOID (* _pfFilter)( LSFLOAT ** _ppPcm, LSINT32 _i32Channels, LSINT32 _i32Samples, LSVOID * _pvFilterParam ), LSVOID * _pvFilterParam ); 00580 00609 static LSINT32 OvRead( LSS_OV_FILE * _povfFile, LSCHAR * _pcBuffer, LSINT32 _i32Length, 00610 LSINT32 _i32BigEndianP, LSINT32 _i32Word, LSINT32 _i32Signed, LSINT32 * _pi32BitStream ); 00611 00625 static LSINT32 OvCrosslap( LSS_OV_FILE * _povfFile1, LSS_OV_FILE * _povfFile2 ); 00626 00634 static LSINT32 OvHalfRate( LSS_OV_FILE * _povfFile, LSINT32 _i32Flag ); 00635 00642 static LSINT32 OvHalfRateP( LSS_OV_FILE * _povfFile ); 00643 00644 00645 protected : 00646 // == Functions. 00655 //static LSINT32 OvHeaderFSeekWrap( FILE * _pfFile, LSINT64 _i64Off, LSINT32 _i32Whence ); 00656 00667 static LSINT32 OvOpen1( LSVOID * _pvFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, 00668 LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks ); 00669 00676 static LSINT32 OvOpen2( LSS_OV_FILE *_povfFile ); 00677 00689 static LSINT32 OvFetchHeaders( LSS_OV_FILE * _povfFile, CVorbisCodec::vorbis_info * _pviVi, CVorbisCodec::vorbis_comment * _pvcVc, 00690 LSINT32 ** _ppi32SerialNoList, LSINT32 * _pi32SerialNoN, 00691 COgg::ogg_page * _popOgPtr ); 00692 00699 static LSINT32 OvOpenSeekable2( LSS_OV_FILE *_povfFile ); 00700 00709 static LSINT64 OvGetNextPage( LSS_OV_FILE *_povfFile, COgg::ogg_page * _popOg, 00710 LSINT64 _i64Boundary ); 00711 00720 static LSINT32 OvLookUpPageSerialNo( COgg::ogg_page * _popOg, LSINT32 * _pi32SerialNoList, LSINT32 _i32N ); 00721 00729 static LSVOID OvAddSerialNo( COgg::ogg_page * _popOg, LSINT32 ** _ppi32SerialNoList, LSINT32 * _pi32N ); 00730 00738 static LSINT64 OvInitialPcmOffset( LSS_OV_FILE * _povfFile, CVorbisCodec::vorbis_info * _pviInfo ); 00739 00750 static LSINT64 OvGetPrevPageSerial( LSS_OV_FILE * _povfFile, 00751 LSINT32 * _pi32SerialList, LSINT32 _i32SerialCount, 00752 LSINT32 * _pi32SerialNo, LSINT64 * _pi64GranPos ); 00753 00768 static LSINT32 OvBisectForwardSerialNo( LSS_OV_FILE * _povfFile, 00769 LSINT64 _i64Begin, 00770 LSINT64 _i64Searched, 00771 LSINT64 _i64End, 00772 LSINT64 _i64EndGran, 00773 LSINT32 _i32EndSerial, 00774 LSINT32 * _pi32CurrentNoList, 00775 LSINT32 _i32CurrentNoS, 00776 LSINT32 _i32M ); 00777 00784 static LSINT32 OvGetData( LSS_OV_FILE * _povfFile ); 00785 00794 static LSINT32 OvLookUpSerialNo( LSINT32 _i32S, LSINT32 * _pi32SerialNoList, LSINT32 _i32N ); 00795 00803 static LSINT32 OvSeekHelper( LSS_OV_FILE *_povfFile, LSINT64 _i64Offset ); 00804 00810 static LSVOID OvDecodeClear( LSS_OV_FILE * _povfFile ); 00811 00818 static LSINT32 OvMakeDecodeReady( LSS_OV_FILE * _povfFile ); 00819 00829 static LSINT32 OvFetchAndProcessPacket( LSS_OV_FILE *_povfFile, COgg::ogg_packet * _popOpIn, LSINT32 _i32ReadP, LSINT32 _i32SpanP ); 00830 00838 static LSINT64 OvGetPrevPage( LSS_OV_FILE * _povfFile, COgg::ogg_page * _popPage ); 00839 00848 static LSINT32 Ov64SeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos, LSINT32 (* _pfLocalSeek)( LSS_OV_FILE *, LSINT64 ) ); 00849 00856 static LSINT32 OvInitSet( LSS_OV_FILE * _povfFile ); 00857 00867 static LSVOID OvGetLap( LSS_OV_FILE *_povfFile, CVorbisCodec::vorbis_info * _pviInfo, CVorbisCodec::vorbis_dsp_state * _pvdsVd, LSFLOAT ** _ppfLapPcm, LSINT32 _i32LapSize ); 00868 00875 static LSINT32 OvInitPrime( LSS_OV_FILE * _povfFile ); 00876 00889 static LSVOID OvSplice( LSFLOAT ** _ppfPcm, LSFLOAT ** _ppfLapPcm, 00890 LSINT32 _i32N1, LSINT32 _i32N2, 00891 LSINT32 _i32Ch1, LSINT32 _i32Ch2, 00892 LSFLOAT * _pfW1, LSFLOAT * _pfW2 ); 00893 00902 static LSINT32 OvDSeekLap( LSS_OV_FILE *_povfFile, LSDOUBLE _dPos, LSINT32 (* _pfLocalSeek)( LSS_OV_FILE *, LSDOUBLE ) ); 00903 00909 static LSINT32 OvHostIsBigEndian(); 00910 00920 static LSUINTPTR ReadFunc( LSVOID * _pvPtr, LSUINTPTR _uiptrSize, LSUINTPTR _uiptrNMemb, LSVOID * _pvDataSource ); 00921 00930 static LSINT32 SeekFunc( LSVOID * _pvDataSource, LSINT64 _i64Offset, LSINT32 _i32Whence ); 00931 00938 static LSINT32 CloseFunc( LSVOID * _pvDataSource ); 00939 00946 static LSINT64 TellFunc( LSVOID * _pvDataSource ); 00947 }; 00948 00949 } // namespace lss 00950 00951 #endif // __LSE_VORBISFILE_H__ 00952