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#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct UserActivity {
10    // 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#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
24pub enum MediaPriority {
25    High = 3,   // I-frames, audio, critical metadata
26    Normal = 2, // P-frames, standard video data
27    Low = 1,    // B-frames, thumbnails, preview data
28}
29
30impl Default for MediaPriority {
31    fn default() -> Self {
32        MediaPriority::Normal
33    }
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct MediaStream {
38    pub id: String,
39    pub user_id: u64,
40    pub content_type: MediaType,
41    pub quality: QualityLevel,
42    pub chunk_size: usize,
43    pub created_at: DateTime<Utc>,
44    pub metadata: HashMap<String, String>,
45}
46
47#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
48pub enum MediaType {
49    Video,
50    Audio,
51    Mixed, // Audio + Video
52}
53
54#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
55pub enum QualityLevel {
56    Low,       // 240p, 64kbps audio
57    Medium,    // 480p, 128kbps audio
58    High,      // 720p, 192kbps audio
59    UltraHigh, // 1080p+, 320kbps audio
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
63pub struct MediaChunk {
64    pub stream_id: String,
65    pub sequence_number: u64,
66    pub data: Vec<u8>,
67    pub chunk_type: ChunkType,
68    pub priority: MediaPriority,
69    pub timestamp: Duration,
70    pub is_final: bool,
71    pub checksum: Option<String>,
72}
73
74#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
75pub enum ChunkType {
76    VideoIFrame, // Key frame - high priority
77    VideoPFrame, // Predicted frame - normal priority
78    VideoBFrame, // Bidirectional frame - low priority
79    Audio,       // Audio data - high priority
80    Metadata,    // Stream metadata - high priority
81    Thumbnail,   // Preview images - low priority
82}
83
84impl ChunkType {
85    pub fn default_priority(&self) -> MediaPriority {
86        match self {
87            ChunkType::VideoIFrame | ChunkType::Audio | ChunkType::Metadata => MediaPriority::High,
88            ChunkType::VideoPFrame => MediaPriority::Normal,
89            ChunkType::VideoBFrame | ChunkType::Thumbnail => MediaPriority::Low,
90        }
91    }
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct StreamMetrics {
96    pub stream_id: String,
97    pub bytes_processed: u64,
98    pub chunks_processed: u64,
99    pub dropped_chunks: u64,
100    pub average_chunk_size: f64,
101    pub buffer_utilization: f64,
102    pub last_updated: DateTime<Utc>,
103}