LiveKit C++ SDK
Real-time audio/video SDK for C++
Loading...
Searching...
No Matches
stats.h
1/*
2 * Copyright 2025 LiveKit
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an “AS IS” BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <cstdint>
20#include <optional>
21#include <string>
22#include <unordered_map>
23#include <variant>
24#include <vector>
25
26namespace livekit {
27
28namespace proto {
29class RtcStats;
30class RtcStatsData;
31class CodecStats;
32class RtpStreamStats;
33class ReceivedRtpStreamStats;
34class InboundRtpStreamStats;
35class SentRtpStreamStats;
36class OutboundRtpStreamStats;
37class RemoteInboundRtpStreamStats;
38class RemoteOutboundRtpStreamStats;
39class MediaSourceStats;
40class AudioSourceStats;
41class VideoSourceStats;
42class AudioPlayoutStats;
43class PeerConnectionStats;
44class DataChannelStats;
45class TransportStats;
46class CandidatePairStats;
47class IceCandidateStats;
48class CertificateStats;
49class StreamStats;
50} // namespace proto
51
52enum class DataChannelState {
53 Connecting,
54 Open,
55 Closing,
56 Closed,
57 Unknown,
58};
59
60enum class QualityLimitationReason {
61 None,
62 Cpu,
63 Bandwidth,
64 Other,
65};
66
67enum class IceRole {
68 Unknown,
69 Controlling,
70 Controlled,
71};
72
73enum class DtlsTransportState {
74 New,
75 Connecting,
76 Connected,
77 Closed,
78 Failed,
79 Unknown,
80};
81
82enum class IceTransportState {
83 New,
84 Checking,
85 Connected,
86 Completed,
87 Disconnected,
88 Failed,
89 Closed,
90 Unknown,
91};
92
93enum class DtlsRole {
94 Client,
95 Server,
96 Unknown,
97};
98
99enum class IceCandidatePairState {
100 Frozen,
101 Waiting,
102 InProgress,
103 Failed,
104 Succeeded,
105 Unknown,
106};
107
108enum class IceCandidateType {
109 Host,
110 Srflx,
111 Prflx,
112 Relay,
113 Unknown,
114};
115
116enum class IceServerTransportProtocol {
117 Udp,
118 Tcp,
119 Tls,
120 Unknown,
121};
122
123enum class IceTcpCandidateType {
124 Active,
125 Passive,
126 So,
127 Unknown,
128};
129
130// ----------------------
131// Leaf stats types
132// ----------------------
133
135 std::string id;
136 std::int64_t timestamp_ms;
137};
138
140 std::uint32_t payload_type;
141 std::string transport_id;
142 std::string mime_type;
143 std::uint32_t clock_rate;
144 std::uint32_t channels;
145 std::string sdp_fmtp_line;
146};
147
149 std::uint32_t ssrc;
150 std::string kind;
151 std::string transport_id;
152 std::string codec_id;
153};
154
156 std::uint64_t packets_received;
157 std::int64_t packets_lost;
158 double jitter;
159};
160
162 std::string track_identifier;
163 std::string mid;
164 std::string remote_id;
165 std::uint32_t frames_decoded;
166 std::uint32_t key_frames_decoded;
167 std::uint32_t frames_rendered;
168 std::uint32_t frames_dropped;
169 std::uint32_t frame_width;
170 std::uint32_t frame_height;
171 double frames_per_second;
172 std::uint64_t qp_sum;
173 double total_decode_time;
174 double total_inter_frame_delay;
175 double total_squared_inter_frame_delay;
176 std::uint32_t pause_count;
177 double total_pause_duration;
178 std::uint32_t freeze_count;
179 double total_freeze_duration;
180 double last_packet_received_timestamp;
181 std::uint64_t header_bytes_received;
182 std::uint64_t packets_discarded;
183 std::uint64_t fec_bytes_received;
184 std::uint64_t fec_packets_received;
185 std::uint64_t fec_packets_discarded;
186 std::uint64_t bytes_received;
187 std::uint32_t nack_count;
188 std::uint32_t fir_count;
189 std::uint32_t pli_count;
190 double total_processing_delay;
191 double estimated_playout_timestamp;
192 double jitter_buffer_delay;
193 double jitter_buffer_target_delay;
194 std::uint64_t jitter_buffer_emitted_count;
195 double jitter_buffer_minimum_delay;
196 std::uint64_t total_samples_received;
197 std::uint64_t concealed_samples;
198 std::uint64_t silent_concealed_samples;
199 std::uint64_t concealment_events;
200 std::uint64_t inserted_samples_for_deceleration;
201 std::uint64_t removed_samples_for_acceleration;
202 double audio_level;
203 double total_audio_energy;
204 double total_samples_duration;
205 std::uint64_t frames_received;
206 std::string decoder_implementation;
207 std::string playout_id;
208 bool power_efficient_decoder;
209 std::uint64_t frames_assembled_from_multiple_packets;
210 double total_assembly_time;
211 std::uint64_t retransmitted_packets_received;
212 std::uint64_t retransmitted_bytes_received;
213 std::uint32_t rtx_ssrc;
214 std::uint32_t fec_ssrc;
215};
216
218 std::uint64_t packets_sent;
219 std::uint64_t bytes_sent;
220};
221
223 std::string mid;
224 std::string media_source_id;
225 std::string remote_id;
226 std::string rid;
227 std::uint64_t header_bytes_sent;
228 std::uint64_t retransmitted_packets_sent;
229 std::uint64_t retransmitted_bytes_sent;
230 std::uint32_t rtx_ssrc;
231 double target_bitrate;
232 std::uint64_t total_encoded_bytes_target;
233 std::uint32_t frame_width;
234 std::uint32_t frame_height;
235 double frames_per_second;
236 std::uint32_t frames_sent;
237 std::uint32_t huge_frames_sent;
238 std::uint32_t frames_encoded;
239 std::uint32_t key_frames_encoded;
240 std::uint64_t qp_sum;
241 double total_encode_time;
242 double total_packet_send_delay;
243 QualityLimitationReason quality_limitation_reason;
244 std::unordered_map<std::string, double> quality_limitation_durations;
245 std::uint32_t quality_limitation_resolution_changes;
246 std::uint32_t nack_count;
247 std::uint32_t fir_count;
248 std::uint32_t pli_count;
249 std::string encoder_implementation;
250 bool power_efficient_encoder;
251 bool active;
252 std::string scalability_mode;
253};
254
256 std::string local_id;
257 double round_trip_time;
258 double total_round_trip_time;
259 double fraction_lost;
260 std::uint64_t round_trip_time_measurements;
261};
262
264 std::string local_id;
265 double remote_timestamp;
266 std::uint64_t reports_sent;
267 double round_trip_time;
268 double total_round_trip_time;
269 std::uint64_t round_trip_time_measurements;
270};
271
273 std::string track_identifier;
274 std::string kind;
275};
276
278 double audio_level;
279 double total_audio_energy;
280 double total_samples_duration;
281 double echo_return_loss;
282 double echo_return_loss_enhancement;
283 double dropped_samples_duration;
284 std::uint32_t dropped_samples_events;
285 double total_capture_delay;
286 std::uint64_t total_samples_captured;
287};
288
290 std::uint32_t width;
291 std::uint32_t height;
292 std::uint32_t frames;
293 double frames_per_second;
294};
295
312
314 std::uint32_t data_channels_opened;
315 std::uint32_t data_channels_closed;
316};
317
319 std::string label;
320 std::string protocol;
321 std::int32_t data_channel_identifier;
322 std::optional<DataChannelState> state;
323 std::uint32_t messages_sent;
324 std::uint64_t bytes_sent;
325 std::uint32_t messages_received;
326 std::uint64_t bytes_received;
327};
328
330 std::uint64_t packets_sent;
331 std::uint64_t packets_received;
332 std::uint64_t bytes_sent;
333 std::uint64_t bytes_received;
334 IceRole ice_role;
335 std::string ice_local_username_fragment;
336 std::optional<DtlsTransportState> dtls_state;
337 std::optional<IceTransportState> ice_state;
338 std::string selected_candidate_pair_id;
339 std::string local_certificate_id;
340 std::string remote_certificate_id;
341 std::string tls_version;
342 std::string dtls_cipher;
343 DtlsRole dtls_role;
344 std::string srtp_cipher;
345 std::uint32_t selected_candidate_pair_changes;
346};
347
349 std::string transport_id;
350 std::string local_candidate_id;
351 std::string remote_candidate_id;
352 std::optional<IceCandidatePairState> state;
353 bool nominated;
354 std::uint64_t packets_sent;
355 std::uint64_t packets_received;
356 std::uint64_t bytes_sent;
357 std::uint64_t bytes_received;
358 double last_packet_sent_timestamp;
359 double last_packet_received_timestamp;
360 double total_round_trip_time;
361 double current_round_trip_time;
362 double available_outgoing_bitrate;
363 double available_incoming_bitrate;
364 std::uint64_t requests_received;
365 std::uint64_t requests_sent;
366 std::uint64_t responses_received;
367 std::uint64_t responses_sent;
368 std::uint64_t consent_requests_sent;
369 std::uint32_t packets_discarded_on_send;
370 std::uint64_t bytes_discarded_on_send;
371};
372
374 std::string transport_id;
375 std::string address;
376 std::int32_t port;
377 std::string protocol;
378 std::optional<IceCandidateType> candidate_type;
379 std::int32_t priority;
380 std::string url;
381 std::optional<IceServerTransportProtocol> relay_protocol;
382 std::string foundation;
383 std::string related_address;
384 std::int32_t related_port;
385 std::string username_fragment;
386 std::optional<IceTcpCandidateType> tcp_type;
387};
388
390 std::string fingerprint;
391 std::string fingerprint_algorithm;
392 std::string base64_certificate;
393 std::string issuer_certificate_id;
394};
395
397 std::string id;
398 std::string stream_identifier;
399};
400
401// ----------------------
402// High-level RtcStats wrapper
403// ----------------------
404
406 RtcStatsData rtc;
407 CodecStats codec;
408};
409
411 RtcStatsData rtc;
412 RtpStreamStats stream;
413 ReceivedRtpStreamStats received;
414 InboundRtpStreamStats inbound;
415};
416
418 RtcStatsData rtc;
419 RtpStreamStats stream;
421 OutboundRtpStreamStats outbound;
422};
423
425 RtcStatsData rtc;
426 RtpStreamStats stream;
427 ReceivedRtpStreamStats received;
428 RemoteInboundRtpStreamStats remote_inbound;
429};
430
432 RtcStatsData rtc;
433 RtpStreamStats stream;
435 RemoteOutboundRtpStreamStats remote_outbound;
436};
437
439 RtcStatsData rtc;
440 MediaSourceStats source;
441 AudioSourceStats audio;
442 VideoSourceStats video;
443};
444
446 RtcStatsData rtc;
447 AudioPlayoutStats audio_playout;
448};
449
454
456 RtcStatsData rtc;
458};
459
461 RtcStatsData rtc;
462 TransportStats transport;
463};
464
466 RtcStatsData rtc;
467 CandidatePairStats candidate_pair;
468};
469
471 RtcStatsData rtc;
472 IceCandidateStats candidate;
473};
474
476 RtcStatsData rtc;
477 IceCandidateStats candidate;
478};
479
481 RtcStatsData rtc;
482 CertificateStats certificate;
483};
484
486 RtcStatsData rtc;
487 StreamStats stream;
488};
489
490// Deprecated Track omitted on purpose.
491
492using RtcStatsVariant =
499
500struct RtcStats {
501 RtcStatsVariant stats;
502};
503
504// ----------------------
505// fromProto declarations
506// ----------------------
507
508RtcStatsData fromProto(const proto::RtcStatsData &);
509
510CodecStats fromProto(const proto::CodecStats &);
511RtpStreamStats fromProto(const proto::RtpStreamStats &);
512ReceivedRtpStreamStats fromProto(const proto::ReceivedRtpStreamStats &);
513InboundRtpStreamStats fromProto(const proto::InboundRtpStreamStats &);
514SentRtpStreamStats fromProto(const proto::SentRtpStreamStats &);
515OutboundRtpStreamStats fromProto(const proto::OutboundRtpStreamStats &);
517fromProto(const proto::RemoteInboundRtpStreamStats &);
519fromProto(const proto::RemoteOutboundRtpStreamStats &);
520MediaSourceStats fromProto(const proto::MediaSourceStats &);
521AudioSourceStats fromProto(const proto::AudioSourceStats &);
522VideoSourceStats fromProto(const proto::VideoSourceStats &);
523AudioPlayoutStats fromProto(const proto::AudioPlayoutStats &);
524PeerConnectionStats fromProto(const proto::PeerConnectionStats &);
525DataChannelStats fromProto(const proto::DataChannelStats &);
526TransportStats fromProto(const proto::TransportStats &);
527CandidatePairStats fromProto(const proto::CandidatePairStats &);
528IceCandidateStats fromProto(const proto::IceCandidateStats &);
529CertificateStats fromProto(const proto::CertificateStats &);
530StreamStats fromProto(const proto::StreamStats &);
531
532// High-level:
533RtcStats fromProto(const proto::RtcStats &);
534
535// helper if you have repeated RtcStats in proto:
536std::vector<RtcStats> fromProto(const std::vector<proto::RtcStats> &);
537
538} // namespace livekit
Statistics for audio playout performance.
Definition stats.h:302
std::string kind
The type of media ("audio").
Definition stats.h:303
double total_playout_delay
Cumulative playout delay in seconds.
Definition stats.h:309
double synthesized_samples_duration
Definition stats.h:304
std::uint32_t synthesized_samples_events
Definition stats.h:306
std::uint64_t total_samples_count
Total number of samples played out.
Definition stats.h:310
double total_samples_duration
Total duration of all samples in seconds.
Definition stats.h:308
Definition stats.h:277
Definition stats.h:348
Definition stats.h:389
Definition stats.h:139
Definition stats.h:318
Definition stats.h:373
Definition stats.h:161
Definition stats.h:272
Definition stats.h:222
Definition stats.h:313
Definition stats.h:155
Definition stats.h:465
Definition stats.h:480
Definition stats.h:405
Definition stats.h:455
Definition stats.h:410
Definition stats.h:470
Definition stats.h:445
Definition stats.h:438
Definition stats.h:417
Definition stats.h:450
Definition stats.h:475
Definition stats.h:424
Definition stats.h:134
Definition stats.h:500
Definition stats.h:485
Definition stats.h:460
Definition stats.h:148
Definition stats.h:217
Definition stats.h:396
Definition stats.h:329
Definition stats.h:289