| Index: webrtc/api/rtcstatscollector.cc
|
| diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc
|
| index 084eab177cc7e557df3c69579a9807463e481e2a..8b32e849ad637820421f63a042771be73da80b40 100644
|
| --- a/webrtc/api/rtcstatscollector.cc
|
| +++ b/webrtc/api/rtcstatscollector.cc
|
| @@ -18,9 +18,24 @@
|
| #include "webrtc/api/webrtcsession.h"
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/base/sslidentity.h"
|
| +#include "webrtc/p2p/base/candidate.h"
|
| +#include "webrtc/p2p/base/port.h"
|
|
|
| namespace webrtc {
|
|
|
| +const char* CandidateTypeToRTCIceCandidateType(const std::string& type) {
|
| + if (type == cricket::LOCAL_PORT_TYPE)
|
| + return RTCIceCandidateType::kHost;
|
| + if (type == cricket::STUN_PORT_TYPE)
|
| + return RTCIceCandidateType::kSrflx;
|
| + if (type == cricket::PRFLX_PORT_TYPE)
|
| + return RTCIceCandidateType::kPrflx;
|
| + if (type == cricket::RELAY_PORT_TYPE)
|
| + return RTCIceCandidateType::kRelay;
|
| + RTC_NOTREACHED();
|
| + return nullptr;
|
| +}
|
| +
|
| rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
|
| PeerConnection* pc, int64_t cache_lifetime_us) {
|
| return rtc::scoped_refptr<RTCStatsCollector>(
|
| @@ -93,6 +108,8 @@ void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
|
| SessionStats session_stats;
|
| if (pc_->session()->GetTransportStats(&session_stats)) {
|
| ProduceCertificateStats_s(timestamp_us, session_stats, report.get());
|
| + ProduceIceCandidateAndPairStats_s(timestamp_us, session_stats,
|
| + report.get());
|
| }
|
| ProducePeerConnectionStats_s(timestamp_us, report.get());
|
|
|
| @@ -201,6 +218,56 @@ void RTCStatsCollector::ProduceCertificateStatsFromSSLCertificateAndChain_s(
|
| }
|
| }
|
|
|
| +void RTCStatsCollector::ProduceIceCandidateAndPairStats_s(
|
| + int64_t timestamp_us, const SessionStats& session_stats,
|
| + RTCStatsReport* report) const {
|
| + RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + for (const auto& transport : session_stats.transport_stats) {
|
| + for (const auto& channel : transport.second.channel_stats) {
|
| + for (const cricket::ConnectionInfo& info : channel.connection_infos) {
|
| + // TODO(hbos): Produce |RTCIceCandidatePairStats| referencing the
|
| + // resulting |RTCIceCandidateStats| pair. crbug.com/633550
|
| + ProduceIceCandidateStats_s(
|
| + timestamp_us, info.local_candidate, true, report);
|
| + ProduceIceCandidateStats_s(
|
| + timestamp_us, info.remote_candidate, false, report);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +const std::string& RTCStatsCollector::ProduceIceCandidateStats_s(
|
| + int64_t timestamp_us, const cricket::Candidate& candidate, bool is_local,
|
| + RTCStatsReport* report) const {
|
| + RTC_DCHECK(signaling_thread_->IsCurrent());
|
| + std::string id = is_local ? "RTCLocalIceCandidate_" + candidate.id()
|
| + : "RTCRemoteIceCandidate_" + candidate.id();
|
| + const RTCStats* stats = report->Get(id);
|
| + if (!stats) {
|
| + std::unique_ptr<RTCIceCandidateStats> candidate_stats;
|
| + if (is_local) {
|
| + candidate_stats.reset(
|
| + new RTCLocalIceCandidateStats(std::move(id), timestamp_us));
|
| + } else {
|
| + candidate_stats.reset(
|
| + new RTCRemoteIceCandidateStats(std::move(id), timestamp_us));
|
| + }
|
| + candidate_stats->ip = candidate.address().ipaddr().ToString();
|
| + candidate_stats->port = static_cast<int32_t>(candidate.address().port());
|
| + candidate_stats->protocol = candidate.protocol();
|
| + candidate_stats->candidate_type = CandidateTypeToRTCIceCandidateType(
|
| + candidate.type());
|
| + candidate_stats->priority = static_cast<int32_t>(candidate.priority());
|
| + // TODO(hbos): Define candidate_stats->url. crbug.com/632723
|
| +
|
| + stats = candidate_stats.get();
|
| + report->AddStats(std::move(candidate_stats));
|
| + }
|
| + RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType
|
| + : RTCRemoteIceCandidateStats::kType);
|
| + return stats->id();
|
| +}
|
| +
|
| void RTCStatsCollector::ProducePeerConnectionStats_s(
|
| int64_t timestamp_us, RTCStatsReport* report) const {
|
| RTC_DCHECK(signaling_thread_->IsCurrent());
|
|
|