pub const DEFAULT_MAX_PIXELS: u64 = 256 * 1024 * 1024;
pub const DEFAULT_MAX_FRAME_BYTES: usize = 512 * 1024 * 1024;
pub const DEFAULT_MAX_PACKET_BYTES: usize = 1024 * 1024 * 1024;
pub const DEFAULT_MAX_ATTACHMENT_BYTES: usize = 64 * 1024 * 1024;
pub const DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES: usize = 256 * 1024 * 1024;
pub const DEFAULT_MAX_CODEC_PARAMETER_BYTES: usize = 16 * 1024 * 1024;
pub const DEFAULT_MAX_TOTAL_CODEC_PARAMETER_BYTES: usize = 64 * 1024 * 1024;
const _: () = {
assert!(DEFAULT_MAX_PIXELS > 0 && DEFAULT_MAX_PIXELS < u64::MAX);
assert!(DEFAULT_MAX_FRAME_BYTES > 0 && DEFAULT_MAX_FRAME_BYTES < usize::MAX);
assert!(DEFAULT_MAX_PACKET_BYTES > 0 && DEFAULT_MAX_PACKET_BYTES < usize::MAX);
assert!(DEFAULT_MAX_ATTACHMENT_BYTES > 0);
assert!(DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES > 0);
assert!(7680 * 4320 < DEFAULT_MAX_PIXELS);
assert!(7680 * 4320 * 8 < DEFAULT_MAX_FRAME_BYTES);
assert!(7680 * 4320 * 16 < DEFAULT_MAX_FRAME_BYTES);
assert!(100_000 * 100_000 > DEFAULT_MAX_PIXELS);
assert!(DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES >= DEFAULT_MAX_ATTACHMENT_BYTES);
assert!(DEFAULT_MAX_PACKET_BYTES >= DEFAULT_MAX_ATTACHMENT_BYTES);
assert!(DEFAULT_MAX_PACKET_BYTES <= i32::MAX as usize);
assert!(DEFAULT_MAX_CODEC_PARAMETER_BYTES > 0);
assert!(DEFAULT_MAX_TOTAL_CODEC_PARAMETER_BYTES >= DEFAULT_MAX_CODEC_PARAMETER_BYTES);
assert!(10 * 1024 * 1024 < DEFAULT_MAX_CODEC_PARAMETER_BYTES);
assert!(DEFAULT_MAX_IMAGE_SIDE_DATA_BYTES >= DEFAULT_MAX_CODEC_PARAMETER_BYTES);
};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct FrameLimits {
max_pixels: u64,
max_frame_bytes: usize,
max_image_side_data_bytes: usize,
}
impl Default for FrameLimits {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl FrameLimits {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self {
max_pixels: DEFAULT_MAX_PIXELS,
max_frame_bytes: DEFAULT_MAX_FRAME_BYTES,
max_image_side_data_bytes: DEFAULT_MAX_IMAGE_SIDE_DATA_BYTES,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_pixels(&self) -> u64 {
self.max_pixels
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_frame_bytes(&self) -> usize {
self.max_frame_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_image_side_data_bytes(&self) -> usize {
self.max_image_side_data_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_pixels(mut self, value: u64) -> Self {
self.max_pixels = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_frame_bytes(mut self, value: usize) -> Self {
self.max_frame_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_image_side_data_bytes(mut self, value: usize) -> Self {
self.max_image_side_data_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_pixels(&mut self, value: u64) -> &mut Self {
self.max_pixels = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_frame_bytes(&mut self, value: usize) -> &mut Self {
self.max_frame_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_image_side_data_bytes(&mut self, value: usize) -> &mut Self {
self.max_image_side_data_bytes = value;
self
}
}
pub const DEFAULT_MAX_PROBE_BYTES: u64 = 5 * 1024 * 1024;
pub const DEFAULT_MAX_STREAMS: u32 = 1000;
pub const DEFAULT_MAX_CHAPTERS: u32 = 4096;
pub const DEFAULT_MAX_TOTAL_CHAPTER_TITLE_BYTES: usize = 1024 * 1024;
pub const DEFAULT_MAX_TOTAL_STREAM_METADATA_BYTES: usize = 4 * 1024 * 1024;
pub const DEFAULT_MAX_IMAGE_SIDE_DATA_BYTES: usize = DEFAULT_MAX_CODEC_PARAMETER_BYTES;
pub const DEFAULT_MAX_IMAGE_INPUT_BYTES: usize = DEFAULT_MAX_ATTACHMENT_BYTES;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PacketLimits {
max_packet_bytes: usize,
}
impl Default for PacketLimits {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl PacketLimits {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self {
max_packet_bytes: DEFAULT_MAX_PACKET_BYTES,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_packet_bytes(&self) -> usize {
self.max_packet_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_packet_bytes(mut self, value: usize) -> Self {
self.max_packet_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_packet_bytes(&mut self, value: usize) -> &mut Self {
self.max_packet_bytes = value;
self
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct DecoderLimits {
frame: FrameLimits,
max_codec_parameter_bytes: usize,
max_packet_bytes: usize,
max_image_input_bytes: usize,
}
impl Default for DecoderLimits {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl DecoderLimits {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self {
frame: FrameLimits::new(),
max_codec_parameter_bytes: DEFAULT_MAX_CODEC_PARAMETER_BYTES,
max_packet_bytes: DEFAULT_MAX_PACKET_BYTES,
max_image_input_bytes: DEFAULT_MAX_IMAGE_INPUT_BYTES,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn frame(&self) -> FrameLimits {
self.frame
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_codec_parameter_bytes(&self) -> usize {
self.max_codec_parameter_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_packet_bytes(&self) -> usize {
self.max_packet_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn packet_limits(&self) -> PacketLimits {
PacketLimits::new().with_max_packet_bytes(self.max_packet_bytes)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_image_input_bytes(&self) -> usize {
self.max_image_input_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_frame(mut self, value: FrameLimits) -> Self {
self.frame = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_codec_parameter_bytes(mut self, value: usize) -> Self {
self.max_codec_parameter_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_packet_bytes(mut self, value: usize) -> Self {
self.max_packet_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_image_input_bytes(mut self, value: usize) -> Self {
self.max_image_input_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_frame(&mut self, value: FrameLimits) -> &mut Self {
self.frame = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_codec_parameter_bytes(&mut self, value: usize) -> &mut Self {
self.max_codec_parameter_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_packet_bytes(&mut self, value: usize) -> &mut Self {
self.max_packet_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_image_input_bytes(&mut self, value: usize) -> &mut Self {
self.max_image_input_bytes = value;
self
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct DemuxLimits {
packet: PacketLimits,
max_attachment_bytes: usize,
max_total_attachment_bytes: usize,
max_codec_parameter_bytes: usize,
max_total_codec_parameter_bytes: usize,
max_probe_bytes: u64,
max_streams: u32,
max_chapters: u32,
max_total_chapter_title_bytes: usize,
max_total_stream_metadata_bytes: usize,
}
impl Default for DemuxLimits {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl DemuxLimits {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self {
packet: PacketLimits::new(),
max_attachment_bytes: DEFAULT_MAX_ATTACHMENT_BYTES,
max_total_attachment_bytes: DEFAULT_MAX_TOTAL_ATTACHMENT_BYTES,
max_codec_parameter_bytes: DEFAULT_MAX_CODEC_PARAMETER_BYTES,
max_total_codec_parameter_bytes: DEFAULT_MAX_TOTAL_CODEC_PARAMETER_BYTES,
max_probe_bytes: DEFAULT_MAX_PROBE_BYTES,
max_streams: DEFAULT_MAX_STREAMS,
max_chapters: DEFAULT_MAX_CHAPTERS,
max_total_chapter_title_bytes: DEFAULT_MAX_TOTAL_CHAPTER_TITLE_BYTES,
max_total_stream_metadata_bytes: DEFAULT_MAX_TOTAL_STREAM_METADATA_BYTES,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_probe_bytes(&self) -> u64 {
self.max_probe_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_streams(&self) -> u32 {
self.max_streams
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_probe_bytes(mut self, value: u64) -> Self {
self.max_probe_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_streams(mut self, value: u32) -> Self {
self.max_streams = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_chapters(&self) -> u32 {
self.max_chapters
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_total_chapter_title_bytes(&self) -> usize {
self.max_total_chapter_title_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_chapters(mut self, value: u32) -> Self {
self.max_chapters = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_total_chapter_title_bytes(mut self, value: usize) -> Self {
self.max_total_chapter_title_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_chapters(&mut self, value: u32) -> &mut Self {
self.max_chapters = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_total_chapter_title_bytes(&mut self, value: usize) -> &mut Self {
self.max_total_chapter_title_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_total_stream_metadata_bytes(&self) -> usize {
self.max_total_stream_metadata_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_total_stream_metadata_bytes(mut self, value: usize) -> Self {
self.max_total_stream_metadata_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_total_stream_metadata_bytes(&mut self, value: usize) -> &mut Self {
self.max_total_stream_metadata_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn packet(&self) -> PacketLimits {
self.packet
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_attachment_bytes(&self) -> usize {
self.max_attachment_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_total_attachment_bytes(&self) -> usize {
self.max_total_attachment_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_codec_parameter_bytes(&self) -> usize {
self.max_codec_parameter_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn max_total_codec_parameter_bytes(&self) -> usize {
self.max_total_codec_parameter_bytes
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_packet(mut self, value: PacketLimits) -> Self {
self.packet = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_attachment_bytes(mut self, value: usize) -> Self {
self.max_attachment_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_total_attachment_bytes(mut self, value: usize) -> Self {
self.max_total_attachment_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_codec_parameter_bytes(mut self, value: usize) -> Self {
self.max_codec_parameter_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
#[must_use]
pub const fn with_max_total_codec_parameter_bytes(mut self, value: usize) -> Self {
self.max_total_codec_parameter_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_packet(&mut self, value: PacketLimits) -> &mut Self {
self.packet = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_attachment_bytes(&mut self, value: usize) -> &mut Self {
self.max_attachment_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_total_attachment_bytes(&mut self, value: usize) -> &mut Self {
self.max_total_attachment_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_codec_parameter_bytes(&mut self, value: usize) -> &mut Self {
self.max_codec_parameter_bytes = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_max_total_codec_parameter_bytes(&mut self, value: usize) -> &mut Self {
self.max_total_codec_parameter_bytes = value;
self
}
}
#[cfg(test)]
mod tests;