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
void setPresentationTimeScale (unsigned scale)
void seekWithinFile (float seekNPT)
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 30 of file MP3StreamState.cpp.

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

MP3StreamState::~MP3StreamState (  )  [virtual]

Definition at line 34 of file MP3StreamState.cpp.

References closeSocket, fFid, fFidIsReallyASocket, and NULL.

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


Member Function Documentation

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

Definition at line 46 of file MP3StreamState.cpp.

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

Referenced by MP3FileSource::assignStream().

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

unsigned MP3StreamState::findNextHeader ( struct timeval &  presentationTime  ) 

Definition at line 125 of file MP3StreamState.cpp.

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

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

00125                                                                         {
00126   presentationTime = fNextFramePresentationTime;
00127 
00128   if (!findNextFrame()) return 0;
00129 
00130   // From this frame, figure out the *next* frame's presentation time:
00131   struct timeval framePlayTime = currentFramePlayTime();
00132   if (fPresentationTimeScale > 1) {
00133     // Scale this value
00134     unsigned secondsRem = framePlayTime.tv_sec % fPresentationTimeScale;
00135     framePlayTime.tv_sec -= secondsRem;
00136     framePlayTime.tv_usec += secondsRem*MILLION;
00137     framePlayTime.tv_sec /= fPresentationTimeScale;
00138     framePlayTime.tv_usec /= fPresentationTimeScale;
00139   }
00140   fNextFramePresentationTime.tv_usec += framePlayTime.tv_usec;
00141   fNextFramePresentationTime.tv_sec
00142     += framePlayTime.tv_sec + fNextFramePresentationTime.tv_usec/MILLION;
00143   fNextFramePresentationTime.tv_usec %= MILLION;
00144 
00145   return fr().hdr;
00146 }

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

Definition at line 148 of file MP3StreamState.cpp.

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

Referenced by MP3FileSource::doGetNextFrame1().

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

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

Definition at line 182 of file MP3StreamState.cpp.

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

Referenced by MP3FileSource::getAttributes().

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

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

Definition at line 198 of file MP3StreamState.cpp.

References fFid, and fFidIsReallyASocket.

Referenced by MP3HTTPSource::writeGetCmd().

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

float MP3StreamState::filePlayTime (  )  const

Definition at line 77 of file MP3StreamState.cpp.

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

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

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

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

Definition at line 60 of file MP3StreamState.hh.

References fPresentationTimeScale.

Referenced by MP3FileSource::setPresentationTimeScale().

void MP3StreamState::seekWithinFile ( float  seekNPT  ) 

Definition at line 89 of file MP3StreamState.cpp.

References fFid, fFidIsReallyASocket, fFileSize, fHasXingTOC, filePlayTime(), and fXingTOC.

Referenced by MP3FileSource::seekWithinFile().

00089                                                  {
00090   if (fFidIsReallyASocket) return; // it's not seekable
00091 
00092   float fileDuration = filePlayTime();
00093   if (seekNPT < 0.0) {
00094     seekNPT = 0.0;
00095   } else if (seekNPT > fileDuration) {
00096     seekNPT = fileDuration;
00097   }
00098   float seekFraction = seekNPT/fileDuration;
00099 
00100   unsigned seekByteNumber;
00101   if (fHasXingTOC) {
00102     // The file is VBR, with a Xing TOC; use it to determine which byte to seek to:
00103     float percent = seekFraction*100.0f;
00104     unsigned a = (unsigned)percent;
00105     if (a > 99) a = 99;
00106 
00107     unsigned fa = fXingTOC[a];
00108     unsigned fb;
00109     if (a < 99) {
00110       fb = fXingTOC[a+1];
00111     } else {
00112       fb = 256;
00113     }
00114     float seekByteFraction = (fa + (fb-fa)*(percent-a))/256.0f;
00115 
00116     seekByteNumber = (unsigned)(seekByteFraction*fFileSize);
00117   } else {
00118     // Normal case: Treat the file as if it's CBR:
00119     seekByteNumber = (unsigned)(seekFraction*fFileSize);
00120   }
00121 
00122   fseek(fFid, seekByteNumber, SEEK_SET);
00123 }

void MP3StreamState::checkForXingHeader (  ) 

Definition at line 439 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().

