DeinterleavingFrames Class Reference

Collaboration diagram for DeinterleavingFrames:

Collaboration graph
[legend]

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
DeinterleavingFrameDescriptorfDescriptors

Detailed Description

Definition at line 187 of file MP3ADUinterleaving.cpp.


Constructor & Destructor Documentation

DeinterleavingFrames::DeinterleavingFrames (  ) 

Definition at line 404 of file MP3ADUinterleaving.cpp.

DeinterleavingFrames::~DeinterleavingFrames (  )  [virtual]

Definition at line 409 of file MP3ADUinterleaving.cpp.

References fDescriptors.

00409                                             {
00410   delete[] fDescriptors;
00411 }


Member Function Documentation

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

void DeinterleavingFrames::startNewCycle (  ) 

Definition at line 515 of file MP3ADUinterleaving.cpp.

References fHaveEndedCycle, and True.

Referenced by MP3ADUdeinterleaver::afterGettingFrame().

00515                                          {
00516   fHaveEndedCycle = True;
00517 }


Field Documentation

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


The documentation for this class was generated from the following file:
Generated on Thu May 17 07:15:11 2012 for live by  doxygen 1.5.2