use crate::rtp_::Bitrate;
const PACING_FACTOR: f64 = 1.1;
const PADDING_TARGET: Bitrate = Bitrate::bps(50_000);
pub(crate) struct PacingResult {
pub padding_rate: Bitrate,
pub pacing_rate: Bitrate,
}
pub(crate) struct PacerControl {}
impl PacerControl {
pub fn new() -> Self {
Self {}
}
pub fn calculate(
&self,
has_active_media: bool,
estimate: Bitrate,
is_overuse: bool,
) -> PacingResult {
let padding_rate = if is_overuse {
Bitrate::ZERO
} else if has_active_media {
PADDING_TARGET
} else {
Bitrate::ZERO
};
let min_pacing_rate = estimate * PACING_FACTOR;
let pacing_rate = min_pacing_rate.max(padding_rate);
PacingResult {
padding_rate,
pacing_rate,
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn padding_enabled_with_active_media() {
let c = PacerControl::new();
let estimate = Bitrate::kbps(1_000);
let r = c.calculate(true, estimate, false);
assert_eq!(r.padding_rate, PADDING_TARGET);
}
#[test]
fn no_padding_without_active_media() {
let c = PacerControl::new();
let estimate = Bitrate::kbps(1_000);
let r = c.calculate(false, estimate, false);
assert_eq!(r.padding_rate, Bitrate::ZERO);
}
#[test]
fn overuse_suppresses_padding() {
let c = PacerControl::new();
let estimate = Bitrate::mbps(40);
let r = c.calculate(true, estimate, true);
assert_eq!(r.padding_rate, Bitrate::ZERO);
}
}