pub struct AdaptiveQualityController {
pub target_latency_ms: f32,
pub current_quality: f32,
quality_history: Vec<f32>,
latency_history: Vec<f32>,
adaptation_rate: f32,
}
impl AdaptiveQualityController {
pub fn new(target_latency_ms: f32) -> Self {
Self {
target_latency_ms,
current_quality: 0.8,
quality_history: Vec::new(),
latency_history: Vec::new(),
adaptation_rate: 0.1,
}
}
pub fn update(&mut self, latency_ms: f32) {
self.latency_history.push(latency_ms);
if self.latency_history.len() > 10 {
self.latency_history.remove(0);
}
let avg_latency =
self.latency_history.iter().sum::<f32>() / self.latency_history.len() as f32;
if avg_latency > self.target_latency_ms * 1.2 {
self.current_quality = (self.current_quality - self.adaptation_rate).max(0.1);
} else if avg_latency < self.target_latency_ms * 0.8 {
self.current_quality = (self.current_quality + self.adaptation_rate * 0.5).min(1.0);
}
self.quality_history.push(self.current_quality);
if self.quality_history.len() > 10 {
self.quality_history.remove(0);
}
}
pub fn get_quality(&self) -> f32 {
self.current_quality
}
}