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
00034 #include <libOOOgg/CircularBuffer.h>
00035 #include <libOOOgg/OggPage.h>
00036 #include <libOOOgg/OggTypeDefs.h>
00037 #include <libOOOgg/IOggCallback.h>
00038 #include <libOOOgg/IFIFOBuffer.h>
00039
00040
00041
00042
00043 using namespace std;
00044
00045 class LIBOOOGG_API OggDataBuffer {
00046 public:
00047
00048 enum eState {
00049 EOS,
00050 AWAITING_BASE_HEADER = 32,
00051 AWAITING_SEG_TABLE,
00052 AWAITING_DATA,
00053 LOST_PAGE_SYNC
00054 };
00055
00056 enum eFeedResult {
00057 FEED_OK,
00058 FEED_NULL_POINTER = 64,
00059 FEED_BUFFER_WRITE_ERROR
00060 };
00061
00062 enum eDispatchResult {
00063 DISPATCH_OK,
00064 DISPATCH_NO_CALLBACK = 256,
00065 DISPATCH_FALSE
00066 };
00067
00068 enum eProcessResult {
00069 PROCESS_OK,
00070 PROCESS_UNKNOWN_INTERNAL_ERROR = 512,
00071 PROCESS_STREAM_READ_ERROR,
00072 PROCESS_DISPATCH_FALSE,
00073 PROCESS_DISPATCH_FAILED,
00074 PROCESS_FAILED_TO_SET_HEADER,
00075 PROCESS_LOST_SYNC = 4096
00076
00077 };
00078
00079 static const int MAX_OGG_PAGE_SIZE = OggPageHeader::OGG_BASE_HEADER_SIZE +
00080 (OggPageHeader::MAX_NUM_SEGMENTS * OggPageHeader::MAX_SEGMENT_SIZE) +
00081 (OggPageHeader::SEGMENT_WIDTH * OggPageHeader::MAX_NUM_SEGMENTS);
00082
00083
00084
00085 void debugWrite(string inString);
00086
00087
00088
00089 OggDataBuffer(void);
00090 virtual ~OggDataBuffer(void);
00091
00093 bool registerStaticCallback(fPageCallback inPageCallback, void* inUserData);
00094
00096 bool registerVirtualCallback(IOggCallback* inPageCallback);
00097
00099 eFeedResult feed(const unsigned char* inData, unsigned long inNumBytes);
00100 void clearData();
00101
00103 unsigned long numBytesAvail();
00104
00106 eState state();
00107
00108 protected:
00109
00110 IFIFOBuffer* mBuffer;
00111
00112
00113 unsigned long mNumBytesNeeded;
00114 eState mState;
00115 OggPage* pendingPage;
00116 LOOG_INT64 mPrevGranPos;
00117
00118
00119 IOggCallback* mVirtualCallback;
00120 fPageCallback mStaticCallback;
00121 void* mStaticCallbackUserData;
00122
00123
00124 eProcessResult processBuffer();
00125 eProcessResult processBaseHeader();
00126 eProcessResult processSegTable();
00127 eProcessResult processDataSegment();
00128
00129
00130 virtual eDispatchResult dispatch(OggPage* inOggPage);
00131
00132
00133
00134
00135 private:
00136 OggDataBuffer& operator=(const OggDataBuffer& other);
00137 OggDataBuffer(const OggDataBuffer& other);
00138 };