

Public Member Functions | |
| AC3AudioStreamParser (AC3AudioStreamFramer *usingSource, FramedSource *inputSource) | |
| virtual | ~AC3AudioStreamParser () |
| Boolean | testStreamCode (unsigned char ourStreamCode, unsigned char *ptr, unsigned size) |
| unsigned | parseFrame (unsigned &numTruncatedBytes) |
| void | registerReadInterest (unsigned char *to, unsigned maxSize) |
| AC3FrameParams const & | currentFrame () const |
| Boolean | haveParsedAFrame () const |
| void | readAndSaveAFrame () |
| virtual void | flushInput () |
Protected Types | |
| typedef void( | clientContinueFunc )(void *clientData, unsigned char *ptr, unsigned size, struct timeval presentationTime) |
Protected Member Functions | |
| void | saveParserState () |
| virtual void | restoreSavedParserState () |
| u_int32_t | get4Bytes () |
| u_int32_t | test4Bytes () |
| u_int16_t | get2Bytes () |
| u_int8_t | get1Byte () |
| void | getBytes (u_int8_t *to, unsigned numBytes) |
| void | skipBytes (unsigned numBytes) |
| void | skipBits (unsigned numBits) |
| unsigned | getBits (unsigned numBits) |
| unsigned | curOffset () const |
| unsigned & | totNumValidBytes () |
Private Member Functions | |
| void | afterGettingSavedFrame1 (unsigned frameSize) |
| void | onSavedFrameClosure1 () |
Static Private Member Functions | |
| static void | afterGettingSavedFrame (void *clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds) |
| static void | onSavedFrameClosure (void *clientData) |
Private Attributes | |
| AC3AudioStreamFramer * | fUsingSource |
| unsigned char * | fTo |
| unsigned | fMaxSize |
| Boolean | fHaveParsedAFrame |
| unsigned char * | fSavedFrame |
| unsigned | fSavedFrameSize |
| char | fSavedFrameFlag |
| AC3FrameParams | fCurrentFrame |
Definition at line 40 of file AC3AudioStreamFramer.cpp.
typedef void( StreamParser::clientContinueFunc)(void *clientData, unsigned char *ptr, unsigned size, struct timeval presentationTime) [protected, inherited] |
Definition at line 33 of file StreamParser.hh.
| AC3AudioStreamParser::AC3AudioStreamParser | ( | AC3AudioStreamFramer * | usingSource, | |
| FramedSource * | inputSource | |||
| ) |
Definition at line 224 of file AC3AudioStreamFramer.cpp.
00226 : StreamParser(inputSource, FramedSource::handleClosure, usingSource, 00227 &AC3AudioStreamFramer::handleNewData, usingSource), 00228 fUsingSource(usingSource), fHaveParsedAFrame(False), 00229 fSavedFrame(NULL), fSavedFrameSize(0) { 00230 }
| AC3AudioStreamParser::~AC3AudioStreamParser | ( | ) | [virtual] |
| Boolean AC3AudioStreamParser::testStreamCode | ( | unsigned char | ourStreamCode, | |
| unsigned char * | ptr, | |||
| unsigned | size | |||
| ) |
Definition at line 242 of file AC3AudioStreamFramer.cpp.
References False, StreamParser::totNumValidBytes(), and True.
Referenced by AC3AudioStreamFramer::handleNewData().
00243 { 00244 if (size < 4) return False; // shouldn't happen 00245 unsigned char streamCode = *ptr; 00246 00247 if (streamCode == ourStreamCode) { 00248 // Remove the first 4 bytes from the stream: 00249 memmove(ptr, ptr + 4, size - 4); 00250 totNumValidBytes() = totNumValidBytes() - 4; 00251 00252 return True; 00253 } else { 00254 // Discard all of the data that was just read: 00255 totNumValidBytes() = totNumValidBytes() - size; 00256 00257 return False; 00258 } 00259 }
| unsigned AC3AudioStreamParser::parseFrame | ( | unsigned & | numTruncatedBytes | ) |
Definition at line 261 of file AC3AudioStreamFramer.cpp.
References Medium::envir(), fCurrentFrame, fHaveParsedAFrame, fMaxSize, AC3FrameParams::frameSize, frameSize, fSavedFrame, fSavedFrameSize, fTo, fUsingSource, StreamParser::get4Bytes(), StreamParser::getBytes(), AC3FrameParams::hdr0, AC3FrameParams::hdr1, NULL, StreamParser::saveParserState(), AC3FrameParams::setParamsFromHeader(), StreamParser::skipBytes(), StreamParser::test4Bytes(), and True.
Referenced by AC3AudioStreamFramer::parseNextFrame().
00261 { 00262 if (fSavedFrameSize > 0) { 00263 // We've already read and parsed a frame. Use it instead: 00264 memmove(fTo, fSavedFrame, fSavedFrameSize); 00265 delete[] fSavedFrame; fSavedFrame = NULL; 00266 unsigned frameSize = fSavedFrameSize; 00267 fSavedFrameSize = 0; 00268 return frameSize; 00269 } 00270 00271 try { 00272 saveParserState(); 00273 00274 // We expect an AC3 audio header (first 2 bytes == 0x0B77) at the start: 00275 while (1) { 00276 unsigned next4Bytes = test4Bytes(); 00277 if (next4Bytes>>16 == 0x0B77) break; 00278 skipBytes(1); 00279 saveParserState(); 00280 } 00281 fCurrentFrame.hdr0 = get4Bytes(); 00282 fCurrentFrame.hdr1 = test4Bytes(); 00283 00284 fCurrentFrame.setParamsFromHeader(); 00285 fHaveParsedAFrame = True; 00286 00287 // Copy the frame to the requested destination: 00288 unsigned frameSize = fCurrentFrame.frameSize; 00289 if (frameSize > fMaxSize) { 00290 numTruncatedBytes = frameSize - fMaxSize; 00291 frameSize = fMaxSize; 00292 } else { 00293 numTruncatedBytes = 0; 00294 } 00295 00296 fTo[0] = fCurrentFrame.hdr0 >> 24; 00297 fTo[1] = fCurrentFrame.hdr0 >> 16; 00298 fTo[2] = fCurrentFrame.hdr0 >> 8; 00299 fTo[3] = fCurrentFrame.hdr0; 00300 getBytes(&fTo[4], frameSize-4); 00301 skipBytes(numTruncatedBytes); 00302 00303 return frameSize; 00304 } catch (int /*e*/) { 00305 #ifdef DEBUG 00306 fUsingSource->envir() << "AC3AudioStreamParser::parseFrame() EXCEPTION (This is normal behavior - *not* an error)\n"; 00307 #endif 00308 return 0; // the parsing got interrupted 00309 } 00310 }
| void AC3AudioStreamParser::registerReadInterest | ( | unsigned char * | to, | |
| unsigned | maxSize | |||
| ) |
Definition at line 235 of file AC3AudioStreamFramer.cpp.
Referenced by AC3AudioStreamFramer::doGetNextFrame().
| AC3FrameParams const& AC3AudioStreamParser::currentFrame | ( | ) | const [inline] |
Definition at line 55 of file AC3AudioStreamFramer.cpp.
References fCurrentFrame.
Referenced by AC3AudioStreamFramer::currentFramePlayTime(), and AC3AudioStreamFramer::samplingRate().
00055 { return fCurrentFrame; }
| Boolean AC3AudioStreamParser::haveParsedAFrame | ( | ) | const [inline] |
Definition at line 57 of file AC3AudioStreamFramer.cpp.
References fHaveParsedAFrame.
Referenced by AC3AudioStreamFramer::samplingRate().
00057 { return fHaveParsedAFrame; }
| void AC3AudioStreamParser::readAndSaveAFrame | ( | ) |
Definition at line 312 of file AC3AudioStreamFramer.cpp.
References afterGettingSavedFrame(), TaskScheduler::doEventLoop(), Medium::envir(), fSavedFrame, fSavedFrameFlag, fSavedFrameSize, fUsingSource, FramedSource::getNextFrame(), onSavedFrameClosure(), and UsageEnvironment::taskScheduler().
Referenced by AC3AudioStreamFramer::samplingRate().
00312 { 00313 unsigned const maxAC3FrameSize = 4000; 00314 fSavedFrame = new unsigned char[maxAC3FrameSize]; 00315 fSavedFrameSize = 0; 00316 00317 fSavedFrameFlag = 0; 00318 fUsingSource->getNextFrame(fSavedFrame, maxAC3FrameSize, 00319 afterGettingSavedFrame, this, 00320 onSavedFrameClosure, this); 00321 fUsingSource->envir().taskScheduler().doEventLoop(&fSavedFrameFlag); 00322 }
| void AC3AudioStreamParser::afterGettingSavedFrame | ( | void * | clientData, | |
| unsigned | frameSize, | |||
| unsigned | numTruncatedBytes, | |||
| struct timeval | presentationTime, | |||
| unsigned | durationInMicroseconds | |||
| ) | [static, private] |
Definition at line 325 of file AC3AudioStreamFramer.cpp.
References afterGettingSavedFrame1().
Referenced by readAndSaveAFrame().
00328 { 00329 AC3AudioStreamParser* parser = (AC3AudioStreamParser*)clientData; 00330 parser->afterGettingSavedFrame1(frameSize); 00331 }
| void AC3AudioStreamParser::afterGettingSavedFrame1 | ( | unsigned | frameSize | ) | [private] |
Definition at line 334 of file AC3AudioStreamFramer.cpp.
References fSavedFrameFlag, and fSavedFrameSize.
Referenced by afterGettingSavedFrame().
00334 { 00335 fSavedFrameSize = frameSize; 00336 fSavedFrameFlag = ~0; 00337 }
| void AC3AudioStreamParser::onSavedFrameClosure | ( | void * | clientData | ) | [static, private] |
Definition at line 339 of file AC3AudioStreamFramer.cpp.
References onSavedFrameClosure1().
Referenced by readAndSaveAFrame().
00339 { 00340 AC3AudioStreamParser* parser = (AC3AudioStreamParser*)clientData; 00341 parser->onSavedFrameClosure1(); 00342 }
| void AC3AudioStreamParser::onSavedFrameClosure1 | ( | ) | [private] |
Definition at line 344 of file AC3AudioStreamFramer.cpp.
References fSavedFrame, fSavedFrameFlag, fSavedFrameSize, and NULL.
Referenced by onSavedFrameClosure().
00344 { 00345 delete[] fSavedFrame; fSavedFrame = NULL; 00346 fSavedFrameSize = 0; 00347 fSavedFrameFlag = ~0; 00348 }
| void StreamParser::flushInput | ( | ) | [virtual, inherited] |
Reimplemented in MPEG1or2VideoStreamParser, and MPEG4VideoStreamParser.
Definition at line 178 of file StreamParser.cpp.
References StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, StreamParser::fSavedParserIndex, StreamParser::fSavedRemainingUnparsedBits, and StreamParser::fTotNumValidBytes.
Referenced by MPEGVideoStreamFramer::flushInput(), MPEG4VideoStreamParser::flushInput(), MPEG1or2VideoStreamParser::flushInput(), MPEG1or2Demux::flushInput(), MPEG1or2AudioStreamFramer::flushInput(), and AC3AudioStreamFramer::flushInput().
00178 { 00179 fCurParserIndex = fSavedParserIndex = 0; 00180 fSavedRemainingUnparsedBits = fRemainingUnparsedBits = 0; 00181 fTotNumValidBytes = 0; 00182 }
| void StreamParser::saveParserState | ( | ) | [protected, inherited] |
Definition at line 121 of file StreamParser.cpp.
References StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, StreamParser::fSavedParserIndex, and StreamParser::fSavedRemainingUnparsedBits.
Referenced by MPEG1or2AudioStreamParser::parse(), parseFrame(), MPEGVideoStreamParser::setParseState(), MPEGProgramStreamParser::setParseState(), and H263plusVideoStreamParser::setParseState().
00121 { 00122 fSavedParserIndex = fCurParserIndex; 00123 fSavedRemainingUnparsedBits = fRemainingUnparsedBits; 00124 }
| void StreamParser::restoreSavedParserState | ( | ) | [protected, virtual, inherited] |
Reimplemented in H263plusVideoStreamParser, and MPEGVideoStreamParser.
Definition at line 126 of file StreamParser.cpp.
References StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, StreamParser::fSavedParserIndex, and StreamParser::fSavedRemainingUnparsedBits.
Referenced by StreamParser::afterGettingBytes(), MPEGProgramStreamParser::parsePESPacket(), MPEGVideoStreamParser::restoreSavedParserState(), and H263plusVideoStreamParser::restoreSavedParserState().
00126 { 00127 fCurParserIndex = fSavedParserIndex; 00128 fRemainingUnparsedBits = fSavedRemainingUnparsedBits; 00129 }
| u_int32_t StreamParser::get4Bytes | ( | ) | [inline, protected, inherited] |
Definition at line 46 of file StreamParser.hh.
References StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, and StreamParser::test4Bytes().
Referenced by parseFrame(), MPEG1or2VideoStreamParser::parseGOPHeader(), MPEG4VideoStreamParser::parseGroupOfVideoObjectPlane(), MPEGProgramStreamParser::parsePackHeader(), MPEGProgramStreamParser::parsePESPacket(), MPEG1or2VideoStreamParser::parsePictureHeader(), MPEG4VideoStreamParser::parseVideoObjectLayer(), MPEG4VideoStreamParser::parseVideoObjectPlane(), MPEG1or2VideoStreamParser::parseVideoSequenceHeader(), MPEG4VideoStreamParser::parseVisualObject(), MPEG4VideoStreamParser::parseVisualObjectSequence(), MPEGVideoStreamParser::saveToNextCode(), and MPEGVideoStreamParser::skipToNextCode().
00046 { // byte-aligned; returned in big-endian order 00047 u_int32_t result = test4Bytes(); 00048 fCurParserIndex += 4; 00049 fRemainingUnparsedBits = 0; 00050 00051 return result; 00052 }
| u_int32_t StreamParser::test4Bytes | ( | ) | [inline, protected, inherited] |
Definition at line 53 of file StreamParser.hh.
References StreamParser::ensureValidBytes(), and StreamParser::nextToParse().
Referenced by StreamParser::get4Bytes(), StreamParser::getBits(), MPEG1or2AudioStreamParser::parse(), parseFrame(), MPEG1or2VideoStreamParser::parseGOPHeader(), MPEGProgramStreamParser::parsePackHeader(), MPEGProgramStreamParser::parsePESPacket(), MPEGProgramStreamParser::parseSystemHeader(), MPEG1or2VideoStreamParser::parseVideoSequenceHeader(), and MPEG4VideoStreamParser::parseVisualObjectSequence().
00053 { // as above, but doesn't advance ptr 00054 ensureValidBytes(4); 00055 00056 unsigned char const* ptr = nextToParse(); 00057 return (ptr[0]<<24)|(ptr[1]<<16)|(ptr[2]<<8)|ptr[3]; 00058 }
| u_int16_t StreamParser::get2Bytes | ( | ) | [inline, protected, inherited] |
Definition at line 60 of file StreamParser.hh.
References StreamParser::ensureValidBytes(), StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, and StreamParser::nextToParse().
Referenced by MPEGProgramStreamParser::parsePESPacket(), and MPEGProgramStreamParser::parseSystemHeader().
00060 { 00061 ensureValidBytes(2); 00062 00063 unsigned char const* ptr = nextToParse(); 00064 u_int16_t result = (ptr[0]<<8)|ptr[1]; 00065 00066 fCurParserIndex += 2; 00067 fRemainingUnparsedBits = 0; 00068 00069 return result; 00070 }
| u_int8_t StreamParser::get1Byte | ( | ) | [inline, protected, inherited] |
Definition at line 72 of file StreamParser.hh.
References StreamParser::curBank(), StreamParser::ensureValidBytes(), StreamParser::fCurParserIndex, and StreamParser::fRemainingUnparsedBits.
Referenced by MPEG1or2VideoStreamParser::parseGOPHeader(), H263plusVideoStreamParser::parseH263Frame(), MPEGProgramStreamParser::parsePackHeader(), MPEGProgramStreamParser::parsePESPacket(), MPEG4VideoStreamParser::parseVideoObjectPlane(), MPEG1or2VideoStreamParser::parseVideoSequenceHeader(), MPEG4VideoStreamParser::parseVisualObject(), MPEG4VideoStreamParser::parseVisualObjectSequence(), MPEGVideoStreamParser::saveToNextCode(), and MPEGVideoStreamParser::skipToNextCode().
00072 { // byte-aligned 00073 ensureValidBytes(1); 00074 fRemainingUnparsedBits = 0; 00075 return curBank()[fCurParserIndex++]; 00076 }
| void StreamParser::getBytes | ( | u_int8_t * | to, | |
| unsigned | numBytes | |||
| ) | [inline, protected, inherited] |
Definition at line 78 of file StreamParser.hh.
References StreamParser::ensureValidBytes(), StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, and StreamParser::nextToParse().
Referenced by MPEG1or2AudioStreamParser::parse(), parseFrame(), MPEG4VideoStreamParser::parseGroupOfVideoObjectPlane(), H263plusVideoStreamParser::parseH263Frame(), and MPEGProgramStreamParser::parsePESPacket().
00078 { 00079 ensureValidBytes(numBytes); 00080 memmove(to, nextToParse(), numBytes); 00081 fCurParserIndex += numBytes; 00082 fRemainingUnparsedBits = 0; 00083 }
| void StreamParser::skipBytes | ( | unsigned | numBytes | ) | [inline, protected, inherited] |
Definition at line 84 of file StreamParser.hh.
References StreamParser::ensureValidBytes(), and StreamParser::fCurParserIndex.
Referenced by MPEG1or2AudioStreamParser::parse(), parseFrame(), MPEGProgramStreamParser::parsePackHeader(), MPEGProgramStreamParser::parsePESPacket(), and MPEGProgramStreamParser::parseSystemHeader().
00084 { 00085 ensureValidBytes(numBytes); 00086 fCurParserIndex += numBytes; 00087 }
| void StreamParser::skipBits | ( | unsigned | numBits | ) | [protected, inherited] |
Definition at line 131 of file StreamParser.cpp.
References StreamParser::ensureValidBytes(), StreamParser::fCurParserIndex, and StreamParser::fRemainingUnparsedBits.
Referenced by MPEGProgramStreamParser::parsePackHeader().
00131 { 00132 if (numBits <= fRemainingUnparsedBits) { 00133 fRemainingUnparsedBits -= numBits; 00134 } else { 00135 numBits -= fRemainingUnparsedBits; 00136 00137 unsigned numBytesToExamine = (numBits+7)/8; // round up 00138 ensureValidBytes(numBytesToExamine); 00139 fCurParserIndex += numBytesToExamine; 00140 00141 fRemainingUnparsedBits = 8*numBytesToExamine - numBits; 00142 } 00143 }
| unsigned StreamParser::getBits | ( | unsigned | numBits | ) | [protected, inherited] |
Definition at line 145 of file StreamParser.cpp.
References StreamParser::fCurParserIndex, StreamParser::fRemainingUnparsedBits, StreamParser::lastParsed(), and StreamParser::test4Bytes().
Referenced by MPEGProgramStreamParser::parsePackHeader(), and MPEGProgramStreamParser::parsePESPacket().
00145 { 00146 if (numBits <= fRemainingUnparsedBits) { 00147 unsigned char lastByte = *lastParsed(); 00148 lastByte >>= (fRemainingUnparsedBits - numBits); 00149 fRemainingUnparsedBits -= numBits; 00150 00151 return (unsigned)lastByte &~ ((~0)<<numBits); 00152 } else { 00153 unsigned char lastByte; 00154 if (fRemainingUnparsedBits > 0) { 00155 lastByte = *lastParsed(); 00156 } else { 00157 lastByte = 0; 00158 } 00159 00160 unsigned remainingBits = numBits - fRemainingUnparsedBits; // > 0 00161 00162 // For simplicity, read the next 4 bytes, even though we might not 00163 // need all of them here: 00164 unsigned result = test4Bytes(); 00165 00166 result >>= (32 - remainingBits); 00167 result |= (lastByte << remainingBits); 00168 if (numBits < 32) result &=~ ((~0)<<numBits); 00169 00170 unsigned const numRemainingBytes = (remainingBits+7)/8; 00171 fCurParserIndex += numRemainingBytes; 00172 fRemainingUnparsedBits = 8*numRemainingBytes - remainingBits; 00173 00174 return result; 00175 } 00176 }
| unsigned StreamParser::curOffset | ( | ) | const [inline, protected, inherited] |
Definition at line 93 of file StreamParser.hh.
References StreamParser::fCurParserIndex.
Referenced by MPEGProgramStreamParser::parsePESPacket().
00093 { return fCurParserIndex; }
| unsigned& StreamParser::totNumValidBytes | ( | ) | [inline, protected, inherited] |
Definition at line 95 of file StreamParser.hh.
References StreamParser::fTotNumValidBytes.
Referenced by testStreamCode().
00095 { return fTotNumValidBytes; }
Definition at line 70 of file AC3AudioStreamFramer.cpp.
Referenced by parseFrame(), and readAndSaveAFrame().
unsigned char* AC3AudioStreamParser::fTo [private] |
Definition at line 71 of file AC3AudioStreamFramer.cpp.
Referenced by parseFrame(), and registerReadInterest().
unsigned AC3AudioStreamParser::fMaxSize [private] |
Definition at line 72 of file AC3AudioStreamFramer.cpp.
Referenced by parseFrame(), and registerReadInterest().
Definition at line 74 of file AC3AudioStreamFramer.cpp.
Referenced by haveParsedAFrame(), and parseFrame().
unsigned char* AC3AudioStreamParser::fSavedFrame [private] |
Definition at line 75 of file AC3AudioStreamFramer.cpp.
Referenced by onSavedFrameClosure1(), parseFrame(), and readAndSaveAFrame().
unsigned AC3AudioStreamParser::fSavedFrameSize [private] |
Definition at line 76 of file AC3AudioStreamFramer.cpp.
Referenced by afterGettingSavedFrame1(), onSavedFrameClosure1(), parseFrame(), and readAndSaveAFrame().
char AC3AudioStreamParser::fSavedFrameFlag [private] |
Definition at line 77 of file AC3AudioStreamFramer.cpp.
Referenced by afterGettingSavedFrame1(), onSavedFrameClosure1(), and readAndSaveAFrame().
Definition at line 80 of file AC3AudioStreamFramer.cpp.
Referenced by currentFrame(), and parseFrame().
1.5.2