MP3StreamState Class Reference

#include <MP3StreamState.hh>

Collaboration diagram for MP3StreamState:

Collaboration graph
[legend]

Public Member Functions

 MP3StreamState (UsageEnvironment &env)
virtual ~MP3StreamState ()
void assignStream (FILE *fid, unsigned fileSize)
unsigned findNextHeader (struct timeval &presentationTime)
Boolean readFrame (unsigned char *outBuf, unsigned outBufSize, unsigned &resultFrameSize, unsigned &resultDurationInMicroseconds)
void getAttributes (char *buffer, unsigned bufferSize) const
void writeGetCmd (char const *hostName, unsigned short portNum, char const *fileName)
float filePlayTime () const
unsigned fileSize () const
void setPresentationTimeScale (unsigned scale)
unsigned getByteNumberFromPositionFraction (float fraction)
void seekWithinFile (unsigned seekByteNumber)
void checkForXingHeader ()

Protected Member Functions

unsigned readFromStream (unsigned char *buf, unsigned numChars)

Private Member Functions

MP3FrameParamsfr ()
MP3FrameParams const & fr () const
timeval currentFramePlayTime () const
Boolean findNextFrame ()

Private Attributes

UsageEnvironmentfEnv
FILE * fFid
Boolean fFidIsReallyASocket
unsigned fFileSize
unsigned fNumFramesInFile
unsigned fPresentationTimeScale
Boolean fIsVBR
Boolean fHasXingTOC
u_int8_t fXingTOC [XING_TOC_LENGTH]
MP3FrameParams fCurrentFrame
timeval fNextFramePresentationTime

Detailed Description

Definition at line 41 of file MP3StreamState.hh.


Constructor & Destructor Documentation

MP3StreamState::MP3StreamState ( UsageEnvironment env  ) 

Definition at line 31 of file MP3StreamState.cpp.

00032   : fEnv(env), fFid(NULL), fPresentationTimeScale(1) {
00033 }

MP3StreamState::~MP3StreamState (  )  [virtual]

Definition at line 35 of file MP3StreamState.cpp.

References CloseInputFile(), closeSocket, fFid, fFidIsReallyASocket, and NULL.

00035                                 {
00036   // Close our open file or socket:
00037   if (fFid != NULL && fFid != stdin) {
00038     if (fFidIsReallyASocket) {
00039       intptr_t fid_long = (intptr_t)fFid;
00040       closeSocket((int)fid_long);
00041     } else {
00042       CloseInputFile(fFid);
00043     }
00044   }
00045 }


Member Function Documentation

void MP3StreamState::assignStream ( FILE *  fid,
unsigned  fileSize 
)

Definition at line 47 of file MP3StreamState.cpp.

References False, fFid, fFidIsReallyASocket, fFileSize, fHasXingTOC, fIsVBR, fNextFramePresentationTime, fNumFramesInFile, and NULL.

Referenced by MP3FileSource::assignStream().

00047                                                               {
00048   fFid = fid;
00049 
00050   if (fileSize == (unsigned)(-1)) { /*HACK#####*/
00051     fFidIsReallyASocket = 1;
00052     fFileSize = 0;
00053   } else {
00054     fFidIsReallyASocket = 0;
00055     fFileSize = fileSize;
00056   }
00057   fNumFramesInFile = 0; // until we know otherwise
00058   fIsVBR = fHasXingTOC = False; // ditto
00059 
00060   // Set the first frame's 'presentation time' to the current wall time:
00061   gettimeofday(&fNextFramePresentationTime, NULL);
00062 }

unsigned MP3StreamState::findNextHeader ( struct timeval &  presentationTime  ) 

Definition at line 116 of file MP3StreamState.cpp.

References currentFramePlayTime(), findNextFrame(), fNextFramePresentationTime, fPresentationTimeScale, fr(), MP3FrameParams::hdr, and MILLION.

Referenced by MP3FileSource::doGetNextFrame1(), and MP3FileSource::initializeStream().

