use crate::pcm::PcmFormat;
use crate::time::Micros;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Codec {
Jpeg,
H264,
Pcm(PcmFormat),
}
impl Codec {
#[must_use]
pub const fn mime(self) -> &'static str {
match self {
Codec::Jpeg => "image/jpeg",
Codec::H264 => "video/H264",
Codec::Pcm(_) => "audio/L16",
}
}
#[must_use]
pub const fn tag(self) -> u8 {
match self {
Codec::Jpeg => 1,
Codec::H264 => 2,
Codec::Pcm(_) => 3,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct MediaPacket<'a> {
pub codec: Codec,
pub key: bool,
pub timestamp: Micros,
pub data: &'a [u8],
}
impl<'a> MediaPacket<'a> {
#[must_use]
pub const fn new(codec: Codec, key: bool, timestamp: Micros, data: &'a [u8]) -> Self {
MediaPacket {
codec,
key,
timestamp,
data,
}
}
#[must_use]
pub const fn len(&self) -> usize {
self.data.len()
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.data.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::pcm::SampleFormat;
#[test]
fn tags_and_mimes_are_stable() {
assert_eq!(Codec::Jpeg.tag(), 1);
assert_eq!(Codec::H264.tag(), 2);
let pcm = Codec::Pcm(PcmFormat::new(16_000, 1, SampleFormat::I16).unwrap());
assert_eq!(pcm.tag(), 3);
assert_eq!(pcm.mime(), "audio/L16");
let p = MediaPacket::new(Codec::Jpeg, true, Micros(7), &[0xFF, 0xD8]);
assert_eq!(p.len(), 2);
assert!(!p.is_empty());
assert!(p.key);
}
}