From 5dfde18c77d96918ec0c18c9496a2253a049a253 Mon Sep 17 00:00:00 2001 From: Steve Anton Date: Tue, 6 Feb 2018 10:34:40 -0800 Subject: [PATCH] Change PeerConnection stats interface to be more flexible This removes the SessionStats object and replaces it with two methods on PeerConnection: GetTransportNamesByMid and GetTransportStatsByNames for use by the stats collectors. These methods are more flexible and can cover cases where there are more than one video/audio channel. Bug: webrtc:8764 Change-Id: Id400cc548fc43675462ff6175a7fa9c9f4fd5948 Reviewed-on: https://webrtc-review.googlesource.com/47244 Commit-Queue: Steve Anton Reviewed-by: Taylor Brandstetter Cr-Commit-Position: refs/heads/master@{#21921} --- pc/peerconnection.cc | 81 +++++++-------- pc/peerconnection.h | 9 +- pc/peerconnectioninternal.h | 39 ++----- pc/rtcstatscollector.cc | 147 +++++++++++++-------------- pc/rtcstatscollector.h | 26 +++-- pc/statscollector.cc | 28 +++-- pc/test/fakepeerconnectionbase.h | 12 ++- pc/test/fakepeerconnectionforstats.h | 41 +++----- pc/test/mock_peerconnection.h | 2 - pc/trackmediainfomap.cc | 1 + pc/trackmediainfomap.h | 3 + pc/trackmediainfomap_unittest.cc | 1 + 12 files changed, 180 insertions(+), 210 deletions(-) diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc index 3205e8f207..87bef82f15 100644 --- a/pc/peerconnection.cc +++ b/pc/peerconnection.cc @@ -4760,39 +4760,48 @@ bool PeerConnection::ReadyToSendData() const { sctp_ready_to_send_data_; } -std::unique_ptr PeerConnection::GetSessionStats_s() { - RTC_DCHECK(signaling_thread()->IsCurrent()); - ChannelNamePairs channel_name_pairs; - if (voice_channel()) { - channel_name_pairs.voice = ChannelNamePair( - voice_channel()->content_name(), voice_channel()->transport_name()); +std::map PeerConnection::GetTransportNamesByMid() + const { + std::map transport_names_by_mid; + for (auto transceiver : transceivers_) { + cricket::BaseChannel* channel = transceiver->internal()->channel(); + if (channel) { + transport_names_by_mid[channel->content_name()] = + channel->transport_name(); + } } - if (video_channel()) { - channel_name_pairs.video = ChannelNamePair( - video_channel()->content_name(), video_channel()->transport_name()); - } - if (rtp_data_channel()) { - channel_name_pairs.data = - ChannelNamePair(rtp_data_channel()->content_name(), - rtp_data_channel()->transport_name()); + if (rtp_data_channel_) { + transport_names_by_mid[rtp_data_channel_->content_name()] = + rtp_data_channel_->transport_name(); } if (sctp_transport_) { - RTC_DCHECK(sctp_content_name_); - RTC_DCHECK(sctp_transport_name_); - channel_name_pairs.data = - ChannelNamePair(*sctp_content_name_, *sctp_transport_name_); + transport_names_by_mid[*sctp_content_name_] = *sctp_transport_name_; } - return GetSessionStats(channel_name_pairs); + return transport_names_by_mid; } -std::unique_ptr PeerConnection::GetSessionStats( - const ChannelNamePairs& channel_name_pairs) { - if (network_thread()->IsCurrent()) { - return GetSessionStats_n(channel_name_pairs); +std::map +PeerConnection::GetTransportStatsByNames( + const std::set& transport_names) { + if (!network_thread()->IsCurrent()) { + return network_thread() + ->Invoke>( + RTC_FROM_HERE, + [&] { return GetTransportStatsByNames(transport_names); }); } - return network_thread()->Invoke>( - RTC_FROM_HERE, - rtc::Bind(&PeerConnection::GetSessionStats_n, this, channel_name_pairs)); + std::map transport_stats_by_name; + for (const std::string& transport_name : transport_names) { + cricket::TransportStats transport_stats; + bool success = + transport_controller_->GetStats(transport_name, &transport_stats); + if (success) { + transport_stats_by_name[transport_name] = std::move(transport_stats); + } else { + RTC_LOG(LS_ERROR) << "Failed to get transport stats for transport_name=" + << transport_name; + } + } + return transport_stats_by_name; } bool PeerConnection::GetLocalCertificate( @@ -5270,26 +5279,6 @@ Call::Stats PeerConnection::GetCallStats() { } } -std::unique_ptr PeerConnection::GetSessionStats_n( - const ChannelNamePairs& channel_name_pairs) { - RTC_DCHECK(network_thread()->IsCurrent()); - std::unique_ptr session_stats(new SessionStats()); - for (const auto channel_name_pair : - {&channel_name_pairs.voice, &channel_name_pairs.video, - &channel_name_pairs.data}) { - if (*channel_name_pair) { - cricket::TransportStats transport_stats; - if (!transport_controller_->GetStats((*channel_name_pair)->transport_name, - &transport_stats)) { - return nullptr; - } - session_stats->transport_stats[(*channel_name_pair)->transport_name] = - std::move(transport_stats); - } - } - return session_stats; -} - bool PeerConnection::CreateSctpTransport_n(const std::string& content_name, const std::string& transport_name) { RTC_DCHECK(network_thread()->IsCurrent()); diff --git a/pc/peerconnection.h b/pc/peerconnection.h index 9523ada0f6..05a11712d4 100644 --- a/pc/peerconnection.h +++ b/pc/peerconnection.h @@ -253,9 +253,9 @@ class PeerConnection : public PeerConnectionInternal, return sctp_transport_name_; } - std::unique_ptr GetSessionStats_s() override; - std::unique_ptr GetSessionStats( - const ChannelNamePairs& channel_name_pairs) override; + std::map GetTransportNamesByMid() const override; + std::map GetTransportStatsByNames( + const std::set& transport_names) override; Call::Stats GetCallStats() override; bool GetLocalCertificate( @@ -812,9 +812,6 @@ class PeerConnection : public PeerConnectionInternal, bool CreateDataChannel(const std::string& mid, const std::string& transport_name); - std::unique_ptr GetSessionStats_n( - const ChannelNamePairs& channel_name_pairs); - bool CreateSctpTransport_n(const std::string& content_name, const std::string& transport_name); // For bundling. diff --git a/pc/peerconnectioninternal.h b/pc/peerconnectioninternal.h index 7f06afed44..18a24b8bf5 100644 --- a/pc/peerconnectioninternal.h +++ b/pc/peerconnectioninternal.h @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -22,27 +23,6 @@ namespace webrtc { -// Statistics for all the transports of the session. -// TODO(pthatcher): Think of a better name for this. We already have -// a TransportStats in transport.h. Perhaps TransportsStats? -struct SessionStats { - std::map transport_stats; -}; - -struct ChannelNamePair { - ChannelNamePair(const std::string& content_name, - const std::string& transport_name) - : content_name(content_name), transport_name(transport_name) {} - std::string content_name; - std::string transport_name; -}; - -struct ChannelNamePairs { - rtc::Optional voice; - rtc::Optional video; - rtc::Optional data; -}; - // Internal interface for extra PeerConnection methods. class PeerConnectionInternal : public PeerConnectionInterface { public: @@ -80,16 +60,13 @@ class PeerConnectionInternal : public PeerConnectionInterface { virtual rtc::Optional sctp_content_name() const = 0; virtual rtc::Optional sctp_transport_name() const = 0; - // Returns stats for all channels of all transports. - // This avoids exposing the internal structures used to track them. - // The parameterless version creates |ChannelNamePairs| from |voice_channel|, - // |video_channel| and |voice_channel| if available - this requires it to be - // called on the signaling thread - and invokes the other |GetStats|. The - // other |GetStats| can be invoked on any thread; if not invoked on the - // network thread a thread hop will happen. - virtual std::unique_ptr GetSessionStats_s() = 0; - virtual std::unique_ptr GetSessionStats( - const ChannelNamePairs& channel_name_pairs) = 0; + // Returns a map from MID to transport name for all active media sections. + virtual std::map GetTransportNamesByMid() const = 0; + + // Returns a map from transport name to transport stats for all given + // transport names. + virtual std::map + GetTransportStatsByNames(const std::set& transport_names) = 0; virtual Call::Stats GetCallStats() = 0; diff --git a/pc/rtcstatscollector.cc b/pc/rtcstatscollector.cc index 2e249e1ea2..77dde9591a 100644 --- a/pc/rtcstatscollector.cc +++ b/pc/rtcstatscollector.cc @@ -699,28 +699,9 @@ void RTCStatsCollector::GetStatsReport( num_pending_partial_reports_ = 2; partial_report_timestamp_us_ = cache_now_us; - // Prepare |channel_name_pairs_| for use in + // Prepare |transport_name_by_mid_| for use in // |ProducePartialResultsOnNetworkThread|. - channel_name_pairs_.reset(new ChannelNamePairs()); - if (pc_->voice_channel()) { - channel_name_pairs_->voice = - ChannelNamePair(pc_->voice_channel()->content_name(), - pc_->voice_channel()->transport_name()); - } - if (pc_->video_channel()) { - channel_name_pairs_->video = - ChannelNamePair(pc_->video_channel()->content_name(), - pc_->video_channel()->transport_name()); - } - if (pc_->rtp_data_channel()) { - channel_name_pairs_->data = - ChannelNamePair(pc_->rtp_data_channel()->content_name(), - pc_->rtp_data_channel()->transport_name()); - } - if (pc_->sctp_content_name()) { - channel_name_pairs_->data = ChannelNamePair(*pc_->sctp_content_name(), - *pc_->sctp_transport_name()); - } + transport_names_by_mid_ = pc_->GetTransportNamesByMid(); // Prepare |track_media_info_map_| for use in // |ProducePartialResultsOnNetworkThread| and // |ProducePartialResultsOnSignalingThread|. @@ -730,6 +711,16 @@ void RTCStatsCollector::GetStatsReport( // implemented to invoke on the signaling thread. track_to_id_ = PrepareTrackToID_s(); + voice_mid_.reset(); + if (pc_->voice_channel()) { + voice_mid_ = pc_->voice_channel()->content_name(); + } + + video_mid_.reset(); + if (pc_->video_channel()) { + video_mid_ = pc_->video_channel()->content_name(); + } + // Prepare |call_stats_| here since GetCallStats() will hop to the worker // thread. // TODO(holmer): To avoid the hop we could move BWE and BWE stats to the @@ -779,24 +770,25 @@ void RTCStatsCollector::ProducePartialResultsOnNetworkThread( rtc::scoped_refptr report = RTCStatsReport::Create( timestamp_us); - std::unique_ptr session_stats = - pc_->GetSessionStats(*channel_name_pairs_); - if (session_stats) { - std::map transport_cert_stats = - PrepareTransportCertificateStats_n(*session_stats); - - ProduceCertificateStats_n( - timestamp_us, transport_cert_stats, report.get()); - ProduceCodecStats_n( - timestamp_us, *track_media_info_map_, report.get()); - ProduceIceCandidateAndPairStats_n(timestamp_us, *session_stats, - track_media_info_map_->video_media_info(), - call_stats_, report.get()); - ProduceRTPStreamStats_n(timestamp_us, *session_stats, *channel_name_pairs_, - *track_media_info_map_, report.get()); - ProduceTransportStats_n( - timestamp_us, *session_stats, transport_cert_stats, report.get()); + std::set transport_names; + for (const auto& entry : transport_names_by_mid_) { + transport_names.insert(entry.second); } + std::map transport_stats_by_name = + pc_->GetTransportStatsByNames(transport_names); + + std::map transport_cert_stats = + PrepareTransportCertificateStats_n(transport_stats_by_name); + + ProduceCertificateStats_n(timestamp_us, transport_cert_stats, report.get()); + ProduceCodecStats_n(timestamp_us, *track_media_info_map_, report.get()); + ProduceIceCandidateAndPairStats_n(timestamp_us, transport_stats_by_name, + track_media_info_map_->video_media_info(), + call_stats_, report.get()); + ProduceRTPStreamStats_n(timestamp_us, transport_names_by_mid_, + *track_media_info_map_, report.get()); + ProduceTransportStats_n(timestamp_us, transport_stats_by_name, + transport_cert_stats, report.get()); AddPartialResults(report); } @@ -826,7 +818,7 @@ void RTCStatsCollector::AddPartialResults_s( cache_timestamp_us_ = partial_report_timestamp_us_; cached_report_ = partial_report_; partial_report_ = nullptr; - channel_name_pairs_.reset(); + transport_names_by_mid_.clear(); track_media_info_map_.reset(); track_to_id_.clear(); // Trace WebRTC Stats when getStats is called on Javascript. @@ -926,15 +918,18 @@ void RTCStatsCollector::ProduceDataChannelStats_s( void RTCStatsCollector::ProduceIceCandidateAndPairStats_n( int64_t timestamp_us, - const SessionStats& session_stats, + const std::map& + transport_stats_by_name, const cricket::VideoMediaInfo* video_media_info, const Call::Stats& call_stats, RTCStatsReport* report) const { RTC_DCHECK(network_thread_->IsCurrent()); - for (const auto& transport_stats : session_stats.transport_stats) { - for (const auto& channel_stats : transport_stats.second.channel_stats) { + for (const auto& entry : transport_stats_by_name) { + const std::string& transport_name = entry.first; + const cricket::TransportStats& transport_stats = entry.second; + for (const auto& channel_stats : transport_stats.channel_stats) { std::string transport_id = RTCTransportStatsIDFromTransportChannel( - transport_stats.second.transport_name, channel_stats.component); + transport_name, channel_stats.component); for (const cricket::ConnectionInfo& info : channel_stats.connection_infos) { std::unique_ptr candidate_pair_stats( @@ -1029,17 +1024,15 @@ void RTCStatsCollector::ProducePeerConnectionStats_s( void RTCStatsCollector::ProduceRTPStreamStats_n( int64_t timestamp_us, - const SessionStats& session_stats, - const ChannelNamePairs& channel_name_pairs, + const std::map& transport_names_by_mid, const TrackMediaInfoMap& track_media_info_map, RTCStatsReport* report) const { RTC_DCHECK(network_thread_->IsCurrent()); // Audio if (track_media_info_map.voice_media_info()) { - RTC_DCHECK(channel_name_pairs.voice); - const std::string& transport_name = - (*channel_name_pairs.voice).transport_name; + RTC_DCHECK(voice_mid_); + const std::string& transport_name = transport_names_by_mid.at(*voice_mid_); std::string transport_id = RTCTransportStatsIDFromTransportChannel( transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP); // Inbound @@ -1094,9 +1087,8 @@ void RTCStatsCollector::ProduceRTPStreamStats_n( } // Video if (track_media_info_map.video_media_info()) { - RTC_DCHECK(channel_name_pairs.video); - const std::string& transport_name = - (*channel_name_pairs.video).transport_name; + RTC_DCHECK(video_mid_); + const std::string& transport_name = transport_names_by_mid.at(*video_mid_); std::string transport_id = RTCTransportStatsIDFromTransportChannel( transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP); // Inbound @@ -1152,26 +1144,32 @@ void RTCStatsCollector::ProduceRTPStreamStats_n( } void RTCStatsCollector::ProduceTransportStats_n( - int64_t timestamp_us, const SessionStats& session_stats, + int64_t timestamp_us, + const std::map& + transport_stats_by_name, const std::map& transport_cert_stats, RTCStatsReport* report) const { RTC_DCHECK(network_thread_->IsCurrent()); - for (const auto& transport : session_stats.transport_stats) { + for (const auto& entry : transport_stats_by_name) { + const std::string& transport_name = entry.first; + const cricket::TransportStats& transport_stats = entry.second; + // Get reference to RTCP channel, if it exists. std::string rtcp_transport_stats_id; - for (const auto& channel_stats : transport.second.channel_stats) { + for (const cricket::TransportChannelStats& channel_stats : + transport_stats.channel_stats) { if (channel_stats.component == cricket::ICE_CANDIDATE_COMPONENT_RTCP) { rtcp_transport_stats_id = RTCTransportStatsIDFromTransportChannel( - transport.second.transport_name, channel_stats.component); + transport_name, channel_stats.component); break; } } // Get reference to local and remote certificates of this transport, if they // exist. - const auto& certificate_stats_it = transport_cert_stats.find( - transport.second.transport_name); + const auto& certificate_stats_it = + transport_cert_stats.find(transport_name); RTC_DCHECK(certificate_stats_it != transport_cert_stats.cend()); std::string local_certificate_id; if (certificate_stats_it->second.local) { @@ -1185,12 +1183,12 @@ void RTCStatsCollector::ProduceTransportStats_n( } // There is one transport stats for each channel. - for (const auto& channel_stats : transport.second.channel_stats) { + for (const cricket::TransportChannelStats& channel_stats : + transport_stats.channel_stats) { std::unique_ptr transport_stats( - new RTCTransportStats( - RTCTransportStatsIDFromTransportChannel( - transport.second.transport_name, channel_stats.component), - timestamp_us)); + new RTCTransportStats(RTCTransportStatsIDFromTransportChannel( + transport_name, channel_stats.component), + timestamp_us)); transport_stats->bytes_sent = 0; transport_stats->bytes_received = 0; transport_stats->dtls_state = DtlsTransportStateToRTCDtlsTransportState( @@ -1219,25 +1217,28 @@ void RTCStatsCollector::ProduceTransportStats_n( std::map RTCStatsCollector::PrepareTransportCertificateStats_n( - const SessionStats& session_stats) const { + const std::map& + transport_stats_by_name) const { RTC_DCHECK(network_thread_->IsCurrent()); std::map transport_cert_stats; - for (const auto& transport_stats : session_stats.transport_stats) { + for (const auto& entry : transport_stats_by_name) { + const std::string& transport_name = entry.first; + CertificateStatsPair certificate_stats_pair; rtc::scoped_refptr local_certificate; - if (pc_->GetLocalCertificate(transport_stats.second.transport_name, - &local_certificate)) { + if (pc_->GetLocalCertificate(transport_name, &local_certificate)) { certificate_stats_pair.local = local_certificate->ssl_certificate().GetStats(); } + std::unique_ptr remote_certificate = - pc_->GetRemoteSSLCertificate(transport_stats.second.transport_name); + pc_->GetRemoteSSLCertificate(transport_name); if (remote_certificate) { certificate_stats_pair.remote = remote_certificate->GetStats(); } + transport_cert_stats.insert( - std::make_pair(transport_stats.second.transport_name, - std::move(certificate_stats_pair))); + std::make_pair(transport_name, std::move(certificate_stats_pair))); } return transport_cert_stats; } @@ -1259,11 +1260,9 @@ RTCStatsCollector::PrepareTrackMediaInfoMap_s() const { video_media_info.reset(); } } - std::unique_ptr track_media_info_map( - new TrackMediaInfoMap(std::move(voice_media_info), - std::move(video_media_info), - pc_->GetSenders(), - pc_->GetReceivers())); + std::unique_ptr track_media_info_map(new TrackMediaInfoMap( + std::move(voice_media_info), std::move(video_media_info), + pc_->GetSenders(), pc_->GetReceivers())); return track_media_info_map; } diff --git a/pc/rtcstatscollector.h b/pc/rtcstatscollector.h index 0549966a93..24a7bb2f0e 100644 --- a/pc/rtcstatscollector.h +++ b/pc/rtcstatscollector.h @@ -96,7 +96,8 @@ class RTCStatsCollector : public virtual rtc::RefCountInterface, // Produces |RTCIceCandidatePairStats| and |RTCIceCandidateStats|. void ProduceIceCandidateAndPairStats_n( int64_t timestamp_us, - const SessionStats& session_stats, + const std::map& + transport_stats_by_name, const cricket::VideoMediaInfo* video_media_info, const Call::Stats& call_stats, RTCStatsReport* report) const; @@ -107,20 +108,24 @@ class RTCStatsCollector : public virtual rtc::RefCountInterface, void ProducePeerConnectionStats_s( int64_t timestamp_us, RTCStatsReport* report) const; // Produces |RTCInboundRTPStreamStats| and |RTCOutboundRTPStreamStats|. - void ProduceRTPStreamStats_n(int64_t timestamp_us, - const SessionStats& session_stats, - const ChannelNamePairs& channel_name_pairs, - const TrackMediaInfoMap& track_media_info_map, - RTCStatsReport* report) const; + void ProduceRTPStreamStats_n( + int64_t timestamp_us, + const std::map& transport_names_by_mid, + const TrackMediaInfoMap& track_media_info_map, + RTCStatsReport* report) const; // Produces |RTCTransportStats|. void ProduceTransportStats_n( - int64_t timestamp_us, const SessionStats& session_stats, + int64_t timestamp_us, + const std::map& + transport_stats_by_name, const std::map& transport_cert_stats, RTCStatsReport* report) const; // Helper function to stats-producing functions. std::map - PrepareTransportCertificateStats_n(const SessionStats& session_stats) const; + PrepareTransportCertificateStats_n( + const std::map& + transport_stats_by_name) const; std::unique_ptr PrepareTrackMediaInfoMap_s() const; std::map PrepareTrackToID_s() const; @@ -145,10 +150,13 @@ class RTCStatsCollector : public virtual rtc::RefCountInterface, // |ProducePartialResultsOnSignalingThread|, reset after work is complete. Not // passed as arguments to avoid copies. This is thread safe - when we // set/reset we know there are no pending stats requests in progress. - std::unique_ptr channel_name_pairs_; + std::map transport_names_by_mid_; std::unique_ptr track_media_info_map_; std::map track_to_id_; + rtc::Optional voice_mid_; + rtc::Optional video_mid_; + Call::Stats call_stats_; // A timestamp, in microseconds, that is based on a timer that is diff --git a/pc/statscollector.cc b/pc/statscollector.cc index 80c988dca4..d81689986d 100644 --- a/pc/statscollector.cc +++ b/pc/statscollector.cc @@ -11,6 +11,7 @@ #include "pc/statscollector.h" #include +#include #include #include @@ -745,36 +746,41 @@ void StatsCollector::ExtractSessionInfo() { report->AddBoolean(StatsReport::kStatsValueNameInitiator, pc_->initial_offerer()); - std::unique_ptr stats = pc_->GetSessionStats_s(); - if (!stats) { - return; + std::set transport_names; + for (const auto& entry : pc_->GetTransportNamesByMid()) { + transport_names.insert(entry.second); } - for (const auto& transport_iter : stats->transport_stats) { + std::map transport_stats_by_name = + pc_->GetTransportStatsByNames(transport_names); + + for (const auto& entry : transport_stats_by_name) { + const std::string& transport_name = entry.first; + const cricket::TransportStats& transport_stats = entry.second; + // Attempt to get a copy of the certificates from the transport and // expose them in stats reports. All channels in a transport share the // same local and remote certificates. // StatsReport::Id local_cert_report_id, remote_cert_report_id; rtc::scoped_refptr certificate; - if (pc_->GetLocalCertificate(transport_iter.second.transport_name, - &certificate)) { + if (pc_->GetLocalCertificate(transport_name, &certificate)) { StatsReport* r = AddCertificateReports(&(certificate->ssl_certificate())); if (r) local_cert_report_id = r->id(); } std::unique_ptr cert = - pc_->GetRemoteSSLCertificate(transport_iter.second.transport_name); + pc_->GetRemoteSSLCertificate(transport_name); if (cert) { StatsReport* r = AddCertificateReports(cert.get()); if (r) remote_cert_report_id = r->id(); } - for (const auto& channel_iter : transport_iter.second.channel_stats) { - StatsReport::Id id(StatsReport::NewComponentId( - transport_iter.second.transport_name, channel_iter.component)); + for (const auto& channel_iter : transport_stats.channel_stats) { + StatsReport::Id id( + StatsReport::NewComponentId(transport_name, channel_iter.component)); StatsReport* channel_report = reports_.ReplaceOrAddNew(id); channel_report->set_timestamp(stats_gathering_started_); channel_report->AddInt(StatsReport::kStatsValueNameComponent, @@ -807,7 +813,7 @@ void StatsCollector::ExtractSessionInfo() { for (const cricket::ConnectionInfo& info : channel_iter.connection_infos) { StatsReport* connection_report = AddConnectionInfoReport( - transport_iter.first, channel_iter.component, connection_id++, + transport_name, channel_iter.component, connection_id++, channel_report->id(), info); if (info.best_connection) { channel_report->AddId( diff --git a/pc/test/fakepeerconnectionbase.h b/pc/test/fakepeerconnectionbase.h index a42b6e3b45..790aa8ff87 100644 --- a/pc/test/fakepeerconnectionbase.h +++ b/pc/test/fakepeerconnectionbase.h @@ -11,7 +11,9 @@ #ifndef PC_TEST_FAKEPEERCONNECTIONBASE_H_ #define PC_TEST_FAKEPEERCONNECTIONBASE_H_ +#include #include +#include #include #include @@ -277,11 +279,13 @@ class FakePeerConnectionBase : public PeerConnectionInternal { return rtc::nullopt; } - std::unique_ptr GetSessionStats_s() override { return nullptr; } + std::map GetTransportNamesByMid() const override { + return {}; + } - std::unique_ptr GetSessionStats( - const ChannelNamePairs& channel_name_pairs) override { - return nullptr; + std::map GetTransportStatsByNames( + const std::set& transport_names) override { + return {}; } Call::Stats GetCallStats() override { return Call::Stats(); } diff --git a/pc/test/fakepeerconnectionforstats.h b/pc/test/fakepeerconnectionforstats.h index bc32e2a7c1..989640a364 100644 --- a/pc/test/fakepeerconnectionforstats.h +++ b/pc/test/fakepeerconnectionforstats.h @@ -245,30 +245,27 @@ class FakePeerConnectionForStats : public FakePeerConnectionBase { return sctp_data_channels_; } - std::unique_ptr GetSessionStats_s() override { - std::set transport_names; + std::map GetTransportNamesByMid() const override { + std::map transport_names_by_mid; if (voice_channel_) { - transport_names.insert(voice_channel_->transport_name()); + transport_names_by_mid[voice_channel_->content_name()] = + voice_channel_->transport_name(); } if (video_channel_) { - transport_names.insert(video_channel_->transport_name()); + transport_names_by_mid[video_channel_->content_name()] = + video_channel_->transport_name(); } - return GetSessionStatsForTransports(transport_names); + return transport_names_by_mid; } - std::unique_ptr GetSessionStats( - const ChannelNamePairs& channel_name_pairs) override { - std::set transport_names; - if (channel_name_pairs.voice) { - transport_names.insert(channel_name_pairs.voice.value().transport_name); + std::map GetTransportStatsByNames( + const std::set& transport_names) override { + std::map transport_stats_by_name; + for (const std::string& transport_name : transport_names) { + transport_stats_by_name[transport_name] = + GetTransportStatsByName(transport_name); } - if (channel_name_pairs.video) { - transport_names.insert(channel_name_pairs.video.value().transport_name); - } - if (channel_name_pairs.data) { - transport_names.insert(channel_name_pairs.data.value().transport_name); - } - return GetSessionStatsForTransports(transport_names); + return transport_stats_by_name; } Call::Stats GetCallStats() override { return call_stats_; } @@ -296,16 +293,6 @@ class FakePeerConnectionForStats : public FakePeerConnectionBase { } private: - std::unique_ptr GetSessionStatsForTransports( - const std::set& transport_names) { - auto stats = rtc::MakeUnique(); - for (const std::string& transport_name : transport_names) { - stats->transport_stats[transport_name] = - GetTransportStatsByName(transport_name); - } - return stats; - } - cricket::TransportStats GetTransportStatsByName( const std::string& transport_name) { auto it = transport_stats_by_name_.find(transport_name); diff --git a/pc/test/mock_peerconnection.h b/pc/test/mock_peerconnection.h index c7a542f788..02a3b9e953 100644 --- a/pc/test/mock_peerconnection.h +++ b/pc/test/mock_peerconnection.h @@ -68,8 +68,6 @@ class MockPeerConnection MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32_t, std::string*)); MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32_t, std::string*)); MOCK_METHOD0(GetCallStats, Call::Stats()); - MOCK_METHOD1(GetSessionStats, - std::unique_ptr(const ChannelNamePairs&)); MOCK_METHOD2(GetLocalCertificate, bool(const std::string& transport_name, rtc::scoped_refptr* certificate)); diff --git a/pc/trackmediainfomap.cc b/pc/trackmediainfomap.cc index 36e4eb3a95..654db15c04 100644 --- a/pc/trackmediainfomap.cc +++ b/pc/trackmediainfomap.cc @@ -10,6 +10,7 @@ #include "pc/trackmediainfomap.h" +#include #include namespace webrtc { diff --git a/pc/trackmediainfomap.h b/pc/trackmediainfomap.h index c427c47998..a0f882d941 100644 --- a/pc/trackmediainfomap.h +++ b/pc/trackmediainfomap.h @@ -13,6 +13,7 @@ #include #include +#include #include #include "api/mediastreaminterface.h" @@ -82,6 +83,8 @@ class TrackMediaInfoMap { const MediaStreamTrackInterface* track) const; private: + rtc::Optional voice_mid_; + rtc::Optional video_mid_; std::unique_ptr voice_media_info_; std::unique_ptr video_media_info_; // These maps map tracks (identified by a pointer) to their corresponding info diff --git a/pc/trackmediainfomap_unittest.cc b/pc/trackmediainfomap_unittest.cc index 583aa89d73..93d6155af0 100644 --- a/pc/trackmediainfomap_unittest.cc +++ b/pc/trackmediainfomap_unittest.cc @@ -12,6 +12,7 @@ #include #include +#include #include #include