use oxideav_core::CodecId;
pub const ALLOWED_WEBM_CODECS: &[&str] = &[
"V_VP8", "V_VP9", "V_AV1", "A_VORBIS", "A_OPUS",
];
pub fn is_webm_matroska_codec(matroska_codec_id: &str) -> bool {
ALLOWED_WEBM_CODECS.contains(&matroska_codec_id)
}
pub fn is_webm_codec(id: &CodecId) -> bool {
matches!(id.as_str(), "vp8" | "vp9" | "av1" | "vorbis" | "opus")
}
pub fn from_matroska(s: &str, codec_private: &[u8]) -> CodecId {
let id = match s {
"A_FLAC" => "flac",
"A_OPUS" => "opus",
"A_VORBIS" => "vorbis",
"A_PCM/INT/LIT" => "pcm_s16le",
"A_PCM/INT/BIG" => "pcm_s16be",
"A_PCM/FLOAT/IEEE" => "pcm_f32le",
"A_AAC" | "A_AAC/MPEG4/LC" | "A_AAC/MPEG2/LC" => "aac",
"A_MPEG/L3" => "mp3",
"A_AC3" => "ac3",
"A_EAC3" => "eac3",
"V_VP8" => "vp8",
"V_VP9" => "vp9",
"V_AV1" => "av1",
"V_MPEG1" => "mpeg1video",
"V_MPEG2" => "mpeg2video",
"V_MPEG4/ISO/AVC" => "h264",
"V_MPEGH/ISO/HEVC" => "h265",
"V_FFV1" => "ffv1",
"V_THEORA" => "theora",
"V_MS/VFW/FOURCC" => return from_bitmapinfoheader(codec_private),
"S_TEXT/UTF8" => "subrip",
"S_TEXT/SSA" => "ssa",
"S_TEXT/ASS" => "ass",
"S_TEXT/WEBVTT" => "webvtt",
"S_TEXT/USF" => "usf",
"S_VOBSUB" => "dvd_subtitle",
"S_HDMV/PGS" => "hdmv_pgs_subtitle",
"S_HDMV/TEXTST" => "hdmv_text_subtitle",
"S_DVBSUB" => "dvb_subtitle",
"S_KATE" => "kate",
other => return CodecId::new(format!("mkv:{other}")),
};
CodecId::new(id)
}
fn from_bitmapinfoheader(cp: &[u8]) -> CodecId {
if cp.len() < 20 {
return CodecId::new("mkv:BI/<truncated>");
}
let fourcc = &cp[16..20];
let fourcc_str = std::str::from_utf8(fourcc).unwrap_or("????");
match fourcc_str {
"FFV1" => CodecId::new("ffv1"),
other => CodecId::new(format!("mkv:BI/{other}")),
}
}
pub fn strip_bitmapinfoheader(codec_id: &str, codec_private: &[u8]) -> Vec<u8> {
if codec_id == "V_MS/VFW/FOURCC" && codec_private.len() >= 40 {
codec_private[40..].to_vec()
} else {
codec_private.to_vec()
}
}
pub fn to_matroska(id: &CodecId) -> Option<&'static str> {
Some(match id.as_str() {
"flac" => "A_FLAC",
"opus" => "A_OPUS",
"vorbis" => "A_VORBIS",
"pcm_s16le" => "A_PCM/INT/LIT",
"pcm_s16be" => "A_PCM/INT/BIG",
"pcm_f32le" => "A_PCM/FLOAT/IEEE",
"aac" => "A_AAC",
"mp3" => "A_MPEG/L3",
"ac3" => "A_AC3",
"eac3" => "A_EAC3",
"vp8" => "V_VP8",
"vp9" => "V_VP9",
"av1" => "V_AV1",
"mpeg1video" => "V_MPEG1",
"mpeg2video" => "V_MPEG2",
"h264" => "V_MPEG4/ISO/AVC",
"h265" => "V_MPEGH/ISO/HEVC",
"ffv1" => "V_FFV1",
"subrip" => "S_TEXT/UTF8",
"ssa" => "S_TEXT/SSA",
"ass" => "S_TEXT/ASS",
"webvtt" => "S_TEXT/WEBVTT",
"usf" => "S_TEXT/USF",
"dvd_subtitle" => "S_VOBSUB",
"hdmv_pgs_subtitle" => "S_HDMV/PGS",
"hdmv_text_subtitle" => "S_HDMV/TEXTST",
"dvb_subtitle" => "S_DVBSUB",
"kate" => "S_KATE",
_ => return None,
})
}