ReorderingPacketBuffer Class Reference

Collaboration diagram for ReorderingPacketBuffer:

Collaboration graph
[legend]

Public Member Functions

 ReorderingPacketBuffer (BufferedPacketFactory *packetFactory)
virtual ~ReorderingPacketBuffer ()
void reset ()
BufferedPacketgetFreePacket (MultiFramedRTPSource *ourSource)
Boolean storePacket (BufferedPacket *bPacket)
BufferedPacketgetNextCompletedPacket (Boolean &packetLossPreceded)
void releaseUsedPacket (BufferedPacket *packet)
void freePacket (BufferedPacket *packet)
Boolean isEmpty () const
void setThresholdTime (unsigned uSeconds)
void resetHaveSeenFirstPacket ()

Private Attributes

BufferedPacketFactoryfPacketFactory
unsigned fThresholdTime
Boolean fHaveSeenFirstPacket
unsigned short fNextExpectedSeqNo
BufferedPacketfHeadPacket
BufferedPacketfTailPacket
BufferedPacketfSavedPacket
Boolean fSavedPacketFree

Detailed Description

Definition at line 28 of file MultiFramedRTPSource.cpp.


Constructor & Destructor Documentation

ReorderingPacketBuffer::ReorderingPacketBuffer ( BufferedPacketFactory packetFactory  ) 

Definition at line 461 of file MultiFramedRTPSource.cpp.

References NULL.

00462   : fThresholdTime(100000) /* default reordering threshold: 100 ms */,
00463     fHaveSeenFirstPacket(False), fHeadPacket(NULL), fTailPacket(NULL), fSavedPacket(NULL), fSavedPacketFree(True) {
00464   fPacketFactory = (packetFactory == NULL)
00465     ? (new BufferedPacketFactory)
00466     : packetFactory;
00467 }

ReorderingPacketBuffer::~ReorderingPacketBuffer (  )  [virtual]

Definition at line 469 of file MultiFramedRTPSource.cpp.

References fPacketFactory, and reset().

00469                                                 {
00470   reset();
00471   delete fPacketFactory;
00472 }


Member Function Documentation

void ReorderingPacketBuffer::reset (  ) 

Definition at line 474 of file MultiFramedRTPSource.cpp.

References fHeadPacket, fSavedPacket, fSavedPacketFree, fTailPacket, NULL, and resetHaveSeenFirstPacket().

Referenced by MultiFramedRTPSource::doStopGettingFrames(), and ~ReorderingPacketBuffer().

00474                                    {
00475   if (fSavedPacketFree) delete fSavedPacket; // because fSavedPacket is not in the list
00476   delete fHeadPacket; // will also delete fSavedPacket if it's in the list
00477   resetHaveSeenFirstPacket();
00478   fHeadPacket = fTailPacket = fSavedPacket = NULL;
00479 }

BufferedPacket * ReorderingPacketBuffer::getFreePacket ( MultiFramedRTPSource ourSource  ) 

Definition at line 481 of file MultiFramedRTPSource.cpp.

References BufferedPacketFactory::createNewPacket(), False, fPacketFactory, fSavedPacket, fSavedPacketFree, NULL, and True.

Referenced by MultiFramedRTPSource::networkReadHandler1().

00481                                                                                      {
00482   if (fSavedPacket == NULL) { // we're being called for the first time
00483     fSavedPacket = fPacketFactory->createNewPacket(ourSource);
00484     fSavedPacketFree = True;
00485   }
00486 
00487   if (fSavedPacketFree == True) {
00488     fSavedPacketFree = False;
00489     return fSavedPacket;
00490   } else {
00491     return fPacketFactory->createNewPacket(ourSource);
00492   }
00493 }

Boolean ReorderingPacketBuffer::storePacket ( BufferedPacket bPacket  ) 

Definition at line 495 of file MultiFramedRTPSource.cpp.

References False, fHaveSeenFirstPacket, fHeadPacket, fNextExpectedSeqNo, fTailPacket, BufferedPacket::isFirstPacket(), BufferedPacket::nextPacket(), NULL, BufferedPacket::rtpSeqNo(), seqNumLT(), and True.

Referenced by MultiFramedRTPSource::networkReadHandler1().

