|  | /* | 
|  | *  Copyright 2016 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "api/stats/rtcstats_objects.h" | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | #include "api/stats/attribute.h" | 
|  | #include "api/stats/rtc_stats.h" | 
|  | #include "api/units/timestamp.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate", | 
|  | AttributeInit("fingerprint", &fingerprint), | 
|  | AttributeInit("fingerprintAlgorithm", &fingerprint_algorithm), | 
|  | AttributeInit("base64Certificate", &base64_certificate), | 
|  | AttributeInit("issuerCertificateId", &issuer_certificate_id)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCCertificateStats::RTCCertificateStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCCertificateStats::~RTCCertificateStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCCodecStats, RTCStats, "codec", | 
|  | AttributeInit("transportId", &transport_id), | 
|  | AttributeInit("payloadType", &payload_type), | 
|  | AttributeInit("mimeType", &mime_type), | 
|  | AttributeInit("clockRate", &clock_rate), | 
|  | AttributeInit("channels", &channels), | 
|  | AttributeInit("sdpFmtpLine", &sdp_fmtp_line)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCCodecStats::RTCCodecStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCCodecStats::~RTCCodecStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCDataChannelStats, RTCStats, "data-channel", | 
|  | AttributeInit("label", &label), | 
|  | AttributeInit("protocol", &protocol), | 
|  | AttributeInit("dataChannelIdentifier", &data_channel_identifier), | 
|  | AttributeInit("state", &state), | 
|  | AttributeInit("messagesSent", &messages_sent), | 
|  | AttributeInit("bytesSent", &bytes_sent), | 
|  | AttributeInit("messagesReceived", &messages_received), | 
|  | AttributeInit("bytesReceived", &bytes_received)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCDataChannelStats::RTCDataChannelStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCDataChannelStats::~RTCDataChannelStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCIceCandidatePairStats, RTCStats, "candidate-pair", | 
|  | AttributeInit("transportId", &transport_id), | 
|  | AttributeInit("localCandidateId", &local_candidate_id), | 
|  | AttributeInit("remoteCandidateId", &remote_candidate_id), | 
|  | AttributeInit("state", &state), | 
|  | AttributeInit("priority", &priority), | 
|  | AttributeInit("nominated", &nominated), | 
|  | AttributeInit("writable", &writable), | 
|  | AttributeInit("packetsSent", &packets_sent), | 
|  | AttributeInit("packetsReceived", &packets_received), | 
|  | AttributeInit("bytesSent", &bytes_sent), | 
|  | AttributeInit("bytesReceived", &bytes_received), | 
|  | AttributeInit("totalRoundTripTime", &total_round_trip_time), | 
|  | AttributeInit("currentRoundTripTime", ¤t_round_trip_time), | 
|  | AttributeInit("availableOutgoingBitrate", &available_outgoing_bitrate), | 
|  | AttributeInit("availableIncomingBitrate", &available_incoming_bitrate), | 
|  | AttributeInit("requestsReceived", &requests_received), | 
|  | AttributeInit("requestsSent", &requests_sent), | 
|  | AttributeInit("responsesReceived", &responses_received), | 
|  | AttributeInit("responsesSent", &responses_sent), | 
|  | AttributeInit("consentRequestsSent", &consent_requests_sent), | 
|  | AttributeInit("packetsDiscardedOnSend", &packets_discarded_on_send), | 
|  | AttributeInit("bytesDiscardedOnSend", &bytes_discarded_on_send), | 
|  | AttributeInit("lastPacketReceivedTimestamp", | 
|  | &last_packet_received_timestamp), | 
|  | AttributeInit("lastPacketSentTimestamp", &last_packet_sent_timestamp)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCIceCandidatePairStats::RTCIceCandidatePairStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCIceCandidatePairStats::~RTCIceCandidatePairStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCIceCandidateStats, RTCStats, "abstract-ice-candidate", | 
|  | AttributeInit("transportId", &transport_id), | 
|  | AttributeInit("isRemote", &is_remote), | 
|  | AttributeInit("networkType", &network_type), | 
|  | AttributeInit("ip", &ip), | 
|  | AttributeInit("address", &address), | 
|  | AttributeInit("port", &port), | 
|  | AttributeInit("protocol", &protocol), | 
|  | AttributeInit("relayProtocol", &relay_protocol), | 
|  | AttributeInit("candidateType", &candidate_type), | 
|  | AttributeInit("priority", &priority), | 
|  | AttributeInit("url", &url), | 
|  | AttributeInit("foundation", &foundation), | 
|  | AttributeInit("relatedAddress", &related_address), | 
|  | AttributeInit("relatedPort", &related_port), | 
|  | AttributeInit("usernameFragment", &username_fragment), | 
|  | AttributeInit("tcpType", &tcp_type), | 
|  | AttributeInit("vpn", &vpn), | 
|  | AttributeInit("networkAdapterType", &network_adapter_type)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCIceCandidateStats::RTCIceCandidateStats(std::string id, | 
|  | Timestamp timestamp, | 
|  | bool is_remote) | 
|  | : RTCStats(std::move(id), timestamp), is_remote(is_remote) {} | 
|  |  | 
|  | RTCIceCandidateStats::~RTCIceCandidateStats() {} | 
|  |  | 
|  | const char RTCLocalIceCandidateStats::kType[] = "local-candidate"; | 
|  |  | 
|  | RTCLocalIceCandidateStats::RTCLocalIceCandidateStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCIceCandidateStats(std::move(id), timestamp, false) {} | 
|  |  | 
|  | std::unique_ptr<RTCStats> RTCLocalIceCandidateStats::copy() const { | 
|  | return std::make_unique<RTCLocalIceCandidateStats>(*this); | 
|  | } | 
|  |  | 
|  | const char* RTCLocalIceCandidateStats::type() const { | 
|  | return kType; | 
|  | } | 
|  |  | 
|  | const char RTCRemoteIceCandidateStats::kType[] = "remote-candidate"; | 
|  |  | 
|  | RTCRemoteIceCandidateStats::RTCRemoteIceCandidateStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCIceCandidateStats(std::move(id), timestamp, true) {} | 
|  |  | 
|  | std::unique_ptr<RTCStats> RTCRemoteIceCandidateStats::copy() const { | 
|  | return std::make_unique<RTCRemoteIceCandidateStats>(*this); | 
|  | } | 
|  |  | 
|  | const char* RTCRemoteIceCandidateStats::type() const { | 
|  | return kType; | 
|  | } | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCPeerConnectionStats, RTCStats, "peer-connection", | 
|  | AttributeInit("dataChannelsOpened", &data_channels_opened), | 
|  | AttributeInit("dataChannelsClosed", &data_channels_closed)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCPeerConnectionStats::RTCPeerConnectionStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCPeerConnectionStats::~RTCPeerConnectionStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCRtpStreamStats, RTCStats, "rtp", | 
|  | AttributeInit("ssrc", &ssrc), | 
|  | AttributeInit("kind", &kind), | 
|  | AttributeInit("transportId", &transport_id), | 
|  | AttributeInit("codecId", &codec_id)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCRtpStreamStats::RTCRtpStreamStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCRtpStreamStats::~RTCRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL( | 
|  | RTCReceivedRtpStreamStats, RTCRtpStreamStats, "received-rtp", | 
|  | AttributeInit("jitter", &jitter), | 
|  | AttributeInit("packetsLost", &packets_lost)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCReceivedRtpStreamStats::RTCReceivedRtpStreamStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCReceivedRtpStreamStats::~RTCReceivedRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCSentRtpStreamStats, RTCRtpStreamStats, "sent-rtp", | 
|  | AttributeInit("packetsSent", &packets_sent), | 
|  | AttributeInit("bytesSent", &bytes_sent)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCSentRtpStreamStats::RTCSentRtpStreamStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCSentRtpStreamStats::~RTCSentRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL( | 
|  | RTCInboundRtpStreamStats, RTCReceivedRtpStreamStats, "inbound-rtp", | 
|  | AttributeInit("playoutId", &playout_id), | 
|  | AttributeInit("trackIdentifier", &track_identifier), | 
|  | AttributeInit("mid", &mid), | 
|  | AttributeInit("remoteId", &remote_id), | 
|  | AttributeInit("packetsReceived", &packets_received), | 
|  | AttributeInit("packetsDiscarded", &packets_discarded), | 
|  | AttributeInit("fecPacketsReceived", &fec_packets_received), | 
|  | AttributeInit("fecBytesReceived", &fec_bytes_received), | 
|  | AttributeInit("fecPacketsDiscarded", &fec_packets_discarded), | 
|  | AttributeInit("fecSsrc", &fec_ssrc), | 
|  | AttributeInit("bytesReceived", &bytes_received), | 
|  | AttributeInit("headerBytesReceived", &header_bytes_received), | 
|  | AttributeInit("retransmittedPacketsReceived", | 
|  | &retransmitted_packets_received), | 
|  | AttributeInit("retransmittedBytesReceived", &retransmitted_bytes_received), | 
|  | AttributeInit("rtxSsrc", &rtx_ssrc), | 
|  | AttributeInit("lastPacketReceivedTimestamp", | 
|  | &last_packet_received_timestamp), | 
|  | AttributeInit("jitterBufferDelay", &jitter_buffer_delay), | 
|  | AttributeInit("jitterBufferTargetDelay", &jitter_buffer_target_delay), | 
|  | AttributeInit("jitterBufferMinimumDelay", &jitter_buffer_minimum_delay), | 
|  | AttributeInit("jitterBufferEmittedCount", &jitter_buffer_emitted_count), | 
|  | AttributeInit("totalSamplesReceived", &total_samples_received), | 
|  | AttributeInit("concealedSamples", &concealed_samples), | 
|  | AttributeInit("silentConcealedSamples", &silent_concealed_samples), | 
|  | AttributeInit("concealmentEvents", &concealment_events), | 
|  | AttributeInit("insertedSamplesForDeceleration", | 
|  | &inserted_samples_for_deceleration), | 
|  | AttributeInit("removedSamplesForAcceleration", | 
|  | &removed_samples_for_acceleration), | 
|  | AttributeInit("audioLevel", &audio_level), | 
|  | AttributeInit("totalAudioEnergy", &total_audio_energy), | 
|  | AttributeInit("totalSamplesDuration", &total_samples_duration), | 
|  | AttributeInit("framesReceived", &frames_received), | 
|  | AttributeInit("frameWidth", &frame_width), | 
|  | AttributeInit("frameHeight", &frame_height), | 
|  | AttributeInit("framesPerSecond", &frames_per_second), | 
|  | AttributeInit("framesDecoded", &frames_decoded), | 
|  | AttributeInit("keyFramesDecoded", &key_frames_decoded), | 
|  | AttributeInit("framesDropped", &frames_dropped), | 
|  | AttributeInit("totalDecodeTime", &total_decode_time), | 
|  | AttributeInit("totalProcessingDelay", &total_processing_delay), | 
|  | AttributeInit("totalAssemblyTime", &total_assembly_time), | 
|  | AttributeInit("framesAssembledFromMultiplePackets", | 
|  | &frames_assembled_from_multiple_packets), | 
|  | AttributeInit("totalInterFrameDelay", &total_inter_frame_delay), | 
|  | AttributeInit("totalSquaredInterFrameDelay", | 
|  | &total_squared_inter_frame_delay), | 
|  | AttributeInit("pauseCount", &pause_count), | 
|  | AttributeInit("totalPausesDuration", &total_pauses_duration), | 
|  | AttributeInit("freezeCount", &freeze_count), | 
|  | AttributeInit("totalFreezesDuration", &total_freezes_duration), | 
|  | AttributeInit("contentType", &content_type), | 
|  | AttributeInit("estimatedPlayoutTimestamp", &estimated_playout_timestamp), | 
|  | AttributeInit("decoderImplementation", &decoder_implementation), | 
|  | AttributeInit("firCount", &fir_count), | 
|  | AttributeInit("pliCount", &pli_count), | 
|  | AttributeInit("nackCount", &nack_count), | 
|  | AttributeInit("qpSum", &qp_sum), | 
|  | AttributeInit("totalCorruptionProbability", &total_corruption_probability), | 
|  | AttributeInit("totalSquaredCorruptionProbability", | 
|  | &total_squared_corruption_probability), | 
|  | AttributeInit("corruptionMeasurements", &corruption_measurements), | 
|  | AttributeInit("googTimingFrameInfo", &goog_timing_frame_info), | 
|  | AttributeInit("powerEfficientDecoder", &power_efficient_decoder), | 
|  | AttributeInit("jitterBufferFlushes", &jitter_buffer_flushes), | 
|  | AttributeInit("delayedPacketOutageSamples", &delayed_packet_outage_samples), | 
|  | AttributeInit("relativePacketArrivalDelay", &relative_packet_arrival_delay), | 
|  | AttributeInit("interruptionCount", &interruption_count), | 
|  | AttributeInit("totalInterruptionDuration", &total_interruption_duration), | 
|  | AttributeInit("minPlayoutDelay", &min_playout_delay)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCInboundRtpStreamStats::RTCInboundRtpStreamStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCReceivedRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCInboundRtpStreamStats::~RTCInboundRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL( | 
|  | RTCOutboundRtpStreamStats, RTCSentRtpStreamStats, "outbound-rtp", | 
|  | AttributeInit("mediaSourceId", &media_source_id), | 
|  | AttributeInit("remoteId", &remote_id), | 
|  | AttributeInit("mid", &mid), | 
|  | AttributeInit("rid", &rid), | 
|  | AttributeInit("encodingIndex", &encoding_index), | 
|  | AttributeInit("retransmittedPacketsSent", &retransmitted_packets_sent), | 
|  | AttributeInit("headerBytesSent", &header_bytes_sent), | 
|  | AttributeInit("retransmittedBytesSent", &retransmitted_bytes_sent), | 
|  | AttributeInit("targetBitrate", &target_bitrate), | 
|  | AttributeInit("framesEncoded", &frames_encoded), | 
|  | AttributeInit("keyFramesEncoded", &key_frames_encoded), | 
|  | AttributeInit("totalEncodeTime", &total_encode_time), | 
|  | AttributeInit("totalEncodedBytesTarget", &total_encoded_bytes_target), | 
|  | AttributeInit("frameWidth", &frame_width), | 
|  | AttributeInit("frameHeight", &frame_height), | 
|  | AttributeInit("framesPerSecond", &frames_per_second), | 
|  | AttributeInit("framesSent", &frames_sent), | 
|  | AttributeInit("hugeFramesSent", &huge_frames_sent), | 
|  | AttributeInit("totalPacketSendDelay", &total_packet_send_delay), | 
|  | AttributeInit("qualityLimitationReason", &quality_limitation_reason), | 
|  | AttributeInit("qualityLimitationDurations", &quality_limitation_durations), | 
|  | AttributeInit("qualityLimitationResolutionChanges", | 
|  | &quality_limitation_resolution_changes), | 
|  | AttributeInit("contentType", &content_type), | 
|  | AttributeInit("encoderImplementation", &encoder_implementation), | 
|  | AttributeInit("firCount", &fir_count), | 
|  | AttributeInit("pliCount", &pli_count), | 
|  | AttributeInit("nackCount", &nack_count), | 
|  | AttributeInit("qpSum", &qp_sum), | 
|  | AttributeInit("active", &active), | 
|  | AttributeInit("powerEfficientEncoder", &power_efficient_encoder), | 
|  | AttributeInit("scalabilityMode", &scalability_mode), | 
|  | AttributeInit("rtxSsrc", &rtx_ssrc)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCOutboundRtpStreamStats::RTCOutboundRtpStreamStats(std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCSentRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCOutboundRtpStreamStats::~RTCOutboundRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL( | 
|  | RTCRemoteInboundRtpStreamStats, RTCReceivedRtpStreamStats, | 
|  | "remote-inbound-rtp", | 
|  | AttributeInit("localId", &local_id), | 
|  | AttributeInit("roundTripTime", &round_trip_time), | 
|  | AttributeInit("fractionLost", &fraction_lost), | 
|  | AttributeInit("totalRoundTripTime", &total_round_trip_time), | 
|  | AttributeInit("roundTripTimeMeasurements", &round_trip_time_measurements)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCRemoteInboundRtpStreamStats::RTCRemoteInboundRtpStreamStats( | 
|  | std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCReceivedRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCRemoteInboundRtpStreamStats::~RTCRemoteInboundRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL( | 
|  | RTCRemoteOutboundRtpStreamStats, RTCSentRtpStreamStats, | 
|  | "remote-outbound-rtp", | 
|  | AttributeInit("localId", &local_id), | 
|  | AttributeInit("remoteTimestamp", &remote_timestamp), | 
|  | AttributeInit("reportsSent", &reports_sent), | 
|  | AttributeInit("roundTripTime", &round_trip_time), | 
|  | AttributeInit("roundTripTimeMeasurements", &round_trip_time_measurements), | 
|  | AttributeInit("totalRoundTripTime", &total_round_trip_time)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCRemoteOutboundRtpStreamStats::RTCRemoteOutboundRtpStreamStats( | 
|  | std::string id, | 
|  | Timestamp timestamp) | 
|  | : RTCSentRtpStreamStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCRemoteOutboundRtpStreamStats::~RTCRemoteOutboundRtpStreamStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCMediaSourceStats, RTCStats, "parent-media-source", | 
|  | AttributeInit("trackIdentifier", &track_identifier), | 
|  | AttributeInit("kind", &kind)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCMediaSourceStats::RTCMediaSourceStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCMediaSourceStats::~RTCMediaSourceStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCAudioSourceStats, RTCMediaSourceStats, "media-source", | 
|  | AttributeInit("audioLevel", &audio_level), | 
|  | AttributeInit("totalAudioEnergy", &total_audio_energy), | 
|  | AttributeInit("totalSamplesDuration", &total_samples_duration), | 
|  | AttributeInit("echoReturnLoss", &echo_return_loss), | 
|  | AttributeInit("echoReturnLossEnhancement", &echo_return_loss_enhancement)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCAudioSourceStats::RTCAudioSourceStats(std::string id, Timestamp timestamp) | 
|  | : RTCMediaSourceStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCAudioSourceStats::~RTCAudioSourceStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCVideoSourceStats, RTCMediaSourceStats, "media-source", | 
|  | AttributeInit("width", &width), | 
|  | AttributeInit("height", &height), | 
|  | AttributeInit("frames", &frames), | 
|  | AttributeInit("framesPerSecond", &frames_per_second)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCVideoSourceStats::RTCVideoSourceStats(std::string id, Timestamp timestamp) | 
|  | : RTCMediaSourceStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCVideoSourceStats::~RTCVideoSourceStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCTransportStats, RTCStats, "transport", | 
|  | AttributeInit("bytesSent", &bytes_sent), | 
|  | AttributeInit("packetsSent", &packets_sent), | 
|  | AttributeInit("bytesReceived", &bytes_received), | 
|  | AttributeInit("packetsReceived", &packets_received), | 
|  | AttributeInit("rtcpTransportStatsId", &rtcp_transport_stats_id), | 
|  | AttributeInit("dtlsState", &dtls_state), | 
|  | AttributeInit("selectedCandidatePairId", &selected_candidate_pair_id), | 
|  | AttributeInit("localCertificateId", &local_certificate_id), | 
|  | AttributeInit("remoteCertificateId", &remote_certificate_id), | 
|  | AttributeInit("tlsVersion", &tls_version), | 
|  | AttributeInit("dtlsCipher", &dtls_cipher), | 
|  | AttributeInit("dtlsRole", &dtls_role), | 
|  | AttributeInit("srtpCipher", &srtp_cipher), | 
|  | AttributeInit("selectedCandidatePairChanges", | 
|  | &selected_candidate_pair_changes), | 
|  | AttributeInit("iceRole", &ice_role), | 
|  | AttributeInit("iceLocalUsernameFragment", &ice_local_username_fragment), | 
|  | AttributeInit("iceState", &ice_state)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCTransportStats::RTCTransportStats(std::string id, Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp) {} | 
|  |  | 
|  | RTCTransportStats::~RTCTransportStats() {} | 
|  |  | 
|  | // clang-format off | 
|  | WEBRTC_RTCSTATS_IMPL(RTCAudioPlayoutStats, RTCStats, "media-playout", | 
|  | AttributeInit("kind", &kind), | 
|  | AttributeInit("synthesizedSamplesDuration", &synthesized_samples_duration), | 
|  | AttributeInit("synthesizedSamplesEvents", &synthesized_samples_events), | 
|  | AttributeInit("totalSamplesDuration", &total_samples_duration), | 
|  | AttributeInit("totalPlayoutDelay", &total_playout_delay), | 
|  | AttributeInit("totalSamplesCount", &total_samples_count)) | 
|  | // clang-format on | 
|  |  | 
|  | RTCAudioPlayoutStats::RTCAudioPlayoutStats(const std::string& id, | 
|  | Timestamp timestamp) | 
|  | : RTCStats(std::move(id), timestamp), kind("audio") {} | 
|  |  | 
|  | RTCAudioPlayoutStats::~RTCAudioPlayoutStats() {} | 
|  |  | 
|  | }  // namespace webrtc |