00116                                                                         {
00117   presentationTime = fNextFramePresentationTime;
00118 
00119   if (!findNextFrame()) return 0;
00120 
00121   // From this frame, figure out the *next* frame's presentation time:
00122   struct timeval framePlayTime = currentFramePlayTime();
00123   if (fPresentationTimeScale > 1) {
00124     // Scale this value
00125     unsigned secondsRem = framePlayTime.tv_sec % fPresentationTimeScale;
00126     framePlayTime.tv_sec -= secondsRem;
00127     framePlayTime.tv_usec += secondsRem*MILLION;
00128     framePlayTime.tv_sec /= fPresentationTimeScale;
00129     framePlayTime.tv_usec /= fPresentationTimeScale;
00130   }
00131   fNextFramePresentationTime.tv_usec += framePlayTime.tv_usec;
00132   fNextFramePresentationTime.tv_sec
00133     += framePlayTime.tv_sec + fNextFramePresentationTime.tv_usec/MILLION;
00134   fNextFramePresentationTime.tv_usec %= MILLION;
00135 
00136   return fr().hdr;
00137 }

Boolean MP3StreamState::readFrame ( unsigned char *  outBuf,
unsigned  outBufSize,
unsigned &  resultFrameSize,
unsigned &  resultDurationInMicroseconds 
)

Definition at line 139 of file MP3StreamState.cpp.

References currentFramePlayTime(), False, fr(), MP3FrameParams::frameSize, MP3FrameParams::hdr, MILLION, and True.

Referenced by MP3FileSource::doGetNextFrame1().

00141                                                                           {
00142   /* We assume that "mp3FindNextHeader()" has already been called */
00143 
00144   resultFrameSize = 4 + fr().frameSize;
00145 
00146   if (outBufSize < resultFrameSize) {
00147 #ifdef DEBUG_ERRORS
00148     fprintf(stderr, "Insufficient buffer size for reading input frame (%d, need %d)\n",
00149             outBufSize, resultFrameSize);
00150 #endif
00151     if (outBufSize < 4) outBufSize = 0;
00152     resultFrameSize = outBufSize;
00153 
00154     return False;
00155   }
00156 
00157   if (resultFrameSize >= 4) {
00158     unsigned& hdr = fr().hdr;
00159     *outBuf++ = (unsigned char)(hdr>>24);
00160     *outBuf++ = (unsigned char)(hdr>>16);
00161     *outBuf++ = (unsigned char)(hdr>>8);
00162     *outBuf++ = (unsigned char)(hdr);
00163 
00164     memmove(outBuf, fr().frameBytes, resultFrameSize-4);
00165   }
00166 
00167   struct timeval const pt = currentFramePlayTime();
00168   resultDurationInMicroseconds = pt.tv_sec*MILLION + pt.tv_usec;
00169 
00170   return True;
00171 }

void MP3StreamState::getAttributes ( char *  buffer,
unsigned  bufferSize 
) const

Definition at line 173 of file MP3StreamState.cpp.

References filePlayTime(), fIsVBR, and fr().

Referenced by MP3FileSource::getAttributes().

00173                                                                           {
00174   char const* formatStr
00175     = "bandwidth %d MPEGnumber %d MPEGlayer %d samplingFrequency %d isStereo %d playTime %d isVBR %d";
00176   unsigned fpt = (unsigned)(filePlayTime() + 0.5); // rounds to nearest integer
00177 #if defined(IRIX) || defined(ALPHA) || defined(_QNX4) || defined(IMN_PIM) || defined(CRIS)
00178   /* snprintf() isn't defined, so just use sprintf() - ugh! */
00179   sprintf(buffer, formatStr,
00180           fr().bitrate, fr().isMPEG2 ? 2 : 1, fr().layer, fr().samplingFreq, fr().isStereo,
00181           fpt, fIsVBR);
00182 #else
00183   snprintf(buffer, bufferSize, formatStr,
00184           fr().bitrate, fr().isMPEG2 ? 2 : 1, fr().layer, fr().samplingFreq, fr().isStereo,
00185           fpt, fIsVBR);
00186 #endif
00187 }

void MP3StreamState::writeGetCmd ( char const *  hostName,
unsigned short  portNum,
char const *  fileName 
)

Definition at line 189 of file MP3StreamState.cpp.

References fFid, and fFidIsReallyASocket.