00495                                                                    {
00496   unsigned short rtpSeqNo = bPacket->rtpSeqNo();
00497 
00498   if (!fHaveSeenFirstPacket) {
00499     fNextExpectedSeqNo = rtpSeqNo; // initialization
00500     bPacket->isFirstPacket() = True;
00501     fHaveSeenFirstPacket = True;
00502   }
00503 
00504   // Ignore this packet if its sequence number is less than the one
00505   // that we're looking for (in this case, it's been excessively delayed).
00506   if (seqNumLT(rtpSeqNo, fNextExpectedSeqNo)) return False;
00507 
00508   if (fTailPacket == NULL) {
00509     // Common case: There are no packets in the queue; this will be the first one:
00510     bPacket->nextPacket() = NULL;
00511     fHeadPacket = fTailPacket = bPacket;
00512     return True;
00513   }
00514 
00515   if (seqNumLT(fTailPacket->rtpSeqNo(), rtpSeqNo)) {
00516     // The next-most common case: There are packets already in the queue; this packet arrived in order => put it at the tail:
00517     bPacket->nextPacket() = NULL;
00518     fTailPacket->nextPacket() = bPacket;
00519     fTailPacket = bPacket;
00520     return True;
00521   } 
00522 
00523   if (rtpSeqNo == fTailPacket->rtpSeqNo()) {
00524     // This is a duplicate packet - ignore it
00525     return False;
00526   }
00527 
00528   // Rare case: This packet is out-of-order.  Run through the list (from the head), to figure out where it belongs:
00529   BufferedPacket* beforePtr = NULL;
00530   BufferedPacket* afterPtr = fHeadPacket;
00531   while (afterPtr != NULL) {
00532     if (seqNumLT(rtpSeqNo, afterPtr->rtpSeqNo())) break; // it comes here
00533     if (rtpSeqNo == afterPtr->rtpSeqNo()) {
00534       // This is a duplicate packet - ignore it
00535       return False;
00536     }
00537 
00538     beforePtr = afterPtr;
00539     afterPtr = afterPtr->nextPacket();
00540   }
00541 
00542   // Link our new packet between "beforePtr" and "afterPtr":
00543   bPacket->nextPacket() = afterPtr;
00544   if (beforePtr == NULL) {
00545     fHeadPacket = bPacket;
00546   } else {
00547     beforePtr->nextPacket() = bPacket;
00548   }
00549 
00550   return True;
00551 }

BufferedPacket * ReorderingPacketBuffer::getNextCompletedPacket ( Boolean packetLossPreceded  ) 

Definition at line 568 of file MultiFramedRTPSource.cpp.

References fHeadPacket, fNextExpectedSeqNo, fThresholdTime, BufferedPacket::isFirstPacket(), NULL, BufferedPacket::rtpSeqNo(), BufferedPacket::timeReceived(), and True.

Referenced by MultiFramedRTPSource::doGetNextFrame1().

00568                                                     {
00569   if (fHeadPacket == NULL) return NULL;
00570 
00571   // Check whether the next packet we want is already at the head
00572   // of the queue:
00573   // ASSERT: fHeadPacket->rtpSeqNo() >= fNextExpectedSeqNo
00574   if (fHeadPacket->rtpSeqNo() == fNextExpectedSeqNo) {
00575     packetLossPreceded = fHeadPacket->isFirstPacket();
00576         // (The very first packet is treated as if there was packet loss beforehand.)
00577     return fHeadPacket;
00578   }
00579 
00580   // We're still waiting for our desired packet to arrive.  However, if
00581   // our time threshold has been exceeded, then forget it, and return
00582   // the head packet instead:
00583   struct timeval timeNow;
00584   gettimeofday(&timeNow, NULL);
00585   unsigned uSecondsSinceReceived
00586     = (timeNow.tv_sec - fHeadPacket->timeReceived().tv_sec)*1000000
00587     + (timeNow.tv_usec - fHeadPacket->timeReceived().tv_usec);
00588   if (uSecondsSinceReceived > fThresholdTime) {
00589     fNextExpectedSeqNo = fHeadPacket->rtpSeqNo();
00590         // we've given up on earlier packets now
00591     packetLossPreceded = True;
00592     return fHeadPacket;
00593   }
00594 
00595   // Otherwise, keep waiting for our desired packet to arrive:
00596   return NULL;
00597 }

