use crate::time::Timescale;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MediaKind {
Video,
Audio,
Text,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Codec {
H264,
H265,
Av1,
Vp8,
Vp9,
Aac,
Ac3,
Eac3,
Mp3,
Flac,
Opus,
WebVtt,
Stpp,
Other(String),
}
impl Codec {
pub fn rfc6381_family(&self) -> &str {
match self {
Codec::H264 => "avc1",
Codec::H265 => "hvc1",
Codec::Av1 => "av01",
Codec::Vp8 => "vp08",
Codec::Vp9 => "vp09",
Codec::Aac => "mp4a",
Codec::Ac3 => "ac-3",
Codec::Eac3 => "ec-3",
Codec::Mp3 => "mp4a",
Codec::Flac => "fLaC",
Codec::Opus => "Opus",
Codec::WebVtt => "wvtt",
Codec::Stpp => "stpp",
Codec::Other(s) => s.as_str(),
}
}
}
#[derive(Debug, Clone)]
pub struct StreamInfo {
pub kind: MediaKind,
pub codec: Codec,
pub timescale: Timescale,
pub resolution: Option<(u32, u32)>,
pub sample_rate: Option<u32>,
pub bitrate: Option<u32>,
pub codec_string: Option<String>,
pub language: Option<String>,
}
impl StreamInfo {
pub fn rfc6381(&self) -> String {
self.codec_string.clone().unwrap_or_else(|| self.codec.rfc6381_family().to_string())
}
}