Index: webrtc/api/rtcstatscollector.cc |
diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc |
index f1c7ed7e1acb1ae773753d9586c55a3f07c132e8..cf97057c1b6884595618b3083beeacad5727f93d 100644 |
--- a/webrtc/api/rtcstatscollector.cc |
+++ b/webrtc/api/rtcstatscollector.cc |
@@ -233,8 +233,17 @@ void ProduceCertificateStatsFromSSLCertificateStats( |
RTCCertificateStats* prev_certificate_stats = nullptr; |
for (const rtc::SSLCertificateStats* s = &certificate_stats; s; |
s = s->issuer.get()) { |
+ std::string certificate_stats_id = |
+ RTCCertificateIDFromFingerprint(s->fingerprint); |
+ // It is possible for the same certificate to show up multiple times, e.g. |
+ // if local and remote side use the same certificate in a loopback call. |
+ // If the report already contains stats for this certificate, skip it. |
+ if (report->Get(certificate_stats_id)) { |
+ RTC_DCHECK_EQ(s, &certificate_stats); |
+ break; |
+ } |
RTCCertificateStats* certificate_stats = new RTCCertificateStats( |
- RTCCertificateIDFromFingerprint(s->fingerprint), timestamp_us); |
+ certificate_stats_id, timestamp_us); |
certificate_stats->fingerprint = s->fingerprint; |
certificate_stats->fingerprint_algorithm = s->fingerprint_algorithm; |
certificate_stats->base64_certificate = s->base64_certificate; |
@@ -288,8 +297,9 @@ void ProduceMediaStreamAndTrackStats( |
MediaStreamInterface* stream = streams->at(i); |
std::unique_ptr<RTCMediaStreamStats> stream_stats( |
- new RTCMediaStreamStats("RTCMediaStream_" + stream->label(), |
- timestamp_us)); |
+ new RTCMediaStreamStats( |
+ (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + |
+ stream->label(), timestamp_us)); |
stream_stats->stream_identifier = stream->label(); |
stream_stats->track_ids = std::vector<std::string>(); |
// Audio Tracks |