00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "StreamParser.hh"
00022
00023 #include <string.h>
00024 #include <stdlib.h>
00025
00026 #define BANK_SIZE 150000
00027
00028 void StreamParser::flushInput() {
00029 fCurParserIndex = fSavedParserIndex = 0;
00030 fSavedRemainingUnparsedBits = fRemainingUnparsedBits = 0;
00031 fTotNumValidBytes = 0;
00032 }
00033
00034 StreamParser::StreamParser(FramedSource* inputSource,
00035 FramedSource::onCloseFunc* onInputCloseFunc,
00036 void* onInputCloseClientData,
00037 clientContinueFunc* clientContinueFunc,
00038 void* clientContinueClientData)
00039 : fInputSource(inputSource), fClientOnInputCloseFunc(onInputCloseFunc),
00040 fClientOnInputCloseClientData(onInputCloseClientData),
00041 fClientContinueFunc(clientContinueFunc),
00042 fClientContinueClientData(clientContinueClientData),
00043 fSavedParserIndex(0), fSavedRemainingUnparsedBits(0),
00044 fCurParserIndex(0), fRemainingUnparsedBits(0),
00045 fTotNumValidBytes(0), fHaveSeenEOF(False) {
00046 fBank[0] = new unsigned char[BANK_SIZE];
00047 fBank[1] = new unsigned char[BANK_SIZE];
00048 fCurBankNum = 0;
00049 fCurBank = fBank[fCurBankNum];
00050
00051 fLastSeenPresentationTime.tv_sec = 0; fLastSeenPresentationTime.tv_usec = 0;
00052 }
00053
00054 StreamParser::~StreamParser() {
00055 delete[] fBank[0]; delete[] fBank[1];
00056 }
00057
00058 void StreamParser::saveParserState() {
00059 fSavedParserIndex = fCurParserIndex;
00060 fSavedRemainingUnparsedBits = fRemainingUnparsedBits;
00061 }
00062
00063 void StreamParser::restoreSavedParserState() {
00064 fCurParserIndex = fSavedParserIndex;
00065 fRemainingUnparsedBits = fSavedRemainingUnparsedBits;
00066 }
00067
00068 void StreamParser::skipBits(unsigned numBits) {
00069 if (numBits <= fRemainingUnparsedBits) {
00070 fRemainingUnparsedBits -= numBits;
00071 } else {
00072 numBits -= fRemainingUnparsedBits;
00073
00074 unsigned numBytesToExamine = (numBits+7)/8;
00075 ensureValidBytes(numBytesToExamine);
00076 fCurParserIndex += numBytesToExamine;
00077
00078 fRemainingUnparsedBits = 8*numBytesToExamine - numBits;
00079 }
00080 }
00081
00082 unsigned StreamParser::getBits(unsigned numBits) {
00083 if (numBits <= fRemainingUnparsedBits) {
00084 unsigned char lastByte = *lastParsed();
00085 lastByte >>= (fRemainingUnparsedBits - numBits);
00086 fRemainingUnparsedBits -= numBits;
00087
00088 return (unsigned)lastByte &~ ((~0)<<numBits);
00089 } else {
00090 unsigned char lastByte;
00091 if (fRemainingUnparsedBits > 0) {
00092 lastByte = *lastParsed();
00093 } else {
00094 lastByte = 0;
00095 }
00096
00097 unsigned remainingBits = numBits - fRemainingUnparsedBits;
00098
00099
00100
00101 unsigned result = test4Bytes();
00102
00103 result >>= (32 - remainingBits);
00104 result |= (lastByte << remainingBits);
00105 if (numBits < 32) result &=~ ((~0)<<numBits);
00106
00107 unsigned const numRemainingBytes = (remainingBits+7)/8;
00108 fCurParserIndex += numRemainingBytes;
00109 fRemainingUnparsedBits = 8*numRemainingBytes - remainingBits;
00110
00111 return result;
00112 }
00113 }
00114
00115 unsigned StreamParser::bankSize() const {
00116 return BANK_SIZE;
00117 }
00118
00119 #define NO_MORE_BUFFERED_INPUT 1
00120
00121 void StreamParser::ensureValidBytes1(unsigned numBytesNeeded) {
00122
00123
00124 unsigned maxInputFrameSize = fInputSource->maxFrameSize();
00125 if (maxInputFrameSize > numBytesNeeded) numBytesNeeded = maxInputFrameSize;
00126
00127
00128
00129 if (fCurParserIndex + numBytesNeeded > BANK_SIZE) {
00130
00131 unsigned numBytesToSave = fTotNumValidBytes - fSavedParserIndex;
00132 unsigned char const* from = &curBank()[fSavedParserIndex];
00133
00134 fCurBankNum = (fCurBankNum + 1)%2;
00135 fCurBank = fBank[fCurBankNum];
00136 memmove(curBank(), from, numBytesToSave);
00137 fCurParserIndex = fCurParserIndex - fSavedParserIndex;
00138 fSavedParserIndex = 0;
00139 fTotNumValidBytes = numBytesToSave;
00140 }
00141
00142
00143
00144 if (fCurParserIndex + numBytesNeeded > BANK_SIZE) {
00145
00146
00147 fInputSource->envir() << "StreamParser internal error ("
00148 << fCurParserIndex << " + "
00149 << numBytesNeeded << " > "
00150 << BANK_SIZE << ")\n";
00151 fInputSource->envir().internalError();
00152 }
00153
00154
00155 unsigned maxNumBytesToRead = BANK_SIZE - fTotNumValidBytes;
00156 fInputSource->getNextFrame(&curBank()[fTotNumValidBytes],
00157 maxNumBytesToRead,
00158 afterGettingBytes, this,
00159 onInputClosure, this);
00160
00161 throw NO_MORE_BUFFERED_INPUT;
00162 }
00163
00164 void StreamParser::afterGettingBytes(void* clientData,
00165 unsigned numBytesRead,
00166 unsigned ,
00167 struct timeval presentationTime,
00168 unsigned ){
00169 StreamParser* parser = (StreamParser*)clientData;
00170 if (parser != NULL) parser->afterGettingBytes1(numBytesRead, presentationTime);
00171 }
00172
00173 void StreamParser::afterGettingBytes1(unsigned numBytesRead, struct timeval presentationTime) {
00174
00175 if (fTotNumValidBytes + numBytesRead > BANK_SIZE) {
00176 fInputSource->envir()
00177 << "StreamParser::afterGettingBytes() warning: read "
00178 << numBytesRead << " bytes; expected no more than "
00179 << BANK_SIZE - fTotNumValidBytes << "\n";
00180 }
00181
00182 fLastSeenPresentationTime = presentationTime;
00183
00184 unsigned char* ptr = &curBank()[fTotNumValidBytes];
00185 fTotNumValidBytes += numBytesRead;
00186
00187
00188 restoreSavedParserState();
00189
00190
00191 fClientContinueFunc(fClientContinueClientData, ptr, numBytesRead, presentationTime);
00192 }
00193
00194 void StreamParser::onInputClosure(void* clientData) {
00195 StreamParser* parser = (StreamParser*)clientData;
00196 if (parser != NULL) parser->onInputClosure1();
00197 }
00198
00199 void StreamParser::onInputClosure1() {
00200 if (!fHaveSeenEOF) {
00201
00202
00203 fHaveSeenEOF = True;
00204 afterGettingBytes1(0, fLastSeenPresentationTime);
00205 } else {
00206
00207 fHaveSeenEOF = False;
00208 if (fClientOnInputCloseFunc != NULL) (*fClientOnInputCloseFunc)(fClientOnInputCloseClientData);
00209 }
00210 }