use crate::types::{CameraDeviceInfo, CameraFormat};
pub type DeviceInfo = CameraDeviceInfo;
pub type FormatInfo = CameraFormat;
#[derive(Debug, Clone)]
pub enum BufferPolicy {
DropOldest {
capacity: usize,
},
}
#[derive(Debug, Clone)]
pub enum AudioMode {
Disabled,
Enabled,
}
#[derive(Debug, Clone)]
pub struct CaptureConfig {
pub device_id: String,
pub format: CameraFormat,
pub buffer_policy: BufferPolicy,
pub audio_mode: AudioMode,
pub audio_device_id: Option<String>,
}
impl CaptureConfig {
pub fn new(device_id: String, format: CameraFormat) -> Self {
Self {
device_id,
format,
buffer_policy: BufferPolicy::DropOldest { capacity: 2 },
audio_mode: AudioMode::Disabled,
audio_device_id: None,
}
}
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct Frame {
pub sequence: u64,
pub timestamp_us: u64,
pub width: u32,
pub height: u32,
pub format: String,
pub device_id: String,
pub data: Vec<u8>,
}
#[derive(Debug, Clone)]
pub struct AudioPacket {
pub sequence: u64,
pub timestamp_us: u64,
pub sample_rate: u32,
pub channels: u16,
pub format: String,
pub data: Vec<u8>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_capture_config_defaults() {
let format = CameraFormat::new(640, 480, 30.0);
let cfg = CaptureConfig::new("dev-1".to_string(), format.clone());
assert_eq!(cfg.device_id, "dev-1");
assert_eq!(cfg.format, format);
match cfg.buffer_policy {
BufferPolicy::DropOldest { capacity } => assert_eq!(capacity, 2),
}
assert!(matches!(cfg.audio_mode, AudioMode::Disabled));
assert!(cfg.audio_device_id.is_none());
}
#[test]
fn test_frame_serialization_shape() {
let frame = Frame {
sequence: 7,
timestamp_us: 123,
width: 320,
height: 240,
format: "RGB".to_string(),
device_id: "dev".to_string(),
data: vec![1, 2, 3],
};
let json = serde_json::to_string(&frame).expect("frame should serialize");
assert!(json.contains("\"sequence\":7"));
assert!(json.contains("\"width\":320"));
assert!(json.contains("\"format\":\"RGB\""));
}
#[test]
fn test_audio_packet_clone_and_fields() {
let pkt = AudioPacket {
sequence: 3,
timestamp_us: 1000,
sample_rate: 48_000,
channels: 2,
format: "F32".to_string(),
data: vec![0, 1, 2, 3],
};
let cloned = pkt.clone();
assert_eq!(cloned.sequence, 3);
assert_eq!(cloned.sample_rate, 48_000);
assert_eq!(cloned.channels, 2);
assert_eq!(cloned.format, "F32");
assert_eq!(cloned.data.len(), 4);
}
}