00191                                                        {
00192   char const* const getCmdFmt = "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n";
00193 
00194   if (fFidIsReallyASocket) {
00195     intptr_t fid_long = (intptr_t)fFid;
00196     int sock = (int)fid_long;
00197     char writeBuf[100];
00198 #if defined(IRIX) || defined(ALPHA) || defined(_QNX4) || defined(IMN_PIM) || defined(CRIS)
00199     /* snprintf() isn't defined, so just use sprintf() */
00200     /* This is a security risk if filename can come from an external user */
00201     sprintf(writeBuf, getCmdFmt, fileName, hostName, portNum);
00202 #else
00203     snprintf(writeBuf, sizeof writeBuf, getCmdFmt,
00204              fileName, hostName, portNum);
00205 #endif
00206     send(sock, writeBuf, strlen(writeBuf), 0);
00207   } else {
00208     fprintf(fFid, getCmdFmt, fileName, hostName, portNum);
00209     fflush(fFid);
00210   }
00211 }

float MP3StreamState::filePlayTime (  )  const

Definition at line 78 of file MP3StreamState.cpp.

References currentFramePlayTime(), fCurrentFrame, fFileSize, fNumFramesInFile, MP3FrameParams::frameSize, and MILLION.

Referenced by MP3FileSource::filePlayTime(), and getAttributes().

00078                                          {
00079   unsigned numFramesInFile = fNumFramesInFile;
00080   if (numFramesInFile == 0) {
00081     // Estimate the number of frames from the file size, and the
00082     // size of the current frame:
00083     numFramesInFile = fFileSize/(4 + fCurrentFrame.frameSize);
00084   }
00085 
00086   struct timeval const pt = currentFramePlayTime();
00087   return numFramesInFile*(pt.tv_sec + pt.tv_usec/(float)MILLION);
00088 }

unsigned MP3StreamState::fileSize (  )  const [inline]

Definition at line 60 of file MP3StreamState.hh.

References fFileSize.

Referenced by MP3FileSource::fileSize().

00060 { return fFileSize; }

void MP3StreamState::setPresentationTimeScale ( unsigned  scale  )  [inline]

Definition at line 61 of file MP3StreamState.hh.

References fPresentationTimeScale.

Referenced by MP3FileSource::setPresentationTimeScale().

unsigned MP3StreamState::getByteNumberFromPositionFraction ( float  fraction  ) 

Definition at line 90 of file MP3StreamState.cpp.

References fFileSize, fHasXingTOC, and fXingTOC.

Referenced by MP3FileSource::seekWithinFile().

00090                                                                          {
00091   if (fHasXingTOC) {
00092     // The file is VBR, with a Xing TOC; use it to determine which byte to seek to:
00093     float percent = fraction*100.0f;
00094     unsigned a = (unsigned)percent;
00095     if (a > 99) a = 99;
00096 
00097     unsigned fa = fXingTOC[a];
00098     unsigned fb;
00099     if (a < 99) {
00100       fb = fXingTOC[a+1];
00101     } else {
00102       fb = 256;
00103     }
00104     fraction = (fa + (fb-fa)*(percent-a))/256.0f;
00105   }
00106 
00107   return (unsigned)(fraction*fFileSize);
00108 }

void MP3StreamState::seekWithinFile ( unsigned  seekByteNumber  ) 

Definition at line 110 of file MP3StreamState.cpp.

References fFid, fFidIsReallyASocket, and SeekFile64().

Referenced by MP3FileSource::seekWithinFile().

00110                                                            {
00111   if (fFidIsReallyASocket) return; // it's not seekable
00112 
00113   SeekFile64(fFid, seekByteNumber, SEEK_SET);
00114 }

void MP3StreamState::checkForXingHeader (  ) 

Definition at line 420 of file MP3StreamState.cpp.

References fFileSize, fHasXingTOC, fIsVBR, fNumFramesInFile, fr(), MP3FrameParams::frameBytes, MP3FrameParams::frameSize, frameSize, fXingTOC, MP3FrameParams::sideInfoSize, True, XING_BYTES_FLAG, XING_FRAMES_FLAG, XING_TOC_FLAG, and XING_TOC_LENGTH.

Referenced by MP3FileSource::initializeStream().

