rs2_stream/media/
types.rs

1//! Core types for media streaming
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6use std::time::Duration;
7
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct UserActivity {  // Add 'pub' here
11    /// Unique identifier for the activity
12    pub id: String,        // Make fields public too
13    /// User ID who performed the activity
14    pub user_id: u64,
15    /// Type of activity (e.g., "login", "purchase", "view")
16    pub activity_type: String,
17    /// Timestamp when the activity occurred
18    pub timestamp: DateTime<Utc>,
19    /// Additional metadata about the activity
20    pub metadata: HashMap<String, String>,
21}
22
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
25pub enum MediaPriority {
26    High = 3,    // I-frames, audio, critical metadata
27    Normal = 2,  // P-frames, standard video data
28    Low = 1,     // B-frames, thumbnails, preview data
29}
30
31impl Default for MediaPriority {
32    fn default() -> Self {
33        MediaPriority::Normal
34    }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct MediaStream {
39    pub id: String,
40    pub user_id: u64,
41    pub content_type: MediaType,
42    pub quality: QualityLevel,
43    pub chunk_size: usize,
44    pub created_at: DateTime<Utc>,
45    pub metadata: HashMap<String, String>,
46}
47
48#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
49pub enum MediaType {
50    Video,
51    Audio,
52    Mixed, // Audio + Video
53}
54
55#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
56pub enum QualityLevel {
57    Low,      // 240p, 64kbps audio
58    Medium,   // 480p, 128kbps audio  
59    High,     // 720p, 192kbps audio
60    UltraHigh, // 1080p+, 320kbps audio
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, Eq)]
64#[derive(PartialEq)]
65pub struct MediaChunk {
66    pub stream_id: String,
67    pub sequence_number: u64,
68    pub data: Vec<u8>,
69    pub chunk_type: ChunkType,
70    pub priority: MediaPriority,
71    pub timestamp: Duration,
72    pub is_final: bool,
73    pub checksum: Option<String>,
74}
75
76#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
77pub enum ChunkType {
78    VideoIFrame,    // Key frame - high priority
79    VideoPFrame,    // Predicted frame - normal priority  
80    VideoBFrame,    // Bidirectional frame - low priority
81    Audio,          // Audio data - high priority
82    Metadata,       // Stream metadata - high priority
83    Thumbnail,      // Preview images - low priority
84}
85
86impl ChunkType {
87    pub fn default_priority(&self) -> MediaPriority {
88        match self {
89            ChunkType::VideoIFrame | ChunkType::Audio | ChunkType::Metadata => MediaPriority::High,
90            ChunkType::VideoPFrame => MediaPriority::Normal,
91            ChunkType::VideoBFrame | ChunkType::Thumbnail => MediaPriority::Low,
92        }
93    }
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct StreamMetrics {
98    pub stream_id: String,
99    pub bytes_processed: u64,
100    pub chunks_processed: u64,
101    pub dropped_chunks: u64,
102    pub average_chunk_size: f64,
103    pub buffer_utilization: f64,
104    pub last_updated: DateTime<Utc>,
105}