
Public Member Functions | |
| ReorderingPacketBuffer (BufferedPacketFactory *packetFactory) | |
| virtual | ~ReorderingPacketBuffer () |
| void | reset () |
| BufferedPacket * | getFreePacket (MultiFramedRTPSource *ourSource) |
| Boolean | storePacket (BufferedPacket *bPacket) |
| BufferedPacket * | getNextCompletedPacket (Boolean &packetLossPreceded) |
| void | releaseUsedPacket (BufferedPacket *packet) |
| void | freePacket (BufferedPacket *packet) |
| Boolean | isEmpty () const |
| void | setThresholdTime (unsigned uSeconds) |
| void | resetHaveSeenFirstPacket () |
Private Attributes | |
| BufferedPacketFactory * | fPacketFactory |
| unsigned | fThresholdTime |
| Boolean | fHaveSeenFirstPacket |
| unsigned short | fNextExpectedSeqNo |
| BufferedPacket * | fHeadPacket |
| BufferedPacket * | fTailPacket |
| BufferedPacket * | fSavedPacket |
| Boolean | fSavedPacketFree |
Definition at line 28 of file MultiFramedRTPSource.cpp.
| 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 }
| 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().
00048 { fHaveSeenFirstPacket = False; }
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().
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().
Definition at line 55 of file MultiFramedRTPSource.cpp.
Referenced by getNextCompletedPacket(), isEmpty(), releaseUsedPacket(), reset(), and storePacket().
Definition at line 56 of file MultiFramedRTPSource.cpp.
Referenced by releaseUsedPacket(), reset(), and storePacket().
Definition at line 57 of file MultiFramedRTPSource.cpp.
Referenced by freePacket(), getFreePacket(), and reset().
Definition at line 59 of file MultiFramedRTPSource.cpp.
Referenced by freePacket(), getFreePacket(), and reset().
1.5.2