00420                                         {
00421   // Look for 'Xing' in the first 4 bytes after the 'side info':
00422   if (fr().frameSize < fr().sideInfoSize) return;
00423   unsigned bytesAvailable = fr().frameSize - fr().sideInfoSize;
00424   unsigned char* p = &(fr().frameBytes[fr().sideInfoSize]);
00425 
00426   if (bytesAvailable < 8) return;
00427   if (p[0] != 'X' || p[1] != 'i' || p[2] != 'n' || p[3] != 'g') return;
00428 
00429   // We found it.
00430   fIsVBR = True;
00431 
00432   u_int32_t flags = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
00433   unsigned i = 8;
00434   bytesAvailable -= 8;
00435 
00436   if (flags&XING_FRAMES_FLAG) {
00437     // The next 4 bytes are the number of frames:
00438     if (bytesAvailable < 4) return;
00439     fNumFramesInFile = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]);
00440     i += 4; bytesAvailable -= 4;
00441   }
00442 
00443   if (flags&XING_BYTES_FLAG) {
00444     // The next 4 bytes is the file size:
00445     if (bytesAvailable < 4) return;
00446     fFileSize = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]);
00447     i += 4; bytesAvailable -= 4;
00448   }
00449 
00450   if (flags&XING_TOC_FLAG) {
00451     // Fill in the Xing 'table of contents':
00452     if (bytesAvailable < XING_TOC_LENGTH) return;
00453     fHasXingTOC = True;
00454     for (unsigned j = 0; j < XING_TOC_LENGTH; ++j) {
00455       fXingTOC[j] = p[i+j];
00456     }
00457     i += XING_TOC_FLAG; bytesAvailable -= XING_TOC_FLAG;
00458   }
00459 }

unsigned MP3StreamState::readFromStream ( unsigned char *  buf,
unsigned  numChars 
) [protected]

Definition at line 390 of file MP3StreamState.cpp.

References fEnv, fFid, fFidIsReallyASocket, and waitUntilSocketIsReadable().

Referenced by findNextFrame().

00391                                                            {
00392   // Hack for doing socket I/O instead of file I/O (e.g., on Windows)
00393   if (fFidIsReallyASocket) {
00394     intptr_t fid_long = (intptr_t)fFid;
00395     int sock = (int)fid_long;
00396     unsigned totBytesRead = 0;
00397     do {
00398       waitUntilSocketIsReadable(fEnv, sock);
00399       int bytesRead
00400         = recv(sock, &((char*)buf)[totBytesRead], numChars-totBytesRead, 0);
00401       if (bytesRead < 0) return 0;
00402 
00403       totBytesRead += (unsigned)bytesRead;
00404     } while (totBytesRead < numChars);
00405 
00406     return totBytesRead;
00407   } else {
00408 #ifndef _WIN32_WCE
00409     waitUntilSocketIsReadable(fEnv, (int)fileno(fFid));
00410 #endif
00411     return fread(buf, 1, numChars, fFid);
00412   }
00413 }

MP3FrameParams& MP3StreamState::fr (  )  [inline, private]

Definition at line 71 of file MP3StreamState.hh.

References fCurrentFrame.

Referenced by checkForXingHeader(), currentFramePlayTime(), findNextFrame(), findNextHeader(), getAttributes(), and readFrame().

00071 {return fCurrentFrame;}

MP3FrameParams const& MP3StreamState::fr (  )  const [inline, private]

Definition at line 72 of file MP3StreamState.hh.

References fCurrentFrame.

00072 {return fCurrentFrame;}

struct timeval MP3StreamState::currentFramePlayTime (  )  const [read, private]

Definition at line 64 of file MP3StreamState.cpp.

References fr(), MP3FrameParams::isMPEG2, MILLION, and MP3FrameParams::samplingFreq.

Referenced by filePlayTime(), findNextHeader(), and readFrame().

00064                                                           {
00065   unsigned const numSamples = 1152;
00066   unsigned const freq = fr().samplingFreq*(1 + fr().isMPEG2);
00067 
00068   // result is numSamples/freq
00069   unsigned const uSeconds
00070     = ((numSamples*2*MILLION)/freq + 1)/2; // rounds to nearest integer
00071 
00072   struct timeval result;
00073   result.tv_sec = uSeconds/MILLION;
00074   result.tv_usec = uSeconds%MILLION;
00075   return result;
00076 }

Boolean MP3StreamState::findNextFrame (  )  [private]

Definition at line 216 of file MP3StreamState.cpp.

References False, MP3FrameParams::firstHdr, fr(), frameSize, MP3FrameParams::hdr, HDRCMPMASK, MP3FrameParams::oldHdr, readFromStream(), MP3FrameParams::setBytePointer(), MP3FrameParams::setParamsFromHeader(), and True.

Referenced by findNextHeader().

