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