00001 #pragma once 00002 00003 #include "..\BaseSplitter\BaseSplitter.h" 00004 00005 #pragma pack(push, 1) 00006 struct OggPageHeader 00007 { 00008 DWORD capture_pattern; 00009 BYTE stream_structure_version; 00010 BYTE header_type_flag; enum {continued=1, first=2, last=4}; 00011 __int64 granule_position; 00012 DWORD bitstream_serial_number; 00013 DWORD page_sequence_number; 00014 DWORD CRC_checksum; 00015 BYTE number_page_segments; 00016 }; 00017 struct OggVorbisIdHeader 00018 { 00019 DWORD vorbis_version; 00020 BYTE audio_channels; 00021 DWORD audio_sample_rate; 00022 DWORD bitrate_maximum; 00023 DWORD bitrate_nominal; 00024 DWORD bitrate_minimum; 00025 BYTE blocksize_0:4; 00026 BYTE blocksize_1:4; 00027 BYTE framing_flag; 00028 }; 00029 struct OggVideoHeader 00030 { 00031 DWORD w, h; 00032 }; 00033 struct OggAudioHeader 00034 { 00035 WORD nChannels, nBlockAlign; 00036 DWORD nAvgBytesPerSec; 00037 }; 00038 struct OggStreamHeader 00039 { 00040 char streamtype[8], subtype[4]; 00041 DWORD size; 00042 __int64 time_unit, samples_per_unit; 00043 DWORD default_len; 00044 DWORD buffersize; 00045 WORD bps; 00046 WORD alignmentfix1; 00047 union {OggVideoHeader v; OggAudioHeader a;}; 00048 DWORD alignmentfix2; 00049 }; 00050 #pragma pack(pop) 00051 00052 class OggPage : public CArray<BYTE> 00053 { 00054 public: 00055 OggPageHeader m_hdr; 00056 CList<int> m_lens; 00057 OggPage() {memset(&m_hdr, 0, sizeof(m_hdr));} 00058 }; 00059 00060 class COggFile : public CBaseSplitterFile 00061 { 00062 using CBaseSplitterFile::Read; 00063 00064 HRESULT Init(); 00065 00066 public: 00067 COggFile(IAsyncReader* pAsyncReader, HRESULT& hr); 00068 00069 bool Sync(HANDLE hBreak = NULL); 00070 bool Read(OggPageHeader& hdr, HANDLE hBreak = NULL); 00071 bool Read(OggPage& page, bool fFull = true, HANDLE hBreak = NULL); 00072 };