void ReorderingPacketBuffer::releaseUsedPacket ( BufferedPacket packet  ) 

Definition at line 553 of file MultiFramedRTPSource.cpp.

References fHeadPacket, fNextExpectedSeqNo, freePacket(), fTailPacket, BufferedPacket::nextPacket(), and NULL.

Referenced by MultiFramedRTPSource::doGetNextFrame1().

00553                                                                      {
00554   // ASSERT: packet == fHeadPacket
00555   // ASSERT: fNextExpectedSeqNo == packet->rtpSeqNo()
00556   ++fNextExpectedSeqNo; // because we're finished with this packet now
00557 
00558   fHeadPacket = fHeadPacket->nextPacket();
00559   if (!fHeadPacket) { 
00560     fTailPacket = NULL;
00561   }
00562   packet->nextPacket() = NULL;
00563 
00564   freePacket(packet);
00565 }

void ReorderingPacketBuffer::freePacket ( BufferedPacket packet  )  [inline]

Definition at line 38 of file MultiFramedRTPSource.cpp.

References fSavedPacket, fSavedPacketFree, and True.

Referenced by MultiFramedRTPSource::networkReadHandler1(), and releaseUsedPacket().

00038                                           {
00039     if (packet != fSavedPacket) {
00040       delete packet;
00041     } else {
00042       fSavedPacketFree = True;
00043     }
00044   }

Boolean ReorderingPacketBuffer::isEmpty (  )  const [inline]

Definition at line 45 of file MultiFramedRTPSource.cpp.

References fHeadPacket, and NULL.

Referenced by MultiFramedRTPSource::doGetNextFrame1().

00045 { return fHeadPacket == NULL; }

void ReorderingPacketBuffer::setThresholdTime ( unsigned  uSeconds  )  [inline]

Definition at line 47 of file MultiFramedRTPSource.cpp.

References fThresholdTime.

Referenced by MultiFramedRTPSource::setPacketReorderingThresholdTime().

00047 { fThresholdTime = uSeconds; }

void ReorderingPacketBuffer::resetHaveSeenFirstPacket (  )  [inline]

Definition at line 48 of file MultiFramedRTPSource.cpp.

References False, and fHaveSeenFirstPacket.

Referenced by MultiFramedRTPSource::networkReadHandler1(), and reset().


Field Documentation

BufferedPacketFactory* ReorderingPacketBuffer::fPacketFactory [private]

Definition at line 51 of file MultiFramedRTPSource.cpp.

Referenced by getFreePacket(), and ~ReorderingPacketBuffer().

unsigned ReorderingPacketBuffer::fThresholdTime [private]

Definition at line 52 of file MultiFramedRTPSource.cpp.

Referenced by getNextCompletedPacket(), and setThresholdTime().

Boolean ReorderingPacketBuffer::fHaveSeenFirstPacket [private]

Definition at line 53 of file MultiFramedRTPSource.cpp.

Referenced by resetHaveSeenFirstPacket(), and storePacket().

unsigned short ReorderingPacketBuffer::fNextExpectedSeqNo [private]

Definition at line 54 of file MultiFramedRTPSource.cpp.

Referenced by getNextCompletedPacket(), releaseUsedPacket(), and storePacket().

BufferedPacket* ReorderingPacketBuffer::fHeadPacket [private]

Definition at line 55 of file MultiFramedRTPSource.cpp.

Referenced by getNextCompletedPacket(), isEmpty(), releaseUsedPacket(), reset(), and storePacket().

BufferedPacket* ReorderingPacketBuffer::fTailPacket [private]

Definition at line 56 of file MultiFramedRTPSource.cpp.

Referenced by releaseUsedPacket(), reset(), and storePacket().

BufferedPacket* ReorderingPacketBuffer::fSavedPacket [private]

Definition at line 57 of file MultiFramedRTPSource.cpp.

Referenced by freePacket(), getFreePacket(), and reset().

Boolean ReorderingPacketBuffer::fSavedPacketFree [private]

Definition at line 59 of file MultiFramedRTPSource.cpp.

Referenced by freePacket(), getFreePacket(), and reset().


The documentation for this class was generated from the following file:
Generated on Thu Feb 2 23:55:47 2012 for live by  doxygen 1.5.2