const CONTAINER_FOURCCS: &[&[u8; 4]] = &[
b"moov", b"trak", b"mdia", b"minf", b"stbl", b"stsd", b"edts", b"udta", b"meta", b"dinf",
b"mvex", b"moof", b"traf", b"mfra",
b"mp4a", b"Opus", b"ac-3", b"ec-3", b"enca", b"av01", b"avc1", b"avc3", b"hvc1", b"hev1",
b"hvc2", b"hev2", b"dvh1", b"dvhe", b"vp08", b"vp09", b"apco", b"apcs", b"apcn", b"apch",
b"ap4h", b"ap4x",
b"wave",
];
#[inline]
fn is_container(fourcc: &[u8; 4]) -> bool {
CONTAINER_FOURCCS.contains(&fourcc)
}
fn sample_entry_fixed_fields_len(fourcc: &[u8; 4]) -> Option<usize> {
let visual = matches!(
fourcc,
b"av01"
| b"avc1"
| b"avc3"
| b"hvc1"
| b"hev1"
| b"hvc2"
| b"hev2"
| b"dvh1"
| b"dvhe"
| b"vp08"
| b"vp09"
| b"apco"
| b"apcs"
| b"apcn"
| b"apch"
| b"ap4h"
| b"ap4x",
);
let audio = matches!(fourcc, b"mp4a" | b"Opus" | b"ac-3" | b"ec-3" | b"enca");
if visual {
Some(78)
} else if audio {
Some(28)
} else {
None
}
}
pub fn sanitize_isobmff_box_sizes(data: &[u8]) -> Vec<u8> {
let mut out = Vec::with_capacity(data.len());
walk_and_sanitize(data, 0, data.len(), b"****", &mut out);
out
}
fn walk_and_sanitize(data: &[u8], start: usize, end: usize, parent: &[u8; 4], out: &mut Vec<u8>) {
let mut cursor = start;
while cursor < end {
if cursor + 8 > end {
out.extend_from_slice(&data[cursor..end]);
return;
}
let raw_size = u32::from_be_bytes([
data[cursor],
data[cursor + 1],
data[cursor + 2],
data[cursor + 3],
]) as u64;
let fourcc: &[u8; 4] = data[cursor + 4..cursor + 8].try_into().unwrap();
if raw_size == 0 {
out.extend_from_slice(&data[cursor..end]);
return;
}
let mut header_len = 8usize;
let mut box_size = raw_size;
if raw_size == 1 {
if cursor + 16 > end {
out.extend_from_slice(&data[cursor..end]);
return;
}
box_size = u64::from_be_bytes([
data[cursor + 8],
data[cursor + 9],
data[cursor + 10],
data[cursor + 11],
data[cursor + 12],
data[cursor + 13],
data[cursor + 14],
data[cursor + 15],
]);
header_len = 16;
}
let remaining = (end - cursor) as u64;
let clamped = if box_size > remaining {
remaining
} else {
box_size
};
if clamped <= u32::MAX as u64 && header_len == 8 {
out.extend_from_slice(&(clamped as u32).to_be_bytes());
out.extend_from_slice(fourcc);
} else {
out.extend_from_slice(&data[cursor..cursor + header_len]);
}
let payload_start = cursor + header_len;
let payload_end = (cursor as u64 + clamped) as usize;
let payload_end = payload_end.min(end);
if payload_start >= payload_end {
cursor = payload_end.max(cursor + header_len);
continue;
}
if is_container(fourcc) {
let prefix_len = if fourcc == b"stsd" {
8
} else if parent == b"stsd" {
sample_entry_fixed_fields_len(fourcc).unwrap_or(0)
} else {
0
};
let copy_end = (payload_start + prefix_len).min(payload_end);
out.extend_from_slice(&data[payload_start..copy_end]);
walk_and_sanitize(data, copy_end, payload_end, fourcc, out);
} else {
out.extend_from_slice(&data[payload_start..payload_end]);
}
cursor = payload_end;
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_box(fourcc: &[u8; 4], payload: &[u8]) -> Vec<u8> {
let size = (8 + payload.len()) as u32;
let mut out = Vec::with_capacity(size as usize);
out.extend_from_slice(&size.to_be_bytes());
out.extend_from_slice(fourcc);
out.extend_from_slice(payload);
out
}
fn make_sized_box(fourcc: &[u8; 4], reported_size: u32, payload: &[u8]) -> Vec<u8> {
let mut out = Vec::with_capacity(8 + payload.len());
out.extend_from_slice(&reported_size.to_be_bytes());
out.extend_from_slice(fourcc);
out.extend_from_slice(payload);
out
}
#[test]
fn well_formed_file_passes_through_byte_identical() {
let esds = make_box(b"esds", &[0x00; 32]);
let mut mp4a_payload = vec![0u8; 28]; mp4a_payload.extend_from_slice(&esds);
let mp4a = make_box(b"mp4a", &mp4a_payload);
let stsd = {
let mut p = vec![0u8, 0, 0, 0]; p.extend_from_slice(&1u32.to_be_bytes()); p.extend_from_slice(&mp4a);
make_box(b"stsd", &p)
};
let stbl = make_box(b"stbl", &stsd);
let minf = make_box(b"minf", &stbl);
let mdia = make_box(b"mdia", &minf);
let trak = make_box(b"trak", &mdia);
let moov = make_box(b"moov", &trak);
let sanitized = sanitize_isobmff_box_sizes(&moov);
assert_eq!(
sanitized, moov,
"well-formed input must round-trip byte-identical"
);
}
#[test]
fn over_reported_child_inside_mp4a_gets_clamped() {
let bad_esds = make_sized_box(b"esds", 100, &[0xAB; 8]);
let mut mp4a_payload = vec![0u8; 28]; mp4a_payload.extend_from_slice(&bad_esds);
let mp4a = make_box(b"mp4a", &mp4a_payload);
let stsd_payload = {
let mut p = vec![0u8; 4]; p.extend_from_slice(&1u32.to_be_bytes()); p.extend_from_slice(&mp4a);
p
};
let stsd = make_box(b"stsd", &stsd_payload);
let sanitized = sanitize_isobmff_box_sizes(&stsd);
let mp4a_header_offset = 16;
assert_eq!(
&sanitized[mp4a_header_offset + 4..mp4a_header_offset + 8],
b"mp4a"
);
let esds_size_offset = mp4a_header_offset + 8 + 28;
let clamped_esds_size = u32::from_be_bytes([
sanitized[esds_size_offset],
sanitized[esds_size_offset + 1],
sanitized[esds_size_offset + 2],
sanitized[esds_size_offset + 3],
]);
assert!(
clamped_esds_size <= 16,
"esds size should be clamped to fit, got {clamped_esds_size}",
);
assert!(
clamped_esds_size >= 8,
"esds size should still cover its header, got {clamped_esds_size}",
);
}
#[test]
fn inner_mp4a_inside_wave_is_not_treated_as_sample_entry() {
let inner_mp4a = make_box(b"mp4a", &vec![0u8; 24]); let frma = make_box(b"frma", b"mp4a");
let esds_body = vec![0u8; 32];
let esds = make_box(b"esds", &esds_body);
let wave_payload = {
let mut p = Vec::new();
p.extend_from_slice(&frma);
p.extend_from_slice(&inner_mp4a);
p.extend_from_slice(&esds);
p
};
let wave = make_box(b"wave", &wave_payload);
let mut outer_mp4a_payload = vec![0u8; 28];
outer_mp4a_payload.extend_from_slice(&wave);
let outer_mp4a = make_box(b"mp4a", &outer_mp4a_payload);
let stsd_payload = {
let mut p = vec![0u8; 4];
p.extend_from_slice(&1u32.to_be_bytes());
p.extend_from_slice(&outer_mp4a);
p
};
let stsd = make_box(b"stsd", &stsd_payload);
let sanitized = sanitize_isobmff_box_sizes(&stsd);
assert_eq!(
sanitized, stsd,
"well-formed iPhone-shaped MP4 must pass through unchanged"
);
}
#[test]
fn sanitizer_is_idempotent() {
let bad_esds = make_sized_box(b"esds", 100, &[0u8; 8]);
let mut mp4a_payload = vec![0u8; 28];
mp4a_payload.extend_from_slice(&bad_esds);
let mp4a = make_box(b"mp4a", &mp4a_payload);
let once = sanitize_isobmff_box_sizes(&mp4a);
let twice = sanitize_isobmff_box_sizes(&once);
assert_eq!(once, twice, "sanitizer must be idempotent");
}
#[test]
fn truncated_input_is_handled_without_panic() {
let mut bad = vec![];
bad.extend_from_slice(&100u32.to_be_bytes());
bad.extend_from_slice(b"moov");
bad.extend_from_slice(&[0u8; 4]); let _ = sanitize_isobmff_box_sizes(&bad); }
}