use std::convert::TryFrom;
use crate::model::error::ParseError;
#[repr(u64)]
#[derive(Clone, Debug, Copy, PartialEq)]
pub enum LOCHeaderExtensionId {
CaptureTimestamp = 2, VideoFrameMarking = 4, AudioLevel = 6, VideoConfig = 13, }
impl TryFrom<u64> for LOCHeaderExtensionId {
type Error = ParseError;
fn try_from(value: u64) -> Result<Self, Self::Error> {
match value {
2 => Ok(LOCHeaderExtensionId::CaptureTimestamp),
4 => Ok(LOCHeaderExtensionId::VideoFrameMarking),
6 => Ok(LOCHeaderExtensionId::AudioLevel),
13 => Ok(LOCHeaderExtensionId::VideoConfig),
_ => Err(ParseError::InvalidType {
context: "LOCHeaderExtensionId::try_from(u64)",
details: format!("Invalid type, got {value}"),
}),
}
}
}
impl From<LOCHeaderExtensionId> for u64 {
fn from(value: LOCHeaderExtensionId) -> Self {
value as u64
}
}
#[repr(u64)]
#[derive(Clone, Debug, Copy, PartialEq, Eq)]
pub enum TrackExtensionType {
DeliveryTimeout = 0x02, MaxCacheDuration = 0x04, ImmutableExtensions = 0x0B, DefaultPublisherPriority = 0x0E, DefaultPublisherGroupOrder = 0x22, DynamicGroups = 0x30, PriorGroupIdGap = 0x3C, PriorObjectIdGap = 0x3E, }
impl TryFrom<u64> for TrackExtensionType {
type Error = ParseError;
fn try_from(value: u64) -> Result<Self, Self::Error> {
match value {
0x02 => Ok(TrackExtensionType::DeliveryTimeout),
0x04 => Ok(TrackExtensionType::MaxCacheDuration),
0x0B => Ok(TrackExtensionType::ImmutableExtensions),
0x0E => Ok(TrackExtensionType::DefaultPublisherPriority),
0x22 => Ok(TrackExtensionType::DefaultPublisherGroupOrder),
0x30 => Ok(TrackExtensionType::DynamicGroups),
0x3C => Ok(TrackExtensionType::PriorGroupIdGap),
0x3E => Ok(TrackExtensionType::PriorObjectIdGap),
_ => Err(ParseError::InvalidType {
context: "TrackExtensionType::try_from(u64)",
details: format!("Unknown extension type, got {value}"),
}),
}
}
}
impl From<TrackExtensionType> for u64 {
fn from(value: TrackExtensionType) -> Self {
value as u64
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_track_extension_type_roundtrip() {
let known = [
(0x02u64, TrackExtensionType::DeliveryTimeout),
(0x04, TrackExtensionType::MaxCacheDuration),
(0x0B, TrackExtensionType::ImmutableExtensions),
(0x0E, TrackExtensionType::DefaultPublisherPriority),
(0x22, TrackExtensionType::DefaultPublisherGroupOrder),
(0x30, TrackExtensionType::DynamicGroups),
(0x3C, TrackExtensionType::PriorGroupIdGap),
(0x3E, TrackExtensionType::PriorObjectIdGap),
];
for (raw, expected) in known {
let parsed = TrackExtensionType::try_from(raw).unwrap();
assert_eq!(parsed, expected);
assert_eq!(u64::from(parsed), raw);
}
}
#[test]
fn test_track_extension_type_unknown() {
assert!(TrackExtensionType::try_from(0xFF).is_err());
assert!(TrackExtensionType::try_from(0x00).is_err());
}
}