OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2016 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/api/rtcstatscollector.h" | 11 #include "webrtc/api/rtcstatscollector.h" |
12 | 12 |
13 #include <memory> | 13 #include <memory> |
14 #include <utility> | 14 #include <utility> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "webrtc/api/peerconnection.h" | 17 #include "webrtc/api/peerconnection.h" |
18 #include "webrtc/api/webrtcsession.h" | 18 #include "webrtc/api/webrtcsession.h" |
19 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" |
20 #include "webrtc/base/sslidentity.h" | 20 #include "webrtc/base/sslidentity.h" |
21 #include "webrtc/p2p/base/candidate.h" | 21 #include "webrtc/p2p/base/candidate.h" |
22 #include "webrtc/p2p/base/port.h" | 22 #include "webrtc/p2p/base/port.h" |
23 | 23 |
24 namespace webrtc { | 24 namespace webrtc { |
25 | 25 |
| 26 namespace { |
| 27 |
26 const char* CandidateTypeToRTCIceCandidateType(const std::string& type) { | 28 const char* CandidateTypeToRTCIceCandidateType(const std::string& type) { |
27 if (type == cricket::LOCAL_PORT_TYPE) | 29 if (type == cricket::LOCAL_PORT_TYPE) |
28 return RTCIceCandidateType::kHost; | 30 return RTCIceCandidateType::kHost; |
29 if (type == cricket::STUN_PORT_TYPE) | 31 if (type == cricket::STUN_PORT_TYPE) |
30 return RTCIceCandidateType::kSrflx; | 32 return RTCIceCandidateType::kSrflx; |
31 if (type == cricket::PRFLX_PORT_TYPE) | 33 if (type == cricket::PRFLX_PORT_TYPE) |
32 return RTCIceCandidateType::kPrflx; | 34 return RTCIceCandidateType::kPrflx; |
33 if (type == cricket::RELAY_PORT_TYPE) | 35 if (type == cricket::RELAY_PORT_TYPE) |
34 return RTCIceCandidateType::kRelay; | 36 return RTCIceCandidateType::kRelay; |
35 RTC_NOTREACHED(); | 37 RTC_NOTREACHED(); |
36 return nullptr; | 38 return nullptr; |
37 } | 39 } |
38 | 40 |
| 41 const char* DataStateToRTCDataChannelState( |
| 42 DataChannelInterface::DataState state) { |
| 43 switch (state) { |
| 44 case DataChannelInterface::kConnecting: |
| 45 return RTCDataChannelState::kConnecting; |
| 46 case DataChannelInterface::kOpen: |
| 47 return RTCDataChannelState::kOpen; |
| 48 case DataChannelInterface::kClosing: |
| 49 return RTCDataChannelState::kClosing; |
| 50 case DataChannelInterface::kClosed: |
| 51 return RTCDataChannelState::kClosed; |
| 52 default: |
| 53 RTC_NOTREACHED(); |
| 54 return nullptr; |
| 55 } |
| 56 } |
| 57 |
| 58 } // namespace |
| 59 |
39 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( | 60 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( |
40 PeerConnection* pc, int64_t cache_lifetime_us) { | 61 PeerConnection* pc, int64_t cache_lifetime_us) { |
41 return rtc::scoped_refptr<RTCStatsCollector>( | 62 return rtc::scoped_refptr<RTCStatsCollector>( |
42 new rtc::RefCountedObject<RTCStatsCollector>(pc, cache_lifetime_us)); | 63 new rtc::RefCountedObject<RTCStatsCollector>(pc, cache_lifetime_us)); |
43 } | 64 } |
44 | 65 |
45 RTCStatsCollector::RTCStatsCollector(PeerConnection* pc, | 66 RTCStatsCollector::RTCStatsCollector(PeerConnection* pc, |
46 int64_t cache_lifetime_us) | 67 int64_t cache_lifetime_us) |
47 : pc_(pc), | 68 : pc_(pc), |
48 signaling_thread_(pc->session()->signaling_thread()), | 69 signaling_thread_(pc->session()->signaling_thread()), |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 int64_t timestamp_us) { | 125 int64_t timestamp_us) { |
105 RTC_DCHECK(signaling_thread_->IsCurrent()); | 126 RTC_DCHECK(signaling_thread_->IsCurrent()); |
106 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); | 127 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); |
107 | 128 |
108 SessionStats session_stats; | 129 SessionStats session_stats; |
109 if (pc_->session()->GetTransportStats(&session_stats)) { | 130 if (pc_->session()->GetTransportStats(&session_stats)) { |
110 ProduceCertificateStats_s(timestamp_us, session_stats, report.get()); | 131 ProduceCertificateStats_s(timestamp_us, session_stats, report.get()); |
111 ProduceIceCandidateAndPairStats_s(timestamp_us, session_stats, | 132 ProduceIceCandidateAndPairStats_s(timestamp_us, session_stats, |
112 report.get()); | 133 report.get()); |
113 } | 134 } |
| 135 ProduceDataChannelStats_s(timestamp_us, report.get()); |
114 ProducePeerConnectionStats_s(timestamp_us, report.get()); | 136 ProducePeerConnectionStats_s(timestamp_us, report.get()); |
115 | 137 |
116 AddPartialResults(report); | 138 AddPartialResults(report); |
117 } | 139 } |
118 | 140 |
119 void RTCStatsCollector::ProducePartialResultsOnWorkerThread( | 141 void RTCStatsCollector::ProducePartialResultsOnWorkerThread( |
120 int64_t timestamp_us) { | 142 int64_t timestamp_us) { |
121 RTC_DCHECK(worker_thread_->IsCurrent()); | 143 RTC_DCHECK(worker_thread_->IsCurrent()); |
122 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); | 144 rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(); |
123 | 145 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 stats->fingerprint = s->fingerprint; | 233 stats->fingerprint = s->fingerprint; |
212 stats->fingerprint_algorithm = s->fingerprint_algorithm; | 234 stats->fingerprint_algorithm = s->fingerprint_algorithm; |
213 stats->base64_certificate = s->base64_certificate; | 235 stats->base64_certificate = s->base64_certificate; |
214 if (prev_stats) | 236 if (prev_stats) |
215 prev_stats->issuer_certificate_id = stats->id(); | 237 prev_stats->issuer_certificate_id = stats->id(); |
216 report->AddStats(std::unique_ptr<RTCCertificateStats>(stats)); | 238 report->AddStats(std::unique_ptr<RTCCertificateStats>(stats)); |
217 prev_stats = stats; | 239 prev_stats = stats; |
218 } | 240 } |
219 } | 241 } |
220 | 242 |
| 243 void RTCStatsCollector::ProduceDataChannelStats_s( |
| 244 int64_t timestamp_us, RTCStatsReport* report) const { |
| 245 RTC_DCHECK(signaling_thread_->IsCurrent()); |
| 246 for (const rtc::scoped_refptr<DataChannel>& data_channel : |
| 247 pc_->sctp_data_channels()) { |
| 248 std::unique_ptr<RTCDataChannelStats> data_channel_stats( |
| 249 new RTCDataChannelStats( |
| 250 "RTCDataChannel_" + rtc::ToString<>(data_channel->id()), |
| 251 timestamp_us)); |
| 252 data_channel_stats->label = data_channel->label(); |
| 253 data_channel_stats->protocol = data_channel->protocol(); |
| 254 data_channel_stats->datachannelid = data_channel->id(); |
| 255 data_channel_stats->state = |
| 256 DataStateToRTCDataChannelState(data_channel->state()); |
| 257 data_channel_stats->messages_sent = data_channel->messages_sent(); |
| 258 data_channel_stats->bytes_sent = data_channel->bytes_sent(); |
| 259 data_channel_stats->messages_received = data_channel->messages_received(); |
| 260 data_channel_stats->bytes_received = data_channel->bytes_received(); |
| 261 report->AddStats(std::move(data_channel_stats)); |
| 262 } |
| 263 } |
| 264 |
221 void RTCStatsCollector::ProduceIceCandidateAndPairStats_s( | 265 void RTCStatsCollector::ProduceIceCandidateAndPairStats_s( |
222 int64_t timestamp_us, const SessionStats& session_stats, | 266 int64_t timestamp_us, const SessionStats& session_stats, |
223 RTCStatsReport* report) const { | 267 RTCStatsReport* report) const { |
224 RTC_DCHECK(signaling_thread_->IsCurrent()); | 268 RTC_DCHECK(signaling_thread_->IsCurrent()); |
225 for (const auto& transport_stats : session_stats.transport_stats) { | 269 for (const auto& transport_stats : session_stats.transport_stats) { |
226 for (const auto& channel_stats : transport_stats.second.channel_stats) { | 270 for (const auto& channel_stats : transport_stats.second.channel_stats) { |
227 for (const cricket::ConnectionInfo& info : | 271 for (const cricket::ConnectionInfo& info : |
228 channel_stats.connection_infos) { | 272 channel_stats.connection_infos) { |
229 const std::string& id = "RTCIceCandidatePair_" + | 273 const std::string& id = "RTCIceCandidatePair_" + |
230 info.local_candidate.id() + "_" + info.remote_candidate.id(); | 274 info.local_candidate.id() + "_" + info.remote_candidate.id(); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 // There is always just one |RTCPeerConnectionStats| so its |id| can be a | 374 // There is always just one |RTCPeerConnectionStats| so its |id| can be a |
331 // constant. | 375 // constant. |
332 std::unique_ptr<RTCPeerConnectionStats> stats( | 376 std::unique_ptr<RTCPeerConnectionStats> stats( |
333 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); | 377 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); |
334 stats->data_channels_opened = data_channels_opened; | 378 stats->data_channels_opened = data_channels_opened; |
335 stats->data_channels_closed = static_cast<uint32_t>(data_channels.size()) - | 379 stats->data_channels_closed = static_cast<uint32_t>(data_channels.size()) - |
336 data_channels_opened; | 380 data_channels_opened; |
337 report->AddStats(std::move(stats)); | 381 report->AddStats(std::move(stats)); |
338 } | 382 } |
339 | 383 |
| 384 const char* CandidateTypeToRTCIceCandidateTypeForTesting( |
| 385 const std::string& type) { |
| 386 return CandidateTypeToRTCIceCandidateType(type); |
| 387 } |
| 388 |
| 389 const char* DataStateToRTCDataChannelStateForTesting( |
| 390 DataChannelInterface::DataState state) { |
| 391 return DataStateToRTCDataChannelState(state); |
| 392 } |
| 393 |
340 } // namespace webrtc | 394 } // namespace webrtc |
OLD | NEW |