00216                                       {
00217   unsigned char hbuf[8];
00218   unsigned l; int i;
00219   int attempt = 0;
00220 
00221  read_again:
00222   if (readFromStream(hbuf, 4) != 4) return False;
00223 
00224   fr().hdr =  ((unsigned long) hbuf[0] << 24)
00225             | ((unsigned long) hbuf[1] << 16)
00226             | ((unsigned long) hbuf[2] << 8)
00227             | (unsigned long) hbuf[3];
00228 
00229 #ifdef DEBUG_PARSE
00230   fprintf(stderr, "fr().hdr: 0x%08x\n", fr().hdr);
00231 #endif
00232   if (fr().oldHdr != fr().hdr || !fr().oldHdr) {
00233     i = 0;
00234   init_resync:
00235 #ifdef DEBUG_PARSE
00236     fprintf(stderr, "init_resync: fr().hdr: 0x%08x\n", fr().hdr);
00237 #endif
00238     if (   (fr().hdr & 0xffe00000) != 0xffe00000
00239         || (fr().hdr & 0x00060000) == 0 // undefined 'layer' field
00240         || (fr().hdr & 0x0000F000) == 0 // 'free format' bitrate index
00241         || (fr().hdr & 0x0000F000) == 0x0000F000 // undefined bitrate index
00242         || (fr().hdr & 0x00000C00) == 0x00000C00 // undefined frequency index
00243         || (fr().hdr & 0x00000003) != 0x00000000 // 'emphasis' field unexpectedly set
00244        ) {
00245       /* RSF: Do the following test even if we're not at the
00246          start of the file, in case we have two or more
00247          separate MP3 files cat'ed together:
00248       */
00249       /* Check for RIFF hdr */
00250       if (fr().hdr == ('R'<<24)+('I'<<16)+('F'<<8)+'F') {
00251         unsigned char buf[70 /*was: 40*/];
00252 #ifdef DEBUG_ERRORS
00253         fprintf(stderr,"Skipped RIFF header\n");
00254 #endif
00255         readFromStream(buf, 66); /* already read 4 */
00256         goto read_again;
00257       }
00258       /* Check for ID3 hdr */
00259       if ((fr().hdr&0xFFFFFF00) == ('I'<<24)+('D'<<16)+('3'<<8)) {
00260         unsigned tagSize, bytesToSkip;
00261         unsigned char buf[1000];
00262         readFromStream(buf, 6); /* already read 4 */
00263         tagSize = ((buf[2]&0x7F)<<21) + ((buf[3]&0x7F)<<14) + ((buf[4]&0x7F)<<7) + (buf[5]&0x7F);
00264         bytesToSkip = tagSize;
00265         while (bytesToSkip > 0) {
00266           unsigned bytesToRead = sizeof buf;
00267           if (bytesToRead > bytesToSkip) {
00268             bytesToRead = bytesToSkip;
00269           }
00270           readFromStream(buf, bytesToRead);
00271           bytesToSkip -= bytesToRead;
00272         }
00273 #ifdef DEBUG_ERRORS
00274         fprintf(stderr,"Skipped %d-byte ID3 header\n", tagSize);
00275 #endif
00276         goto read_again;
00277       }
00278       /* give up after 20,000 bytes */
00279       if (i++ < 20000/*4096*//*1024*/) {
00280         memmove (&hbuf[0], &hbuf[1], 3);
00281         if (readFromStream(hbuf+3,1) != 1) {
00282           return False;
00283         }
00284         fr().hdr <<= 8;
00285         fr().hdr |= hbuf[3];
00286         fr().hdr &= 0xffffffff;
00287 #ifdef DEBUG_PARSE
00288         fprintf(stderr, "calling init_resync %d\n", i);
00289 #endif
00290         goto init_resync;
00291       }
00292 #ifdef DEBUG_ERRORS
00293       fprintf(stderr,"Giving up searching valid MPEG header\n");
00294 #endif
00295       return False;
00296 
00297 #ifdef DEBUG_ERRORS
00298       fprintf(stderr,"Illegal Audio-MPEG-Header 0x%08lx at offset 0x%lx.\n",
00299               fr().hdr,tell_stream(str)-4);
00300 #endif
00301       /* Read more bytes until we find something that looks
00302          reasonably like a valid header.  This is not a
00303          perfect strategy, but it should get us back on the
00304          track within a short time (and hopefully without
00305          too much distortion in the audio output).  */
00306       do {
00307         attempt++;
00308         memmove (&hbuf[0], &hbuf[1], 7);
00309         if (readFromStream(&hbuf[3],1) != 1) {
00310           return False;
00311         }
00312 
00313         /* This is faster than combining fr().hdr from scratch */
00314         fr().hdr = ((fr().hdr << 8) | hbuf[3]) & 0xffffffff;
00315 
00316         if (!fr().oldHdr)
00317           goto init_resync;       /* "considered harmful", eh? */
00318 
00319       } while ((fr().hdr & HDRCMPMASK) != (fr().oldHdr & HDRCMPMASK)
00320                && (fr().hdr & HDRCMPMASK) != (fr().firstHdr & HDRCMPMASK));
00321 #ifdef DEBUG_ERRORS
00322       fprintf (stderr, "Skipped %d bytes in input.\n", attempt);
00323 #endif
00324     }
00325     if (!fr().firstHdr) {
00326       fr().firstHdr = fr().hdr;
00327     }
00328 
00329     fr().setParamsFromHeader();
00330     fr().setBytePointer(fr().frameBytes, fr().frameSize);
00331 
00332     fr().oldHdr = fr().hdr;
00333 
00334     if (fr().isFreeFormat) {
00335 #ifdef DEBUG_ERRORS
00336       fprintf(stderr,"Free format not supported.\n");
00337 #endif
00338       return False;
00339     }
00340 
00341 #ifdef MP3_ONLY
00342     if (fr().layer != 3) {
00343 #ifdef DEBUG_ERRORS
00344       fprintf(stderr, "MPEG layer %d is not supported!\n", fr().layer);
00345 #endif
00346       return False;
00347     }
00348 #endif
00349   }
00350 
00351   if ((l = readFromStream(fr().frameBytes, fr().frameSize))
00352       != fr().frameSize) {
00353     if (l == 0) return False;
00354     memset(fr().frameBytes+1, 0, fr().frameSize-1);
00355   }
00356 
00357   return True;
00358 }


