1use std::time::{Duration, Instant};
4
5#[derive(Debug, Clone, Default)]
7pub struct SessionStats {
8 pub bytes_received: u64,
10 pub bytes_sent: u64,
12 pub duration: Duration,
14 pub video_frames: u64,
16 pub audio_frames: u64,
18 pub keyframes: u64,
20 pub dropped_frames: u64,
22 pub bitrate: u64,
24}
25
26impl SessionStats {
27 pub fn new() -> Self {
29 Self::default()
30 }
31
32 pub fn calculate_bitrate(&mut self) {
34 let secs = self.duration.as_secs();
35 if secs > 0 {
36 self.bitrate = (self.bytes_received * 8) / secs;
37 }
38 }
39}
40
41#[derive(Debug, Clone)]
43pub struct StreamStats {
44 pub stream_key: String,
46 pub started_at: Instant,
48 pub bytes_received: u64,
50 pub video_frames: u64,
52 pub audio_frames: u64,
54 pub keyframes: u64,
56 pub last_video_ts: u32,
58 pub last_audio_ts: u32,
60 pub video_codec: Option<String>,
62 pub audio_codec: Option<String>,
64 pub width: Option<u32>,
66 pub height: Option<u32>,
68 pub framerate: Option<f64>,
70 pub audio_sample_rate: Option<u32>,
72 pub audio_channels: Option<u8>,
74}
75
76impl StreamStats {
77 pub fn new(stream_key: String) -> Self {
78 Self {
79 stream_key,
80 started_at: Instant::now(),
81 bytes_received: 0,
82 video_frames: 0,
83 audio_frames: 0,
84 keyframes: 0,
85 last_video_ts: 0,
86 last_audio_ts: 0,
87 video_codec: None,
88 audio_codec: None,
89 width: None,
90 height: None,
91 framerate: None,
92 audio_sample_rate: None,
93 audio_channels: None,
94 }
95 }
96
97 pub fn duration(&self) -> Duration {
99 self.started_at.elapsed()
100 }
101
102 pub fn bitrate(&self) -> u64 {
104 let secs = self.duration().as_secs();
105 if secs > 0 {
106 (self.bytes_received * 8) / secs
107 } else {
108 0
109 }
110 }
111
112 pub fn calculated_framerate(&self) -> f64 {
114 let secs = self.duration().as_secs_f64();
115 if secs > 0.0 {
116 self.video_frames as f64 / secs
117 } else {
118 0.0
119 }
120 }
121}
122
123#[derive(Debug, Clone, Default)]
125pub struct ServerStats {
126 pub total_connections: u64,
128 pub active_connections: u64,
130 pub total_bytes_received: u64,
132 pub total_bytes_sent: u64,
134 pub active_streams: u64,
136 pub uptime: Duration,
138}
139
140impl ServerStats {
141 pub fn new() -> Self {
142 Self::default()
143 }
144}