use std::time::Duration;
pub const DEFAULT_TARGET_FPS: f64 = 60.0;
pub const MAX_TARGET_FPS: f64 = 240.0;
pub const MIN_TARGET_FPS: f64 = 24.0;
pub const DEFAULT_SYNC_ACCURACY_MS: f64 = 0.5;
pub const MAX_LATENCY_MS: u64 = 20;
pub const DEFAULT_TRACKING_RATE_HZ: f64 = 120.0;
pub const DEFAULT_LED_BRIGHTNESS_NITS: u32 = 1000;
pub const MAX_LED_BRIGHTNESS_NITS: u32 = 5000;
pub const DEFAULT_COLOR_BIT_DEPTH: u8 = 10;
pub mod frame_rates {
pub const FILM_23_976: f64 = 23.976;
pub const FILM_24: f64 = 24.0;
pub const PAL_25: f64 = 25.0;
pub const NTSC_29_97: f64 = 29.97;
pub const FPS_30: f64 = 30.0;
pub const PAL_50: f64 = 50.0;
pub const NTSC_59_94: f64 = 59.94;
pub const FPS_60: f64 = 60.0;
pub const FPS_120: f64 = 120.0;
pub const FPS_240: f64 = 240.0;
}
pub mod resolutions {
pub const HD_1080P: (usize, usize) = (1920, 1080);
pub const UHD_4K: (usize, usize) = (3840, 2160);
pub const UHD_8K: (usize, usize) = (7680, 4320);
pub const DCI_2K: (usize, usize) = (2048, 1080);
pub const DCI_4K: (usize, usize) = (4096, 2160);
}
pub mod color_spaces {
pub const SRGB_GAMMA: f32 = 2.2;
pub const REC709_GAMMA: f32 = 2.4;
pub const REC2020_GAMMA: f32 = 2.4;
pub const LINEAR_GAMMA: f32 = 1.0;
}
pub mod led_wall {
pub const MIN_PIXEL_PITCH_MM: f64 = 0.5;
pub const MAX_PIXEL_PITCH_MM: f64 = 10.0;
pub const TYPICAL_VIEWING_DISTANCE_M: f64 = 5.0;
pub const DEFAULT_REFRESH_RATE_HZ: u32 = 3840;
}
pub mod tracking {
pub const MIN_CONFIDENCE: f32 = 0.3;
pub const GOOD_CONFIDENCE: f32 = 0.8;
pub const EXCELLENT_CONFIDENCE: f32 = 0.95;
pub const DEFAULT_SMOOTHING_WINDOW: usize = 5;
}
pub mod timing {
use super::Duration;
pub const ONE_MS: Duration = Duration::from_millis(1);
pub const ONE_US: Duration = Duration::from_micros(1);
pub const FRAME_TIME_60FPS: Duration = Duration::from_micros(16667);
pub const FRAME_TIME_120FPS: Duration = Duration::from_micros(8333);
}
pub mod metrics {
pub const GOOD_FPS_THRESHOLD: f64 = 58.0;
pub const ACCEPTABLE_DROP_RATE_PCT: f64 = 1.0;
pub const CRITICAL_LATENCY_MS: u64 = 50;
}
pub mod presets {
use crate::{QualityMode, VirtualProductionConfig, WorkflowType};
#[must_use]
pub fn led_wall_high_quality() -> VirtualProductionConfig {
VirtualProductionConfig {
workflow: WorkflowType::LedWall,
target_fps: super::DEFAULT_TARGET_FPS,
sync_accuracy_ms: 0.5,
quality: QualityMode::Final,
color_calibration: true,
lens_correction: true,
num_cameras: 1,
motion_capture: false,
unreal_integration: false,
}
}
#[must_use]
pub fn realtime_preview() -> VirtualProductionConfig {
VirtualProductionConfig {
workflow: WorkflowType::LedWall,
target_fps: super::DEFAULT_TARGET_FPS,
sync_accuracy_ms: 1.0,
quality: QualityMode::Preview,
color_calibration: false,
lens_correction: false,
num_cameras: 1,
motion_capture: false,
unreal_integration: false,
}
}
#[must_use]
pub fn multi_camera_production() -> VirtualProductionConfig {
VirtualProductionConfig {
workflow: WorkflowType::LedWall,
target_fps: super::DEFAULT_TARGET_FPS,
sync_accuracy_ms: 0.5,
quality: QualityMode::Final,
color_calibration: true,
lens_correction: true,
num_cameras: 4,
motion_capture: false,
unreal_integration: false,
}
}
#[must_use]
pub fn unreal_integration() -> VirtualProductionConfig {
VirtualProductionConfig {
workflow: WorkflowType::LedWall,
target_fps: super::DEFAULT_TARGET_FPS,
sync_accuracy_ms: 0.5,
quality: QualityMode::Final,
color_calibration: true,
lens_correction: true,
num_cameras: 1,
motion_capture: true,
unreal_integration: true,
}
}
#[must_use]
pub fn ar_vr() -> VirtualProductionConfig {
VirtualProductionConfig {
workflow: WorkflowType::AugmentedReality,
target_fps: 90.0, sync_accuracy_ms: 0.3,
quality: QualityMode::Final,
color_calibration: true,
lens_correction: true,
num_cameras: 1,
motion_capture: true,
unreal_integration: false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_frame_rates() {
assert_eq!(frame_rates::FPS_60, 60.0);
assert_eq!(frame_rates::FPS_30, 30.0);
}
#[test]
fn test_resolutions() {
assert_eq!(resolutions::HD_1080P, (1920, 1080));
assert_eq!(resolutions::UHD_4K, (3840, 2160));
}
#[test]
fn test_presets() {
let config = presets::led_wall_high_quality();
assert_eq!(config.quality, crate::QualityMode::Final);
let config = presets::realtime_preview();
assert_eq!(config.quality, crate::QualityMode::Preview);
let config = presets::multi_camera_production();
assert_eq!(config.num_cameras, 4);
}
#[test]
fn test_timing_constants() {
assert_eq!(timing::ONE_MS.as_millis(), 1);
assert_eq!(timing::ONE_US.as_micros(), 1);
}
}