const EBML_MAGIC: [u8; 4] = [0x1A, 0x45, 0xDF, 0xA3];
pub fn is_webm(data: &[u8]) -> bool {
if data.len() < 4 || data[0..4] != EBML_MAGIC {
return false;
}
let search_len = data.len().min(64);
data[..search_len].windows(4).any(|w| w == b"webm")
}
pub fn is_matroska(data: &[u8]) -> bool {
if data.len() < 4 || data[0..4] != EBML_MAGIC {
return false;
}
let search_len = data.len().min(64);
data[..search_len].windows(8).any(|w| w == b"matroska")
}
pub fn is_ebml(data: &[u8]) -> bool {
data.len() >= 4 && data[0..4] == EBML_MAGIC
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_webm_detection() {
let webm_data = [
0x1A, 0x45, 0xDF, 0xA3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x43, b'w', b'e', b'b', b'm', ];
assert!(is_webm(&webm_data));
assert!(is_ebml(&webm_data));
assert!(!is_matroska(&webm_data));
}
#[test]
fn test_matroska_detection() {
let mkv_data = [
0x1A, 0x45, 0xDF, 0xA3, 0x01, 0x00, 0x00, 0x00, b'm', b'a', b't', b'r', b'o', b's', b'k', b'a', ];
assert!(!is_webm(&mkv_data));
assert!(is_ebml(&mkv_data));
assert!(is_matroska(&mkv_data));
}
#[test]
fn test_invalid_data() {
assert!(!is_webm(&[]));
assert!(!is_webm(&[0x00, 0x00, 0x00]));
assert!(!is_webm(b"RIFF"));
assert!(!is_ebml(&[]));
}
}