public void addSR() { enqueueCommonReportPrefix(RTCPConstants.RTCP_PT_SR, _stream.SSRC(), 5 /* extra words in a SR */); // Now, add the 'sender info' for our sink // Insert the NTP and RTP timestamps for the 'wallclock time': TimeVal timeNow = new TimeVal(); RTPTime.GetTimestamp(ref timeNow); _fOutBuf.WriteWord((uint)(timeNow.tv_sec + 0x83AA7E80)); // NTP timestamp most-significant word (1970 epoch -> 1900 epoch) double fractionalPart = (timeNow.tv_usec / 15625.0) * 0x04000000; // 2^32/10^6 _fOutBuf.WriteWord((uint)(fractionalPart + 0.5)); // NTP timestamp least-significant word uint rtpTimestamp = _stream.ConvertToRTPTimestamp(timeNow); _fOutBuf.WriteWord(rtpTimestamp); // RTP ts // Insert the packet and byte counts: uint packetCount = _stream.PacketCount() - _session.PacketsCount; uint octetCount = _stream.OctetCount() - _session.OctetCount; _fOutBuf.WriteWord(packetCount); _fOutBuf.WriteWord(octetCount); if (_logger.IsDebugEnabled) { _logger.Debug("Sending report : {0}.{1} packet {2} octet {3} Sequence {4}", timeNow.tv_sec + 0x83AA7E80, (uint)(fractionalPart + 0.5), packetCount, octetCount, _stream.CurrentSeqNo()); } }
public RTPTransmissionStat(RTPStream stream, uint ssrc) { _stream = stream; SSRC = ssrc; fLastPacketNumReceived = 0; fPacketLossRatio = 0; fTotNumPacketsLost = 0; fJitter = 0; fLastSRTime = 0; fDiffSR_RRTime = 0; fAtLeastTwoRRsHaveBeenReceived = false; fFirstPacket = true; fTotalOctetCount_hi = 0; fTotalOctetCount_lo = 0; fTotalPacketCount_hi = 0; fTotalPacketCount_lo = 0; fTimeCreated = new TimeVal(); RTPTime.GetTimestamp(ref fTimeCreated); fLastOctetCount = _stream.OctetCount(); fLastPacketCount = _stream.PacketCount(); }
public void noteIncomingRR(IPEndPoint lastFromAddress, uint lossStats, uint lastPacketNumReceived, uint jitter, uint lastSRTime, uint diffSR_RRTime) { if (fFirstPacket) { fFirstPacket = false; fFirstPacketNumReported = lastPacketNumReceived; } else { fAtLeastTwoRRsHaveBeenReceived = true; fOldLastPacketNumReceived = fLastPacketNumReceived; fOldTotNumPacketsLost = fTotNumPacketsLost; } RTPTime.GetTimestamp(ref fTimeReceived); fLastFromAddress = lastFromAddress; fPacketLossRatio = (byte)(lossStats >> 24); fTotNumPacketsLost = lossStats & 0xFFFFFF; fLastPacketNumReceived = lastPacketNumReceived; fJitter = jitter; fLastSRTime = lastSRTime; fDiffSR_RRTime = diffSR_RRTime; if (_logger.IsDebugEnabled) { _logger.Debug("RTCP RR data (received at {0}.{1}): lossStats {2:x8}, TotNumLost {3} lastPacketNumReceived {4}, jitter {5}, lastSRTime {6}, diffSR_RRTime {7} from SSRC {0}", fTimeReceived.tv_sec, fTimeReceived.tv_usec, lossStats, fTotNumPacketsLost, lastPacketNumReceived, jitter, lastSRTime, diffSR_RRTime, SSRC); } if (_logger.IsDebugEnabled) { uint rtd = roundTripDelay(); _logger.Debug("=> round-trip delay: {0:x4} (== {1} seconds)", rtd, rtd / 65536.0); } // Update our counts of the total number of octets and packets sent towards // this receiver: uint newOctetCount = _stream.OctetCount(); uint octetCountDiff = newOctetCount - fLastOctetCount; fLastOctetCount = newOctetCount; uint prevTotalOctetCount_lo = fTotalOctetCount_lo; fTotalOctetCount_lo += octetCountDiff; if (fTotalOctetCount_lo < prevTotalOctetCount_lo) { // wrap around ++fTotalOctetCount_hi; } uint newPacketCount = _stream.PacketCount(); uint packetCountDiff = newPacketCount - fLastPacketCount; fLastPacketCount = newPacketCount; uint prevTotalPacketCount_lo = fTotalPacketCount_lo; fTotalPacketCount_lo += packetCountDiff; if (fTotalPacketCount_lo < prevTotalPacketCount_lo) { // wrap around ++fTotalPacketCount_hi; } }