OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" |
12 | 12 |
13 #include <assert.h> | 13 #include <assert.h> |
14 #include <string.h> | 14 #include <string.h> |
15 | 15 |
16 #include <algorithm> | |
17 | |
18 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
19 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
20 #include "webrtc/base/trace_event.h" | 18 #include "webrtc/base/trace_event.h" |
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" | 21 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" |
24 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 22 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
25 #include "webrtc/system_wrappers/include/ntp_time.h" | 23 #include "webrtc/system_wrappers/include/ntp_time.h" |
26 | 24 |
27 namespace webrtc { | 25 namespace webrtc { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 _cbTransportFeedbackObserver(transport_feedback_observer), | 57 _cbTransportFeedbackObserver(transport_feedback_observer), |
60 _criticalSectionRTCPReceiver( | 58 _criticalSectionRTCPReceiver( |
61 CriticalSectionWrapper::CreateCriticalSection()), | 59 CriticalSectionWrapper::CreateCriticalSection()), |
62 main_ssrc_(0), | 60 main_ssrc_(0), |
63 _remoteSSRC(0), | 61 _remoteSSRC(0), |
64 _remoteSenderInfo(), | 62 _remoteSenderInfo(), |
65 _lastReceivedSRNTPsecs(0), | 63 _lastReceivedSRNTPsecs(0), |
66 _lastReceivedSRNTPfrac(0), | 64 _lastReceivedSRNTPfrac(0), |
67 _lastReceivedXRNTPsecs(0), | 65 _lastReceivedXRNTPsecs(0), |
68 _lastReceivedXRNTPfrac(0), | 66 _lastReceivedXRNTPfrac(0), |
| 67 xr_rrtr_status_(false), |
69 xr_rr_rtt_ms_(0), | 68 xr_rr_rtt_ms_(0), |
70 _receivedInfoMap(), | 69 _receivedInfoMap(), |
71 _lastReceivedRrMs(0), | 70 _lastReceivedRrMs(0), |
72 _lastIncreasedSequenceNumberMs(0), | 71 _lastIncreasedSequenceNumberMs(0), |
73 stats_callback_(NULL), | 72 stats_callback_(NULL), |
74 packet_type_counter_observer_(packet_type_counter_observer), | 73 packet_type_counter_observer_(packet_type_counter_observer), |
75 num_skipped_packets_(0), | 74 num_skipped_packets_(0), |
76 last_skipped_packets_warning_(clock->TimeInMilliseconds()) { | 75 last_skipped_packets_warning_(clock->TimeInMilliseconds()) { |
77 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); | 76 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); |
78 } | 77 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 } | 183 } |
185 if (minRTT) { | 184 if (minRTT) { |
186 *minRTT = reportBlock->minRTT; | 185 *minRTT = reportBlock->minRTT; |
187 } | 186 } |
188 if (maxRTT) { | 187 if (maxRTT) { |
189 *maxRTT = reportBlock->maxRTT; | 188 *maxRTT = reportBlock->maxRTT; |
190 } | 189 } |
191 return 0; | 190 return 0; |
192 } | 191 } |
193 | 192 |
| 193 void RTCPReceiver::SetRtcpXrRrtrStatus(bool enable) { |
| 194 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); |
| 195 xr_rrtr_status_ = enable; |
| 196 } |
| 197 |
194 bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) { | 198 bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) { |
195 assert(rtt_ms); | 199 assert(rtt_ms); |
196 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 200 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); |
197 if (xr_rr_rtt_ms_ == 0) { | 201 if (xr_rr_rtt_ms_ == 0) { |
198 return false; | 202 return false; |
199 } | 203 } |
200 *rtt_ms = xr_rr_rtt_ms_; | 204 *rtt_ms = xr_rr_rtt_ms_; |
201 xr_rr_rtt_ms_ = 0; | 205 xr_rr_rtt_ms_ = 0; |
202 return true; | 206 return true; |
203 } | 207 } |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 reportBlock->remoteReceiveBlock.extendedHighSeqNum = | 517 reportBlock->remoteReceiveBlock.extendedHighSeqNum = |
514 rb.ExtendedHighestSequenceNumber; | 518 rb.ExtendedHighestSequenceNumber; |
515 reportBlock->remoteReceiveBlock.jitter = rb.Jitter; | 519 reportBlock->remoteReceiveBlock.jitter = rb.Jitter; |
516 reportBlock->remoteReceiveBlock.delaySinceLastSR = rb.DelayLastSR; | 520 reportBlock->remoteReceiveBlock.delaySinceLastSR = rb.DelayLastSR; |
517 reportBlock->remoteReceiveBlock.lastSR = rb.LastSR; | 521 reportBlock->remoteReceiveBlock.lastSR = rb.LastSR; |
518 | 522 |
519 if (rtcpPacket.ReportBlockItem.Jitter > reportBlock->remoteMaxJitter) { | 523 if (rtcpPacket.ReportBlockItem.Jitter > reportBlock->remoteMaxJitter) { |
520 reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter; | 524 reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter; |
521 } | 525 } |
522 | 526 |
| 527 int64_t rtt = 0; |
523 uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR; | 528 uint32_t send_time = rtcpPacket.ReportBlockItem.LastSR; |
524 uint32_t rtt = 0; | 529 // RFC3550, section 6.4.1, LSR field discription states: |
525 | 530 // If no SR has been received yet, the field is set to zero. |
526 if (send_time > 0) { | 531 // Receiver rtp_rtcp module is not expected to calculate rtt using |
| 532 // Sender Reports even if it accidentally can. |
| 533 if (!receiver_only_ && send_time != 0) { |
527 uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR; | 534 uint32_t delay = rtcpPacket.ReportBlockItem.DelayLastSR; |
528 // Local NTP time. | 535 // Local NTP time. |
529 uint32_t receive_time = CompactNtp(NtpTime(*_clock)); | 536 uint32_t receive_time = CompactNtp(NtpTime(*_clock)); |
530 | 537 |
531 // RTT in 1/(2^16) seconds. | 538 // RTT in 1/(2^16) seconds. |
532 uint32_t rtt_ntp = receive_time - delay - send_time; | 539 uint32_t rtt_ntp = receive_time - delay - send_time; |
533 // Convert to 1/1000 seconds (milliseconds). | 540 // Convert to 1/1000 seconds (milliseconds). |
534 uint32_t rtt_ms = CompactNtpIntervalToMs(rtt_ntp); | 541 rtt = CompactNtpRttToMs(rtt_ntp); |
535 rtt = std::max<uint32_t>(rtt_ms, 1); | |
536 if (rtt > reportBlock->maxRTT) { | 542 if (rtt > reportBlock->maxRTT) { |
537 // Store max RTT. | 543 // Store max RTT. |
538 reportBlock->maxRTT = rtt; | 544 reportBlock->maxRTT = rtt; |
539 } | 545 } |
540 if (reportBlock->minRTT == 0) { | 546 if (reportBlock->minRTT == 0) { |
541 // First RTT. | 547 // First RTT. |
542 reportBlock->minRTT = rtt; | 548 reportBlock->minRTT = rtt; |
543 } else if (rtt < reportBlock->minRTT) { | 549 } else if (rtt < reportBlock->minRTT) { |
544 // Store min RTT. | 550 // Store min RTT. |
545 reportBlock->minRTT = rtt; | 551 reportBlock->minRTT = rtt; |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 RTCPPacketInformation& rtcpPacketInformation) | 915 RTCPPacketInformation& rtcpPacketInformation) |
910 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { | 916 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { |
911 if (registered_ssrcs_.find(packet.XRDLRRReportBlockItem.SSRC) == | 917 if (registered_ssrcs_.find(packet.XRDLRRReportBlockItem.SSRC) == |
912 registered_ssrcs_.end()) { | 918 registered_ssrcs_.end()) { |
913 // Not to us. | 919 // Not to us. |
914 return; | 920 return; |
915 } | 921 } |
916 | 922 |
917 rtcpPacketInformation.xr_dlrr_item = true; | 923 rtcpPacketInformation.xr_dlrr_item = true; |
918 | 924 |
| 925 // Caller should explicitly enable rtt calculation using extended reports. |
| 926 if (!xr_rrtr_status_) |
| 927 return; |
| 928 |
919 // The send_time and delay_rr fields are in units of 1/2^16 sec. | 929 // The send_time and delay_rr fields are in units of 1/2^16 sec. |
920 uint32_t send_time = packet.XRDLRRReportBlockItem.LastRR; | 930 uint32_t send_time = packet.XRDLRRReportBlockItem.LastRR; |
921 // RFC3411, section 4.5, LRR field discription states: | 931 // RFC3611, section 4.5, LRR field discription states: |
922 // If no such block has been received, the field is set to zero. | 932 // If no such block has been received, the field is set to zero. |
923 if (send_time == 0) | 933 if (send_time == 0) |
924 return; | 934 return; |
925 | 935 |
926 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; | 936 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; |
927 uint32_t now = CompactNtp(NtpTime(*_clock)); | 937 uint32_t now = CompactNtp(NtpTime(*_clock)); |
928 | 938 |
929 uint32_t rtt_ntp = now - delay_rr - send_time; | 939 uint32_t rtt_ntp = now - delay_rr - send_time; |
930 uint32_t rtt_ms = CompactNtpIntervalToMs(rtt_ntp); | 940 xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp); |
931 xr_rr_rtt_ms_ = std::max<uint32_t>(rtt_ms, 1); | |
932 | 941 |
933 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; | 942 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; |
934 } | 943 } |
935 | 944 |
936 void | 945 void |
937 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, | 946 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, |
938 RTCPPacketInformation& rtcpPacketInformation) | 947 RTCPPacketInformation& rtcpPacketInformation) |
939 { | 948 { |
940 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 949 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
941 | 950 |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1445 return -1; | 1454 return -1; |
1446 } | 1455 } |
1447 num += receiveInfo->TmmbrSet.lengthOfSet(); | 1456 num += receiveInfo->TmmbrSet.lengthOfSet(); |
1448 receiveInfoIt++; | 1457 receiveInfoIt++; |
1449 } | 1458 } |
1450 } | 1459 } |
1451 return num; | 1460 return num; |
1452 } | 1461 } |
1453 | 1462 |
1454 } // namespace webrtc | 1463 } // namespace webrtc |
OLD | NEW |