#include "pc/rtc_stats_collector.h"
#include <stdint.h>
#include <stdio.h>
#include <cstdint>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
#include "absl/functional/bind_front.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "api/audio/audio_device.h"
#include "api/audio/audio_processing_statistics.h"
#include "api/candidate.h"
#include "api/dtls_transport_interface.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/rtp_parameters.h"
#include "api/sequence_checker.h"
#include "api/stats/rtc_stats.h"
#include "api/stats/rtcstats_objects.h"
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video_codecs/scalability_mode.h"
#include "common_video/include/quality_limitation_reason.h"
#include "media/base/media_channel.h"
#include "media/base/media_channel_impl.h"
#include "modules/rtp_rtcp/include/report_block_data.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "p2p/base/connection_info.h"
#include "p2p/base/ice_transport_internal.h"
#include "p2p/base/p2p_constants.h"
#include "p2p/base/port.h"
#include "pc/channel_interface.h"
#include "pc/data_channel_utils.h"
#include "pc/rtc_stats_traversal.h"
#include "pc/rtp_receiver_proxy.h"
#include "pc/rtp_sender_proxy.h"
#include "pc/webrtc_sdp.h"
#include "rtc_base/checks.h"
#include "rtc_base/ip_address.h"
#include "rtc_base/logging.h"
#include "rtc_base/network_constants.h"
#include "rtc_base/rtc_certificate.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/ssl_stream_adapter.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h"
namespace webrtc {
namespace {
const char kDirectionInbound = …;
const char kDirectionOutbound = …;
static constexpr char kAudioPlayoutSingletonId[] = …;
std::string RTCCertificateIDFromFingerprint(const std::string& fingerprint) { … }
std::string RTCCodecStatsIDFromTransportAndCodecParameters(
const char direction,
const std::string& transport_id,
const RtpCodecParameters& codec_params) { … }
std::string RTCIceCandidatePairStatsIDFromConnectionInfo(
const cricket::ConnectionInfo& info) { … }
std::string RTCTransportStatsIDFromTransportChannel(
const std::string& transport_name,
int channel_component) { … }
std::string RTCInboundRtpStreamStatsIDFromSSRC(const std::string& transport_id,
cricket::MediaType media_type,
uint32_t ssrc) { … }
std::string RTCOutboundRtpStreamStatsIDFromSSRC(const std::string& transport_id,
cricket::MediaType media_type,
uint32_t ssrc) { … }
std::string RTCRemoteInboundRtpStreamStatsIdFromSourceSsrc(
cricket::MediaType media_type,
uint32_t source_ssrc) { … }
std::string RTCRemoteOutboundRTPStreamStatsIDFromSSRC(
cricket::MediaType media_type,
uint32_t source_ssrc) { … }
std::string RTCMediaSourceStatsIDFromKindAndAttachment(
cricket::MediaType media_type,
int attachment_id) { … }
const char* DataStateToRTCDataChannelState(
DataChannelInterface::DataState state) { … }
const char* IceCandidatePairStateToRTCStatsIceCandidatePairState(
cricket::IceCandidatePairState state) { … }
const char* IceRoleToRTCIceRole(cricket::IceRole role) { … }
const char* DtlsTransportStateToRTCDtlsTransportState(
DtlsTransportState state) { … }
const char* IceTransportStateToRTCIceTransportState(IceTransportState state) { … }
const char* NetworkTypeToStatsType(rtc::AdapterType type) { … }
absl::string_view NetworkTypeToStatsNetworkAdapterType(rtc::AdapterType type) { … }
const char* QualityLimitationReasonToRTCQualityLimitationReason(
QualityLimitationReason reason) { … }
std::map<std::string, double>
QualityLimitationDurationToRTCQualityLimitationDuration(
std::map<QualityLimitationReason, int64_t> durations_ms) { … }
double DoubleAudioLevelFromIntAudioLevel(int audio_level) { … }
std::string GetCodecIdAndMaybeCreateCodecStats(
Timestamp timestamp,
const char direction,
const std::string& transport_id,
const RtpCodecParameters& codec_params,
RTCStatsReport* report) { … }
void SetInboundRTPStreamStatsFromMediaReceiverInfo(
const cricket::MediaReceiverInfo& media_receiver_info,
RTCInboundRtpStreamStats* inbound_stats) { … }
std::unique_ptr<RTCInboundRtpStreamStats> CreateInboundAudioStreamStats(
const cricket::VoiceMediaInfo& voice_media_info,
const cricket::VoiceReceiverInfo& voice_receiver_info,
const std::string& transport_id,
const std::string& mid,
Timestamp timestamp,
RTCStatsReport* report) { … }
std::unique_ptr<RTCAudioPlayoutStats> CreateAudioPlayoutStats(
const AudioDeviceModule::Stats& audio_device_stats,
Timestamp timestamp) { … }
std::unique_ptr<RTCRemoteOutboundRtpStreamStats>
CreateRemoteOutboundMediaStreamStats(
const cricket::MediaReceiverInfo& media_receiver_info,
const std::string& mid,
cricket::MediaType media_type,
const RTCInboundRtpStreamStats& inbound_audio_stats,
const std::string& transport_id) { … }
std::unique_ptr<RTCInboundRtpStreamStats>
CreateInboundRTPStreamStatsFromVideoReceiverInfo(
const std::string& transport_id,
const std::string& mid,
const cricket::VideoMediaInfo& video_media_info,
const cricket::VideoReceiverInfo& video_receiver_info,
Timestamp timestamp,
RTCStatsReport* report) { … }
void SetOutboundRTPStreamStatsFromMediaSenderInfo(
const cricket::MediaSenderInfo& media_sender_info,
RTCOutboundRtpStreamStats* outbound_stats) { … }
std::unique_ptr<RTCOutboundRtpStreamStats>
CreateOutboundRTPStreamStatsFromVoiceSenderInfo(
const std::string& transport_id,
const std::string& mid,
const cricket::VoiceMediaInfo& voice_media_info,
const cricket::VoiceSenderInfo& voice_sender_info,
Timestamp timestamp,
RTCStatsReport* report) { … }
std::unique_ptr<RTCOutboundRtpStreamStats>
CreateOutboundRTPStreamStatsFromVideoSenderInfo(
const std::string& transport_id,
const std::string& mid,
const cricket::VideoMediaInfo& video_media_info,
const cricket::VideoSenderInfo& video_sender_info,
Timestamp timestamp,
RTCStatsReport* report) { … }
std::unique_ptr<RTCRemoteInboundRtpStreamStats>
ProduceRemoteInboundRtpStreamStatsFromReportBlockData(
const std::string& transport_id,
const ReportBlockData& report_block,
cricket::MediaType media_type,
const std::map<std::string, RTCOutboundRtpStreamStats*>& outbound_rtps,
const RTCStatsReport& report) { … }
void ProduceCertificateStatsFromSSLCertificateStats(
Timestamp timestamp,
const rtc::SSLCertificateStats& certificate_stats,
RTCStatsReport* report) { … }
const std::string& ProduceIceCandidateStats(Timestamp timestamp,
const cricket::Candidate& candidate,
bool is_local,
const std::string& transport_id,
RTCStatsReport* report) { … }
template <typename StatsType>
void SetAudioProcessingStats(StatsType* stats,
const AudioProcessingStats& apm_stats) { … }
}
rtc::scoped_refptr<RTCStatsReport>
RTCStatsCollector::CreateReportFilteredBySelector(
bool filter_by_sender_selector,
rtc::scoped_refptr<const RTCStatsReport> report,
rtc::scoped_refptr<RtpSenderInternal> sender_selector,
rtc::scoped_refptr<RtpReceiverInternal> receiver_selector) { … }
RTCStatsCollector::CertificateStatsPair
RTCStatsCollector::CertificateStatsPair::Copy() const { … }
RTCStatsCollector::RequestInfo::RequestInfo(
rtc::scoped_refptr<RTCStatsCollectorCallback> callback)
: … { … }
RTCStatsCollector::RequestInfo::RequestInfo(
rtc::scoped_refptr<RtpSenderInternal> selector,
rtc::scoped_refptr<RTCStatsCollectorCallback> callback)
: … { … }
RTCStatsCollector::RequestInfo::RequestInfo(
rtc::scoped_refptr<RtpReceiverInternal> selector,
rtc::scoped_refptr<RTCStatsCollectorCallback> callback)
: … { … }
RTCStatsCollector::RequestInfo::RequestInfo(
RTCStatsCollector::RequestInfo::FilterMode filter_mode,
rtc::scoped_refptr<RTCStatsCollectorCallback> callback,
rtc::scoped_refptr<RtpSenderInternal> sender_selector,
rtc::scoped_refptr<RtpReceiverInternal> receiver_selector)
: … { … }
rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
PeerConnectionInternal* pc,
int64_t cache_lifetime_us) { … }
RTCStatsCollector::RTCStatsCollector(PeerConnectionInternal* pc,
int64_t cache_lifetime_us)
: … { … }
RTCStatsCollector::~RTCStatsCollector() { … }
void RTCStatsCollector::GetStatsReport(
rtc::scoped_refptr<RTCStatsCollectorCallback> callback) { … }
void RTCStatsCollector::GetStatsReport(
rtc::scoped_refptr<RtpSenderInternal> selector,
rtc::scoped_refptr<RTCStatsCollectorCallback> callback) { … }
void RTCStatsCollector::GetStatsReport(
rtc::scoped_refptr<RtpReceiverInternal> selector,
rtc::scoped_refptr<RTCStatsCollectorCallback> callback) { … }
void RTCStatsCollector::GetStatsReportInternal(
RTCStatsCollector::RequestInfo request) { … }
void RTCStatsCollector::ClearCachedStatsReport() { … }
void RTCStatsCollector::WaitForPendingRequest() { … }
void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
Timestamp timestamp) { … }
void RTCStatsCollector::ProducePartialResultsOnSignalingThreadImpl(
Timestamp timestamp,
RTCStatsReport* partial_report) { … }
void RTCStatsCollector::ProducePartialResultsOnNetworkThread(
Timestamp timestamp,
absl::optional<std::string> sctp_transport_name) { … }
void RTCStatsCollector::ProducePartialResultsOnNetworkThreadImpl(
Timestamp timestamp,
const std::map<std::string, cricket::TransportStats>&
transport_stats_by_name,
const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
RTCStatsReport* partial_report) { … }
void RTCStatsCollector::MergeNetworkReport_s() { … }
void RTCStatsCollector::DeliverCachedReport(
rtc::scoped_refptr<const RTCStatsReport> cached_report,
std::vector<RTCStatsCollector::RequestInfo> requests) { … }
void RTCStatsCollector::ProduceCertificateStats_n(
Timestamp timestamp,
const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceDataChannelStats_n(
Timestamp timestamp,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceIceCandidateAndPairStats_n(
Timestamp timestamp,
const std::map<std::string, cricket::TransportStats>&
transport_stats_by_name,
const Call::Stats& call_stats,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceMediaSourceStats_s(
Timestamp timestamp,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProducePeerConnectionStats_s(
Timestamp timestamp,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceAudioPlayoutStats_s(
Timestamp timestamp,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceRTPStreamStats_n(
Timestamp timestamp,
const std::vector<RtpTransceiverStatsInfo>& transceiver_stats_infos,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceAudioRTPStreamStats_n(
Timestamp timestamp,
const RtpTransceiverStatsInfo& stats,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceVideoRTPStreamStats_n(
Timestamp timestamp,
const RtpTransceiverStatsInfo& stats,
RTCStatsReport* report) const { … }
void RTCStatsCollector::ProduceTransportStats_n(
Timestamp timestamp,
const std::map<std::string, cricket::TransportStats>&
transport_stats_by_name,
const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
RTCStatsReport* report) const { … }
std::map<std::string, RTCStatsCollector::CertificateStatsPair>
RTCStatsCollector::PrepareTransportCertificateStats_n(
const std::map<std::string, cricket::TransportStats>&
transport_stats_by_name) { … }
void RTCStatsCollector::PrepareTransceiverStatsInfosAndCallStats_s_w_n() { … }
void RTCStatsCollector::OnSctpDataChannelStateChanged(
int channel_id,
DataChannelInterface::DataState state) { … }
}