00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #pragma once
00033 #include <libilliCore/iLE_Math.h>
00034 #include <libilliCore/StringHelper.h>
00035
00036
00037
00038
00039
00040 using namespace std;
00041
00042 #define OGG_CAPTURE_PATTERN "Oggs"
00043 class LIBOOOGG_API OggPageHeader
00044 {
00045 public:
00046 OggPageHeader(void);
00047 ~OggPageHeader(void);
00048 OggPageHeader* clone();
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static const int MAX_NUM_SEGMENTS = 255;
00060 static const int MAX_SEGMENT_SIZE = 255;
00061 static const int SEGMENT_WIDTH = 1;
00062
00063 static const unsigned char OGG_CAPTURE_PATTERN_SIZE = 4;
00064 static const unsigned char OGG_BASE_HEADER_SIZE = 27;
00065 static const LOOG_INT64 UNKNOWN_GRANULE_POS = -1;
00066 enum ePageState {
00067 INVALID,
00068 BLANK,
00069 BASE_HEAD_SET,
00070 FULL_HEAD_SET,
00071 COMPLETE
00072 };
00073
00074 enum eHeadFlags {
00075 NO_FLAGS = 0,
00076 CONTINUATION = 1,
00077 BOS = 2,
00078 EOS = 4
00079 };
00080
00081
00082 enum eFieldOffsets {
00083 CAPTURE_PATTURN = 0,
00084 STRUCTURE_VERSION = 4,
00085 HEADER_FLAGS = 5,
00086 GRANULE_POS = 6,
00087 SERIAL_NO = 14,
00088 SEQUENCE_NO = 18,
00089 OGG_CHECKSUM = 22,
00090 NUM_SEGMENTS = 26,
00091 SEGMENT_TABLE = 27
00092 };
00093
00094
00095 bool rawData(unsigned char* outData, unsigned long inBuffSize);
00096
00097
00098 ePageState pageState();
00099 void setPageState(ePageState inPageState);
00100
00101
00102 bool isContinuation();
00103 bool isBOS();
00104 bool isEOS();
00105
00106
00107 unsigned long pageSize();
00108 unsigned long headerSize();
00109 unsigned long dataSize();
00110 unsigned long calculateDataSize();
00111
00112
00113 bool setBaseHeader(const unsigned char* inBaseHeader);
00114
00115
00116 unsigned char StructureVersion();
00117 unsigned char HeaderFlags();
00118 LOOG_INT64 GranulePos();
00119 unsigned long StreamSerialNo();
00120 unsigned long PageSequenceNo();
00121 unsigned long CRCChecksum();
00122 unsigned char NumPageSegments();
00123 unsigned char* SegmentTable();
00124
00125
00126 void setStructureVersion(unsigned char inVal);
00127 void setHeaderFlags(unsigned char inVal);
00128 void setGranulePos(LOOG_INT64 inPtr);
00129 void setGranulePos(const unsigned char* inPtr);
00130 void setStreamSerialNo(unsigned long inVal);
00131 void setStreamSerialNo(const unsigned char* inPtr);
00132 void setPageSequenceNo(unsigned long inVal);
00133 void setPageSequenceNo(const unsigned char* inPtr);
00134 void setCRCChecksum(unsigned long inVal);
00135 void setCRCChecksum(const unsigned char* inPtr);
00136 void setNumPageSegments(unsigned char inVal);
00137 void setSegmentTable(unsigned char* inPtr);
00138 void setSegmentTable(const unsigned char* inPtr, unsigned char inNumSegs);
00139
00140 void setHeaderSize(unsigned long inVal);
00141 void setDataSize(unsigned long inVal);
00142
00143
00144
00145 string toString();
00146 protected:
00147
00148 unsigned long mPageSize;
00149 unsigned long mHeaderSize;
00150 unsigned long mDataSize;
00151
00152
00153 unsigned char mStructureVersion;
00154 unsigned char mHeaderFlags;
00155 LOOG_INT64 mGranulePos;
00156 unsigned long mStreamSerialNo;
00157 unsigned long mPageSequenceNo;
00158 unsigned long mCRCChecksum;
00159 unsigned char mNumPageSegments;
00160
00161
00162 unsigned char* mSegmentTable;
00163
00164
00165 ePageState mPageState;
00166 private:
00167 OggPageHeader& operator=(const OggPageHeader& other);
00168 OggPageHeader(const OggPageHeader& other);
00169 };