Example #1
0
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 );
}
Example #2
0
  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;
    }
  }