#include <MP3StreamState.hh>
Collaboration diagram for MP3StreamState:

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 | |
| MP3FrameParams & | fr () |
| MP3FrameParams const & | fr () const |
| timeval | currentFramePlayTime () const |
| Boolean | findNextFrame () |
Private Attributes | |
| UsageEnvironment & | fEnv |
| 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 |
Definition at line 41 of file MP3StreamState.hh.
| 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 }
| 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().
00061 { fPresentationTimeScale = scale; }
| 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 }
UsageEnvironment& MP3StreamState::fEnv [private] |
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] |
struct timeval MP3StreamState::fNextFramePresentationTime [read, private] |
Definition at line 90 of file MP3StreamState.hh.
Referenced by assignStream(), and findNextHeader().
1.5.2