#[non_exhaustive]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct DecoderLimits {
pub max_pixels_per_frame: u64,
pub max_alloc_bytes_per_frame: u64,
pub max_alloc_count_per_frame: u32,
pub max_arenas_in_flight: u8,
pub max_decoded_audio_seconds_per_packet: u32,
}
impl Default for DecoderLimits {
fn default() -> Self {
Self {
max_pixels_per_frame: 32_768u64 * 32_768u64,
max_alloc_bytes_per_frame: 1u64 << 30, max_alloc_count_per_frame: 1_000_000,
max_arenas_in_flight: 8,
max_decoded_audio_seconds_per_packet: 60,
}
}
}
impl DecoderLimits {
pub fn with_max_pixels_per_frame(mut self, n: u64) -> Self {
self.max_pixels_per_frame = n;
self
}
pub fn with_max_alloc_bytes_per_frame(mut self, n: u64) -> Self {
self.max_alloc_bytes_per_frame = n;
self
}
pub fn with_max_alloc_count_per_frame(mut self, n: u32) -> Self {
self.max_alloc_count_per_frame = n;
self
}
pub fn with_max_arenas_in_flight(mut self, n: u8) -> Self {
self.max_arenas_in_flight = n;
self
}
pub fn with_max_decoded_audio_seconds_per_packet(mut self, n: u32) -> Self {
self.max_decoded_audio_seconds_per_packet = n;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_are_conservative_but_finite() {
let l = DecoderLimits::default();
assert_eq!(l.max_pixels_per_frame, 1_073_741_824);
assert_eq!(l.max_alloc_bytes_per_frame, 1u64 << 30);
assert_eq!(l.max_alloc_count_per_frame, 1_000_000);
assert_eq!(l.max_arenas_in_flight, 8);
assert_eq!(l.max_decoded_audio_seconds_per_packet, 60);
}
#[test]
fn builder_methods_compose() {
let l = DecoderLimits::default()
.with_max_pixels_per_frame(1024 * 1024)
.with_max_alloc_bytes_per_frame(8 * 1024 * 1024)
.with_max_alloc_count_per_frame(1024)
.with_max_arenas_in_flight(2)
.with_max_decoded_audio_seconds_per_packet(1);
assert_eq!(l.max_pixels_per_frame, 1024 * 1024);
assert_eq!(l.max_alloc_bytes_per_frame, 8 * 1024 * 1024);
assert_eq!(l.max_alloc_count_per_frame, 1024);
assert_eq!(l.max_arenas_in_flight, 2);
assert_eq!(l.max_decoded_audio_seconds_per_packet, 1);
}
#[test]
fn copy_semantics() {
let a = DecoderLimits::default();
let b = a; assert_eq!(a, b);
}
}