AC3AudioStreamParser Class Reference

Inheritance diagram for AC3AudioStreamParser:

Inheritance graph
[legend]
Collaboration diagram for AC3AudioStreamParser:

Collaboration graph
[legend]

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

AC3AudioStreamFramerfUsingSource
unsigned char * fTo
unsigned fMaxSize
Boolean fHaveParsedAFrame
unsigned char * fSavedFrame
unsigned fSavedFrameSize
char fSavedFrameFlag
AC3FrameParams fCurrentFrame

Detailed Description

Definition at line 40 of file AC3AudioStreamFramer.cpp.


Member Typedef Documentation

typedef void( StreamParser::clientContinueFunc)(void *clientData, unsigned char *ptr, unsigned size, struct timeval presentationTime) [protected, inherited]

Definition at line 33 of file StreamParser.hh.


Constructor & Destructor Documentation

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]

Definition at line 232 of file AC3AudioStreamFramer.cpp.

00232                                             {
00233 }


Member Function Documentation

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.

References fMaxSize, and fTo.

Referenced by AC3AudioStreamFramer::doGetNextFrame().

00236                                                                    {
00237   fTo = to;
00238   fMaxSize = maxSize;
00239 }

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().

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().

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().

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; }


Field Documentation

AC3AudioStreamFramer* AC3AudioStreamParser::fUsingSource [private]

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().

Boolean AC3AudioStreamParser::fHaveParsedAFrame [private]

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().

AC3FrameParams AC3AudioStreamParser::fCurrentFrame [private]

Definition at line 80 of file AC3AudioStreamFramer.cpp.

Referenced by currentFrame(), and parseFrame().


The documentation for this class was generated from the following file:
Generated on Tue Oct 7 15:39:31 2008 for live by  doxygen 1.5.2