00439                                         {
00440   // Look for 'Xing' in the first 4 bytes after the 'side info':
00441   if (fr().frameSize < fr().sideInfoSize) return;
00442   unsigned bytesAvailable = fr().frameSize - fr().sideInfoSize;
00443   unsigned char* p = &(fr().frameBytes[fr().sideInfoSize]);
00444 
00445   if (bytesAvailable < 8) return;
00446   if (p[0] != 'X' || p[1] != 'i' || p[2] != 'n' || p[3] != 'g') return;
00447 
00448   // We found it.
00449   fIsVBR = True;
00450 
00451   u_int32_t flags = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
00452   unsigned i = 8;
00453   bytesAvailable -= 8;
00454 
00455   if (flags&XING_FRAMES_FLAG) {
00456     // The next 4 bytes are the number of frames:
00457     if (bytesAvailable < 4) return;
00458     fNumFramesInFile = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]);
00459     i += 4; bytesAvailable -= 4;
00460   }
00461 
00462   if (flags&XING_BYTES_FLAG) {
00463     // The next 4 bytes is the file size:
00464     if (bytesAvailable < 4) return;
00465     fFileSize = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]);
00466     i += 4; bytesAvailable -= 4;
00467   }
00468 
00469   if (flags&XING_TOC_FLAG) {
00470     // Fill in the Xing 'table of contents':
00471     if (bytesAvailable < XING_TOC_LENGTH) return;
00472     fHasXingTOC = True;
00473     for (unsigned j = 0; j < XING_TOC_LENGTH; ++j) {
00474       fXingTOC[j] = p[i+j];
00475     }
00476     i += XING_TOC_FLAG; bytesAvailable -= XING_TOC_FLAG;
00477   }
00478 }

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

Definition at line 411 of file MP3StreamState.cpp.

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

Referenced by findNextFrame().

00412                                                            {
00413   // Hack for doing socket I/O instead of file I/O (e.g., on Windows)
00414   if (fFidIsReallyASocket) {
00415     long fid_long = (long)fFid;
00416     int sock = (int)fid_long;
00417     unsigned totBytesRead = 0;
00418     do {
00419       waitUntilSocketIsReadable(fEnv, sock);
00420       int bytesRead
00421         = recv(sock, &((char*)buf)[totBytesRead], numChars-totBytesRead, 0);
00422       if (bytesRead < 0) return 0;
00423 
00424       totBytesRead += (unsigned)bytesRead;
00425     } while (totBytesRead < numChars);
00426 
00427     return totBytesRead;
00428   } else {
00429     waitUntilSocketIsReadable(fEnv, (int)fileno(fFid));
00430     return fread(buf, 1, numChars, fFid);
00431   }
00432 }

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

Definition at line 69 of file MP3StreamState.hh.

References fCurrentFrame.

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

00069 {return fCurrentFrame;}

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

Definition at line 70 of file MP3StreamState.hh.

References fCurrentFrame.

00070 {return fCurrentFrame;}

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

Definition at line 63 of file MP3StreamState.cpp.

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

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

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

Boolean MP3StreamState::findNextFrame (  )  [private]

Definition at line 225 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().

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


Field Documentation

UsageEnvironment& MP3StreamState::fEnv [private]

Definition at line 77 of file MP3StreamState.hh.

Referenced by readFromStream().

FILE* MP3StreamState::fFid [private]

Definition at line 78 of file MP3StreamState.hh.

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

Boolean MP3StreamState::fFidIsReallyASocket [private]

Definition at line 79 of file MP3StreamState.hh.

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

unsigned MP3StreamState::fFileSize [private]

Definition at line 80 of file MP3StreamState.hh.

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

unsigned MP3StreamState::fNumFramesInFile [private]

Definition at line 81 of file MP3StreamState.hh.

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

unsigned MP3StreamState::fPresentationTimeScale [private]

Definition at line 82 of file MP3StreamState.hh.

Referenced by findNextHeader(), and setPresentationTimeScale().

Boolean MP3StreamState::fIsVBR [private]

Definition at line 84 of file MP3StreamState.hh.

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

Boolean MP3StreamState::fHasXingTOC [private]

Definition at line 84 of file MP3StreamState.hh.

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

u_int8_t MP3StreamState::fXingTOC[XING_TOC_LENGTH] [private]

Definition at line 85 of file MP3StreamState.hh.

Referenced by checkForXingHeader(), and seekWithinFile().

MP3FrameParams MP3StreamState::fCurrentFrame [private]

Definition at line 87 of file MP3StreamState.hh.

Referenced by filePlayTime(), and fr().

struct timeval MP3StreamState::fNextFramePresentationTime [read, private]

Definition at line 88 of file MP3StreamState.hh.

Referenced by assignStream(), and findNextHeader().


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