Field Documentation

UsageEnvironment& MP3StreamState::fEnv [private]

Definition at line 79 of file MP3StreamState.hh.

Referenced by readFromStream().

FILE* MP3StreamState::fFid [private]

Definition at line 80 of file MP3StreamState.hh.

Referenced by assignStream(), readFromStream(), seekWithinFile(), writeGetCmd(), and ~MP3StreamState().

Boolean MP3StreamState::fFidIsReallyASocket [private]

Definition at line 81 of file MP3StreamState.hh.

Referenced by assignStream(), readFromStream(), seekWithinFile(), writeGetCmd(), and ~MP3StreamState().

unsigned MP3StreamState::fFileSize [private]

Definition at line 82 of file MP3StreamState.hh.

Referenced by assignStream(), checkForXingHeader(), filePlayTime(), fileSize(), and getByteNumberFromPositionFraction().

unsigned MP3StreamState::fNumFramesInFile [private]

Definition at line 83 of file MP3StreamState.hh.

Referenced by assignStream(), checkForXingHeader(), and filePlayTime().

unsigned MP3StreamState::fPresentationTimeScale [private]

Definition at line 84 of file MP3StreamState.hh.

Referenced by findNextHeader(), and setPresentationTimeScale().

Boolean MP3StreamState::fIsVBR [private]

Definition at line 86 of file MP3StreamState.hh.

Referenced by assignStream(), checkForXingHeader(), and getAttributes().

Boolean MP3StreamState::fHasXingTOC [private]

Definition at line 86 of file MP3StreamState.hh.

Referenced by assignStream(), checkForXingHeader(), and getByteNumberFromPositionFraction().

u_int8_t MP3StreamState::fXingTOC[XING_TOC_LENGTH] [private]

Definition at line 87 of file MP3StreamState.hh.

Referenced by checkForXingHeader(), and getByteNumberFromPositionFraction().

MP3FrameParams MP3StreamState::fCurrentFrame [private]

Definition at line 89 of file MP3StreamState.hh.

Referenced by filePlayTime(), and fr().

struct timeval MP3StreamState::fNextFramePresentationTime [read, private]

Definition at line 90 of file MP3StreamState.hh.

Referenced by assignStream(), and findNextHeader().


The documentation for this class was generated from the following files:
Generated on Mon Apr 29 13:31:56 2013 for live by  doxygen 1.5.2