
Public Member Functions | |
| DeinterleavingFrames () | |
| virtual | ~DeinterleavingFrames () |
| Boolean | haveReleaseableFrame () |
| void | getIncomingFrameParams (unsigned char *&dataPtr, unsigned &bytesAvailable) |
| void | getIncomingFrameParamsAfter (unsigned frameSize, struct timeval presentationTime, unsigned durationInMicroseconds, unsigned char &icc, unsigned char &ii) |
| void | getReleasingFrameParams (unsigned char *&dataPtr, unsigned &bytesInUse, struct timeval &presentationTime, unsigned &durationInMicroseconds) |
| void | moveIncomingFrameIntoPlace () |
| void | releaseNext () |
| void | startNewCycle () |
Private Attributes | |
| unsigned | fNextIndexToRelease |
| Boolean | fHaveEndedCycle |
| unsigned | fIIlastSeen |
| unsigned | fMinIndexSeen |
| unsigned | fMaxIndexSeen |
| DeinterleavingFrameDescriptor * | fDescriptors |
Definition at line 187 of file MP3ADUinterleaving.cpp.
| DeinterleavingFrames::DeinterleavingFrames | ( | ) |
Definition at line 404 of file MP3ADUinterleaving.cpp.
00405 : fNextIndexToRelease(0), fHaveEndedCycle(False), 00406 fMinIndexSeen(MAX_CYCLE_SIZE), fMaxIndexSeen(0), 00407 fDescriptors(new DeinterleavingFrameDescriptor[MAX_CYCLE_SIZE+1]) { 00408 }
| DeinterleavingFrames::~DeinterleavingFrames | ( | ) | [virtual] |
Definition at line 409 of file MP3ADUinterleaving.cpp.
References fDescriptors.
00409 { 00410 delete[] fDescriptors; 00411 }
| Boolean DeinterleavingFrames::haveReleaseableFrame | ( | ) |
Definition at line 413 of file MP3ADUinterleaving.cpp.
References False, fDescriptors, fHaveEndedCycle, fMaxIndexSeen, fMinIndexSeen, fNextIndexToRelease, DeinterleavingFrameDescriptor::frameDataSize, MAX_CYCLE_SIZE, moveIncomingFrameIntoPlace(), and True.
Referenced by MP3ADUdeinterleaver::doGetNextFrame().
00413 { 00414 if (!fHaveEndedCycle) { 00415 // Check just the next frame in the sequence 00416 return fDescriptors[fNextIndexToRelease].frameDataSize > 0; 00417 } else { 00418 // We've just ended a cycle, so we can skip over frames that didn't 00419 // get filled in (due to packet loss): 00420 if (fNextIndexToRelease < fMinIndexSeen) { 00421 fNextIndexToRelease = fMinIndexSeen; 00422 } 00423 while (fNextIndexToRelease < fMaxIndexSeen 00424 && fDescriptors[fNextIndexToRelease].frameDataSize == 0) { 00425 ++fNextIndexToRelease; 00426 } 00427 if (fNextIndexToRelease >= fMaxIndexSeen) { 00428 // No more frames are available from the cycle that we just ended, so 00429 // clear out all previously stored frames, then make available 00430 // the last-read frame, and return false for now: 00431 for (unsigned i = fMinIndexSeen; i < fMaxIndexSeen; ++i) { 00432 fDescriptors[i].frameDataSize = 0; 00433 } 00434 00435 fMinIndexSeen = MAX_CYCLE_SIZE; fMaxIndexSeen = 0; 00436 moveIncomingFrameIntoPlace(); 00437 00438 fHaveEndedCycle = False; 00439 fNextIndexToRelease = 0; 00440 return False; 00441 } 00442 00443 return True; 00444 } 00445 }
| void DeinterleavingFrames::getIncomingFrameParams | ( | unsigned char *& | dataPtr, | |
| unsigned & | bytesAvailable | |||
| ) |
Definition at line 447 of file MP3ADUinterleaving.cpp.
References fDescriptors, DeinterleavingFrameDescriptor::frameData, MAX_CYCLE_SIZE, MAX_FRAME_SIZE, and NULL.
Referenced by MP3ADUdeinterleaver::doGetNextFrame().
00448 { 00449 // Use fDescriptors[MAX_CYCLE_SIZE] to store the incoming frame, 00450 // prior to figuring out its real position: 00451 DeinterleavingFrameDescriptor& desc = fDescriptors[MAX_CYCLE_SIZE]; 00452 if (desc.frameData == NULL) { 00453 // There's no buffer yet, so allocate a new one: 00454 desc.frameData = new unsigned char[MAX_FRAME_SIZE]; 00455 } 00456 dataPtr = desc.frameData; 00457 bytesAvailable = MAX_FRAME_SIZE; 00458 }
| void DeinterleavingFrames::getIncomingFrameParamsAfter | ( | unsigned | frameSize, | |
| struct timeval | presentationTime, | |||
| unsigned | durationInMicroseconds, | |||
| unsigned char & | icc, | |||
| unsigned char & | ii | |||
| ) |
Definition at line 461 of file MP3ADUinterleaving.cpp.
References DeinterleavingFrameDescriptor::durationInMicroseconds, fDescriptors, fIIlastSeen, DeinterleavingFrameDescriptor::frameData, DeinterleavingFrameDescriptor::frameDataSize, ADUdescriptor::getRemainingFrameSize(), MAX_CYCLE_SIZE, and DeinterleavingFrameDescriptor::presentationTime.
Referenced by MP3ADUdeinterleaver::afterGettingFrame().
00464 { 00465 DeinterleavingFrameDescriptor& desc = fDescriptors[MAX_CYCLE_SIZE]; 00466 desc.frameDataSize = frameSize; 00467 desc.presentationTime = presentationTime; 00468 desc.durationInMicroseconds = durationInMicroseconds; 00469 00470 // Advance over the ADU descriptor, to get to the MPEG 'syncword': 00471 unsigned char* ptr = desc.frameData; 00472 (void)ADUdescriptor::getRemainingFrameSize(ptr); 00473 00474 // Read the next 11 bits into (ii,icc), and replace them with all-1s: 00475 fIIlastSeen = ii = *ptr; *ptr++ = 0xFF; 00476 icc = (*ptr&0xE0)>>5; *ptr |= 0xE0; 00477 }
| void DeinterleavingFrames::getReleasingFrameParams | ( | unsigned char *& | dataPtr, | |
| unsigned & | bytesInUse, | |||
| struct timeval & | presentationTime, | |||
| unsigned & | durationInMicroseconds | |||
| ) |
Definition at line 479 of file MP3ADUinterleaving.cpp.
References DeinterleavingFrameDescriptor::durationInMicroseconds, fDescriptors, fNextIndexToRelease, DeinterleavingFrameDescriptor::frameData, DeinterleavingFrameDescriptor::frameDataSize, and DeinterleavingFrameDescriptor::presentationTime.
Referenced by MP3ADUdeinterleaver::releaseOutgoingFrame().
00482 { 00483 DeinterleavingFrameDescriptor& desc = fDescriptors[fNextIndexToRelease]; 00484 dataPtr = desc.frameData; 00485 bytesInUse = desc.frameDataSize; 00486 presentationTime = desc.presentationTime; 00487 durationInMicroseconds = desc.durationInMicroseconds; 00488 }
| void DeinterleavingFrames::moveIncomingFrameIntoPlace | ( | ) |
Definition at line 490 of file MP3ADUinterleaving.cpp.
References fDescriptors, fIIlastSeen, fMaxIndexSeen, fMinIndexSeen, DeinterleavingFrameDescriptor::frameData, DeinterleavingFrameDescriptor::frameDataSize, MAX_CYCLE_SIZE, and DeinterleavingFrameDescriptor::presentationTime.
Referenced by MP3ADUdeinterleaver::afterGettingFrame(), and haveReleaseableFrame().
00490 { 00491 DeinterleavingFrameDescriptor& fromDesc = fDescriptors[MAX_CYCLE_SIZE]; 00492 DeinterleavingFrameDescriptor& toDesc = fDescriptors[fIIlastSeen]; 00493 00494 toDesc.frameDataSize = fromDesc.frameDataSize; 00495 toDesc.presentationTime = fromDesc.presentationTime; 00496 00497 // Move the data pointer into place by swapping the data pointers: 00498 unsigned char* tmp = toDesc.frameData; 00499 toDesc.frameData = fromDesc.frameData; 00500 fromDesc.frameData = tmp; 00501 00502 if (fIIlastSeen < fMinIndexSeen) { 00503 fMinIndexSeen = fIIlastSeen; 00504 } 00505 if (fIIlastSeen + 1 > fMaxIndexSeen) { 00506 fMaxIndexSeen = fIIlastSeen + 1; 00507 } 00508 }
| void DeinterleavingFrames::releaseNext | ( | ) |
Definition at line 510 of file MP3ADUinterleaving.cpp.
References fDescriptors, fNextIndexToRelease, DeinterleavingFrameDescriptor::frameDataSize, and MAX_CYCLE_SIZE.
Referenced by MP3ADUdeinterleaver::releaseOutgoingFrame().
00510 { 00511 fDescriptors[fNextIndexToRelease].frameDataSize = 0; 00512 fNextIndexToRelease = (fNextIndexToRelease+1)%MAX_CYCLE_SIZE; 00513 }
| void DeinterleavingFrames::startNewCycle | ( | ) |
Definition at line 515 of file MP3ADUinterleaving.cpp.
References fHaveEndedCycle, and True.
Referenced by MP3ADUdeinterleaver::afterGettingFrame().
00515 { 00516 fHaveEndedCycle = True; 00517 }
unsigned DeinterleavingFrames::fNextIndexToRelease [private] |
Definition at line 208 of file MP3ADUinterleaving.cpp.
Referenced by getReleasingFrameParams(), haveReleaseableFrame(), and releaseNext().
Boolean DeinterleavingFrames::fHaveEndedCycle [private] |
Definition at line 209 of file MP3ADUinterleaving.cpp.
Referenced by haveReleaseableFrame(), and startNewCycle().
unsigned DeinterleavingFrames::fIIlastSeen [private] |
Definition at line 210 of file MP3ADUinterleaving.cpp.
Referenced by getIncomingFrameParamsAfter(), and moveIncomingFrameIntoPlace().
unsigned DeinterleavingFrames::fMinIndexSeen [private] |
Definition at line 211 of file MP3ADUinterleaving.cpp.
Referenced by haveReleaseableFrame(), and moveIncomingFrameIntoPlace().
unsigned DeinterleavingFrames::fMaxIndexSeen [private] |
Definition at line 211 of file MP3ADUinterleaving.cpp.
Referenced by haveReleaseableFrame(), and moveIncomingFrameIntoPlace().
class DeinterleavingFrameDescriptor* DeinterleavingFrames::fDescriptors [private] |
Definition at line 212 of file MP3ADUinterleaving.cpp.
Referenced by getIncomingFrameParams(), getIncomingFrameParamsAfter(), getReleasingFrameParams(), haveReleaseableFrame(), moveIncomingFrameIntoPlace(), releaseNext(), and ~DeinterleavingFrames().
1.5.2