void MembershipBookkeeping::SyncSourceLink::computeStats() { // See Appendix A.3 // compute cumulative packet lost. setExtendedMaxSeqNum(getMaxSeqNum() + getSeqNumAccum()); uint32 expected = (getExtendedMaxSeqNum() - getBaseSeqNum() + 1); uint32 pc = getObservedPacketCount(); uint32 lost; if ( 0 == pc ) lost = 0; else lost = expected - pc; setCumulativePacketLost(lost); // compute the fraction of packets lost during the last // reporting interval. uint32 expectedDelta = expected - expectedPrior; expectedPrior = expected; uint32 receivedDelta = getObservedPacketCount() - receivedPrior; receivedPrior = getObservedPacketCount(); uint32 lostDelta = expectedDelta - receivedDelta; if ( expectedDelta == 0 || lostDelta <= 0 ) setFractionLost(0); else setFractionLost((lostDelta<<8) / expectedDelta ); }
void Stats::processRtcpPacket(RtcpHeader* chead) { unsigned int ssrc = chead->getSSRC(); ELOG_DEBUG("RTCP SubPacket: PT %d, SSRC %u, block count %d ", chead->packettype, chead->getSSRC(), chead->getBlockCount()); switch (chead->packettype) { case RTCP_SDES_PT: ELOG_DEBUG("SDES"); break; case RTCP_BYE: ELOG_DEBUG("RTCP BYE"); break; case RTCP_Receiver_PT: setFractionLost(chead->getFractionLost(), ssrc); setPacketsLost(chead->getLostPackets(), ssrc); setJitter(chead->getJitter(), ssrc); setSourceSSRC(chead->getSourceSSRC(), ssrc); break; case RTCP_Sender_PT: setRtcpPacketSent(chead->getPacketsSent(), ssrc); setRtcpBytesSent(chead->getOctetsSent(), ssrc); break; case RTCP_RTP_Feedback_PT: ELOG_DEBUG("RTP FB: Usually NACKs: %u", chead->getBlockCount()); ELOG_DEBUG("PID %u BLP %u", chead->getNackPid(), chead->getNackBlp()); accountNACKMessage(ssrc); break; case RTCP_PS_Feedback_PT: ELOG_DEBUG("RTCP PS FB TYPE: %u", chead->getBlockCount() ); switch (chead->getBlockCount()) { case RTCP_PLI_FMT: ELOG_DEBUG("PLI Message"); accountPLIMessage(ssrc); break; case RTCP_SLI_FMT: ELOG_DEBUG("SLI Message"); accountSLIMessage(ssrc); break; case RTCP_FIR_FMT: ELOG_DEBUG("FIR Message"); accountFIRMessage(ssrc); break; case RTCP_AFB: { char *uniqueId = reinterpret_cast<char*>(&chead->report.rembPacket.uniqueid); if (!strncmp(uniqueId, "REMB", 4)) { uint64_t bitrate = chead->getBrMantis() << chead->getBrExp(); // ELOG_DEBUG("REMB Packet numSSRC %u mantissa %u exp %u, tot %lu bps", // chead->getREMBNumSSRC(), chead->getBrMantis(), chead->getBrExp(), bitrate); setBandwidth(bitrate, ssrc); } else { ELOG_DEBUG("Unsupported AFB Packet not REMB") } break; } default: ELOG_WARN("Unsupported RTCP_PS FB TYPE %u", chead->getBlockCount()); break; } break; default: ELOG_DEBUG("Unknown RTCP Packet, %d", chead->packettype); break; } }