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 470 of file MultiFramedRTPSource.cpp.

References NULL.

00471   : fThresholdTime(100000) /* default reordering threshold: 100 ms */,
00472     fHaveSeenFirstPacket(False), fHeadPacket(NULL), fTailPacket(NULL), fSavedPacket(NULL), fSavedPacketFree(True) {
00473   fPacketFactory = (packetFactory == NULL)
00474     ? (new BufferedPacketFactory)
00475     : packetFactory;
00476 }

ReorderingPacketBuffer::~ReorderingPacketBuffer (  )  [virtual]

Definition at line 478 of file MultiFramedRTPSource.cpp.

References fPacketFactory, and reset().

00478                                                 {
00479   reset();
00480   delete fPacketFactory;
00481 }


Member Function Documentation

void ReorderingPacketBuffer::reset (  ) 

Definition at line 483 of file MultiFramedRTPSource.cpp.

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

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

00483                                    {
00484   if (fSavedPacketFree) delete fSavedPacket; // because fSavedPacket is not in the list
00485   delete fHeadPacket; // will also delete fSavedPacket if it's in the list
00486   resetHaveSeenFirstPacket();
00487   fHeadPacket = fTailPacket = fSavedPacket = NULL;
00488 }

BufferedPacket * ReorderingPacketBuffer::getFreePacket ( MultiFramedRTPSource ourSource  ) 

Definition at line 490 of file MultiFramedRTPSource.cpp.

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

Referenced by MultiFramedRTPSource::networkReadHandler1().

00490                                                                                      {
00491   if (fSavedPacket == NULL) { // we're being called for the first time
00492     fSavedPacket = fPacketFactory->createNewPacket(ourSource);
00493     fSavedPacketFree = True;
00494   }
00495 
00496   if (fSavedPacketFree == True) {
00497     fSavedPacketFree = False;
00498     return fSavedPacket;
00499   } else {
00500     return fPacketFactory->createNewPacket(ourSource);
00501   }
00502 }

Boolean ReorderingPacketBuffer::storePacket ( BufferedPacket bPacket  ) 

Definition at line 504 of file MultiFramedRTPSource.cpp.

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

Referenced by MultiFramedRTPSource::networkReadHandler1().

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

BufferedPacket * ReorderingPacketBuffer::getNextCompletedPacket ( Boolean packetLossPreceded  ) 

Definition at line 577 of file MultiFramedRTPSource.cpp.

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

Referenced by MultiFramedRTPSource::doGetNextFrame1().

00577                                                     {
00578   if (fHeadPacket == NULL) return NULL;
00579 
00580   // Check whether the next packet we want is already at the head
00581   // of the queue:
00582   // ASSERT: fHeadPacket->rtpSeqNo() >= fNextExpectedSeqNo
00583   if (fHeadPacket->rtpSeqNo() == fNextExpectedSeqNo) {
00584     packetLossPreceded = fHeadPacket->isFirstPacket();
00585         // (The very first packet is treated as if there was packet loss beforehand.)
00586     return fHeadPacket;
00587   }
00588 
00589   // We're still waiting for our desired packet to arrive.  However, if
00590   // our time threshold has been exceeded, then forget it, and return
00591   // the head packet instead:
00592   Boolean timeThresholdHasBeenExceeded;
00593   if (fThresholdTime == 0) {
00594     timeThresholdHasBeenExceeded = True; // optimization
00595   } else {
00596     struct timeval timeNow;
00597     gettimeofday(&timeNow, NULL);
00598     unsigned uSecondsSinceReceived
00599       = (timeNow.tv_sec - fHeadPacket->timeReceived().tv_sec)*1000000
00600       + (timeNow.tv_usec - fHeadPacket->timeReceived().tv_usec);
00601     timeThresholdHasBeenExceeded = uSecondsSinceReceived > fThresholdTime;
00602   }
00603   if (timeThresholdHasBeenExceeded) {
00604     fNextExpectedSeqNo = fHeadPacket->rtpSeqNo();
00605         // we've given up on earlier packets now
00606     packetLossPreceded = True;
00607     return fHeadPacket;
00608   }
00609 
00610   // Otherwise, keep waiting for our desired packet to arrive:
00611   return NULL;
00612 }

void ReorderingPacketBuffer::releaseUsedPacket ( BufferedPacket packet  ) 

Definition at line 562 of file MultiFramedRTPSource.cpp.

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

Referenced by MultiFramedRTPSource::doGetNextFrame1().

00562                                                                      {
00563   // ASSERT: packet == fHeadPacket
00564   // ASSERT: fNextExpectedSeqNo == packet->rtpSeqNo()
00565   ++fNextExpectedSeqNo; // because we're finished with this packet now
00566 
00567   fHeadPacket = fHeadPacket->nextPacket();
00568   if (!fHeadPacket) { 
00569     fTailPacket = NULL;
00570   }
00571   packet->nextPacket() = NULL;
00572 
00573   freePacket(packet);
00574 }

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 Mon Apr 29 13:32:28 2013 for live by  doxygen 1.5.2