use crate::{PlaneSize, SourceCamera, TimeMode};
use serde::{Deserialize, Serialize};
pub(crate) type Magic = [u8; 5];
pub(crate) const MAGIC_RAW: Magic = [97, 100, 100, 101, 114]; pub(crate) const MAGIC_COMPRESSED: Magic = [97, 100, 100, 101, 99]; #[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub(crate) struct EventStreamHeader {
pub(crate) magic: Magic,
pub(crate) version: u8,
pub(crate) endianness: u8, pub(crate) width: u16,
pub(crate) height: u16,
pub(crate) tps: u32,
pub(crate) ref_interval: u32,
pub(crate) delta_t_max: u32,
pub(crate) event_size: u8,
pub(crate) channels: u8,
}
pub(crate) trait HeaderExtension {}
#[derive(Debug, Default, Serialize, Deserialize)]
pub(crate) struct EventStreamHeaderExtensionV0 {}
impl HeaderExtension for EventStreamHeaderExtensionV0 {}
#[derive(Debug, Default, Serialize, Deserialize)]
pub(crate) struct EventStreamHeaderExtensionV1 {
pub(crate) source: SourceCamera,
}
impl HeaderExtension for EventStreamHeaderExtensionV1 {}
#[derive(Debug, Default, Serialize, Deserialize)]
pub(crate) struct EventStreamHeaderExtensionV2 {
pub(crate) time_mode: TimeMode,
}
impl HeaderExtension for EventStreamHeaderExtensionV2 {}
impl EventStreamHeader {
pub(crate) fn new(
magic: Magic,
plane_size: PlaneSize,
tps: u32,
ref_interval: u32,
delta_t_max: u32,
codec_version: u8,
) -> EventStreamHeader {
assert!(plane_size.channels > 0);
assert!(delta_t_max > 0);
assert!(plane_size.width > 0);
assert!(plane_size.height > 0);
assert!(magic == MAGIC_RAW || magic == MAGIC_COMPRESSED);
EventStreamHeader {
magic,
version: codec_version,
endianness: 98, width: plane_size.width,
height: plane_size.height,
tps,
ref_interval,
delta_t_max,
event_size: match plane_size.channels {
1 => 9, _ => 11,
},
channels: plane_size.channels,
}
}
}