use crate::quality::QualityReport;
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct PreviewFrameEvent {
pub jpeg_data: Vec<u8>,
pub quality: Option<QualityReport>,
pub stale: bool,
pub last_sampled_frame: u64,
pub is_smart_trigger_ready: bool,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub frame_number: u64,
}
#[derive(Debug, Clone)]
pub struct PreviewConfig {
pub fps_target: u32,
pub downscale: f32,
pub quality_sample_rate: u32,
pub analyze_at_full_res: bool,
pub jpeg_quality: u8,
}
impl PreviewConfig {
pub fn validate(&self) -> Result<(), String> {
if !(1..=60).contains(&self.fps_target) {
return Err("fps_target must be 1-60".into());
}
if !(0.1..=1.0).contains(&self.downscale) {
return Err("downscale must be 0.1-1.0".into());
}
if self.quality_sample_rate == 0 {
return Err("quality_sample_rate must be >= 1".into());
}
if !(30..=95).contains(&self.jpeg_quality) {
return Err("jpeg_quality must be 30-95".into());
}
Ok(())
}
}
impl Default for PreviewConfig {
fn default() -> Self {
Self {
fps_target: 15,
downscale: 0.5,
quality_sample_rate: 5,
analyze_at_full_res: false,
jpeg_quality: 70,
}
}
}