Index: webrtc/api/rtcstatscollector.cc |
diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc |
index 5f60ea13cecadb7defc5169701e06a2d7308dc26..5d7804e893b4b35446811d557424cc807bc8e47f 100644 |
--- a/webrtc/api/rtcstatscollector.cc |
+++ b/webrtc/api/rtcstatscollector.cc |
@@ -36,6 +36,23 @@ const char* CandidateTypeToRTCIceCandidateType(const std::string& type) { |
return nullptr; |
} |
+const char* DataStateToRTCDataChannelState( |
+ DataChannelInterface::DataState state) { |
+ switch (state) { |
+ case DataChannelInterface::kConnecting: |
+ return RTCDataChannelState::kConnecting; |
+ case DataChannelInterface::kOpen: |
+ return RTCDataChannelState::kOpen; |
+ case DataChannelInterface::kClosing: |
+ return RTCDataChannelState::kClosing; |
+ case DataChannelInterface::kClosed: |
+ return RTCDataChannelState::kClosed; |
+ default: |
+ RTC_NOTREACHED(); |
+ return nullptr; |
+ } |
+} |
+ |
rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( |
PeerConnection* pc, int64_t cache_lifetime_us) { |
return rtc::scoped_refptr<RTCStatsCollector>( |
@@ -111,6 +128,7 @@ void RTCStatsCollector::ProducePartialResultsOnSignalingThread( |
ProduceIceCandidateAndPairStats_s(timestamp_us, session_stats, |
report.get()); |
} |
+ ProduceDataChannelStats_s(timestamp_us, report.get()); |
ProducePeerConnectionStats_s(timestamp_us, report.get()); |
AddPartialResults(report); |
@@ -218,6 +236,29 @@ void RTCStatsCollector::ProduceCertificateStatsFromSSLCertificateAndChain_s( |
} |
} |
+void RTCStatsCollector::ProduceDataChannelStats_s( |
+ int64_t timestamp_us, RTCStatsReport* report) const { |
+ RTC_DCHECK(signaling_thread_->IsCurrent()); |
+ const std::vector<rtc::scoped_refptr<DataChannel>>& data_channels = |
+ pc_->sctp_data_channels(); |
+ for (const rtc::scoped_refptr<DataChannel>& data_channel : data_channels) { |
+ std::unique_ptr<RTCDataChannelStats> data_channel_stats( |
+ new RTCDataChannelStats( |
+ "RTCDataChannel_" + rtc::ToString<>(data_channel->id()), |
+ timestamp_us)); |
+ data_channel_stats->label = data_channel->label(); |
+ data_channel_stats->protocol = data_channel->protocol(); |
+ data_channel_stats->datachannelid = data_channel->id(); |
+ data_channel_stats->state = |
+ DataStateToRTCDataChannelState(data_channel->state()); |
+ data_channel_stats->messages_sent = data_channel->messages_sent(); |
+ data_channel_stats->bytes_sent = data_channel->bytes_sent(); |
+ data_channel_stats->messages_received = data_channel->messages_received(); |
+ data_channel_stats->bytes_received = data_channel->bytes_received(); |
+ report->AddStats(std::move(data_channel_stats)); |
+ } |
+} |
+ |
void RTCStatsCollector::ProduceIceCandidateAndPairStats_s( |
int64_t timestamp_us, const SessionStats& session_stats, |
RTCStatsReport* report) const { |